testtitlebar: more tests
Turn this into a GtkApplication with an app menu. Allow to override the gtk-shell-shows-app-menu setting and the decoration-button-layout style property.
This commit is contained in:
		| @ -1,22 +1,65 @@ | ||||
| #include <gtk/gtk.h> | ||||
|  | ||||
| int | ||||
| main (int argc, char *argv[]) | ||||
| static void | ||||
| on_text_changed (GtkEntry       *entry, | ||||
|                  GParamSpec     *pspec, | ||||
|                  GtkCssProvider *provider) | ||||
| { | ||||
|   const gchar *layout; | ||||
|   gchar *css; | ||||
|  | ||||
|   layout = gtk_entry_get_text (entry); | ||||
|  | ||||
|   css = g_strdup_printf ("GtkWindow {\n" | ||||
|                          "  -GtkWindow-decoration-button-layout: '%s';\n" | ||||
|                          "}", layout); | ||||
|  | ||||
|   gtk_css_provider_load_from_data (provider, css, -1, NULL); | ||||
|   g_free (css); | ||||
| } | ||||
|  | ||||
| static void | ||||
| activate (GApplication *gapp) | ||||
| { | ||||
|   GtkApplication *app = GTK_APPLICATION (gapp); | ||||
|   GtkWidget *window; | ||||
|   GtkWidget *header; | ||||
|   GtkWidget *grid; | ||||
|   GtkWidget *label; | ||||
|   GtkWidget *entry; | ||||
|   GtkWidget *check; | ||||
|   GtkBuilder *builder; | ||||
|   GMenuModel *menu; | ||||
|   GtkCssProvider *provider; | ||||
|   gchar *layout; | ||||
|  | ||||
|   gtk_init (NULL, NULL); | ||||
|   g_action_map_add_action (G_ACTION_MAP (gapp), G_ACTION (g_simple_action_new ("test", NULL))); | ||||
|   builder = gtk_builder_new (); | ||||
|   gtk_builder_add_from_string (builder, | ||||
|                                "<interface>" | ||||
|                                "  <menu id='app-menu'>" | ||||
|                                "    <section>" | ||||
|                                "      <item>" | ||||
|                                "        <attribute name='label'>Test item</attribute>" | ||||
|                                "        <attribute name='action'>app.test</attribute>" | ||||
|                                "      </item>" | ||||
|                                "    </section>" | ||||
|                                "  </menu>" | ||||
|                                "</interface>", -1, NULL); | ||||
|   window = gtk_application_window_new (app); | ||||
|  | ||||
|   window = gtk_window_new (GTK_WINDOW_TOPLEVEL); | ||||
|   menu = (GMenuModel*)gtk_builder_get_object (builder, "app-menu"); | ||||
|   gtk_application_add_window (app, GTK_WINDOW (window)); | ||||
|   gtk_application_set_app_menu (app, menu); | ||||
|  | ||||
|   header = gtk_header_bar_new (); | ||||
|   gtk_window_set_titlebar (GTK_WINDOW (window), header); | ||||
|  | ||||
|   provider = gtk_css_provider_new (); | ||||
|  | ||||
|   gtk_style_context_add_provider_for_screen (gdk_screen_get_default (), | ||||
|                                              GTK_STYLE_PROVIDER (provider), 600); | ||||
|  | ||||
|   grid = gtk_grid_new (); | ||||
|   g_object_set (grid, | ||||
|                 "halign", GTK_ALIGN_CENTER, | ||||
| @ -30,7 +73,7 @@ main (int argc, char *argv[]) | ||||
|   entry = gtk_entry_new (); | ||||
|   g_object_bind_property (entry, "text", | ||||
|                           header, "title", | ||||
|                           G_BINDING_SYNC_CREATE); | ||||
|                           G_BINDING_BIDIRECTIONAL|G_BINDING_SYNC_CREATE); | ||||
|   gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1); | ||||
|   gtk_grid_attach (GTK_GRID (grid), entry, 1, 0, 1, 1); | ||||
|  | ||||
| @ -39,34 +82,61 @@ main (int argc, char *argv[]) | ||||
|   entry = gtk_entry_new (); | ||||
|   g_object_bind_property (entry, "text", | ||||
|                           header, "subtitle", | ||||
|                           G_BINDING_SYNC_CREATE); | ||||
|                           G_BINDING_BIDIRECTIONAL|G_BINDING_SYNC_CREATE); | ||||
|   gtk_grid_attach (GTK_GRID (grid), label, 0, 1, 1, 1); | ||||
|   gtk_grid_attach (GTK_GRID (grid), entry, 1, 1, 1, 1); | ||||
|  | ||||
|   label = gtk_label_new ("Has Subtitle"); | ||||
|   label = gtk_label_new ("Layout"); | ||||
|   gtk_widget_set_halign (label, GTK_ALIGN_END); | ||||
|   check = gtk_check_button_new (); | ||||
|   g_object_bind_property (check, "active", | ||||
|                           header, "has-subtitle", | ||||
|                           G_BINDING_SYNC_CREATE); | ||||
|   gtk_grid_attach (GTK_GRID (grid), label, 2, 1, 1, 1); | ||||
|   gtk_grid_attach (GTK_GRID (grid), check, 3, 1, 1, 1); | ||||
|   entry = gtk_entry_new (); | ||||
|  | ||||
|   gtk_widget_style_get (window, "decoration-button-layout", &layout, NULL); | ||||
|   gtk_entry_set_text (GTK_ENTRY (entry), layout); | ||||
|   g_free (layout); | ||||
|  | ||||
|   g_signal_connect (entry, "notify::text", | ||||
|                     G_CALLBACK (on_text_changed), provider); | ||||
|   gtk_grid_attach (GTK_GRID (grid), label, 0, 2, 1, 1); | ||||
|   gtk_grid_attach (GTK_GRID (grid), entry, 1, 2, 1, 1); | ||||
|  | ||||
|   label = gtk_label_new ("Close Button"); | ||||
|   gtk_widget_set_halign (label, GTK_ALIGN_END); | ||||
|   check = gtk_check_button_new (); | ||||
|   g_object_bind_property (check, "active", | ||||
|                           header, "show-close-button", | ||||
|                           G_BINDING_SYNC_CREATE); | ||||
|                           G_BINDING_BIDIRECTIONAL|G_BINDING_SYNC_CREATE); | ||||
|   gtk_grid_attach (GTK_GRID (grid), label, 2, 0, 1, 1); | ||||
|   gtk_grid_attach (GTK_GRID (grid), check, 3, 0, 1, 1); | ||||
|  | ||||
|   label = gtk_label_new ("Has Subtitle"); | ||||
|   gtk_widget_set_halign (label, GTK_ALIGN_END); | ||||
|   check = gtk_check_button_new (); | ||||
|   g_object_bind_property (check, "active", | ||||
|                           header, "has-subtitle", | ||||
|                           G_BINDING_BIDIRECTIONAL|G_BINDING_SYNC_CREATE); | ||||
|   gtk_grid_attach (GTK_GRID (grid), label, 2, 1, 1, 1); | ||||
|   gtk_grid_attach (GTK_GRID (grid), check, 3, 1, 1, 1); | ||||
|  | ||||
|   label = gtk_label_new ("Shell Shows Menu"); | ||||
|   gtk_widget_set_halign (label, GTK_ALIGN_END); | ||||
|   check = gtk_check_button_new (); | ||||
|   g_object_bind_property (check, "active", | ||||
|                           gtk_settings_get_default (), "gtk-shell-shows-app-menu", | ||||
|                           G_BINDING_BIDIRECTIONAL|G_BINDING_SYNC_CREATE); | ||||
|   gtk_grid_attach (GTK_GRID (grid), label, 2, 2, 1, 1); | ||||
|   gtk_grid_attach (GTK_GRID (grid), check, 3, 2, 1, 1); | ||||
|  | ||||
|   gtk_container_add (GTK_CONTAINER (window), grid); | ||||
|   gtk_widget_show_all (window); | ||||
|  | ||||
|   gtk_main (); | ||||
|  | ||||
|   gtk_widget_destroy (window); | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int | ||||
| main (int argc, char *argv[]) | ||||
| { | ||||
|   GtkApplication *app; | ||||
|  | ||||
|   app = gtk_application_new ("org.gtk.Test.titlebar", 0); | ||||
|   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL); | ||||
|  | ||||
|   return g_application_run (G_APPLICATION (app), argc, argv); | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Matthias Clasen
					Matthias Clasen