summaryrefslogtreecommitdiff
path: root/examples/application4
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2013-07-20 00:21:48 -0400
committerMatthias Clasen <mclasen@redhat.com>2013-07-20 23:04:47 -0400
commit8087bb7a22303064fef947fc72639fcf70ce1515 (patch)
tree6f27902fc47b4d89f831eeb125a0ede3de1d3d17 /examples/application4
parent68025551e13eebcd8c610b104d309494a3aa973d (diff)
downloadgtk+-8087bb7a22303064fef947fc72639fcf70ce1515.tar.gz
Add a new example app
Add a new example to the getting started part of the docs. The focus of this example is on 'new stuff': GtkApplication, templates, settings, gmenu, gaction, GtkStack, GtkHeaderBar, GtkSearchBar, GtkRevealer, GtkListBox, GtkMenuButton, etc. It is being developed in several steps. Each step is put in a separate directory below examples/: application1, ..., application8. This is a little repetitive, but lets us use the code of all examples in the documentation.
Diffstat (limited to 'examples/application4')
-rw-r--r--examples/application4/Makefile.am31
-rw-r--r--examples/application4/app-menu.ui19
-rw-r--r--examples/application4/exampleapp.c105
-rw-r--r--examples/application4/exampleapp.gresource.xml7
-rw-r--r--examples/application4/exampleapp.h19
-rw-r--r--examples/application4/exampleappwin.c73
-rw-r--r--examples/application4/exampleappwin.h22
-rw-r--r--examples/application4/main.c8
-rw-r--r--examples/application4/window.ui31
9 files changed, 315 insertions, 0 deletions
diff --git a/examples/application4/Makefile.am b/examples/application4/Makefile.am
new file mode 100644
index 0000000000..d20ca0ed02
--- /dev/null
+++ b/examples/application4/Makefile.am
@@ -0,0 +1,31 @@
+AM_CPPFLAGS = \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/gdk \
+ -I$(top_builddir)/gdk \
+ $(GTK_DEBUG_FLAGS) \
+ $(GTK_DEP_CFLAGS)
+
+LDADD = \
+ $(top_builddir)/gtk/libgtk-3.la \
+ $(top_builddir)/gdk/libgdk-3.la \
+ $(GTK_DEP_LIBS)
+
+
+noinst_PROGRAMS = exampleapp
+
+exampleapp_SOURCES = \
+ main.c \
+ exampleapp.c exampleapp.h \
+ exampleappwin.c exampleappwin.h \
+ resources.c
+
+BUILT_SOURCES = resources.c
+
+resources.c: exampleapp.gresource.xml window.ui app-menu.ui
+ $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) $(srcdir)/exampleapp.gresource.xml \
+ --target=$@ --sourcedir=$(srcdir) --generate-source
+
+EXTRA_DIST = \
+ window.ui \
+ app-menu.ui \
+ exampleapp.gresource.xml
diff --git a/examples/application4/app-menu.ui b/examples/application4/app-menu.ui
new file mode 100644
index 0000000000..b0eddb65e5
--- /dev/null
+++ b/examples/application4/app-menu.ui
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <menu id="appmenu">
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Preferences</attribute>
+ <attribute name="action">app.preferences</attribute>
+ </item>
+ </section>
+ <section>
+ <item>
+ <attribute name="label" translatable="yes">_Quit</attribute>
+ <attribute name="action">app.quit</attribute>
+ <attribute name="accel"><![CDATA[<Ctrl>Q]]></attribute>
+ </item>
+ </section>
+ </menu>
+</interface>
diff --git a/examples/application4/exampleapp.c b/examples/application4/exampleapp.c
new file mode 100644
index 0000000000..77ced6b501
--- /dev/null
+++ b/examples/application4/exampleapp.c
@@ -0,0 +1,105 @@
+#include <gtk/gtk.h>
+
+#include "exampleapp.h"
+#include "exampleappwin.h"
+
+struct ExampleApp {
+ GtkApplication parent;
+};
+
+struct ExampleAppClass {
+ GtkApplicationClass parent_class;
+};
+
+G_DEFINE_TYPE(ExampleApp, example_app, GTK_TYPE_APPLICATION);
+
+static void
+example_app_init (ExampleApp *app)
+{
+}
+
+static void
+preferences_activated (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer app)
+{
+}
+
+static void
+quit_activated (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer app)
+{
+ g_application_quit (G_APPLICATION (app));
+}
+
+static GActionEntry app_entries[] = {
+ { "preferences", preferences_activated, NULL, NULL, NULL },
+ { "quit", quit_activated, NULL, NULL, NULL }
+};
+
+static void
+example_app_startup (GApplication *app)
+{
+ GtkBuilder *builder;
+ GMenuModel *app_menu;
+
+ G_APPLICATION_CLASS (example_app_parent_class)->startup (app);
+
+ g_action_map_add_action_entries (G_ACTION_MAP (app),
+ app_entries, G_N_ELEMENTS (app_entries),
+ app);
+
+ builder = gtk_builder_new_from_resource ("/org/gtk/exampleapp/app-menu.ui");
+ app_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "appmenu"));
+ gtk_application_set_app_menu (GTK_APPLICATION (app), app_menu);
+ g_object_unref (builder);
+}
+
+static void
+example_app_activate (GApplication *app)
+{
+ ExampleAppWindow *win;
+
+ win = example_app_window_new (EXAMPLE_APP (app));
+ gtk_window_present (GTK_WINDOW (win));
+}
+
+static void
+example_app_open (GApplication *app,
+ GFile **files,
+ gint n_files,
+ const gchar *hint)
+{
+ GList *windows;
+ ExampleAppWindow *win;
+ int i;
+
+ windows = gtk_application_get_windows (GTK_APPLICATION (app));
+ if (windows)
+ win = EXAMPLE_APP_WINDOW (windows->data);
+ else
+ win = example_app_window_new (EXAMPLE_APP (app));
+
+ for (i = 0; i < n_files; i++)
+ example_app_window_open (win, files[i]);
+
+ gtk_window_present (GTK_WINDOW (win));
+}
+
+static void
+example_app_class_init (ExampleAppClass *class)
+{
+ G_APPLICATION_CLASS (class)->startup = example_app_startup;
+ G_APPLICATION_CLASS (class)->activate = example_app_activate;
+ G_APPLICATION_CLASS (class)->open = example_app_open;
+}
+
+ExampleApp *
+example_app_new (void)
+{
+ return g_object_new (EXAMPLE_APP_TYPE,
+ "application-id", "org.gtk.exampleapp",
+ "flags", G_APPLICATION_HANDLES_OPEN,
+ NULL);
+}
diff --git a/examples/application4/exampleapp.gresource.xml b/examples/application4/exampleapp.gresource.xml
new file mode 100644
index 0000000000..1c9b11821f
--- /dev/null
+++ b/examples/application4/exampleapp.gresource.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gtk/exampleapp">
+ <file preprocess="xml-stripblanks">window.ui</file>
+ <file preprocess="xml-stripblanks">app-menu.ui</file>
+ </gresource>
+</gresources>
diff --git a/examples/application4/exampleapp.h b/examples/application4/exampleapp.h
new file mode 100644
index 0000000000..8b51c598ea
--- /dev/null
+++ b/examples/application4/exampleapp.h
@@ -0,0 +1,19 @@
+#ifndef __EXAMPLEAPP_H
+#define __EXAMPLEAPP_H
+
+#include <gtk/gtk.h>
+
+
+#define EXAMPLE_APP_TYPE (example_app_get_type ())
+#define EXAMPLE_APP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EXAMPLE_APP_TYPE, ExampleApp))
+
+
+typedef struct ExampleApp ExampleApp;
+typedef struct ExampleAppClass ExampleAppClass;
+
+
+GType example_app_get_type (void);
+ExampleApp *example_app_new (void);
+
+
+#endif /* __EXAMPLEAPP_H */
diff --git a/examples/application4/exampleappwin.c b/examples/application4/exampleappwin.c
new file mode 100644
index 0000000000..52306e1fd7
--- /dev/null
+++ b/examples/application4/exampleappwin.c
@@ -0,0 +1,73 @@
+#include "exampleapp.h"
+#include "exampleappwin.h"
+#include <gtk/gtk.h>
+
+struct ExampleAppWindow {
+ GtkApplicationWindow parent;
+};
+
+struct ExampleAppWindowClass {
+ GtkApplicationWindowClass parent_class;
+};
+
+typedef struct ExampleAppWindowPrivate ExampleAppWindowPrivate;
+
+struct ExampleAppWindowPrivate {
+ GtkWidget *stack;
+};
+
+G_DEFINE_TYPE_WITH_PRIVATE(ExampleAppWindow, example_app_window, GTK_TYPE_APPLICATION_WINDOW);
+
+static void
+example_app_window_init (ExampleAppWindow *win)
+{
+ gtk_widget_init_template (GTK_WIDGET (win));
+}
+
+static void
+example_app_window_class_init (ExampleAppWindowClass *class)
+{
+ gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (class),
+ "/org/gtk/exampleapp/window.ui");
+ gtk_widget_class_bind_child (GTK_WIDGET_CLASS (class), ExampleAppWindowPrivate, stack);
+}
+
+ExampleAppWindow *
+example_app_window_new (ExampleApp *app)
+{
+ return g_object_new (EXAMPLE_APP_WINDOW_TYPE, "application", app, NULL);
+}
+
+void
+example_app_window_open (ExampleAppWindow *win,
+ GFile *file)
+{
+ ExampleAppWindowPrivate *priv = example_app_window_get_instance_private (win);
+ gchar *basename;
+ GtkWidget *scrolled, *view;
+ gchar *contents;
+ gsize length;
+
+ basename = g_file_get_basename (file);
+
+ scrolled = gtk_scrolled_window_new (NULL, NULL);
+ gtk_widget_show (scrolled);
+ gtk_widget_set_hexpand (scrolled, TRUE);
+ gtk_widget_set_vexpand (scrolled, TRUE);
+ view = gtk_text_view_new ();
+ gtk_text_view_set_editable (GTK_TEXT_VIEW (view), FALSE);
+ gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (view), FALSE);
+ gtk_widget_show (view);
+ gtk_container_add (GTK_CONTAINER (scrolled), view);
+ gtk_stack_add_titled (GTK_STACK (priv->stack), scrolled, basename, basename);
+
+ if (g_file_load_contents (file, NULL, &contents, &length, NULL, NULL)) {
+ GtkTextBuffer *buffer;
+
+ buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
+ gtk_text_buffer_set_text (buffer, contents, length);
+ g_free (contents);
+ }
+
+ g_free (basename);
+}
diff --git a/examples/application4/exampleappwin.h b/examples/application4/exampleappwin.h
new file mode 100644
index 0000000000..11ff3c27a7
--- /dev/null
+++ b/examples/application4/exampleappwin.h
@@ -0,0 +1,22 @@
+#ifndef __EXAMPLEAPPWIN_H
+#define __EXAMPLEAPPWIN_H
+
+#include <gtk/gtk.h>
+#include "exampleapp.h"
+
+
+#define EXAMPLE_APP_WINDOW_TYPE (example_app_window_get_type ())
+#define EXAMPLE_APP_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EXAMPLE_APP_WINDOW_TYPE, ExampleAppWindow))
+
+
+typedef struct ExampleAppWindow ExampleAppWindow;
+typedef struct ExampleAppWindowClass ExampleAppWindowClass;
+
+
+GType example_app_window_get_type (void);
+ExampleAppWindow *example_app_window_new (ExampleApp *app);
+void example_app_window_open (ExampleAppWindow *win,
+ GFile *file);
+
+
+#endif /* __EXAMPLEAPPWIN_H */
diff --git a/examples/application4/main.c b/examples/application4/main.c
new file mode 100644
index 0000000000..7c24d8b04e
--- /dev/null
+++ b/examples/application4/main.c
@@ -0,0 +1,8 @@
+#include <gtk/gtk.h>
+#include <exampleapp.h>
+
+int
+main (int argc, char *argv[])
+{
+ return g_application_run (G_APPLICATION (example_app_new ()), argc, argv);
+}
diff --git a/examples/application4/window.ui b/examples/application4/window.ui
new file mode 100644
index 0000000000..d90c3f618c
--- /dev/null
+++ b/examples/application4/window.ui
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.8 -->
+ <template class="ExampleAppWindow" parent="GtkApplicationWindow">
+ <property name="title" translatable="yes">Example Application</property>
+ <property name="default-width">600</property>
+ <property name="default-height">400</property>
+ <child>
+ <object class="GtkBox" id="content_box">
+ <property name="visible">True</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkHeaderBar" id="header">
+ <property name="visible">True</property>
+ <child type="title">
+ <object class="GtkStackSwitcher" id="tabs">
+ <property name="visible">True</property>
+ <property name="stack">stack</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStack" id="stack">
+ <property name="visible">True</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>