[gtk+] gtk-demo: modernize the application demo
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] gtk-demo: modernize the application demo
- Date: Sun, 14 Feb 2016 04:04:19 +0000 (UTC)
commit 7bca66e1ff816f45f02682733346469675b2c915
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Feb 13 21:46:40 2016 -0500
gtk-demo: modernize the application demo
Subclass GtkApplication and GtkApplicationWindow
and use a template.
demos/gtk-demo/application.c | 185 ++++++++++++++++++++---------------------
demos/gtk-demo/application.ui | 166 +++++++++++++++++++++----------------
2 files changed, 186 insertions(+), 165 deletions(-)
---
diff --git a/demos/gtk-demo/application.c b/demos/gtk-demo/application.c
index 6124c3f..2ad143e 100644
--- a/demos/gtk-demo/application.c
+++ b/demos/gtk-demo/application.c
@@ -13,6 +13,22 @@
#ifdef STANDALONE
+typedef GtkApplication DemoApplication;
+typedef GtkApplicationClass DemoApplicationClass;
+
+G_DEFINE_TYPE (DemoApplication, demo_application, GTK_TYPE_APPLICATION)
+
+typedef struct {
+ GtkApplicationWindow parent_instance;
+
+ GtkWidget *message;
+ GtkWidget *infobar;
+ GtkTextBuffer *buffer;
+} DemoApplicationWindow;
+typedef GtkApplicationWindowClass DemoApplicationWindowClass;
+
+G_DEFINE_TYPE (DemoApplicationWindow, demo_application_window, GTK_TYPE_APPLICATION_WINDOW)
+
static void create_window (GApplication *app, const char *contents);
static void
@@ -39,10 +55,9 @@ show_action_dialog (GSimpleAction *action)
static void
show_action_infobar (GSimpleAction *action,
GVariant *parameter,
- gpointer window)
+ gpointer data)
{
- GtkWidget *infobar;
- GtkWidget *message;
+ DemoApplicationWindow *window = data;
gchar *text;
const gchar *name;
const gchar *value;
@@ -50,27 +65,25 @@ show_action_infobar (GSimpleAction *action,
name = g_action_get_name (G_ACTION (action));
value = g_variant_get_string (parameter, NULL);
- message = g_object_get_data (G_OBJECT (window), "message");
- infobar = g_object_get_data (G_OBJECT (window), "infobar");
text = g_strdup_printf ("You activated radio action: \"%s\".\n"
"Current value: %s", name, value);
- gtk_label_set_text (GTK_LABEL (message), text);
- gtk_widget_show (infobar);
+ gtk_label_set_text (GTK_LABEL (window->message), text);
+ gtk_widget_show (window->infobar);
g_free (text);
}
static void
-activate_action (GSimpleAction *action,
- GVariant *parameter,
- gpointer user_data)
+activate_action (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
{
show_action_dialog (action);
}
static void
-activate_new (GSimpleAction *action,
- GVariant *parameter,
- gpointer user_data)
+activate_new (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
{
GApplication *app = user_data;
@@ -79,8 +92,8 @@ activate_new (GSimpleAction *action,
static void
open_response_cb (GtkNativeDialog *dialog,
- gint response_id,
- gpointer user_data)
+ gint response_id,
+ gpointer user_data)
{
GtkFileChooserNative *native = user_data;
GApplication *app = g_object_get_data (G_OBJECT (native), "app");
@@ -119,9 +132,9 @@ open_response_cb (GtkNativeDialog *dialog,
static void
-activate_open (GSimpleAction *action,
- GVariant *parameter,
- gpointer user_data)
+activate_open (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
{
GApplication *app = user_data;
GtkFileChooserNative *native;
@@ -332,6 +345,8 @@ startup (GApplication *app)
GMenuModel *appmenu;
GMenuModel *menubar;
+ G_APPLICATION_CLASS (demo_application_parent_class)->startup (app);
+
builder = gtk_builder_new ();
gtk_builder_add_from_resource (builder, "/application/menus.ui", NULL);
@@ -346,66 +361,13 @@ startup (GApplication *app)
static void
create_window (GApplication *app,
- const char *content_text)
+ const char *content)
{
- GtkBuilder *builder;
- GtkWidget *window;
- GtkWidget *grid;
- GtkWidget *contents;
- GtkWidget *status;
- GtkWidget *message;
- GtkWidget *button;
- GtkWidget *infobar;
- GtkWidget *menutool;
- GMenuModel *toolmenu;
- GtkTextBuffer *buffer;
-
- window = gtk_application_window_new (GTK_APPLICATION (app));
- gtk_window_set_title (GTK_WINDOW (window), "Application Class");
- gtk_window_set_icon_name (GTK_WINDOW (window), "document-open");
- gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
-
- g_action_map_add_action_entries (G_ACTION_MAP (window),
- win_entries, G_N_ELEMENTS (win_entries),
- window);
-
- builder = gtk_builder_new ();
- gtk_builder_add_from_resource (builder, "/application/application.ui", NULL);
-
- grid = (GtkWidget *)gtk_builder_get_object (builder, "grid");
- contents = (GtkWidget *)gtk_builder_get_object (builder, "contents");
- status = (GtkWidget *)gtk_builder_get_object (builder, "status");
- message = (GtkWidget *)gtk_builder_get_object (builder, "message");
- button = (GtkWidget *)gtk_builder_get_object (builder, "button");
- infobar = (GtkWidget *)gtk_builder_get_object (builder, "infobar");
- menutool = (GtkWidget *)gtk_builder_get_object (builder, "menutool");
- toolmenu = (GMenuModel *)gtk_builder_get_object (builder, "toolmenu");
-
- g_object_set_data (G_OBJECT (window), "message", message);
- g_object_set_data (G_OBJECT (window), "infobar", infobar);
-
- gtk_container_add (GTK_CONTAINER (window), grid);
-
- gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (menutool),
- gtk_menu_new_from_model (toolmenu));
-
- gtk_widget_grab_focus (contents);
- g_signal_connect (button, "clicked", G_CALLBACK (clicked_cb), infobar);
-
- /* Show text widget info in the statusbar */
- buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (contents));
- if (content_text)
- gtk_text_buffer_set_text (buffer, content_text, -1);
- g_signal_connect_object (buffer, "changed",
- G_CALLBACK (update_statusbar), status, 0);
- g_signal_connect_object (buffer, "mark-set",
- G_CALLBACK (mark_set_callback), status, 0);
+ DemoApplicationWindow *window;
- update_statusbar (buffer, GTK_STATUSBAR (status));
-
- gtk_widget_show_all (window);
-
- g_object_unref (builder);
+ window = (DemoApplicationWindow *)g_object_new (demo_application_window_get_type (), NULL);
+ if (content)
+ gtk_text_buffer_set_text (window->buffer, content, -1);
}
static void
@@ -414,16 +376,12 @@ activate (GApplication *app)
create_window (app, NULL);
}
-int
-main (int argc, char *argv[])
+static void
+demo_application_init (DemoApplication *app)
{
- GtkApplication *app;
GSettings *settings;
GAction *action;
- gtk_init (NULL, NULL);
-
- app = gtk_application_new ("org.gtk.Demo2", 0);
settings = g_settings_new ("org.gtk.Demo");
g_action_map_add_action_entries (G_ACTION_MAP (app),
@@ -433,13 +391,50 @@ main (int argc, char *argv[])
action = g_settings_create_action (settings, "color");
g_action_map_add_action (G_ACTION_MAP (app), action);
+}
+
+static void
+demo_application_class_init (DemoApplicationClass *class)
+{
+ GApplicationClass *app_class = G_APPLICATION_CLASS (class);
+
+ app_class->startup = startup;
+ app_class->activate = activate;
+}
+
+static void
+demo_application_window_init (DemoApplicationWindow *win)
+{
+ gtk_widget_init_template (GTK_WIDGET (win));
+ g_action_map_add_action_entries (G_ACTION_MAP (win),
+ win_entries, G_N_ELEMENTS (win_entries),
+ win);
+}
- g_signal_connect (app, "startup", G_CALLBACK (startup), NULL);
- g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
+static void
+demo_application_window_class_init (DemoApplicationWindowClass *class)
+{
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
+
+ gtk_widget_class_set_template_from_resource (widget_class, "/application/application.ui");
+ gtk_widget_class_bind_template_child (widget_class, DemoApplicationWindow, message);
+ gtk_widget_class_bind_template_child (widget_class, DemoApplicationWindow, infobar);
+ gtk_widget_class_bind_template_child (widget_class, DemoApplicationWindow, buffer);
+ gtk_widget_class_bind_template_callback (widget_class, clicked_cb);
+ gtk_widget_class_bind_template_callback (widget_class, update_statusbar);
+ gtk_widget_class_bind_template_callback (widget_class, mark_set_callback);
+}
- g_application_run (G_APPLICATION (app), 0, NULL);
+int
+main (int argc, char *argv[])
+{
+ GtkApplication *app;
+
+ app = GTK_APPLICATION (g_object_new (demo_application_get_type (),
+ "application-id", "org.gtk.Demo2",
+ NULL));
- return 0;
+ return g_application_run (G_APPLICATION (app), 0, NULL);
}
#else /* !STANDALONE */
@@ -513,15 +508,15 @@ do_application (GtkWidget *toplevel)
else
{
g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL),
- "org.gtk.Demo2",
- "/org/gtk/Demo2",
- "org.gtk.Actions",
- "Activate",
- g_variant_new ("(sava{sv})", "quit", NULL, NULL),
- NULL,
- 0,
- G_MAXINT,
- NULL, NULL);
+ "org.gtk.Demo2",
+ "/org/gtk/Demo2",
+ "org.gtk.Actions",
+ "Activate",
+ g_variant_new ("(sava{sv})", "quit", NULL, NULL),
+ NULL,
+ 0,
+ G_MAXINT,
+ NULL, NULL);
}
return placeholder;
diff --git a/demos/gtk-demo/application.ui b/demos/gtk-demo/application.ui
index b3d8753..4945b2e 100644
--- a/demos/gtk-demo/application.ui
+++ b/demos/gtk-demo/application.ui
@@ -1,100 +1,126 @@
<?xml version="1.0"?>
<interface>
- <object class="GtkGrid" id="grid">
+ <template class="DemoApplicationWindow" parent="GtkWindow">
+ <property name="title" translatable="yes">Application Class</property>
+ <property name="default-width">200</property>
+ <property name="default-height">200</property>
+ <property name="icon-name">document-open</property>
+ <property name="visible">1</property>
<child>
- <object class="GtkToolbar" id="toolbar">
- <property name="hexpand">1</property>
- <style>
- <class name="primary-toolbar"/>
- </style>
- <child>
- <object class="GtkMenuToolButton" id="menutool">
- <property name="icon-name">document-open</property>
- </object>
- </child>
+ <object class="GtkGrid" id="grid">
+ <property name="visible">1</property>
<child>
- <object class="GtkToolButton" id="quit">
- <property name="icon-name">application-exit</property>
- <property name="action-name">app.quit</property>
+ <object class="GtkToolbar" id="toolbar">
+ <property name="visible">1</property>
+ <property name="hexpand">1</property>
+ <style>
+ <class name="primary-toolbar"/>
+ </style>
+ <child>
+ <object class="GtkMenuToolButton" id="menutool">
+ <property name="visible">1</property>
+ <property name="icon-name">document-open</property>
+ <property name="menumodel">toolmenu</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="quit">
+ <property name="visible">1</property>
+ <property name="icon-name">application-exit</property>
+ <property name="action-name">app.quit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparatorToolItem" id="sep">
+ <property name="visible">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkToolButton" id="logo">
+ <property name="visible">1</property>
+ <property name="icon-name">applications-other</property>
+ <property name="action-name">win.logo</property>
+ </object>
+ </child>
</object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">0</property>
+ </packing>
</child>
<child>
- <object class="GtkSeparatorToolItem" id="sep"/>
- </child>
- <child>
- <object class="GtkToolButton" id="logo">
- <property name="icon-name">applications-other</property>
- <property name="action-name">win.logo</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkInfoBar" id="infobar">
- <property name="no-show-all">1</property>
- <property name="hexpand">1</property>
- <child internal-child="content_area">
- <object class="GtkBox" id="content_area">
- <child>
- <object class="GtkLabel" id="message">
- <property name="visible">1</property>
- <property name="hexpand">1</property>
+ <object class="GtkInfoBar" id="infobar">
+ <property name="visible">1</property>
+ <property name="no-show-all">1</property>
+ <property name="hexpand">1</property>
+ <child internal-child="content_area">
+ <object class="GtkBox" id="content_area">
+ <child>
+ <object class="GtkLabel" id="message">
+ <property name="visible">1</property>
+ <property name="hexpand">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child internal-child="action_area">
+ <object class="GtkBox" id="action_area">
+ <child>
+ <object class="GtkButton" id="button">
+ <property name="visible">1</property>
+ <property name="valign">center</property>
+ <property name="label" translatable="yes">_OK</property>
+ <property name="use_underline">1</property>
+ <signal name="clicked" handler="cliced_cb" object="infobar"/>
+ </object>
+ </child>
</object>
</child>
</object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">1</property>
+ </packing>
</child>
- <child internal-child="action_area">
- <object class="GtkBox" id="action_area">
+ <child>
+ <object class="GtkScrolledWindow" id="sw">
+ <property name="visible">1</property>
+ <property name="shadow-type">in</property>
<child>
- <object class="GtkButton" id="button">
+ <object class="GtkTextView" id="contents">
<property name="visible">1</property>
- <property name="valign">center</property>
- <property name="label" translatable="yes">_OK</property>
- <property name="use_underline">1</property>
+ <property name="hexpand">1</property>
+ <property name="vexpand">1</property>
+ <property name="buffer">buffer</property>
</object>
</child>
</object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">2</property>
+ </packing>
</child>
- </object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow" id="sw">
- <property name="shadow-type">in</property>
<child>
- <object class="GtkTextView" id="contents">
+ <object class="GtkStatusbar" id="status">
<property name="hexpand">1</property>
- <property name="vexpand">1</property>
+ <property name="visible">1</property>
</object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">3</property>
+ </packing>
</child>
</object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">2</property>
- </packing>
</child>
- <child>
- <object class="GtkStatusbar" id="status">
- <property name="hexpand">1</property>
- <property name="visible">1</property>
- </object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">3</property>
- </packing>
- </child>
- </object>
+ </template>
<menu id="toolmenu">
<item>
<attribute name="label">File1</attribute>
<attribute name="action">win.file1</attribute>
</item>
</menu>
+ <object class="GtkTextBuffer" id="buffer">
+ <signal name="changed" handler="update_statusbar" object="status"/>
+ <signal name="mark-set" handler="mark_set_callback" object="status"/>
+ </object>
</interface>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]