Tue, 19 Jun 2018 00:44:35 -0400
Start switching Preferences dialog to Glade.
--- a/pidgin/gtkprefs.c Sun Jun 24 23:04:46 2018 -0400 +++ b/pidgin/gtkprefs.c Tue Jun 19 00:44:35 2018 -0400 @@ -86,12 +86,15 @@ gchar *original_name; }; +struct _PidginPrefsWindow { + GtkDialog parent; + + /* Notebook */ + GtkWidget *notebook; +}; + /* Main dialog */ -static GtkWidget *prefs = NULL; - -/* Notebook */ -static GtkWidget *prefsnotebook = NULL; -static int notebook_page = 0; +static PidginPrefsWindow *prefs = NULL; /* Conversations page */ static GtkWidget *sample_webview = NULL; @@ -141,6 +144,7 @@ /* * PROTOTYPES */ +G_DEFINE_TYPE(PidginPrefsWindow, pidgin_prefs_window, GTK_TYPE_DIALOG); static void delete_prefs(GtkWidget *, void *); static void @@ -516,9 +520,6 @@ voice_volume = NULL; video_drawing_area = NULL; #endif - - notebook_page = 0; - prefsnotebook = NULL; prefs = NULL; } @@ -3462,6 +3463,8 @@ static void toggle_voice_test_cb(GtkToggleButton *test, gpointer data) { + PidginPrefsWindow *win = PIDGIN_PREFS_WINDOW(data); + if (gtk_toggle_button_get_active(test)) { gtk_widget_set_sensitive(voice_level, TRUE); enable_voice_test(); @@ -3470,7 +3473,7 @@ G_CALLBACK(on_volume_change_cb), NULL); g_signal_connect(test, "destroy", G_CALLBACK(voice_test_destroy_cb), NULL); - g_signal_connect(prefsnotebook, "switch-page", + g_signal_connect(win->notebook, "switch-page", G_CALLBACK(vv_test_switch_page_cb), test); } else { gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(voice_level), 0.0); @@ -3481,7 +3484,7 @@ g_object_disconnect(test, "any-signal::destroy", G_CALLBACK(voice_test_destroy_cb), NULL, NULL); - g_object_disconnect(prefsnotebook, "any-signal::switch-page", + g_object_disconnect(win->notebook, "any-signal::switch-page", G_CALLBACK(vv_test_switch_page_cb), test, NULL); voice_test_destroy_cb(NULL, NULL); @@ -3509,7 +3512,7 @@ } static void -make_voice_test(GtkWidget *vbox) +make_voice_test(PidginPrefsWindow *win, GtkWidget *vbox) { GtkWidget *test; GtkWidget *hbox; @@ -3560,7 +3563,7 @@ voice_level = level; voice_threshold = threshold; g_signal_connect(test, "toggled", - G_CALLBACK(toggle_voice_test_cb), NULL); + G_CALLBACK(toggle_voice_test_cb), win); } static GstElement * @@ -3672,17 +3675,19 @@ static void toggle_video_test_cb(GtkToggleButton *test, gpointer data) { + PidginPrefsWindow *win = PIDGIN_PREFS_WINDOW(data); + if (gtk_toggle_button_get_active(test)) { enable_video_test(); g_signal_connect(test, "destroy", G_CALLBACK(video_test_destroy_cb), NULL); - g_signal_connect(prefsnotebook, "switch-page", + g_signal_connect(win->notebook, "switch-page", G_CALLBACK(vv_test_switch_page_cb), test); } else { g_object_disconnect(test, "any-signal::destroy", G_CALLBACK(video_test_destroy_cb), NULL, NULL); - g_object_disconnect(prefsnotebook, "any-signal::switch-page", + g_object_disconnect(win->notebook, "any-signal::switch-page", G_CALLBACK(vv_test_switch_page_cb), test, NULL); video_test_destroy_cb(NULL, NULL); @@ -3690,7 +3695,7 @@ } static void -make_video_test(GtkWidget *vbox) +make_video_test(PidginPrefsWindow *win, GtkWidget *vbox) { GtkWidget *test; GtkWidget *video; @@ -3703,7 +3708,7 @@ gtk_box_pack_start(GTK_BOX(vbox), test, FALSE, FALSE, 0); g_signal_connect(test, "toggled", - G_CALLBACK(toggle_video_test_cb), NULL); + G_CALLBACK(toggle_video_test_cb), win); } static void @@ -3826,7 +3831,7 @@ } static GtkWidget * -vv_page(void) +vv_page(PidginPrefsWindow *win) { GtkWidget *ret; GtkWidget *vbox; @@ -3852,7 +3857,7 @@ g_signal_connect_object(manager, "elements-changed::audiosink", G_CALLBACK(device_list_changed_cb), frame, 0); - make_voice_test(vbox); + make_voice_test(win, vbox); vbox = pidgin_make_frame(ret, _("Video")); frame = make_vv_frame(vbox, sg, _("Input"), @@ -3865,7 +3870,7 @@ g_signal_connect_object(manager, "elements-changed::videosink", G_CALLBACK(device_list_changed_cb), frame, 0); - make_video_test(vbox); + make_video_test(win, vbox); gtk_widget_show_all(ret); @@ -3874,49 +3879,59 @@ #endif static int -prefs_notebook_add_page(const char *text, GtkWidget *page, int ind) +prefs_notebook_add_page(GtkNotebook *notebook, const char *text, + GtkWidget *page, int ind) { - return gtk_notebook_append_page(GTK_NOTEBOOK(prefsnotebook), page, gtk_label_new(text)); + return gtk_notebook_append_page(notebook, page, gtk_label_new(text)); } static void -prefs_notebook_init(void) +prefs_notebook_init(PidginPrefsWindow *win) { - prefs_notebook_add_page(_("Interface"), interface_page(), notebook_page++); + GtkNotebook *notebook = GTK_NOTEBOOK(win->notebook); + int notebook_page = 0; + + prefs_notebook_add_page(notebook, _("Interface"), interface_page(), notebook_page++); #ifndef _WIN32 /* We use the registered default browser in windows */ /* if the user is running Mac OS X, hide the browsers tab */ if(purple_running_osx() == FALSE) - prefs_notebook_add_page(_("Browser"), browser_page(), notebook_page++); + prefs_notebook_add_page(notebook, _("Browser"), browser_page(), notebook_page++); #endif - prefs_notebook_add_page(_("Conversations"), conv_page(), notebook_page++); - prefs_notebook_add_page(_("Logging"), logging_page(), notebook_page++); - prefs_notebook_add_page(_("Network"), network_page(), notebook_page++); - prefs_notebook_add_page(_("Proxy"), proxy_page(), notebook_page++); - prefs_notebook_add_page(_("Password Storage"), keyring_page(), notebook_page++); - - prefs_notebook_add_page(_("Sounds"), sound_page(), notebook_page++); - prefs_notebook_add_page(_("Status / Idle"), away_page(), notebook_page++); - prefs_notebook_add_page(_("Themes"), theme_page(), notebook_page++); + prefs_notebook_add_page(notebook, _("Conversations"), conv_page(), notebook_page++); + prefs_notebook_add_page(notebook, _("Logging"), logging_page(), notebook_page++); + prefs_notebook_add_page(notebook, _("Network"), network_page(), notebook_page++); + prefs_notebook_add_page(notebook, _("Proxy"), proxy_page(), notebook_page++); + prefs_notebook_add_page(notebook, _("Password Storage"), keyring_page(), notebook_page++); + + prefs_notebook_add_page(notebook, _("Sounds"), sound_page(), notebook_page++); + prefs_notebook_add_page(notebook, _("Status / Idle"), away_page(), notebook_page++); + prefs_notebook_add_page(notebook, _("Themes"), theme_page(), notebook_page++); #ifdef USE_VV - prefs_notebook_add_page(_("Voice/Video"), vv_page(), notebook_page++); + prefs_notebook_add_page(notebook, _("Voice/Video"), vv_page(win), notebook_page++); #endif } -void -pidgin_prefs_show(void) +static void +pidgin_prefs_window_class_init(PidginPrefsWindowClass *klass) { - GtkWidget *vbox; - GtkWidget *notebook; - GtkWidget *button; - - if (prefs) { - gtk_window_present(GTK_WINDOW(prefs)); - return; - } - + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); + + gtk_widget_class_set_template_from_resource( + widget_class, + "/im/pidgin/Pidgin/Prefs/prefs.ui" + ); + + gtk_widget_class_bind_template_child( + widget_class, PidginPrefsWindow, notebook); + gtk_widget_class_bind_template_callback(widget_class, delete_prefs); +} + +static void +pidgin_prefs_window_init(PidginPrefsWindow *win) +{ /* copy the preferences to tmp values... * I liked "take affect immediately" Oh well :-( */ /* (that should have been "effect," right?) */ @@ -3924,29 +3939,23 @@ /* Back to instant-apply! I win! BU-HAHAHA! */ /* Create the window */ - prefs = pidgin_create_dialog(_("Preferences"), 0, "preferences", FALSE); - g_signal_connect(G_OBJECT(prefs), "destroy", - G_CALLBACK(delete_prefs), NULL); - - vbox = pidgin_dialog_get_vbox_with_properties(GTK_DIALOG(prefs), FALSE, PIDGIN_HIG_BORDER); - - /* The notebook */ - prefsnotebook = notebook = gtk_notebook_new (); - gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_LEFT); - gtk_box_pack_start(GTK_BOX (vbox), notebook, FALSE, FALSE, 0); - gtk_widget_show(prefsnotebook); - - button = pidgin_dialog_add_button(GTK_DIALOG(prefs), GTK_STOCK_CLOSE, NULL, NULL); - g_signal_connect_swapped(G_OBJECT(button), "clicked", - G_CALLBACK(gtk_widget_destroy), prefs); - - prefs_notebook_init(); + gtk_widget_init_template(GTK_WIDGET(win)); + + prefs_notebook_init(win); /* Refresh the list of themes before showing the preferences window */ prefs_themes_refresh(); - - /* Show everything. */ - gtk_widget_show(prefs); +} + +void +pidgin_prefs_show(void) +{ + if (prefs == NULL) { + prefs = PIDGIN_PREFS_WINDOW(g_object_new( + pidgin_prefs_window_get_type(), NULL)); + } + + gtk_window_present(GTK_WINDOW(prefs)); } static void
--- a/pidgin/gtkprefs.h Sun Jun 24 23:04:46 2018 -0400 +++ b/pidgin/gtkprefs.h Tue Jun 19 00:44:35 2018 -0400 @@ -33,6 +33,27 @@ G_BEGIN_DECLS +#define PIDGIN_TYPE_PREFS_WINDOW (pidgin_prefs_window_get_type()) +#if GLIB_CHECK_VERSION(2,44,0) +G_DECLARE_FINAL_TYPE(PidginPrefsWindow, pidgin_prefs_window, PIDGIN, PREFS_WINDOW, GtkDialog) +#else +GType pidgin_prefs_window_get_type(void); +G_GNUC_BEGIN_IGNORE_DEPRECATIONS +typedef struct _PidginPrefsWindow PidginPrefsWindow; +typedef struct { GtkDialogClass parent_class; } PidginPrefsWindowClass; +static inline PidginPrefsWindow * +PIDGIN_PREFS_WINDOW(gpointer ptr) +{ + return G_TYPE_CHECK_INSTANCE_CAST(ptr, pidgin_prefs_window_get_type(), PidginPrefsWindow); +} +static inline gboolean +PIDGIN_IS_PREFS_WINDOW(gpointer ptr) +{ + return G_TYPE_CHECK_INSTANCE_TYPE(ptr, pidgin_prefs_window_get_type()); +} +G_GNUC_END_IGNORE_DEPRECATIONS +#endif + /** * pidgin_prefs_init: *
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pidgin/resources/Prefs/prefs.ui Tue Jun 19 00:44:35 2018 -0400 @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface> + <requires lib="gtk+" version="3.10"/> + <template class="PidginPrefsWindow" parent="GtkDialog"> + <property name="can_focus">False</property> + <property name="title" translatable="yes">Preferences</property> + <property name="type_hint">dialog</property> + <signal name="destroy" handler="delete_prefs" swapped="no"/> + <child> + <placeholder/> + </child> + <child internal-child="vbox"> + <object class="GtkBox"> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <property name="spacing">2</property> + <child internal-child="action_area"> + <object class="GtkButtonBox"> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton"> + <property name="label" translatable="yes">_Close</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">True</property> + <property name="use_underline">True</property> + <signal name="clicked" handler="gtk_widget_destroy" object="PidginPrefsWindow" swapped="yes"/> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkNotebook" id="notebook"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tab_pos">left</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </template> +</interface>
--- a/pidgin/resources/pidgin.gresource.xml Sun Jun 24 23:04:46 2018 -0400 +++ b/pidgin/resources/pidgin.gresource.xml Tue Jun 19 00:44:35 2018 -0400 @@ -7,5 +7,6 @@ <file compressed="true">About/credits.json</file> <file compressed="true">Debug/debug.ui</file> <file compressed="true">Debug/filter-popover.ui</file> + <file compressed="true">Prefs/prefs.ui</file> </gresource> </gresources>