1 #include <gtk/gtk.h>
2 
3 static void
activate(GSimpleAction * action,GVariant * parameter,gpointer user_data)4 activate (GSimpleAction *action,
5           GVariant      *parameter,
6           gpointer       user_data)
7 {
8   g_print ("%s activated\n", g_action_get_name (G_ACTION (action)));
9 }
10 
11 static GActionEntry entries[] = {
12   { "cut", activate, NULL, NULL, NULL },
13   { "copy", activate, NULL, NULL, NULL },
14   { "paste", activate, NULL, NULL, NULL },
15   { "bold", NULL, NULL, "false", NULL },
16   { "italic", NULL, NULL, "false", NULL },
17   { "strikethrough", NULL, NULL, "false", NULL },
18   { "underline", NULL, NULL, "false", NULL },
19   { "set-view", NULL, "s", "'list'", NULL },
20   { "action1", activate, NULL, NULL, NULL },
21   { "action2", NULL, NULL, "true", NULL },
22   { "action2a", NULL, NULL, "false", NULL },
23   { "action3", NULL, "s", "'three'", NULL },
24   { "action4", activate, NULL, NULL, NULL },
25   { "action5", activate, NULL, NULL, NULL },
26   { "action6", activate, NULL, NULL, NULL },
27   { "action7", activate, NULL, NULL, NULL },
28   { "action8", activate, NULL, NULL, NULL },
29   { "action9", activate, NULL, NULL, NULL },
30   { "action10", activate, NULL, NULL, NULL }
31 };
32 
33 int
main(int argc,char * argv[])34 main (int argc, char *argv[])
35 {
36   GtkWidget *win;
37   GtkWidget *box;
38   GtkWidget *button;
39   GtkWidget *button2;
40   GtkBuilder *builder;
41   GMenuModel *model;
42   GSimpleActionGroup *actions;
43   GtkWidget *overlay;
44   GtkWidget *grid;
45   GtkWidget *popover;
46   GtkWidget *popover2;
47   GtkWidget *label;
48   GtkWidget *check;
49   GtkWidget *combo;
50   GtkWidget *header_bar;
51 
52   gtk_init (&argc, &argv);
53 
54   win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
55   gtk_window_set_default_size (GTK_WINDOW (win), 400, 600);
56   header_bar = gtk_header_bar_new ();
57   gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (header_bar), TRUE);
58   gtk_window_set_titlebar (GTK_WINDOW (win), header_bar);
59   gtk_window_set_title (GTK_WINDOW (win), "Test GtkPopover");
60   actions = g_simple_action_group_new ();
61   g_action_map_add_action_entries (G_ACTION_MAP (actions), entries, G_N_ELEMENTS (entries), NULL);
62 
63   gtk_widget_insert_action_group (win, "top", G_ACTION_GROUP (actions));
64 
65   overlay = gtk_overlay_new ();
66   gtk_container_add (GTK_CONTAINER (win), overlay);
67 
68   grid = gtk_grid_new ();
69   gtk_widget_set_halign (grid, GTK_ALIGN_FILL);
70   gtk_widget_set_valign (grid, GTK_ALIGN_FILL);
71   gtk_grid_set_row_spacing (GTK_GRID (grid), 10);
72   gtk_grid_set_column_spacing (GTK_GRID (grid), 10);
73   gtk_container_add (GTK_CONTAINER (overlay), grid);
74 
75   label = gtk_label_new ("");
76   gtk_widget_set_hexpand (label, TRUE);
77   gtk_widget_set_vexpand (label, TRUE);
78   gtk_grid_attach (GTK_GRID (grid), label, 0, 0, 1, 1);
79 
80   label = gtk_label_new ("");
81   gtk_widget_set_hexpand (label, TRUE);
82   gtk_widget_set_vexpand (label, TRUE);
83   gtk_grid_attach (GTK_GRID (grid), label, 3, 6, 1, 1);
84 
85   builder = gtk_builder_new_from_file ("popover.ui");
86   model = (GMenuModel *)gtk_builder_get_object (builder, "menu");
87 
88   box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
89   button = gtk_menu_button_new ();
90   gtk_container_add (GTK_CONTAINER (box), button);
91   button2 = gtk_menu_button_new ();
92   gtk_container_add (GTK_CONTAINER (box), button2);
93 
94   gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (button), model);
95   gtk_menu_button_set_use_popover (GTK_MENU_BUTTON (button), TRUE);
96   popover = GTK_WIDGET (gtk_menu_button_get_popover (GTK_MENU_BUTTON (button)));
97 
98   builder = gtk_builder_new_from_file ("popover2.ui");
99   popover2 = (GtkWidget *)gtk_builder_get_object (builder, "popover");
100   gtk_menu_button_set_popover (GTK_MENU_BUTTON (button2), popover2);
101 
102   g_object_set (box, "margin", 10, NULL);
103   gtk_overlay_add_overlay (GTK_OVERLAY (overlay), box);
104 
105   label = gtk_label_new ("Popover hexpand");
106   check = gtk_check_button_new ();
107   g_object_bind_property (check, "active", popover, "hexpand", G_BINDING_SYNC_CREATE);
108   g_object_bind_property (check, "active", popover2, "hexpand", G_BINDING_SYNC_CREATE);
109   gtk_grid_attach (GTK_GRID (grid), label , 1, 1, 1, 1);
110   gtk_grid_attach (GTK_GRID (grid), check, 2, 1, 1, 1);
111 
112   label = gtk_label_new ("Popover vexpand");
113   check = gtk_check_button_new ();
114   g_object_bind_property (check, "active", popover, "vexpand", G_BINDING_SYNC_CREATE);
115   g_object_bind_property (check, "active", popover2, "vexpand", G_BINDING_SYNC_CREATE);
116   gtk_grid_attach (GTK_GRID (grid), label , 1, 2, 1, 1);
117   gtk_grid_attach (GTK_GRID (grid), check, 2, 2, 1, 1);
118 
119   label = gtk_label_new ("Button direction");
120   combo = gtk_combo_box_text_new ();
121   gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "up", "Up");
122   gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "down", "Down");
123   gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "left", "Left");
124   gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "right", "Right");
125   gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 1);
126   g_object_bind_property (combo, "active", button, "direction", G_BINDING_SYNC_CREATE);
127   g_object_bind_property (combo, "active", button2, "direction", G_BINDING_SYNC_CREATE);
128   gtk_grid_attach (GTK_GRID (grid), label , 1, 3, 1, 1);
129   gtk_grid_attach (GTK_GRID (grid), combo, 2, 3, 1, 1);
130 
131   label = gtk_label_new ("Button halign");
132   combo = gtk_combo_box_text_new ();
133   gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "fill", "Fill");
134   gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "start", "Start");
135   gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "end", "End");
136   gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "center", "Center");
137   gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 2);
138   g_object_bind_property (combo, "active", box, "halign", G_BINDING_SYNC_CREATE);
139   gtk_grid_attach (GTK_GRID (grid), label , 1, 4, 1, 1);
140   gtk_grid_attach (GTK_GRID (grid), combo, 2, 4, 1, 1);
141 
142   label = gtk_label_new ("Button valign");
143   combo = gtk_combo_box_text_new ();
144   gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "fill", "Fill");
145   gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "start", "Start");
146   gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "end", "End");
147   gtk_combo_box_text_append (GTK_COMBO_BOX_TEXT (combo), "center", "Center");
148   gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 1);
149   g_object_bind_property (combo, "active", box, "valign", G_BINDING_SYNC_CREATE);
150   gtk_grid_attach (GTK_GRID (grid), label , 1, 5, 1, 1);
151   gtk_grid_attach (GTK_GRID (grid), combo, 2, 5, 1, 1);
152 
153 
154   gtk_widget_show_all (win);
155 
156   gtk_main ();
157 
158   return 0;
159 }
160