1/* Menu
2 * #Keywords: action, zoom
3 *
4 * Demonstrates how to add a context menu to a custom widget
5 * and connect it with widget actions.
6 *
7 * The custom widget we create here is similar to a GtkPicture,
8 * but allows setting a zoom level for the displayed paintable.
9 *
10 * Our context menu has items to change the zoom level.
11 */
12
13#include <gtk/gtk.h>
14#include "demo3widget.h"
15
16
17GtkWidget *
18do_menu (GtkWidget *do_widget)
19{
20 static GtkWidget *window = NULL;
21
22 if (!window)
23 {
24 GtkWidget *box;
25 GtkWidget *sw;
26 GtkWidget *widget;
27 GtkWidget *scale;
28
29 window = gtk_window_new ();
30 gtk_window_set_title (GTK_WINDOW (window), title: "Menu");
31 gtk_window_set_default_size (GTK_WINDOW (window), width: 600, height: 400);
32 gtk_window_set_display (GTK_WINDOW (window),
33 display: gtk_widget_get_display (widget: do_widget));
34 g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window);
35
36 box = gtk_box_new (orientation: GTK_ORIENTATION_VERTICAL, spacing: 0);
37 gtk_window_set_child (GTK_WINDOW (window), child: box);
38
39 sw = gtk_scrolled_window_new ();
40 gtk_widget_set_vexpand (widget: sw, TRUE);
41 gtk_box_append (GTK_BOX (box), child: sw);
42
43 widget = demo3_widget_new (resource: "/transparent/portland-rose.jpg");
44 gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), child: widget);
45
46 scale = gtk_scale_new_with_range (orientation: GTK_ORIENTATION_HORIZONTAL, min: 0.01, max: 10.0, step: 0.1);
47 gtk_range_set_value (GTK_RANGE (scale), value: 1.0);
48 gtk_box_append (GTK_BOX (box), child: scale);
49
50 g_object_bind_property (source: gtk_range_get_adjustment (GTK_RANGE (scale)), source_property: "value",
51 target: widget, target_property: "scale",
52 flags: G_BINDING_BIDIRECTIONAL);
53 }
54
55 if (!gtk_widget_get_visible (widget: window))
56 gtk_widget_show (widget: window);
57 else
58 gtk_window_destroy (GTK_WINDOW (window));
59
60 return window;
61}
62

source code of gtk/demos/gtk-demo/menu.c