```
GtkWidget *mono_chbn, *prop_chbn; //check_buttons pointers gint mono_response, prop_response; //response_id for the checkbuttons
//will be needed by filter function struct Data { gboolean mono_checked; // checked/active state of Ist check_button gboolean prop_checked; char previous_family[50]; // stores the family name of the font // encountered by gtk_font_chooser_set_filter_func() }filter_data;
//the filter function //(https://developer.gnome.org/gtk3/stable/GtkFontChooser.html#GtkFontFilterFun...)
// it will be called by gtk-font-chooser-set-filter-func, // https://developer.gnome.org/gtk3/stable/GtkFontChooser.html#gtk-font-chooser... , // so should probabably keep the same number and kind of arguments as // described there. gboolean check_filter (const PangoFontFamily *family, // family=related group of faces, of varying slant, weight, width // and other aspects const PangoFontFace *face, // within a face only size varies; NOT USED here; // but probably should not remove this parameter in any case. struct Data *filter_data); // gpointer user_data char current_family[]=pango_font_family_get_name (family);
if (strcmp(current_family, filter_data->previous_family){ //strings not equal returns 1, so consider admiting the font strcpy( filter_data->previous_family, current_family); // https://developer.gnome.org/pango/stable/pango-Fonts.html#pango-font-family-... if(pango_font_family_is_monospace (family);){ return (filter_data -> mono_checked) }else{ return (filter_data -> mono_checked) } }else{ return FALSE //current font is of same family as previous } }
//creating the buttons
mono_chbn=gtk_check_button_new_with_label ("Monospaced"); // returns GtkWidget *; makes label to right of check button gtk_toggle_button_set_mode (mono_chbn, TRUE); // with indicator; Default value: FALSE mono_response=1;
prop_chbn=gtk_check_button_new_with_label ("Proportional"); //places a discrete GtkToggleButton next to a widget, (usually a GtkLabel). gtk_toggle_button_set_mode (mono_chbn, TRUE); prop_response=2;
// adding them to Geany gtkFontchooser dialog gtk_dialog_add_action_widget (FontChooserDG, mono_chbn, mono_response); //when mono_chbn clicked (checked), will make the dialog emit signal //"response" with response ID mono_response gtk_dialog_add_action_widget (FontChooserDG, prop_chbn, mono_response);
// AT OPENING FontChooserDG dialog: (by clicking GtkFontButton)
gboolean saved_mono_state="load from some saved Geany intersession file "; // don't know how it's done, but I guess should be done gboolean saved_prop_state="load from some saved Geany intersession file ";
gtk_toggle_button_set_active (mono_chbn, saved_mono_state); gtk_toggle_button_set_active (prop_chbn, saved_prop_state);
// Filtering of the fonts before user starts clicking inside the // opened font Chooser dialog
strcpy( filter_data.previous_family, ""); // or some other string that's not going to be any valid family font name filter_data.mono_checked = gtk_toggle_button_get_active (mono_chbn); filter_data.prop_checked = gtk_toggle_button_get_active (prop_chbn);
// QUESTION: here // https://developer.gnome.org/gtk3/stable/GtkFontChooser.html#gtk-font-chooser... // says "Adds a filter function that decides which fonts to display // in the font chooser." -- is it meant it only adds/sets/connects the //filter, or actually applies the filter (and does the filtering) //when called? I interpreted in IInd way..
if(filter_data.mono_checked || filter_data.prop_checked){ gtk_font_chooser_set_filter_func (fontchooserInterface, @check_filter, @filter_data, NULL); //GDestroyNotify destroy; // It seemed not needed that's why I set NULL }else{ // when both buttons unchecked, //don't waste time running the filter in vain "display empty list of fonts;" // don't know how it's done }
gtk_widget_show_all (FontChooserDG);
// REACTING to activation of checkbuttons in the dialog
//// QUESTION: // should the program react by "connecting" signals from buttons with //some functions (as I see in such examples // https://python-gtk-3-tutorial.readthedocs.io/en/latest/button_widgets.html), //or by using gtk_dialog_run() with emmitted response signal with // response_ID, as //https://developer.gnome.org/gtk3/stable/GtkDialog.html#gtk-dialog-run // ? Or is it that the latter is only good if one wants a "modal dialog" //(i.e, that is, one which freezes the rest of the application from // user input)? // Anyway, I did it in the IIn way...
while (FontChooserDG != NULL){ //i.e while FontChooserDG still exists gint responseID = gtk_dialog_run (FontChooserDG); //runs a recursive main loop until the dialog either emits // the “response” signal, or is destroyed. if (responseID==mono_response || responseID==prop_response ) { // if any of mono/prop checkbuttons activated strcpy( filter_data.previous_family, ""); filter_data.mono_checked = gtk_toggle_button_get_active (mono_chbn); filter_data.prop_checked = gtk_toggle_button_get_active (prop_chbn); if(filter_data.mono_checked || filter_data.prop_checked){ gtk_font_chooser_set_filter_func (fontchooserInterface, //GtkFontChooser *fontchooser, @check_filter @filter_data, NULL); }else{ // when both buttons unchecked, //don't waste time running the filter in vain "display empty list of fonts;" // I don't know how } }else if ("some other widgets within FontChooserDG were activated"){ //do_widget_specific_something (); }else { // assuming_dialog_was_cancelled (); "save the check-state of both checkbuttons in some Geany intersession file" // however it is done gtk_widget_destroy (FontChooserDG); }
}//while
```