Add a GtkApplication example to gtk3-demo
This commit is contained in:
		| @ -6,6 +6,7 @@ democodedir=$(datadir)/gtk-$(GTK_API_VERSION)/demo | ||||
| ## These should be in the order you want them to appear in the | ||||
| ## demo app, which means alphabetized by demo title, not filename | ||||
| demos =						\ | ||||
| 	application.c				\ | ||||
| 	appwindow.c				\ | ||||
| 	assistant.c				\ | ||||
| 	builder.c				\ | ||||
| @ -65,13 +66,17 @@ LDADDS = \ | ||||
| 	$(GTK_DEP_LIBS)				\ | ||||
| 	-lm | ||||
|  | ||||
| bin_PROGRAMS = gtk3-demo | ||||
| bin_PROGRAMS = gtk3-demo gtk3-demo-application | ||||
|  | ||||
| BUILT_SOURCES = demos.h | ||||
| BUILT_SOURCES = demos.h application_resources.c | ||||
|  | ||||
| EXTRA_DIST += 		\ | ||||
| 	$(IMAGEFILES)	\ | ||||
| 	demo.ui | ||||
| 	demo.ui		\ | ||||
| 	application.gresource.xml \ | ||||
| 	application.ui	\ | ||||
| 	gtk-logo-24.png	\ | ||||
| 	gtk-logo-48.png | ||||
|  | ||||
| demos.h: @REBUILD@ $(demos) geninclude.pl | ||||
| 	$(AM_V_GEN) (here=`pwd` ; cd $(srcdir) && $(PERL) $$here/geninclude.pl $(demos)) > demos.h | ||||
| @ -86,8 +91,17 @@ gtk3_demo_DEPENDENCIES = $(DEPS) | ||||
| gtk3_demo_LDADD = $(LDADDS) | ||||
| gtk3_demo_LDFLAGS = -export-dynamic | ||||
|  | ||||
| gtk3_demo_application_SOURCES = \ | ||||
| 	application-standalone.c \ | ||||
| 	application_resources.c | ||||
|  | ||||
| gtk3_demo_application_LDADD = $(LDADDS) | ||||
|  | ||||
| application_resources.c: application.gresource.xml gtk-logo-24.png gtk-logo-48.png application.ui | ||||
| 	glib-compile-resources --target=$@ --sourcedir=$(srcdir) --generate-source $(srcdir)/application.gresource.xml | ||||
|  | ||||
| IMAGEFILES=	alphatest.png		\ | ||||
| 	        apple-red.png		\ | ||||
| 		apple-red.png		\ | ||||
| 		background.jpg		\ | ||||
| 		floppybuddy.gif		\ | ||||
| 		gnome-applets.png	\ | ||||
|  | ||||
							
								
								
									
										461
									
								
								demos/gtk-demo/application.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										461
									
								
								demos/gtk-demo/application.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,461 @@ | ||||
| /* Application class | ||||
|  * | ||||
|  * Demonstrates a simple application. | ||||
|  * | ||||
|  * This examples uses GtkApplication, GtkApplicationWindow, GtkBuilder | ||||
|  * as well as GMenu and GResource. Due to the way GtkApplication is structured, | ||||
|  * it is run as a separate process. | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include <gtk/gtk.h> | ||||
|  | ||||
| #ifdef STANDALONE | ||||
|  | ||||
| static void | ||||
| show_action_dialog (GSimpleAction *action) | ||||
| { | ||||
|   const gchar *name; | ||||
|   GtkWidget *dialog; | ||||
|  | ||||
|   name = g_action_get_name (G_ACTION (action)); | ||||
|  | ||||
|   dialog = gtk_message_dialog_new (NULL, | ||||
|                                    GTK_DIALOG_DESTROY_WITH_PARENT, | ||||
|                                    GTK_MESSAGE_INFO, | ||||
|                                    GTK_BUTTONS_CLOSE, | ||||
|                                    "You activated action: \"%s\"", | ||||
|                                     name); | ||||
|  | ||||
|   g_signal_connect (dialog, "response", | ||||
|                     G_CALLBACK (gtk_widget_destroy), NULL); | ||||
|  | ||||
|   gtk_widget_show (dialog); | ||||
| } | ||||
|  | ||||
| static void | ||||
| show_action_infobar (GSimpleAction *action, | ||||
|                      GVariant      *parameter, | ||||
|                      gpointer       window) | ||||
| { | ||||
|   GtkWidget *infobar; | ||||
|   GtkWidget *message; | ||||
|   gchar *text; | ||||
|   const gchar *name; | ||||
|   const gchar *value; | ||||
|  | ||||
|   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); | ||||
|   g_free (text); | ||||
| } | ||||
|  | ||||
| static void | ||||
| activate_action (GSimpleAction  *action, | ||||
|                  GVariant       *parameter, | ||||
|                  gpointer        user_data) | ||||
| { | ||||
|   show_action_dialog (action); | ||||
| } | ||||
|  | ||||
| static void | ||||
| activate_toggle (GSimpleAction *action, | ||||
|                  GVariant      *parameter, | ||||
|                  gpointer       user_data) | ||||
| { | ||||
|   GVariant *state; | ||||
|  | ||||
|   show_action_dialog (action); | ||||
|  | ||||
|   state = g_action_get_state (G_ACTION (action)); | ||||
|   g_action_change_state (G_ACTION (action), g_variant_new_boolean (!g_variant_get_boolean (state))); | ||||
|   g_variant_unref (state); | ||||
| } | ||||
|  | ||||
| static void | ||||
| activate_radio (GSimpleAction *action, | ||||
|                 GVariant      *parameter, | ||||
|                 gpointer       user_data) | ||||
| { | ||||
|   show_action_infobar (action, parameter, user_data); | ||||
|  | ||||
|   g_action_change_state (G_ACTION (action), parameter); | ||||
| } | ||||
|  | ||||
| static void | ||||
| activate_about (GSimpleAction *action, | ||||
|                 GVariant      *parameter, | ||||
|                 gpointer       user_data) | ||||
| { | ||||
|   GtkWidget *window = user_data; | ||||
|   GdkPixbuf *pixbuf; | ||||
|   GInputStream *stream; | ||||
|  | ||||
|   const gchar *authors[] = { | ||||
|     "Peter Mattis", | ||||
|     "Spencer Kimball", | ||||
|     "Josh MacDonald", | ||||
|     "and many more...", | ||||
|     NULL | ||||
|   }; | ||||
|  | ||||
|   const gchar *documentors[] = { | ||||
|     "Owen Taylor", | ||||
|     "Tony Gale", | ||||
|     "Matthias Clasen <mclasen@redhat.com>", | ||||
|     "and many more...", | ||||
|     NULL | ||||
|   }; | ||||
|  | ||||
|   stream = g_resources_open_stream ("/logos/gtk-logo-48.png", 0, NULL); | ||||
|   pixbuf = gdk_pixbuf_new_from_stream (stream, NULL, NULL); | ||||
|   g_object_unref (stream); | ||||
|  | ||||
|   gtk_show_about_dialog (GTK_WINDOW (window), | ||||
|                          "program-name", "GTK+ Code Demos", | ||||
|                          "version", g_strdup_printf ("%s,\nRunning against GTK+ %d.%d.%d", | ||||
|                                                      PACKAGE_VERSION, | ||||
|                                                      gtk_get_major_version (), | ||||
|                                                      gtk_get_minor_version (), | ||||
|                                                      gtk_get_micro_version ()), | ||||
|                          "copyright", "(C) 1997-2009 The GTK+ Team", | ||||
|                          "license-type", GTK_LICENSE_LGPL_2_1, | ||||
|                          "website", "http://www.gtk.org", | ||||
|                          "comments", "Program to demonstrate GTK+ functions.", | ||||
|                          "authors", authors, | ||||
|                          "documenters", documentors, | ||||
|                          "logo", pixbuf, | ||||
|                          "title", "About GTK+ Code Demos", | ||||
|                          NULL); | ||||
|   g_object_unref (pixbuf); | ||||
| } | ||||
|  | ||||
| static void | ||||
| activate_quit (GSimpleAction *action, | ||||
|                GVariant      *parameter, | ||||
|                gpointer       user_data) | ||||
| { | ||||
|   GtkApplication *app = user_data; | ||||
|   GtkWidget *win; | ||||
|   GList *list, *next; | ||||
|  | ||||
|   list = gtk_application_get_windows (app); | ||||
|   while (list) | ||||
|     { | ||||
|       win = list->data; | ||||
|       next = list->next; | ||||
|  | ||||
|       gtk_widget_destroy (GTK_WIDGET (win)); | ||||
|  | ||||
|       list = next; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| register_stock_icons (void) | ||||
| { | ||||
|   static gboolean registered = FALSE; | ||||
|  | ||||
|   if (!registered) | ||||
|     { | ||||
|       GdkPixbuf *pixbuf; | ||||
|       GtkIconFactory *factory; | ||||
|       GtkIconSet *icon_set; | ||||
|       GInputStream *stream; | ||||
|  | ||||
|       static GtkStockItem items[] = { | ||||
|         { "demo-gtk-logo", "_GTK!", 0, 0, NULL } | ||||
|       }; | ||||
|  | ||||
|       registered = TRUE; | ||||
|  | ||||
|       gtk_stock_add (items, G_N_ELEMENTS (items)); | ||||
|  | ||||
|       factory = gtk_icon_factory_new (); | ||||
|       gtk_icon_factory_add_default (factory); | ||||
|  | ||||
|       stream = g_resources_open_stream ("/logos/gtk-logo-24.png", 0, NULL); | ||||
|       pixbuf = gdk_pixbuf_new_from_stream (stream, NULL, NULL); | ||||
|       g_object_unref (stream); | ||||
|  | ||||
|       icon_set = gtk_icon_set_new_from_pixbuf (pixbuf); | ||||
|       gtk_icon_factory_add (factory, "demo-gtk-logo", icon_set); | ||||
|       gtk_icon_set_unref (icon_set); | ||||
|       g_object_unref (pixbuf); | ||||
|  | ||||
|       /* Drop our reference to the factory, GTK will hold a reference. */ | ||||
|       g_object_unref (factory); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_statusbar (GtkTextBuffer *buffer, | ||||
|                   GtkStatusbar  *statusbar) | ||||
| { | ||||
|   gchar *msg; | ||||
|   gint row, col; | ||||
|   gint count; | ||||
|   GtkTextIter iter; | ||||
|  | ||||
|   /* clear any previous message, underflow is allowed */ | ||||
|   gtk_statusbar_pop (statusbar, 0); | ||||
|  | ||||
|   count = gtk_text_buffer_get_char_count (buffer); | ||||
|  | ||||
|   gtk_text_buffer_get_iter_at_mark (buffer, | ||||
|                                     &iter, | ||||
|                                     gtk_text_buffer_get_insert (buffer)); | ||||
|  | ||||
|   row = gtk_text_iter_get_line (&iter); | ||||
|   col = gtk_text_iter_get_line_offset (&iter); | ||||
|  | ||||
|   msg = g_strdup_printf ("Cursor at row %d column %d - %d chars in document", | ||||
|                          row, col, count); | ||||
|  | ||||
|   gtk_statusbar_push (statusbar, 0, msg); | ||||
|  | ||||
|   g_free (msg); | ||||
| } | ||||
|  | ||||
| static void | ||||
| mark_set_callback (GtkTextBuffer     *buffer, | ||||
|                    const GtkTextIter *new_location, | ||||
|                    GtkTextMark       *mark, | ||||
|                    gpointer           data) | ||||
| { | ||||
|   update_statusbar (buffer, GTK_STATUSBAR (data)); | ||||
| } | ||||
|  | ||||
| static void | ||||
| change_theme_state (GSimpleAction *action, | ||||
|                     GVariant      *state, | ||||
|                     gpointer       user_data) | ||||
| { | ||||
|   GtkSettings *settings = gtk_settings_get_default (); | ||||
|  | ||||
|   g_object_set (G_OBJECT (settings), | ||||
|                 "gtk-application-prefer-dark-theme", | ||||
|                 g_variant_get_boolean (state), | ||||
|                 NULL); | ||||
|  | ||||
|   g_simple_action_set_state (action, state); | ||||
| } | ||||
|  | ||||
| static void | ||||
| change_titlebar_state (GSimpleAction *action, | ||||
|                        GVariant      *state, | ||||
|                        gpointer       user_data) | ||||
| { | ||||
|   GtkWindow *window = user_data; | ||||
|  | ||||
|   gtk_window_set_hide_titlebar_when_maximized (GTK_WINDOW (window), | ||||
|                                                g_variant_get_boolean (state)); | ||||
|  | ||||
|   g_simple_action_set_state (action, state); | ||||
| } | ||||
|  | ||||
| static void | ||||
| change_radio_state (GSimpleAction *action, | ||||
|                     GVariant      *state, | ||||
|                     gpointer       user_data) | ||||
| { | ||||
|   g_simple_action_set_state (action, state); | ||||
| } | ||||
|  | ||||
| static GActionEntry app_entries[] = { | ||||
|   { "new", activate_action, NULL, NULL, NULL }, | ||||
|   { "open", activate_action, NULL, NULL, NULL }, | ||||
|   { "save", activate_action, NULL, NULL, NULL }, | ||||
|   { "save-as", activate_action, NULL, NULL, NULL }, | ||||
|   { "quit", activate_quit, NULL, NULL, NULL }, | ||||
|   { "dark", activate_toggle, NULL, "false", change_theme_state } | ||||
| }; | ||||
|  | ||||
| static GActionEntry win_entries[] = { | ||||
|   { "titlebar", activate_toggle, NULL, "false", change_titlebar_state }, | ||||
|   { "color", activate_radio, "s", "'red'", change_radio_state }, | ||||
|   { "shape", activate_radio, "s", "'oval'", change_radio_state }, | ||||
|   { "bold", activate_toggle, NULL, "false", NULL }, | ||||
|   { "about", activate_about, NULL, NULL, NULL }, | ||||
|   { "logo", activate_action, NULL, NULL, NULL } | ||||
| }; | ||||
|  | ||||
| static void | ||||
| clicked_cb (GtkWidget *widget, GtkWidget *info) | ||||
| { | ||||
|   gtk_widget_hide (info); | ||||
| } | ||||
|  | ||||
| static void | ||||
| activate (GApplication *app) | ||||
| { | ||||
|   GtkBuilder *builder; | ||||
|   GtkWidget *window; | ||||
|   GtkWidget *grid; | ||||
|   GtkWidget *contents; | ||||
|   GtkWidget *status; | ||||
|   GtkWidget *message; | ||||
|   GtkWidget *button; | ||||
|   GtkWidget *infobar; | ||||
|   GtkTextBuffer *buffer; | ||||
|   GMenuModel *appmenu, *menubar; | ||||
|   GBytes *bytes; | ||||
|   const gchar *data; | ||||
|   gsize size; | ||||
|  | ||||
|   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 (); | ||||
|  | ||||
|   bytes = g_resources_lookup_data ("/ui/application.ui", 0, NULL); | ||||
|   data = g_bytes_get_data (bytes, &size); | ||||
|   gtk_builder_add_from_string (builder, data, size, NULL); | ||||
|   g_bytes_unref (bytes); | ||||
|  | ||||
|   grid = (GtkWidget *)gtk_builder_get_object (builder, "grid"); | ||||
|   appmenu = (GMenuModel *)gtk_builder_get_object (builder, "appmenu"); | ||||
|   menubar = (GMenuModel *)gtk_builder_get_object (builder, "menubar"); | ||||
|   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"); | ||||
|  | ||||
|   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_application_set_app_menu (GTK_APPLICATION (app), appmenu); | ||||
|   gtk_application_set_menubar (GTK_APPLICATION (app), menubar); | ||||
|  | ||||
|   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)); | ||||
|   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); | ||||
|  | ||||
|   update_statusbar (buffer, GTK_STATUSBAR (status)); | ||||
|  | ||||
|   gtk_widget_show_all (window); | ||||
| } | ||||
|  | ||||
| int | ||||
| main (int argc, char *argv[]) | ||||
| { | ||||
|   GtkApplication *app; | ||||
|  | ||||
|   gtk_init (NULL, NULL); | ||||
|  | ||||
|   register_stock_icons (); | ||||
|  | ||||
|   app = gtk_application_new ("org.gtk.Demo", 0); | ||||
|  | ||||
|   g_action_map_add_action_entries (G_ACTION_MAP (app), | ||||
|                                    app_entries, G_N_ELEMENTS (app_entries), | ||||
|                                    app); | ||||
|  | ||||
|   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); | ||||
|  | ||||
|   g_application_run (G_APPLICATION (app), 0, NULL); | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| #else /* !STANDALONE */ | ||||
|  | ||||
| static gboolean name_seen; | ||||
| static GtkWidget *placeholder; | ||||
|  | ||||
| static void | ||||
| on_name_appeared (GDBusConnection *connection, | ||||
|                   const gchar     *name, | ||||
|                   const gchar     *name_owner, | ||||
|                   gpointer         user_data) | ||||
| { | ||||
|   name_seen = TRUE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_name_vanished (GDBusConnection *connection, | ||||
|                   const gchar     *name, | ||||
|                   gpointer         user_data) | ||||
| { | ||||
|   if (!name_seen) | ||||
|     return; | ||||
|  | ||||
|   if (placeholder) | ||||
|     { | ||||
|       gtk_widget_destroy (placeholder); | ||||
|       g_object_unref (placeholder); | ||||
|       placeholder = NULL; | ||||
|     } | ||||
| } | ||||
|  | ||||
| GtkWidget * | ||||
| do_application (GtkWidget *toplevel) | ||||
| { | ||||
|   static guint watch = 0; | ||||
|  | ||||
|   if (watch == 0) | ||||
|     watch = g_bus_watch_name (G_BUS_TYPE_SESSION, | ||||
|                               "org.gtk.Demo", | ||||
|                               0, | ||||
|                               on_name_appeared, | ||||
|                               on_name_vanished, | ||||
|                               NULL, NULL); | ||||
|  | ||||
|   if (placeholder == NULL) | ||||
|     { | ||||
|       const gchar *command; | ||||
|       GError *error = NULL; | ||||
|  | ||||
|       if (g_file_test ("./gtk3-demo-application", G_FILE_TEST_IS_EXECUTABLE)) | ||||
|         command = "./gtk3-demo-application"; | ||||
|       else | ||||
|         command = "gtk3-demo-application"; | ||||
|  | ||||
|       if (!g_spawn_command_line_async (command, &error)) | ||||
|         { | ||||
|           g_warning ("%s", error->message); | ||||
|           g_error_free (error); | ||||
|         } | ||||
|  | ||||
|       placeholder = gtk_label_new (""); | ||||
|       g_object_ref_sink (placeholder); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       g_dbus_connection_call_sync (g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL), | ||||
|                               "org.gtk.Demo", | ||||
|                               "/org/gtk/Demo", | ||||
|                               "org.gtk.Actions", | ||||
|                               "Activate", | ||||
|                               g_variant_new ("(sava{sv})", "quit", NULL, NULL), | ||||
|                               NULL, | ||||
|                               0, | ||||
|                               G_MAXINT, | ||||
|                               NULL, NULL); | ||||
|     } | ||||
|  | ||||
|   return placeholder; | ||||
| } | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										10
									
								
								demos/gtk-demo/application.gresource.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								demos/gtk-demo/application.gresource.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,10 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <gresources> | ||||
|   <gresource prefix="/logos"> | ||||
|     <file>gtk-logo-24.png</file> | ||||
|     <file>gtk-logo-48.png</file> | ||||
|   </gresource> | ||||
|   <gresource prefix="/ui"> | ||||
|     <file>application.ui</file> | ||||
|   </gresource> | ||||
| </gresources> | ||||
							
								
								
									
										150
									
								
								demos/gtk-demo/application.ui
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										150
									
								
								demos/gtk-demo/application.ui
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,150 @@ | ||||
| <?xml version="1.0"?> | ||||
| <interface> | ||||
|   <object class="GtkGrid" id="grid"> | ||||
|     <child> | ||||
|       <object class="GtkToolbar" id="toolbar"> | ||||
|         <property name="orientation">horizontal</property> | ||||
|         <property name="halign">fill</property> | ||||
|         <property name="hexpand">True</property> | ||||
|         <child> | ||||
|           <object class="GtkMenuToolButton" id="menu"> | ||||
|             <property name="stock-id">gtk-open</property> | ||||
|             <child type="menu"> | ||||
|               <object class="GtkMenu" id="m"> | ||||
|                 <child> | ||||
|                   <object class="GtkMenuItem" id="file"> | ||||
|                     <property name="visible">True</property> | ||||
|                     <property name="label">File1</property> | ||||
|                   </object> | ||||
|                 </child> | ||||
|               </object> | ||||
|             </child> | ||||
|           </object> | ||||
|         </child> | ||||
|         <child> | ||||
|           <object class="GtkToolButton" id="quit"> | ||||
|             <property name="stock-id">gtk-quit</property> | ||||
|             <property name="action-name">app.quit</property> | ||||
|           </object> | ||||
|         </child> | ||||
|         <child> | ||||
|           <object class="GtkSeparatorToolItem" id="sep"> | ||||
|           </object> | ||||
|         </child> | ||||
|         <child> | ||||
|           <object class="GtkToolButton" id="logo"> | ||||
|             <property name="stock-id">demo-gtk-logo</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">True</property> | ||||
|         <property name="halign">fill</property> | ||||
|         <property name="hexpand">True</property> | ||||
|         <child internal-child="content_area"> | ||||
|           <object class="GtkBox" id="content_area"> | ||||
|             <child> | ||||
|               <object class="GtkLabel" id="message"> | ||||
|                 <property name="visible">True</property> | ||||
|                 <property name="hexpand">True</property> | ||||
|                 <property name="halign">fill</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">True</property> | ||||
|                 <property name="valign">center</property> | ||||
|                 <property name="label">gtk-ok</property> | ||||
|                 <property name="use-stock">True</property> | ||||
|               </object> | ||||
|             </child> | ||||
|           </object> | ||||
|         </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"> | ||||
|             <property name="halign">fill</property> | ||||
|             <property name="valign">fill</property> | ||||
|             <property name="hexpand">True</property> | ||||
|             <property name="vexpand">True</property> | ||||
|           </object> | ||||
|         </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="halign">fill</property> | ||||
|         <property name="hexpand">True</property> | ||||
|         <property name="visible">True</property> | ||||
|       </object> | ||||
|       <packing> | ||||
|         <property name="left-attach">0</property> | ||||
|         <property name="top-attach">3</property> | ||||
|       </packing> | ||||
|     </child> | ||||
|   </object> | ||||
|   <menu id="appmenu"> | ||||
|     <section> | ||||
|       <item label="_New" action="app.new" accel="<Primary>n"/> | ||||
|       <item label="_Open" action="app.open"/> | ||||
|       <item label="_Save" action="app.save" accel="<Primary>s"/> | ||||
|       <item label="Save _As..." action="app.save-as" accel="<Primary>s"/> | ||||
|     </section> | ||||
|     <section> | ||||
|       <item label="_Quit" action="app.quit" accel="<Primary>q"/> | ||||
|     </section> | ||||
|   </menu> | ||||
|   <menu id="menubar"> | ||||
|     <section> | ||||
|       <submenu label="_Preferences"> | ||||
|         <section> | ||||
|           <item label="_Prefer Dark Theme" action="app.dark"/> | ||||
|           <item label="_Hide Titlebar when maximized" action="win.titlebar"/> | ||||
|           <submenu label="_Color"> | ||||
|             <section> | ||||
|               <item label="_Red" action="win.color" target="red" accel="<Primary>r"/> | ||||
|               <item label="_Green" action="win.color" target="green" accel="<Primary>g"/> | ||||
|               <item label="_Blue" action="win.color" target="blue" accel="<Primary>b"/> | ||||
|             </section> | ||||
|           </submenu> | ||||
|           <submenu label="_Shape"> | ||||
|             <section> | ||||
|               <item label="_Square" action="win.shape" target="square" accel="<Primary>s"/> | ||||
|               <item label="_Rectangle" action="win.shape" target="rectangle" accel="<Primary>r"/> | ||||
|               <item label="_Oval" action="win.shape" target="oval" accel="<Primary>o"/> | ||||
|             </section> | ||||
|           </submenu> | ||||
|           <item label="_Bold" action="win.bold" accel="<Primary>b"/> | ||||
|         </section> | ||||
|       </submenu> | ||||
|       <submenu label="_Help"> | ||||
|         <section> | ||||
|           <item label="_About" action="win.about" accel="<Primary>a"/> | ||||
|         </section> | ||||
|       </submenu> | ||||
|     </section> | ||||
|   </menu> | ||||
| </interface> | ||||
| @ -1,6 +1,8 @@ | ||||
| /* Application main window | ||||
| /* Application window | ||||
|  * | ||||
|  * Demonstrates a typical application window with menubar, toolbar, statusbar. | ||||
|  * | ||||
|  * This example uses GtkUIManager and GtkActionGroup. | ||||
|  */ | ||||
|  | ||||
| #include <gtk/gtk.h> | ||||
|  | ||||
							
								
								
									
										
											BIN
										
									
								
								demos/gtk-demo/gtk-logo-24.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								demos/gtk-demo/gtk-logo-24.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 674 B | 
							
								
								
									
										
											BIN
										
									
								
								demos/gtk-demo/gtk-logo-48.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								demos/gtk-demo/gtk-logo-48.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 2.3 KiB | 
| @ -782,7 +782,7 @@ create_tree (void) | ||||
|   GtkTreeIter iter; | ||||
|   GtkWidget *box, *label, *scrolled_window; | ||||
|  | ||||
|   Demo *d = testgtk_demos; | ||||
|   Demo *d = gtk_demos; | ||||
|  | ||||
|   model = gtk_tree_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_INT); | ||||
|   tree_view = gtk_tree_view_new (); | ||||
| @ -936,10 +936,8 @@ main (int argc, char **argv) | ||||
|    * these few lines, which are just a hack so gtk-demo will work | ||||
|    * in the GTK tree without installing it. | ||||
|    */ | ||||
|   if (g_file_test ("../../gdk-pixbuf/libpixbufloader-pnm.la", | ||||
|                    G_FILE_TEST_EXISTS)) | ||||
|   if (g_file_test ("../../modules/input/immodules.cache", G_FILE_TEST_EXISTS)) | ||||
|     { | ||||
|       g_setenv ("GDK_PIXBUF_MODULE_FILE", "../../gdk-pixbuf/loaders.cache", TRUE); | ||||
|       g_setenv ("GTK_IM_MODULE_FILE", "../../modules/input/immodules.cache", TRUE); | ||||
|     } | ||||
|   /* -- End of hack -- */ | ||||
| @ -1002,7 +1000,7 @@ main (int argc, char **argv) | ||||
|   gtk_window_set_default_size (GTK_WINDOW (window), 600, 400); | ||||
|   gtk_widget_show_all (window); | ||||
|  | ||||
|   load_file (testgtk_demos[0].filename); | ||||
|   load_file (gtk_demos[0].filename); | ||||
|  | ||||
|   gtk_main (); | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Matthias Clasen
					Matthias Clasen