Make 4 incompatible changes to the GAction API
[platform/upstream/glib.git] / gio / tests / gapplication-example-actions.c
1 #include <gio/gio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 static void
6 activate (GApplication *application)
7 {
8   g_application_hold (application);
9   g_print ("activated\n");
10   g_application_release (application);
11 }
12
13 static void
14 activate_action (GAction  *action,
15                  GVariant *parameter,
16                  gpointer  data)
17 {
18   GApplication *application = G_APPLICATION (data);
19
20   g_application_hold (application);
21   g_print ("action %s activated\n", g_action_get_name (action));
22   g_application_release (application);
23 }
24
25 static void
26 activate_toggle_action (GSimpleAction *action,
27                         GVariant      *parameter,
28                         gpointer       data)
29 {
30   GApplication *application = G_APPLICATION (data);
31   GVariant *state;
32   gboolean b;
33
34   g_print ("action %s activated\n", g_action_get_name (G_ACTION (action)));
35
36   g_application_hold (application);
37   state = g_action_get_state (G_ACTION (action));
38   b = g_variant_get_boolean (state);
39   g_variant_unref (state);
40   g_simple_action_set_state (action, g_variant_new_boolean (!b));
41   g_print ("state change %d -> %d\n", b, !b);
42   g_application_release (application);
43 }
44
45 static void
46 add_actions (GApplication *app)
47 {
48   GSimpleActionGroup *actions;
49   GSimpleAction *action;
50
51   actions = g_simple_action_group_new ();
52
53   action = g_simple_action_new ("simple-action", NULL);
54   g_signal_connect (action, "activate", G_CALLBACK (activate_action), app);
55   g_simple_action_group_insert (actions, G_ACTION (action));
56   g_object_unref (action);
57
58   action = g_simple_action_new_stateful ("toggle-action", NULL,
59                                          g_variant_new_boolean (FALSE));
60   g_signal_connect (action, "activate", G_CALLBACK (activate_toggle_action), app);
61   g_simple_action_group_insert (actions, G_ACTION (action));
62   g_object_unref (action);
63
64   g_application_set_action_group (app, G_ACTION_GROUP (actions));
65   g_object_unref (actions);
66 }
67
68 static void
69 describe_and_activate_action (GActionGroup *group,
70                               const gchar  *name)
71 {
72   const GVariantType *param_type;
73   GVariant *state;
74   gboolean enabled;
75   gchar *tmp;
76
77   param_type = g_action_group_get_action_parameter_type (group, name);
78   state = g_action_group_get_action_state (group, name);
79   enabled = g_action_group_get_action_enabled (group, name);
80
81   g_print ("action name:      %s\n", name);
82   tmp = param_type ? g_variant_type_dup_string (param_type) : NULL;
83   g_print ("parameter type:   %s\n", tmp ? tmp : "<none>");
84   g_free (tmp);
85   g_print ("state type:       %s\n",
86            state ? g_variant_get_type_string (state) : "<none>");
87   tmp = state ? g_variant_print (state, FALSE) : NULL;
88   g_print ("state:            %s\n", tmp ? tmp : "<none>");
89   g_free (tmp);
90   g_print ("enabled:          %s\n", enabled ? "true" : "false");
91
92   if (state != NULL)
93     g_variant_unref (state);
94
95   g_action_group_activate_action (group, name, NULL);
96 }
97
98 int
99 main (int argc, char **argv)
100 {
101   GApplication *app;
102   int status;
103
104   app = g_application_new ("org.gtk.TestApplication", 0);
105   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
106   g_application_set_inactivity_timeout (app, 10000);
107
108   add_actions (app);
109
110   if (argc > 1 && strcmp (argv[1], "--simple-action") == 0)
111     {
112       g_application_register (app, NULL, NULL);
113       describe_and_activate_action (G_ACTION_GROUP (app), "simple-action");
114       exit (0);
115     }
116   else if (argc > 1 && strcmp (argv[1], "--toggle-action") == 0)
117     {
118       g_application_register (app, NULL, NULL);
119       describe_and_activate_action (G_ACTION_GROUP (app), "toggle-action");
120       exit (0);
121     }
122
123   status = g_application_run (app, argc, argv);
124
125   g_object_unref (app);
126
127   return status;
128 }