Start switching Preferences dialog to Glade.

Tue, 19 Jun 2018 00:44:35 -0400

author
Elliott Sales de Andrade <qulogic@pidgin.im>
date
Tue, 19 Jun 2018 00:44:35 -0400
changeset 39178
53a96425ffc0
parent 39177
ff19cf5cc0dc
child 39179
a59305ca30bb

Start switching Preferences dialog to Glade.

pidgin/gtkprefs.c file | annotate | diff | comparison | revisions
pidgin/gtkprefs.h file | annotate | diff | comparison | revisions
pidgin/resources/Prefs/prefs.ui file | annotate | diff | comparison | revisions
pidgin/resources/pidgin.gresource.xml file | annotate | diff | comparison | revisions
--- 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>

mercurial