Bug Summary

File:ctk/ctkapplication.c
Warning:line 487, column 71
Casting a non-structure type to a structure type and accessing a field can lead to memory access errors or data corruption

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name ctkapplication.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/ctk -resource-dir /usr/lib/llvm-16/lib/clang/16 -D HAVE_CONFIG_H -I . -I .. -D G_LOG_DOMAIN="Ctk" -D G_LOG_USE_STRUCTURED=1 -D CTK_VERSION="3.25.5" -D CTK_BINARY_VERSION="3.0.0" -D CTK_COMPILATION -D CTK_PRINT_BACKEND_ENABLE_UNSUPPORTED -D CTK_LIBDIR="/usr/lib" -D CTK_LOCALEDIR="/usr/share/locale" -D CTK_DATADIR="/usr/share" -D CTK_DATA_PREFIX="/usr" -D CTK_SYSCONFDIR="/usr/etc" -D CTK_HOST="x86_64-pc-linux-gnu" -D CTK_PRINT_BACKENDS="file,cups" -D X11_DATA_PREFIX="/usr" -D ISO_CODES_PREFIX="" -I .. -I ../ctk -I .. -I ../cdk -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -D G_ENABLE_DEBUG -D G_ENABLE_CONSISTENCY_CHECKS -D GLIB_MIN_REQUIRED_VERSION=GLIB_VERSION_2_66 -D GLIB_MAX_ALLOWED_VERSION=GLIB_VERSION_2_66 -I /usr/include/pango-1.0 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -I /usr/include/atk-1.0 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/x86_64-linux-gnu -I /usr/include/webp -I /usr/include/at-spi2-atk/2.0 -I /usr/include/at-spi-2.0 -I /usr/include/dbus-1.0 -I /usr/lib/x86_64-linux-gnu/dbus-1.0/include -I /usr/include/gio-unix-2.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -I /usr/include/pango-1.0 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -D PIC -internal-isystem /usr/lib/llvm-16/lib/clang/16/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdebug-compilation-dir=/rootdir/ctk -ferror-limit 19 -fvisibility=hidden -fgnuc-version=4.2.1 -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-09-19-171836-43636-1 -x c ctkapplication.c
1/*
2 * Copyright © 2010 Codethink Limited
3 * Copyright © 2013 Canonical Limited
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the licence, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * Author: Ryan Lortie <desrt@desrt.ca>
19 */
20
21#include "config.h"
22
23#include "ctkapplication.h"
24#include "cdkprivate.h"
25
26#ifdef G_OS_UNIX
27#include <gio/gunixfdlist.h>
28#endif
29
30#include <stdlib.h>
31
32#ifdef HAVE_UNISTD_H1
33#include <unistd.h>
34#endif
35
36#include "cdk/cdk-private.h"
37
38#include "ctkapplicationprivate.h"
39#include "ctkclipboardprivate.h"
40#include "ctkmarshalers.h"
41#include "ctkmain.h"
42#include "ctkrecentmanager.h"
43#include "ctkaccelmapprivate.h"
44#include "ctkicontheme.h"
45#include "ctkbuilder.h"
46#include "ctkshortcutswindow.h"
47#include "ctkintl.h"
48
49/* NB: please do not add backend-specific CDK headers here. This should
50 * be abstracted via CtkApplicationImpl.
51 */
52
53/**
54 * SECTION:ctkapplication
55 * @title: CtkApplication
56 * @short_description: Application class
57 *
58 * #CtkApplication is a class that handles many important aspects
59 * of a CTK+ application in a convenient fashion, without enforcing
60 * a one-size-fits-all application model.
61 *
62 * Currently, CtkApplication handles CTK+ initialization, application
63 * uniqueness, session management, provides some basic scriptability and
64 * desktop shell integration by exporting actions and menus and manages a
65 * list of toplevel windows whose life-cycle is automatically tied to the
66 * life-cycle of your application.
67 *
68 * While CtkApplication works fine with plain #CtkWindows, it is recommended
69 * to use it together with #CtkApplicationWindow.
70 *
71 * When CDK threads are enabled, CtkApplication will acquire the CDK
72 * lock when invoking actions that arrive from other processes. The CDK
73 * lock is not touched for local action invocations. In order to have
74 * actions invoked in a predictable context it is therefore recommended
75 * that the CDK lock be held while invoking actions locally with
76 * g_action_group_activate_action(). The same applies to actions
77 * associated with #CtkApplicationWindow and to the “activate” and
78 * “open” #GApplication methods.
79 *
80 * ## Automatic resources ## {#automatic-resources}
81 *
82 * #CtkApplication will automatically load menus from the #CtkBuilder
83 * resource located at "ctk/menus.ui", relative to the application's
84 * resource base path (see g_application_set_resource_base_path()). The
85 * menu with the ID "app-menu" is taken as the application's app menu
86 * and the menu with the ID "menubar" is taken as the application's
87 * menubar. Additional menus (most interesting submenus) can be named
88 * and accessed via ctk_application_get_menu_by_id() which allows for
89 * dynamic population of a part of the menu structure.
90 *
91 * If the resources "ctk/menus-appmenu.ui" or "ctk/menus-traditional.ui" are
92 * present then these files will be used in preference, depending on the value
93 * of ctk_application_prefers_app_menu(). If the resource "ctk/menus-common.ui"
94 * is present it will be loaded as well. This is useful for storing items that
95 * are referenced from both "ctk/menus-appmenu.ui" and
96 * "ctk/menus-traditional.ui".
97 *
98 * It is also possible to provide the menus manually using
99 * ctk_application_set_app_menu() and ctk_application_set_menubar().
100 *
101 * #CtkApplication will also automatically setup an icon search path for
102 * the default icon theme by appending "icons" to the resource base
103 * path. This allows your application to easily store its icons as
104 * resources. See ctk_icon_theme_add_resource_path() for more
105 * information.
106 *
107 * If there is a resource located at "ctk/help-overlay.ui" which
108 * defines a #CtkShortcutsWindow with ID "help_overlay" then CtkApplication
109 * associates an instance of this shortcuts window with each
110 * #CtkApplicationWindow and sets up keyboard accelerators (Control-F1
111 * and Control-?) to open it. To create a menu item that displays the
112 * shortcuts window, associate the item with the action win.show-help-overlay.
113 *
114 * ## A simple application ## {#ctkapplication}
115 *
116 * [A simple example](https://git.gnome.org/browse/ctk+/tree/examples/bp/bloatpad.c)
117 *
118 * CtkApplication optionally registers with a session manager
119 * of the users session (if you set the #CtkApplication:register-session
120 * property) and offers various functionality related to the session
121 * life-cycle.
122 *
123 * An application can block various ways to end the session with
124 * the ctk_application_inhibit() function. Typical use cases for
125 * this kind of inhibiting are long-running, uninterruptible operations,
126 * such as burning a CD or performing a disk backup. The session
127 * manager may not honor the inhibitor, but it can be expected to
128 * inform the user about the negative consequences of ending the
129 * session while inhibitors are present.
130 *
131 * ## See Also ## {#seealso}
132 * [HowDoI: Using CtkApplication](https://wiki.gnome.org/HowDoI/CtkApplication),
133 * [Getting Started with CTK+: Basics](https://developer.gnome.org/ctk3/stable/ctk-getting-started.html#id-1.2.3.3)
134 */
135
136enum {
137 WINDOW_ADDED,
138 WINDOW_REMOVED,
139 QUERY_END,
140 LAST_SIGNAL
141};
142
143static guint ctk_application_signals[LAST_SIGNAL];
144
145enum {
146 PROP_ZERO,
147 PROP_REGISTER_SESSION,
148 PROP_SCREENSAVER_ACTIVE,
149 PROP_APP_MENU,
150 PROP_MENUBAR,
151 PROP_ACTIVE_WINDOW,
152 NUM_PROPERTIES
153};
154
155static GParamSpec *ctk_application_props[NUM_PROPERTIES];
156
157struct _CtkApplicationPrivate
158{
159 CtkApplicationImpl *impl;
160 CtkApplicationAccels *accels;
161
162 GList *windows;
163
164 GMenuModel *app_menu;
165 GMenuModel *menubar;
166 guint last_window_id;
167
168 gboolean register_session;
169 gboolean screensaver_active;
170 CtkActionMuxer *muxer;
171 CtkBuilder *menus_builder;
172 gchar *help_overlay_path;
173 guint profiler_id;
174};
175
176G_DEFINE_TYPE_WITH_PRIVATE (CtkApplication, ctk_application, G_TYPE_APPLICATION)static void ctk_application_init (CtkApplication *self); static
void ctk_application_class_init (CtkApplicationClass *klass)
; static GType ctk_application_get_type_once (void); static gpointer
ctk_application_parent_class = ((void*)0); static gint CtkApplication_private_offset
; static void ctk_application_class_intern_init (gpointer klass
) { ctk_application_parent_class = g_type_class_peek_parent (
klass); if (CtkApplication_private_offset != 0) g_type_class_adjust_private_offset
(klass, &CtkApplication_private_offset); ctk_application_class_init
((CtkApplicationClass*) klass); } __attribute__ ((__unused__
)) static inline gpointer ctk_application_get_instance_private
(CtkApplication *self) { return (((gpointer) ((guint8*) (self
) + (glong) (CtkApplication_private_offset)))); } GType ctk_application_get_type
(void) { static GType static_g_define_type_id = 0; if ((__extension__
({ _Static_assert (sizeof *(&static_g_define_type_id) ==
sizeof (gpointer), "Expression evaluates to false"); (void) (
0 ? (gpointer) * (&static_g_define_type_id) : ((void*)0))
; (!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(*(&static_g_define_type_id)) gapg_temp_newval; __typeof__
((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id
); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5)
; gapg_temp_newval; })) && g_once_init_enter_pointer (
&static_g_define_type_id)); })) ) { GType g_define_type_id
= ctk_application_get_type_once (); (__extension__ ({ _Static_assert
(sizeof *(&static_g_define_type_id) == sizeof (gpointer)
, "Expression evaluates to false"); 0 ? (void) (*(&static_g_define_type_id
) = (g_define_type_id)) : (void) 0; g_once_init_leave_pointer
((&static_g_define_type_id), (gpointer) (guintptr) (g_define_type_id
)); })) ; } return static_g_define_type_id; } __attribute__ (
(__noinline__)) static GType ctk_application_get_type_once (void
) { GType g_define_type_id = g_type_register_static_simple ((
g_application_get_type ()), g_intern_static_string ("CtkApplication"
), sizeof (CtkApplicationClass), (GClassInitFunc)(void (*)(void
)) ctk_application_class_intern_init, sizeof (CtkApplication)
, (GInstanceInitFunc)(void (*)(void)) ctk_application_init, (
GTypeFlags) 0); { {{ CtkApplication_private_offset = g_type_add_instance_private
(g_define_type_id, sizeof (CtkApplicationPrivate)); };} } return
g_define_type_id; }
177
178static gboolean
179ctk_application_focus_in_event_cb (CtkWindow *window,
180 CdkEventFocus *event G_GNUC_UNUSED__attribute__ ((__unused__)),
181 CtkApplication *application)
182{
183 CtkApplicationPrivate *priv = application->priv;
184 GList *link;
185
186 /* Keep the window list sorted by most-recently-focused. */
187 link = g_list_find (priv->windows, window);
188 if (link != NULL((void*)0) && link != priv->windows)
189 {
190 priv->windows = g_list_remove_link (priv->windows, link);
191 priv->windows = g_list_concat (link, priv->windows);
192 }
193
194 if (application->priv->impl)
195 ctk_application_impl_active_window_changed (application->priv->impl, window);
196
197 g_object_notify_by_pspec (G_OBJECT (application)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((application)), (((GType) ((20) << (2))))))))
, ctk_application_props[PROP_ACTIVE_WINDOW]);
198
199 return CDK_EVENT_PROPAGATE((0));
200}
201
202static void
203ctk_application_load_resources (CtkApplication *application)
204{
205 const gchar *base_path;
206
207 base_path = g_application_get_resource_base_path (G_APPLICATION (application)((((GApplication*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((application)), ((g_application_get_type ()))))))
);
208
209 if (base_path == NULL((void*)0))
210 return;
211
212 /* Expand the icon search path */
213 {
214 CtkIconTheme *default_theme;
215 gchar *iconspath;
216
217 default_theme = ctk_icon_theme_get_default ();
218 iconspath = g_strconcat (base_path, "/icons/", NULL((void*)0));
219 ctk_icon_theme_add_resource_path (default_theme, iconspath);
220 g_free (iconspath);
221 }
222
223 /* Load the menus */
224 {
225 gchar *menuspath;
226
227 /* If the user has given a specific file for the variant of menu
228 * that we are looking for, use it with preference.
229 */
230 if (ctk_application_prefers_app_menu (application))
231 menuspath = g_strconcat (base_path, "/ctk/menus-appmenu.ui", NULL((void*)0));
232 else
233 menuspath = g_strconcat (base_path, "/ctk/menus-traditional.ui", NULL((void*)0));
234
235 if (g_resources_get_info (menuspath, G_RESOURCE_LOOKUP_FLAGS_NONE, NULL((void*)0), NULL((void*)0), NULL((void*)0)))
236 application->priv->menus_builder = ctk_builder_new_from_resource (menuspath);
237 g_free (menuspath);
238
239 /* If we didn't get the specific file, fall back. */
240 if (application->priv->menus_builder == NULL((void*)0))
241 {
242 menuspath = g_strconcat (base_path, "/ctk/menus.ui", NULL((void*)0));
243 if (g_resources_get_info (menuspath, G_RESOURCE_LOOKUP_FLAGS_NONE, NULL((void*)0), NULL((void*)0), NULL((void*)0)))
244 application->priv->menus_builder = ctk_builder_new_from_resource (menuspath);
245 g_free (menuspath);
246 }
247
248 /* Always load from -common as well, if we have it */
249 menuspath = g_strconcat (base_path, "/ctk/menus-common.ui", NULL((void*)0));
250 if (g_resources_get_info (menuspath, G_RESOURCE_LOOKUP_FLAGS_NONE, NULL((void*)0), NULL((void*)0), NULL((void*)0)))
251 {
252 GError *error = NULL((void*)0);
253
254 if (application->priv->menus_builder == NULL((void*)0))
255 application->priv->menus_builder = ctk_builder_new ();
256
257 if (!ctk_builder_add_from_resource (application->priv->menus_builder, menuspath, &error))
258 g_error ("failed to load menus-common.ui: %s", error->message);
259 }
260 g_free (menuspath);
261
262 if (application->priv->menus_builder)
263 {
264 GObject *menu;
265
266 menu = ctk_builder_get_object (application->priv->menus_builder, "app-menu");
267 if (menu != NULL((void*)0) && G_IS_MENU_MODEL (menu)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(menu)); GType __t = ((g_menu_model_get_type ())); gboolean __r
; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
)
268 ctk_application_set_app_menu (application, G_MENU_MODEL (menu)((((GMenuModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((menu)), ((g_menu_model_get_type ()))))))
);
269 menu = ctk_builder_get_object (application->priv->menus_builder, "menubar");
270 if (menu != NULL((void*)0) && G_IS_MENU_MODEL (menu)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(menu)); GType __t = ((g_menu_model_get_type ())); gboolean __r
; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; }))))
)
271 ctk_application_set_menubar (application, G_MENU_MODEL (menu)((((GMenuModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((menu)), ((g_menu_model_get_type ()))))))
);
272 }
273 }
274
275 /* Help overlay */
276 {
277 gchar *path;
278
279 path = g_strconcat (base_path, "/ctk/help-overlay.ui", NULL((void*)0));
280 if (g_resources_get_info (path, G_RESOURCE_LOOKUP_FLAGS_NONE, NULL((void*)0), NULL((void*)0), NULL((void*)0)))
281 {
282 const gchar * const accels[] = { "<Primary>F1", "<Primary>question", NULL((void*)0) };
283
284 application->priv->help_overlay_path = path;
285 ctk_application_set_accels_for_action (application, "win.show-help-overlay", accels);
286 }
287 else
288 {
289 g_free (path);
290 }
291 }
292}
293
294
295static void
296ctk_application_startup (GApplication *g_application)
297{
298 CtkApplication *application = CTK_APPLICATION (g_application)((((CtkApplication*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((g_application)), ((ctk_application_get_type ()))))))
;
299
300 G_APPLICATION_CLASS (ctk_application_parent_class)((((GApplicationClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((ctk_application_parent_class)), ((g_application_get_type
()))))))
->startup (g_application);
301
302 ctk_action_muxer_insert (application->priv->muxer, "app", G_ACTION_GROUP (application)((((GActionGroup*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((application)), ((g_action_group_get_type ()))))))
);
303
304 ctk_init (NULL((void*)0), NULL((void*)0));
305
306 application->priv->impl = ctk_application_impl_new (application, cdk_display_get_default ());
307 ctk_application_impl_startup (application->priv->impl, application->priv->register_session);
308
309 ctk_application_load_resources (application);
310}
311
312static void
313ctk_application_shutdown (GApplication *g_application)
314{
315 CtkApplication *application = CTK_APPLICATION (g_application)((((CtkApplication*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((g_application)), ((ctk_application_get_type ()))))))
;
316
317 if (application->priv->impl == NULL((void*)0))
318 return;
319
320 ctk_application_impl_shutdown (application->priv->impl);
321 g_clear_object (&application->priv->impl)do { _Static_assert (sizeof *((&application->priv->
impl)) == sizeof (gpointer), "Expression evaluates to false")
; __typeof__ (((&application->priv->impl))) _pp = (
(&application->priv->impl)); __typeof__ (*((&application
->priv->impl))) _ptr = *_pp; *_pp = ((void*)0); if (_ptr
) (g_object_unref) (_ptr); } while (0)
;
322
323 ctk_action_muxer_remove (application->priv->muxer, "app");
324
325 /* Keep this section in sync with ctk_main() */
326
327 /* Try storing all clipboard data we have */
328 _ctk_clipboard_store_all ();
329
330 /* Synchronize the recent manager singleton */
331 _ctk_recent_manager_sync ();
332
333 G_APPLICATION_CLASS (ctk_application_parent_class)((((GApplicationClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((ctk_application_parent_class)), ((g_application_get_type
()))))))
->shutdown (g_application);
334}
335
336static gboolean
337ctk_application_local_command_line (GApplication *application,
338 gchar ***arguments,
339 gint *exit_status)
340{
341 g_application_add_option_group (application, ctk_get_option_group (FALSE(0)));
342
343 return G_APPLICATION_CLASS (ctk_application_parent_class)((((GApplicationClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((ctk_application_parent_class)), ((g_application_get_type
()))))))
->local_command_line (application, arguments, exit_status);
344}
345
346static void
347ctk_application_add_platform_data (GApplication *application G_GNUC_UNUSED__attribute__ ((__unused__)),
348 GVariantBuilder *builder)
349{
350 /* This is slightly evil.
351 *
352 * We don't have an impl here because we're remote so we can't figure
353 * out what to do on a per-display-server basis.
354 *
355 * So we do all the things... which currently is just one thing.
356 */
357 const gchar *desktop_startup_id =
358 CDK_PRIVATE_CALL (cdk_get_desktop_startup_id)(cdk__private__ ()->cdk_get_desktop_startup_id) ();
359 if (desktop_startup_id)
360 g_variant_builder_add (builder, "{sv}", "desktop-startup-id",
361 g_variant_new_string (desktop_startup_id));
362}
363
364static void
365ctk_application_before_emit (GApplication *g_application,
366 GVariant *platform_data)
367{
368 CtkApplication *application = CTK_APPLICATION (g_application)((((CtkApplication*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((g_application)), ((ctk_application_get_type ()))))))
;
369
370 cdk_threads_enter ();
371
372 ctk_application_impl_before_emit (application->priv->impl, platform_data);
373}
374
375static void
376ctk_application_after_emit (GApplication *application G_GNUC_UNUSED__attribute__ ((__unused__)),
377 GVariant *platform_data)
378{
379 const char *startup_notification_id = NULL((void*)0);
380
381 g_variant_lookup (platform_data, "desktop-startup-id", "&s", &startup_notification_id);
382 if (startup_notification_id)
383 {
384 CdkDisplay *display;
385
386 display = cdk_display_get_default ();
387 if (display)
388 cdk_display_notify_startup_complete (display, startup_notification_id);
389 }
390
391 cdk_threads_leave ();
392}
393
394static void
395ctk_application_init (CtkApplication *application)
396{
397 application->priv = ctk_application_get_instance_private (application);
398
399 application->priv->muxer = ctk_action_muxer_new ();
400
401 application->priv->accels = ctk_application_accels_new ();
402
403 /* getenv now at the latest */
404 CDK_PRIVATE_CALL (cdk_get_desktop_startup_id)(cdk__private__ ()->cdk_get_desktop_startup_id) ();
405}
406
407static void
408ctk_application_window_added (CtkApplication *application,
409 CtkWindow *window)
410{
411 CtkApplicationPrivate *priv = application->priv;
412
413 if (CTK_IS_APPLICATION_WINDOW (window)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(window)); GType __t = ((ctk_application_window_get_type ()))
; gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class
&& __inst->g_class->g_type == __t) __r = (!(0)
); else __r = g_type_check_instance_is_a (__inst, __t); __r; }
))))
)
414 {
415 ctk_application_window_set_id (CTK_APPLICATION_WINDOW (window)((((CtkApplicationWindow*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), ((ctk_application_window_get_type
()))))))
, ++priv->last_window_id);
416 if (priv->help_overlay_path)
417 {
418 CtkBuilder *builder;
419 CtkWidget *help_overlay;
420
421 builder = ctk_builder_new_from_resource (priv->help_overlay_path);
422 help_overlay = CTK_WIDGET (ctk_builder_get_object (builder, "help_overlay"))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_builder_get_object (builder, "help_overlay"))), ((ctk_widget_get_type
()))))))
;
423 if (CTK_IS_SHORTCUTS_WINDOW (help_overlay)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(help_overlay)); GType __t = ((ctk_shortcuts_window_get_type (
))); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; }))))
)
424 ctk_application_window_set_help_overlay (CTK_APPLICATION_WINDOW (window)((((CtkApplicationWindow*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), ((ctk_application_window_get_type
()))))))
,
425 CTK_SHORTCUTS_WINDOW (help_overlay)((((CtkShortcutsWindow*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((help_overlay)), ((ctk_shortcuts_window_get_type
()))))))
);
426 g_object_unref (builder);
427 }
428 }
429
430 priv->windows = g_list_prepend (priv->windows, window);
431 ctk_window_set_application (window, application);
432 g_application_hold (G_APPLICATION (application)((((GApplication*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((application)), ((g_application_get_type ()))))))
);
433
434 g_signal_connect (window, "focus-in-event",g_signal_connect_data ((window), ("focus-in-event"), (((GCallback
) (ctk_application_focus_in_event_cb))), (application), ((void
*)0), (GConnectFlags) 0)
435 G_CALLBACK (ctk_application_focus_in_event_cb),g_signal_connect_data ((window), ("focus-in-event"), (((GCallback
) (ctk_application_focus_in_event_cb))), (application), ((void
*)0), (GConnectFlags) 0)
436 application)g_signal_connect_data ((window), ("focus-in-event"), (((GCallback
) (ctk_application_focus_in_event_cb))), (application), ((void
*)0), (GConnectFlags) 0)
;
437
438 ctk_application_impl_window_added (priv->impl, window);
439
440 ctk_application_impl_active_window_changed (priv->impl, window);
441
442 g_object_notify_by_pspec (G_OBJECT (application)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((application)), (((GType) ((20) << (2))))))))
, ctk_application_props[PROP_ACTIVE_WINDOW]);
443}
444
445static void
446ctk_application_window_removed (CtkApplication *application,
447 CtkWindow *window)
448{
449 CtkApplicationPrivate *priv = application->priv;
450 gpointer old_active;
451
452 old_active = priv->windows;
453
454 if (priv->impl)
455 ctk_application_impl_window_removed (priv->impl, window);
456
457 g_signal_handlers_disconnect_by_func (window,g_signal_handlers_disconnect_matched ((window), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (ctk_application_focus_in_event_cb), (application))
458 ctk_application_focus_in_event_cb,g_signal_handlers_disconnect_matched ((window), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (ctk_application_focus_in_event_cb), (application))
459 application)g_signal_handlers_disconnect_matched ((window), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (ctk_application_focus_in_event_cb), (application))
;
460
461 g_application_release (G_APPLICATION (application)((((GApplication*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((application)), ((g_application_get_type ()))))))
);
462 priv->windows = g_list_remove (priv->windows, window);
463 ctk_window_set_application (window, NULL((void*)0));
464
465 if (priv->windows != old_active && priv->impl)
466 {
467 ctk_application_impl_active_window_changed (priv->impl, priv->windows ? priv->windows->data : NULL((void*)0));
468 g_object_notify_by_pspec (G_OBJECT (application)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((application)), (((GType) ((20) << (2))))))))
, ctk_application_props[PROP_ACTIVE_WINDOW]);
469 }
470}
471
472static void
473extract_accel_from_menu_item (GMenuModel *model,
474 gint item,
475 CtkApplication *app)
476{
477 GMenuAttributeIter *iter;
478 const gchar *key;
479 GVariant *value;
480 const gchar *accel = NULL((void*)0);
481 const gchar *action = NULL((void*)0);
482 GVariant *target = NULL((void*)0);
483
484 iter = g_menu_model_iterate_item_attributes (model, item);
485 while (g_menu_attribute_iter_get_next (iter, &key, &value))
486 {
487 if (g_str_equal (key, "action")(strcmp ((const char *) (key), (const char *) ("action")) == 0
)
&& g_variant_is_of_type (value, G_VARIANT_TYPE_STRING((const GVariantType *) "s")))
Casting a non-structure type to a structure type and accessing a field can lead to memory access errors or data corruption
488 action = g_variant_get_string (value, NULL((void*)0));
489 else if (g_str_equal (key, "accel")(strcmp ((const char *) (key), (const char *) ("accel")) == 0
)
&& g_variant_is_of_type (value, G_VARIANT_TYPE_STRING((const GVariantType *) "s")))
490 accel = g_variant_get_string (value, NULL((void*)0));
491 else if (g_str_equal (key, "target")(strcmp ((const char *) (key), (const char *) ("target")) == 0
)
)
492 target = g_variant_ref (value);
493 g_variant_unref (value);
494 }
495 g_object_unref (iter);
496
497 if (accel && action)
498 {
499 const gchar *accels[2] = { accel, NULL((void*)0) };
500 gchar *detailed_action_name;
501
502 detailed_action_name = g_action_print_detailed_name (action, target);
503 ctk_application_set_accels_for_action (app, detailed_action_name, accels);
504 g_free (detailed_action_name);
505 }
506
507 if (target)
508 g_variant_unref (target);
509}
510
511static void
512extract_accels_from_menu (GMenuModel *model,
513 CtkApplication *app)
514{
515 gint i;
516
517 for (i = 0; i < g_menu_model_get_n_items (model); i++)
518 {
519 GMenuLinkIter *iter;
520 GMenuModel *sub_model;
521
522 extract_accel_from_menu_item (model, i, app);
523
524 iter = g_menu_model_iterate_item_links (model, i);
525 while (g_menu_link_iter_get_next (iter, NULL((void*)0), &sub_model))
526 {
527 extract_accels_from_menu (sub_model, app);
528 g_object_unref (sub_model);
529 }
530 g_object_unref (iter);
531 }
532}
533
534static void
535ctk_application_get_property (GObject *object,
536 guint prop_id,
537 GValue *value,
538 GParamSpec *pspec)
539{
540 CtkApplication *application = CTK_APPLICATION (object)((((CtkApplication*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((object)), ((ctk_application_get_type ()))))))
;
541
542 switch (prop_id)
543 {
544 case PROP_REGISTER_SESSION:
545 g_value_set_boolean (value, application->priv->register_session);
546 break;
547
548 case PROP_SCREENSAVER_ACTIVE:
549 g_value_set_boolean (value, application->priv->screensaver_active);
550 break;
551
552 case PROP_APP_MENU:
553 g_value_set_object (value, ctk_application_get_app_menu (application));
554 break;
555
556 case PROP_MENUBAR:
557 g_value_set_object (value, ctk_application_get_menubar (application));
558 break;
559
560 case PROP_ACTIVE_WINDOW:
561 g_value_set_object (value, ctk_application_get_active_window (application));
562 break;
563
564 default:
565 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec)do { GObject *_glib__object = (GObject*) ((object)); GParamSpec
*_glib__pspec = (GParamSpec*) ((pspec)); guint _glib__property_id
= ((prop_id)); g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'"
, "ctkapplication.c", 565, ("property"), _glib__property_id, _glib__pspec
->name, g_type_name ((((((GTypeClass*) (((GTypeInstance*) (
_glib__pspec))->g_class))->g_type)))), (g_type_name (((
(((GTypeClass*) (((GTypeInstance*) (_glib__object))->g_class
))->g_type)))))); } while (0)
;
566 break;
567 }
568}
569
570static void
571ctk_application_set_property (GObject *object,
572 guint prop_id,
573 const GValue *value,
574 GParamSpec *pspec)
575{
576 CtkApplication *application = CTK_APPLICATION (object)((((CtkApplication*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((object)), ((ctk_application_get_type ()))))))
;
577
578 switch (prop_id)
579 {
580 case PROP_REGISTER_SESSION:
581 application->priv->register_session = g_value_get_boolean (value);
582 break;
583
584 case PROP_APP_MENU:
585 ctk_application_set_app_menu (application, g_value_get_object (value));
586 break;
587
588 case PROP_MENUBAR:
589 ctk_application_set_menubar (application, g_value_get_object (value));
590 break;
591
592 default:
593 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec)do { GObject *_glib__object = (GObject*) ((object)); GParamSpec
*_glib__pspec = (GParamSpec*) ((pspec)); guint _glib__property_id
= ((prop_id)); g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'"
, "ctkapplication.c", 593, ("property"), _glib__property_id, _glib__pspec
->name, g_type_name ((((((GTypeClass*) (((GTypeInstance*) (
_glib__pspec))->g_class))->g_type)))), (g_type_name (((
(((GTypeClass*) (((GTypeInstance*) (_glib__object))->g_class
))->g_type)))))); } while (0)
;
594 break;
595 }
596}
597
598static void
599ctk_application_finalize (GObject *object)
600{
601 CtkApplication *application = CTK_APPLICATION (object)((((CtkApplication*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((object)), ((ctk_application_get_type ()))))))
;
602
603 g_clear_object (&application->priv->menus_builder)do { _Static_assert (sizeof *((&application->priv->
menus_builder)) == sizeof (gpointer), "Expression evaluates to false"
); __typeof__ (((&application->priv->menus_builder)
)) _pp = ((&application->priv->menus_builder)); __typeof__
(*((&application->priv->menus_builder))) _ptr = *_pp
; *_pp = ((void*)0); if (_ptr) (g_object_unref) (_ptr); } while
(0)
;
604 g_clear_object (&application->priv->app_menu)do { _Static_assert (sizeof *((&application->priv->
app_menu)) == sizeof (gpointer), "Expression evaluates to false"
); __typeof__ (((&application->priv->app_menu))) _pp
= ((&application->priv->app_menu)); __typeof__ (*(
(&application->priv->app_menu))) _ptr = *_pp; *_pp =
((void*)0); if (_ptr) (g_object_unref) (_ptr); } while (0)
;
605 g_clear_object (&application->priv->menubar)do { _Static_assert (sizeof *((&application->priv->
menubar)) == sizeof (gpointer), "Expression evaluates to false"
); __typeof__ (((&application->priv->menubar))) _pp
= ((&application->priv->menubar)); __typeof__ (*((
&application->priv->menubar))) _ptr = *_pp; *_pp = (
(void*)0); if (_ptr) (g_object_unref) (_ptr); } while (0)
;
606 g_clear_object (&application->priv->muxer)do { _Static_assert (sizeof *((&application->priv->
muxer)) == sizeof (gpointer), "Expression evaluates to false"
); __typeof__ (((&application->priv->muxer))) _pp =
((&application->priv->muxer)); __typeof__ (*((&
application->priv->muxer))) _ptr = *_pp; *_pp = ((void*
)0); if (_ptr) (g_object_unref) (_ptr); } while (0)
;
607 g_clear_object (&application->priv->accels)do { _Static_assert (sizeof *((&application->priv->
accels)) == sizeof (gpointer), "Expression evaluates to false"
); __typeof__ (((&application->priv->accels))) _pp =
((&application->priv->accels)); __typeof__ (*((&
application->priv->accels))) _ptr = *_pp; *_pp = ((void
*)0); if (_ptr) (g_object_unref) (_ptr); } while (0)
;
608
609 g_free (application->priv->help_overlay_path);
610
611 G_OBJECT_CLASS (ctk_application_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((ctk_application_parent_class)), (((GType) ((20) <<
(2))))))))
->finalize (object);
612}
613
614#ifdef G_OS_UNIX
615
616static const gchar org_gnome_Sysprof3_Profiler_xml[] =
617 "<node>"
618 "<interface name='org.gnome.Sysprof3.Profiler'>"
619 "<property name='Capabilities' type='a{sv}' access='read'/>"
620 "<method name='Start'>"
621 "<arg type='a{sv}' name='options' direction='in'/>"
622 "<arg type='h' name='fd' direction='in'/>"
623 "</method>"
624 "<method name='Stop'>"
625 "</method>"
626 "</interface>"
627 "</node>";
628
629static GDBusInterfaceInfo *org_gnome_Sysprof3_Profiler;
630
631static void
632sysprof_profiler_method_call (GDBusConnection *connection G_GNUC_UNUSED__attribute__ ((__unused__)),
633 const gchar *sender G_GNUC_UNUSED__attribute__ ((__unused__)),
634 const gchar *object_path G_GNUC_UNUSED__attribute__ ((__unused__)),
635 const gchar *interface_name G_GNUC_UNUSED__attribute__ ((__unused__)),
636 const gchar *method_name,
637 GVariant *parameters,
638 GDBusMethodInvocation *invocation,
639 gpointer user_data G_GNUC_UNUSED__attribute__ ((__unused__)))
640{
641 if (strcmp (method_name, "Start") == 0)
642 {
643 GDBusMessage *message;
644 GUnixFDList *fd_list;
645 GVariant *options;
646 int fd = -1;
647 int idx;
648
649 if (CDK_PRIVATE_CALL (cdk_profiler_is_running)(cdk__private__ ()->cdk_profiler_is_running) ())
650 {
651 g_dbus_method_invocation_return_error (invocation,
652 G_DBUS_ERRORg_dbus_error_quark(),
653 G_DBUS_ERROR_FAILED,
654 "Profiler already running");
655 return;
656 }
657
658 g_variant_get (parameters, "(@a{sv}h)", &options, &idx);
659
660 message = g_dbus_method_invocation_get_message (invocation);
661 fd_list = g_dbus_message_get_unix_fd_list (message);
662 if (fd_list)
663 fd = g_unix_fd_list_get (fd_list, idx, NULL((void*)0));
664
665 CDK_PRIVATE_CALL (cdk_profiler_start)(cdk__private__ ()->cdk_profiler_start) (fd);
666
667 g_variant_unref (options);
668 }
669 else if (strcmp (method_name, "Stop") == 0)
670 {
671 if (!CDK_PRIVATE_CALL (cdk_profiler_is_running)(cdk__private__ ()->cdk_profiler_is_running) ())
672 {
673 g_dbus_method_invocation_return_error (invocation,
674 G_DBUS_ERRORg_dbus_error_quark(),
675 G_DBUS_ERROR_FAILED,
676 "Profiler not running");
677 return;
678 }
679
680 CDK_PRIVATE_CALL (cdk_profiler_stop)(cdk__private__ ()->cdk_profiler_stop) ();
681 }
682 else
683 {
684 g_dbus_method_invocation_return_error (invocation,
685 G_DBUS_ERRORg_dbus_error_quark(),
686 G_DBUS_ERROR_UNKNOWN_METHOD,
687 "Unknown method");
688 return;
689 }
690
691 g_dbus_method_invocation_return_value (invocation, NULL((void*)0));
692}
693
694static gboolean
695ctk_application_dbus_register (GApplication *application,
696 GDBusConnection *connection,
697 const char *obect_path G_GNUC_UNUSED__attribute__ ((__unused__)),
698 GError **error)
699{
700 CtkApplicationPrivate *priv = ctk_application_get_instance_private (CTK_APPLICATION (application)((((CtkApplication*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((application)), ((ctk_application_get_type ()))))))
);
701 GDBusInterfaceVTable vtable = {
702 .method_call = sysprof_profiler_method_call
703 };
704
705 if (org_gnome_Sysprof3_Profiler == NULL((void*)0))
706 {
707 GDBusNodeInfo *info;
708
709 info = g_dbus_node_info_new_for_xml (org_gnome_Sysprof3_Profiler_xml, error);
710 if (info == NULL((void*)0))
711 return FALSE(0);
712
713 org_gnome_Sysprof3_Profiler = g_dbus_node_info_lookup_interface (info, "org.gnome.Sysprof3.Profiler");
714 g_dbus_interface_info_ref (org_gnome_Sysprof3_Profiler);
715 g_dbus_node_info_unref (info);
716 }
717
718 priv->profiler_id = g_dbus_connection_register_object (connection,
719 "/org/ctk/Profiler",
720 org_gnome_Sysprof3_Profiler,
721 &vtable,
722 NULL((void*)0),
723 NULL((void*)0),
724 error);
725
726 return TRUE(!(0));
727}
728
729static void
730ctk_application_dbus_unregister (GApplication *application,
731 GDBusConnection *connection,
732 const char *obect_path G_GNUC_UNUSED__attribute__ ((__unused__)))
733{
734 CtkApplicationPrivate *priv = ctk_application_get_instance_private (CTK_APPLICATION (application)((((CtkApplication*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((application)), ((ctk_application_get_type ()))))))
);
735
736 g_dbus_connection_unregister_object (connection, priv->profiler_id);
737}
738
739#else
740
741static gboolean
742ctk_application_dbus_register (GApplication *application,
743 GDBusConnection *connection,
744 const char *obect_path,
745 GError **error)
746{
747 return TRUE(!(0));
748}
749
750static void
751ctk_application_dbus_unregister (GApplication *application,
752 GDBusConnection *connection,
753 const char *obect_path)
754{
755}
756
757#endif
758
759static void
760ctk_application_class_init (CtkApplicationClass *class)
761{
762 GObjectClass *object_class = G_OBJECT_CLASS (class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((class)), (((GType) ((20) << (2))))))))
;
763 GApplicationClass *application_class = G_APPLICATION_CLASS (class)((((GApplicationClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((class)), ((g_application_get_type ()))))))
;
764
765 object_class->get_property = ctk_application_get_property;
766 object_class->set_property = ctk_application_set_property;
767 object_class->finalize = ctk_application_finalize;
768
769 application_class->local_command_line = ctk_application_local_command_line;
770 application_class->add_platform_data = ctk_application_add_platform_data;
771 application_class->before_emit = ctk_application_before_emit;
772 application_class->after_emit = ctk_application_after_emit;
773 application_class->startup = ctk_application_startup;
774 application_class->shutdown = ctk_application_shutdown;
775 application_class->dbus_register = ctk_application_dbus_register;
776 application_class->dbus_unregister = ctk_application_dbus_unregister;
777
778 class->window_added = ctk_application_window_added;
779 class->window_removed = ctk_application_window_removed;
780
781 /**
782 * CtkApplication::window-added:
783 * @application: the #CtkApplication which emitted the signal
784 * @window: the newly-added #CtkWindow
785 *
786 * Emitted when a #CtkWindow is added to @application through
787 * ctk_application_add_window().
788 *
789 * Since: 3.2
790 */
791 ctk_application_signals[WINDOW_ADDED] =
792 g_signal_new (I_("window-added")g_intern_static_string ("window-added"), CTK_TYPE_APPLICATION(ctk_application_get_type ()), G_SIGNAL_RUN_FIRST,
793 G_STRUCT_OFFSET (CtkApplicationClass, window_added)((glong) __builtin_offsetof(CtkApplicationClass, window_added
))
,
794 NULL((void*)0), NULL((void*)0),
795 NULL((void*)0),
796 G_TYPE_NONE((GType) ((1) << (2))), 1, CTK_TYPE_WINDOW(ctk_window_get_type ()));
797
798 /**
799 * CtkApplication::window-removed:
800 * @application: the #CtkApplication which emitted the signal
801 * @window: the #CtkWindow that is being removed
802 *
803 * Emitted when a #CtkWindow is removed from @application,
804 * either as a side-effect of being destroyed or explicitly
805 * through ctk_application_remove_window().
806 *
807 * Since: 3.2
808 */
809 ctk_application_signals[WINDOW_REMOVED] =
810 g_signal_new (I_("window-removed")g_intern_static_string ("window-removed"), CTK_TYPE_APPLICATION(ctk_application_get_type ()), G_SIGNAL_RUN_FIRST,
811 G_STRUCT_OFFSET (CtkApplicationClass, window_removed)((glong) __builtin_offsetof(CtkApplicationClass, window_removed
))
,
812 NULL((void*)0), NULL((void*)0),
813 NULL((void*)0),
814 G_TYPE_NONE((GType) ((1) << (2))), 1, CTK_TYPE_WINDOW(ctk_window_get_type ()));
815
816 /**
817 * CtkApplication::query-end:
818 * @application: the #CtkApplication which emitted the signal
819 *
820 * Emitted when the session manager is about to end the session, only
821 * if #CtkApplication::register-session is %TRUE. Applications can
822 * connect to this signal and call ctk_application_inhibit() with
823 * %CTK_APPLICATION_INHIBIT_LOGOUT to delay the end of the session
824 * until state has been saved.
825 *
826 * Since: 3.24.8
827 */
828 ctk_application_signals[QUERY_END] =
829 g_signal_new (I_("query-end")g_intern_static_string ("query-end"), CTK_TYPE_APPLICATION(ctk_application_get_type ()), G_SIGNAL_RUN_FIRST,
830 0,
831 NULL((void*)0), NULL((void*)0),
832 NULL((void*)0),
833 G_TYPE_NONE((GType) ((1) << (2))), 0);
834 /**
835 * CtkApplication:register-session:
836 *
837 * Set this property to %TRUE to register with the session manager.
838 *
839 * Since: 3.4
840 */
841 ctk_application_props[PROP_REGISTER_SESSION] =
842 g_param_spec_boolean ("register-session",
843 P_("Register session")g_dgettext("ctk30" "-properties","Register session"),
844 P_("Register with the session manager")g_dgettext("ctk30" "-properties","Register with the session manager"
)
,
845 FALSE(0),
846 G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS(G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB
)
);
847
848 /**
849 * CtkApplication:screensaver-active:
850 *
851 * This property is %TRUE if CTK+ believes that the screensaver is
852 * currently active. CTK+ only tracks session state (including this)
853 * when #CtkApplication::register-session is set to %TRUE.
854 *
855 * Tracking the screensaver state is supported on Linux.
856 *
857 * Since: 3.24
858 */
859 ctk_application_props[PROP_SCREENSAVER_ACTIVE] =
860 g_param_spec_boolean ("screensaver-active",
861 P_("Screensaver Active")g_dgettext("ctk30" "-properties","Screensaver Active"),
862 P_("Whether the screensaver is active")g_dgettext("ctk30" "-properties","Whether the screensaver is active"
)
,
863 FALSE(0),
864 G_PARAM_READABLE|G_PARAM_STATIC_STRINGS(G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB
)
);
865
866 ctk_application_props[PROP_APP_MENU] =
867 g_param_spec_object ("app-menu",
868 P_("Application menu")g_dgettext("ctk30" "-properties","Application menu"),
869 P_("The GMenuModel for the application menu")g_dgettext("ctk30" "-properties","The GMenuModel for the application menu"
)
,
870 G_TYPE_MENU_MODEL(g_menu_model_get_type ()),
871 G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS(G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB
)
);
872
873 ctk_application_props[PROP_MENUBAR] =
874 g_param_spec_object ("menubar",
875 P_("Menubar")g_dgettext("ctk30" "-properties","Menubar"),
876 P_("The GMenuModel for the menubar")g_dgettext("ctk30" "-properties","The GMenuModel for the menubar"
)
,
877 G_TYPE_MENU_MODEL(g_menu_model_get_type ()),
878 G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS(G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB
)
);
879
880 ctk_application_props[PROP_ACTIVE_WINDOW] =
881 g_param_spec_object ("active-window",
882 P_("Active window")g_dgettext("ctk30" "-properties","Active window"),
883 P_("The window which most recently had focus")g_dgettext("ctk30" "-properties","The window which most recently had focus"
)
,
884 CTK_TYPE_WINDOW(ctk_window_get_type ()),
885 G_PARAM_READABLE|G_PARAM_STATIC_STRINGS(G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB
)
);
886
887 g_object_class_install_properties (object_class, NUM_PROPERTIES, ctk_application_props);
888}
889
890/**
891 * ctk_application_new:
892 * @application_id: (allow-none): The application ID.
893 * @flags: the application flags
894 *
895 * Creates a new #CtkApplication instance.
896 *
897 * When using #CtkApplication, it is not necessary to call ctk_init()
898 * manually. It is called as soon as the application gets registered as
899 * the primary instance.
900 *
901 * Concretely, ctk_init() is called in the default handler for the
902 * #GApplication::startup signal. Therefore, #CtkApplication subclasses should
903 * chain up in their #GApplication::startup handler before using any CTK+ API.
904 *
905 * Note that commandline arguments are not passed to ctk_init().
906 * All CTK+ functionality that is available via commandline arguments
907 * can also be achieved by setting suitable environment variables
908 * such as `G_DEBUG`, so this should not be a big
909 * problem. If you absolutely must support CTK+ commandline arguments,
910 * you can explicitly call ctk_init() before creating the application
911 * instance.
912 *
913 * If non-%NULL, the application ID must be valid. See
914 * g_application_id_is_valid().
915 *
916 * If no application ID is given then some features (most notably application
917 * uniqueness) will be disabled. A null application ID is only allowed with
918 * CTK+ 3.6 or later.
919 *
920 * Returns: a new #CtkApplication instance
921 *
922 * Since: 3.0
923 */
924CtkApplication *
925ctk_application_new (const gchar *application_id,
926 GApplicationFlags flags)
927{
928 g_return_val_if_fail (application_id == NULL || g_application_id_is_valid (application_id), NULL)do { if ((application_id == ((void*)0) || g_application_id_is_valid
(application_id))) { } else { g_return_if_fail_warning ("Ctk"
, ((const char*) (__func__)), "application_id == NULL || g_application_id_is_valid (application_id)"
); return (((void*)0)); } } while (0)
;
929
930 return g_object_new (CTK_TYPE_APPLICATION(ctk_application_get_type ()),
931 "application-id", application_id,
932 "flags", flags,
933 NULL((void*)0));
934}
935
936/**
937 * ctk_application_add_window:
938 * @application: a #CtkApplication
939 * @window: a #CtkWindow
940 *
941 * Adds a window to @application.
942 *
943 * This call can only happen after the @application has started;
944 * typically, you should add new application windows in response
945 * to the emission of the #GApplication::activate signal.
946 *
947 * This call is equivalent to setting the #CtkWindow:application
948 * property of @window to @application.
949 *
950 * Normally, the connection between the application and the window
951 * will remain until the window is destroyed, but you can explicitly
952 * remove it with ctk_application_remove_window().
953 *
954 * CTK+ will keep the @application running as long as it has
955 * any windows.
956 *
957 * Since: 3.0
958 **/
959void
960ctk_application_add_window (CtkApplication *application,
961 CtkWindow *window)
962{
963 g_return_if_fail (CTK_IS_APPLICATION (application))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
; } } while (0)
;
964 g_return_if_fail (CTK_IS_WINDOW (window))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((window)); GType __t = ((ctk_window_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; })))))) { }
else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__
)), "CTK_IS_WINDOW (window)"); return; } } while (0)
;
965
966 if (!g_application_get_is_registered (G_APPLICATION (application)((((GApplication*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((application)), ((g_application_get_type ()))))))
))
967 {
968 g_critical ("New application windows must be added after the "
969 "GApplication::startup signal has been emitted.");
970 return;
971 }
972
973 if (!g_list_find (application->priv->windows, window))
974 g_signal_emit (application,
975 ctk_application_signals[WINDOW_ADDED], 0, window);
976}
977
978/**
979 * ctk_application_remove_window:
980 * @application: a #CtkApplication
981 * @window: a #CtkWindow
982 *
983 * Remove a window from @application.
984 *
985 * If @window belongs to @application then this call is equivalent to
986 * setting the #CtkWindow:application property of @window to
987 * %NULL.
988 *
989 * The application may stop running as a result of a call to this
990 * function.
991 *
992 * Since: 3.0
993 **/
994void
995ctk_application_remove_window (CtkApplication *application,
996 CtkWindow *window)
997{
998 g_return_if_fail (CTK_IS_APPLICATION (application))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
; } } while (0)
;
999 g_return_if_fail (CTK_IS_WINDOW (window))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((window)); GType __t = ((ctk_window_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; })))))) { }
else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__
)), "CTK_IS_WINDOW (window)"); return; } } while (0)
;
1000
1001 if (g_list_find (application->priv->windows, window))
1002 g_signal_emit (application,
1003 ctk_application_signals[WINDOW_REMOVED], 0, window);
1004}
1005
1006/**
1007 * ctk_application_get_windows:
1008 * @application: a #CtkApplication
1009 *
1010 * Gets a list of the #CtkWindows associated with @application.
1011 *
1012 * The list is sorted by most recently focused window, such that the first
1013 * element is the currently focused window. (Useful for choosing a parent
1014 * for a transient window.)
1015 *
1016 * The list that is returned should not be modified in any way. It will
1017 * only remain valid until the next focus change or window creation or
1018 * deletion.
1019 *
1020 * Returns: (element-type CtkWindow) (transfer none): a #GList of #CtkWindow
1021 *
1022 * Since: 3.0
1023 **/
1024GList *
1025ctk_application_get_windows (CtkApplication *application)
1026{
1027 g_return_val_if_fail (CTK_IS_APPLICATION (application), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
(((void*)0)); } } while (0)
;
1028
1029 return application->priv->windows;
1030}
1031
1032/**
1033 * ctk_application_get_window_by_id:
1034 * @application: a #CtkApplication
1035 * @id: an identifier number
1036 *
1037 * Returns the #CtkApplicationWindow with the given ID.
1038 *
1039 * The ID of a #CtkApplicationWindow can be retrieved with
1040 * ctk_application_window_get_id().
1041 *
1042 * Returns: (nullable) (transfer none): the window with ID @id, or
1043 * %NULL if there is no window with this ID
1044 *
1045 * Since: 3.6
1046 */
1047CtkWindow *
1048ctk_application_get_window_by_id (CtkApplication *application,
1049 guint id)
1050{
1051 GList *l;
1052
1053 g_return_val_if_fail (CTK_IS_APPLICATION (application), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
(((void*)0)); } } while (0)
;
1054
1055 for (l = application->priv->windows; l != NULL((void*)0); l = l->next)
1056 {
1057 if (CTK_IS_APPLICATION_WINDOW (l->data)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(l->data)); GType __t = ((ctk_application_window_get_type (
))); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; }))))
&&
1058 ctk_application_window_get_id (CTK_APPLICATION_WINDOW (l->data)((((CtkApplicationWindow*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((l->data)), ((ctk_application_window_get_type
()))))))
) == id)
1059 return l->data;
1060 }
1061
1062 return NULL((void*)0);
1063}
1064
1065/**
1066 * ctk_application_get_active_window:
1067 * @application: a #CtkApplication
1068 *
1069 * Gets the “active” window for the application.
1070 *
1071 * The active window is the one that was most recently focused (within
1072 * the application). This window may not have the focus at the moment
1073 * if another application has it — this is just the most
1074 * recently-focused window within this application.
1075 *
1076 * Returns: (transfer none) (nullable): the active window, or %NULL if
1077 * there isn't one.
1078 *
1079 * Since: 3.6
1080 **/
1081CtkWindow *
1082ctk_application_get_active_window (CtkApplication *application)
1083{
1084 g_return_val_if_fail (CTK_IS_APPLICATION (application), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
(((void*)0)); } } while (0)
;
1085
1086 return application->priv->windows ? application->priv->windows->data : NULL((void*)0);
1087}
1088
1089static void
1090ctk_application_update_accels (CtkApplication *application)
1091{
1092 GList *l;
1093
1094 for (l = application->priv->windows; l != NULL((void*)0); l = l->next)
1095 _ctk_window_notify_keys_changed (l->data);
1096}
1097
1098/**
1099 * ctk_application_add_accelerator:
1100 * @application: a #CtkApplication
1101 * @accelerator: accelerator string
1102 * @action_name: the name of the action to activate
1103 * @parameter: (allow-none): parameter to pass when activating the action,
1104 * or %NULL if the action does not accept an activation parameter
1105 *
1106 * Installs an accelerator that will cause the named action
1107 * to be activated when the key combination specificed by @accelerator
1108 * is pressed.
1109 *
1110 * @accelerator must be a string that can be parsed by ctk_accelerator_parse(),
1111 * e.g. "<Primary>q" or “<Control><Alt>p”.
1112 *
1113 * @action_name must be the name of an action as it would be used
1114 * in the app menu, i.e. actions that have been added to the application
1115 * are referred to with an “app.” prefix, and window-specific actions
1116 * with a “win.” prefix.
1117 *
1118 * CtkApplication also extracts accelerators out of “accel” attributes
1119 * in the #GMenuModels passed to ctk_application_set_app_menu() and
1120 * ctk_application_set_menubar(), which is usually more convenient
1121 * than calling this function for each accelerator.
1122 *
1123 * Since: 3.4
1124 *
1125 * Deprecated: 3.14: Use ctk_application_set_accels_for_action() instead
1126 */
1127void
1128ctk_application_add_accelerator (CtkApplication *application,
1129 const gchar *accelerator,
1130 const gchar *action_name,
1131 GVariant *parameter)
1132{
1133 const gchar *accelerators[2] = { accelerator, NULL((void*)0) };
1134 gchar *detailed_action_name;
1135
1136 g_return_if_fail (CTK_IS_APPLICATION (application))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
; } } while (0)
;
1137 g_return_if_fail (accelerator != NULL)do { if ((accelerator != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "accelerator != NULL"); return
; } } while (0)
;
1138 g_return_if_fail (action_name != NULL)do { if ((action_name != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "action_name != NULL"); return
; } } while (0)
;
1139
1140 detailed_action_name = g_action_print_detailed_name (action_name, parameter);
1141 ctk_application_set_accels_for_action (application, detailed_action_name, accelerators);
1142 g_free (detailed_action_name);
1143}
1144
1145/**
1146 * ctk_application_remove_accelerator:
1147 * @application: a #CtkApplication
1148 * @action_name: the name of the action to activate
1149 * @parameter: (allow-none): parameter to pass when activating the action,
1150 * or %NULL if the action does not accept an activation parameter
1151 *
1152 * Removes an accelerator that has been previously added
1153 * with ctk_application_add_accelerator().
1154 *
1155 * Since: 3.4
1156 *
1157 * Deprecated: 3.14: Use ctk_application_set_accels_for_action() instead
1158 */
1159void
1160ctk_application_remove_accelerator (CtkApplication *application,
1161 const gchar *action_name,
1162 GVariant *parameter)
1163{
1164 const gchar *accelerators[1] = { NULL((void*)0) };
1165 gchar *detailed_action_name;
1166
1167 g_return_if_fail (CTK_IS_APPLICATION (application))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
; } } while (0)
;
1168 g_return_if_fail (action_name != NULL)do { if ((action_name != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "action_name != NULL"); return
; } } while (0)
;
1169
1170 detailed_action_name = g_action_print_detailed_name (action_name, parameter);
1171 ctk_application_set_accels_for_action (application, detailed_action_name, accelerators);
1172 g_free (detailed_action_name);
1173}
1174
1175/**
1176 * ctk_application_prefers_app_menu:
1177 * @application: a #CtkApplication
1178 *
1179 * Determines if the desktop environment in which the application is
1180 * running would prefer an application menu be shown.
1181 *
1182 * If this function returns %TRUE then the application should call
1183 * ctk_application_set_app_menu() with the contents of an application
1184 * menu, which will be shown by the desktop environment. If it returns
1185 * %FALSE then you should consider using an alternate approach, such as
1186 * a menubar.
1187 *
1188 * The value returned by this function is purely advisory and you are
1189 * free to ignore it. If you call ctk_application_set_app_menu() even
1190 * if the desktop environment doesn't support app menus, then a fallback
1191 * will be provided.
1192 *
1193 * Applications are similarly free not to set an app menu even if the
1194 * desktop environment wants to show one. In that case, a fallback will
1195 * also be created by the desktop environment (GNOME, for example, uses
1196 * a menu with only a "Quit" item in it).
1197 *
1198 * The value returned by this function never changes. Once it returns a
1199 * particular value, it is guaranteed to always return the same value.
1200 *
1201 * You may only call this function after the application has been
1202 * registered and after the base startup handler has run. You're most
1203 * likely to want to use this from your own startup handler. It may
1204 * also make sense to consult this function while constructing UI (in
1205 * activate, open or an action activation handler) in order to determine
1206 * if you should show a gear menu or not.
1207 *
1208 * This function will return %FALSE on Mac OS and a default app menu
1209 * will be created automatically with the "usual" contents of that menu
1210 * typical to most Mac OS applications. If you call
1211 * ctk_application_set_app_menu() anyway, then this menu will be
1212 * replaced with your own.
1213 *
1214 * Returns: %TRUE if you should set an app menu
1215 *
1216 * Since: 3.14
1217 **/
1218gboolean
1219ctk_application_prefers_app_menu (CtkApplication *application)
1220{
1221 g_return_val_if_fail (CTK_IS_APPLICATION (application), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
((0)); } } while (0)
;
1222 g_return_val_if_fail (application->priv->impl != NULL, FALSE)do { if ((application->priv->impl != ((void*)0))) { } else
{ g_return_if_fail_warning ("Ctk", ((const char*) (__func__)
), "application->priv->impl != NULL"); return ((0)); } }
while (0)
;
1223
1224 return ctk_application_impl_prefers_app_menu (application->priv->impl);
1225}
1226
1227/**
1228 * ctk_application_set_app_menu:
1229 * @application: a #CtkApplication
1230 * @app_menu: (allow-none): a #GMenuModel, or %NULL
1231 *
1232 * Sets or unsets the application menu for @application.
1233 *
1234 * This can only be done in the primary instance of the application,
1235 * after it has been registered. #GApplication::startup is a good place
1236 * to call this.
1237 *
1238 * The application menu is a single menu containing items that typically
1239 * impact the application as a whole, rather than acting on a specific
1240 * window or document. For example, you would expect to see
1241 * “Preferences” or “Quit” in an application menu, but not “Save” or
1242 * “Print”.
1243 *
1244 * If supported, the application menu will be rendered by the desktop
1245 * environment.
1246 *
1247 * Use the base #GActionMap interface to add actions, to respond to the user
1248 * selecting these menu items.
1249 *
1250 * Since: 3.4
1251 */
1252void
1253ctk_application_set_app_menu (CtkApplication *application,
1254 GMenuModel *app_menu)
1255{
1256 g_return_if_fail (CTK_IS_APPLICATION (application))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
; } } while (0)
;
1257 g_return_if_fail (g_application_get_is_registered (G_APPLICATION (application)))do { if ((g_application_get_is_registered (((((GApplication*)
(void *) g_type_check_instance_cast ((GTypeInstance*) ((application
)), ((g_application_get_type ()))))))))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "g_application_get_is_registered (G_APPLICATION (application))"
); return; } } while (0)
;
1258 g_return_if_fail (!g_application_get_is_remote (G_APPLICATION (application)))do { if ((!g_application_get_is_remote (((((GApplication*) (void
*) g_type_check_instance_cast ((GTypeInstance*) ((application
)), ((g_application_get_type ()))))))))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "!g_application_get_is_remote (G_APPLICATION (application))"
); return; } } while (0)
;
1259 g_return_if_fail (app_menu == NULL || G_IS_MENU_MODEL (app_menu))do { if ((app_menu == ((void*)0) || (((__extension__ ({ GTypeInstance
*__inst = (GTypeInstance*) ((app_menu)); GType __t = ((g_menu_model_get_type
())); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "app_menu == NULL || G_IS_MENU_MODEL (app_menu)"
); return; } } while (0)
;
1260
1261 if (g_set_object (&application->priv->app_menu, app_menu)(__extension__ ({ _Static_assert (sizeof *(&application->
priv->app_menu) == sizeof (app_menu), "Expression evaluates to false"
); union { char *in; GObject **out; } _object_ptr; _object_ptr
.in = (char *) (&application->priv->app_menu); (void
) (0 ? *(&application->priv->app_menu) = (app_menu)
, (0) : (0)); (g_set_object) (_object_ptr.out, (GObject *) app_menu
); }))
)
1262 {
1263 if (app_menu)
1264 extract_accels_from_menu (app_menu, application);
1265
1266 ctk_application_impl_set_app_menu (application->priv->impl, app_menu);
1267
1268 g_object_notify_by_pspec (G_OBJECT (application)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((application)), (((GType) ((20) << (2))))))))
, ctk_application_props[PROP_APP_MENU]);
1269 }
1270}
1271
1272/**
1273 * ctk_application_get_app_menu:
1274 * @application: a #CtkApplication
1275 *
1276 * Returns the menu model that has been set with
1277 * ctk_application_set_app_menu().
1278 *
1279 * Returns: (transfer none) (nullable): the application menu of @application
1280 * or %NULL if no application menu has been set.
1281 *
1282 * Since: 3.4
1283 */
1284GMenuModel *
1285ctk_application_get_app_menu (CtkApplication *application)
1286{
1287 g_return_val_if_fail (CTK_IS_APPLICATION (application), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
(((void*)0)); } } while (0)
;
1288
1289 return application->priv->app_menu;
1290}
1291
1292/**
1293 * ctk_application_set_menubar:
1294 * @application: a #CtkApplication
1295 * @menubar: (allow-none): a #GMenuModel, or %NULL
1296 *
1297 * Sets or unsets the menubar for windows of @application.
1298 *
1299 * This is a menubar in the traditional sense.
1300 *
1301 * This can only be done in the primary instance of the application,
1302 * after it has been registered. #GApplication::startup is a good place
1303 * to call this.
1304 *
1305 * Depending on the desktop environment, this may appear at the top of
1306 * each window, or at the top of the screen. In some environments, if
1307 * both the application menu and the menubar are set, the application
1308 * menu will be presented as if it were the first item of the menubar.
1309 * Other environments treat the two as completely separate — for example,
1310 * the application menu may be rendered by the desktop shell while the
1311 * menubar (if set) remains in each individual window.
1312 *
1313 * Use the base #GActionMap interface to add actions, to respond to the
1314 * user selecting these menu items.
1315 *
1316 * Since: 3.4
1317 */
1318void
1319ctk_application_set_menubar (CtkApplication *application,
1320 GMenuModel *menubar)
1321{
1322 g_return_if_fail (CTK_IS_APPLICATION (application))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
; } } while (0)
;
1323 g_return_if_fail (g_application_get_is_registered (G_APPLICATION (application)))do { if ((g_application_get_is_registered (((((GApplication*)
(void *) g_type_check_instance_cast ((GTypeInstance*) ((application
)), ((g_application_get_type ()))))))))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "g_application_get_is_registered (G_APPLICATION (application))"
); return; } } while (0)
;
1324 g_return_if_fail (!g_application_get_is_remote (G_APPLICATION (application)))do { if ((!g_application_get_is_remote (((((GApplication*) (void
*) g_type_check_instance_cast ((GTypeInstance*) ((application
)), ((g_application_get_type ()))))))))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "!g_application_get_is_remote (G_APPLICATION (application))"
); return; } } while (0)
;
1325 g_return_if_fail (menubar == NULL || G_IS_MENU_MODEL (menubar))do { if ((menubar == ((void*)0) || (((__extension__ ({ GTypeInstance
*__inst = (GTypeInstance*) ((menubar)); GType __t = ((g_menu_model_get_type
())); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "menubar == NULL || G_IS_MENU_MODEL (menubar)"
); return; } } while (0)
;
1326
1327 if (g_set_object (&application->priv->menubar, menubar)(__extension__ ({ _Static_assert (sizeof *(&application->
priv->menubar) == sizeof (menubar), "Expression evaluates to false"
); union { char *in; GObject **out; } _object_ptr; _object_ptr
.in = (char *) (&application->priv->menubar); (void
) (0 ? *(&application->priv->menubar) = (menubar), (
0) : (0)); (g_set_object) (_object_ptr.out, (GObject *) menubar
); }))
)
1328 {
1329 if (menubar)
1330 extract_accels_from_menu (menubar, application);
1331
1332 ctk_application_impl_set_menubar (application->priv->impl, menubar);
1333
1334 g_object_notify_by_pspec (G_OBJECT (application)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((application)), (((GType) ((20) << (2))))))))
, ctk_application_props[PROP_MENUBAR]);
1335 }
1336}
1337
1338/**
1339 * ctk_application_get_menubar:
1340 * @application: a #CtkApplication
1341 *
1342 * Returns the menu model that has been set with
1343 * ctk_application_set_menubar().
1344 *
1345 * Returns: (transfer none): the menubar for windows of @application
1346 *
1347 * Since: 3.4
1348 */
1349GMenuModel *
1350ctk_application_get_menubar (CtkApplication *application)
1351{
1352 g_return_val_if_fail (CTK_IS_APPLICATION (application), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
(((void*)0)); } } while (0)
;
1353
1354 return application->priv->menubar;
1355}
1356
1357/**
1358 * CtkApplicationInhibitFlags:
1359 * @CTK_APPLICATION_INHIBIT_LOGOUT: Inhibit ending the user session
1360 * by logging out or by shutting down the computer
1361 * @CTK_APPLICATION_INHIBIT_SWITCH: Inhibit user switching
1362 * @CTK_APPLICATION_INHIBIT_SUSPEND: Inhibit suspending the
1363 * session or computer
1364 * @CTK_APPLICATION_INHIBIT_IDLE: Inhibit the session being
1365 * marked as idle (and possibly locked)
1366 *
1367 * Types of user actions that may be blocked by ctk_application_inhibit().
1368 *
1369 * Since: 3.4
1370 */
1371
1372/**
1373 * ctk_application_inhibit:
1374 * @application: the #CtkApplication
1375 * @window: (allow-none): a #CtkWindow, or %NULL
1376 * @flags: what types of actions should be inhibited
1377 * @reason: (allow-none): a short, human-readable string that explains
1378 * why these operations are inhibited
1379 *
1380 * Inform the session manager that certain types of actions should be
1381 * inhibited. This is not guaranteed to work on all platforms and for
1382 * all types of actions.
1383 *
1384 * Applications should invoke this method when they begin an operation
1385 * that should not be interrupted, such as creating a CD or DVD. The
1386 * types of actions that may be blocked are specified by the @flags
1387 * parameter. When the application completes the operation it should
1388 * call ctk_application_uninhibit() to remove the inhibitor. Note that
1389 * an application can have multiple inhibitors, and all of them must
1390 * be individually removed. Inhibitors are also cleared when the
1391 * application exits.
1392 *
1393 * Applications should not expect that they will always be able to block
1394 * the action. In most cases, users will be given the option to force
1395 * the action to take place.
1396 *
1397 * Reasons should be short and to the point.
1398 *
1399 * If @window is given, the session manager may point the user to
1400 * this window to find out more about why the action is inhibited.
1401 *
1402 * Returns: A non-zero cookie that is used to uniquely identify this
1403 * request. It should be used as an argument to ctk_application_uninhibit()
1404 * in order to remove the request. If the platform does not support
1405 * inhibiting or the request failed for some reason, 0 is returned.
1406 *
1407 * Since: 3.4
1408 */
1409guint
1410ctk_application_inhibit (CtkApplication *application,
1411 CtkWindow *window,
1412 CtkApplicationInhibitFlags flags,
1413 const gchar *reason)
1414{
1415 g_return_val_if_fail (CTK_IS_APPLICATION (application), 0)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
(0); } } while (0)
;
1416 g_return_val_if_fail (!g_application_get_is_remote (G_APPLICATION (application)), 0)do { if ((!g_application_get_is_remote (((((GApplication*) (void
*) g_type_check_instance_cast ((GTypeInstance*) ((application
)), ((g_application_get_type ()))))))))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "!g_application_get_is_remote (G_APPLICATION (application))"
); return (0); } } while (0)
;
1417 g_return_val_if_fail (window == NULL || CTK_IS_WINDOW (window), 0)do { if ((window == ((void*)0) || (((__extension__ ({ GTypeInstance
*__inst = (GTypeInstance*) ((window)); GType __t = ((ctk_window_get_type
())); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "window == NULL || CTK_IS_WINDOW (window)"
); return (0); } } while (0)
;
1418
1419 return ctk_application_impl_inhibit (application->priv->impl, window, flags, reason);
1420}
1421
1422/**
1423 * ctk_application_uninhibit:
1424 * @application: the #CtkApplication
1425 * @cookie: a cookie that was returned by ctk_application_inhibit()
1426 *
1427 * Removes an inhibitor that has been established with ctk_application_inhibit().
1428 * Inhibitors are also cleared when the application exits.
1429 *
1430 * Since: 3.4
1431 */
1432void
1433ctk_application_uninhibit (CtkApplication *application,
1434 guint cookie)
1435{
1436 g_return_if_fail (CTK_IS_APPLICATION (application))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
; } } while (0)
;
1437 g_return_if_fail (!g_application_get_is_remote (G_APPLICATION (application)))do { if ((!g_application_get_is_remote (((((GApplication*) (void
*) g_type_check_instance_cast ((GTypeInstance*) ((application
)), ((g_application_get_type ()))))))))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "!g_application_get_is_remote (G_APPLICATION (application))"
); return; } } while (0)
;
1438 g_return_if_fail (cookie > 0)do { if ((cookie > 0)) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "cookie > 0"); return
; } } while (0)
;
1439
1440 ctk_application_impl_uninhibit (application->priv->impl, cookie);
1441}
1442
1443/**
1444 * ctk_application_is_inhibited:
1445 * @application: the #CtkApplication
1446 * @flags: what types of actions should be queried
1447 *
1448 * Determines if any of the actions specified in @flags are
1449 * currently inhibited (possibly by another application).
1450 *
1451 * Note that this information may not be available (for example
1452 * when the application is running in a sandbox).
1453 *
1454 * Returns: %TRUE if any of the actions specified in @flags are inhibited
1455 *
1456 * Since: 3.4
1457 */
1458gboolean
1459ctk_application_is_inhibited (CtkApplication *application,
1460 CtkApplicationInhibitFlags flags)
1461{
1462 g_return_val_if_fail (CTK_IS_APPLICATION (application), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
((0)); } } while (0)
;
1463 g_return_val_if_fail (!g_application_get_is_remote (G_APPLICATION (application)), FALSE)do { if ((!g_application_get_is_remote (((((GApplication*) (void
*) g_type_check_instance_cast ((GTypeInstance*) ((application
)), ((g_application_get_type ()))))))))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "!g_application_get_is_remote (G_APPLICATION (application))"
); return ((0)); } } while (0)
;
1464
1465 return ctk_application_impl_is_inhibited (application->priv->impl, flags);
1466}
1467
1468CtkActionMuxer *
1469ctk_application_get_parent_muxer_for_window (CtkWindow *window)
1470{
1471 CtkApplication *application;
1472
1473 application = ctk_window_get_application (window);
1474
1475 if (!application)
1476 return NULL((void*)0);
1477
1478 return application->priv->muxer;
1479}
1480
1481CtkApplicationAccels *
1482ctk_application_get_application_accels (CtkApplication *application)
1483{
1484 return application->priv->accels;
1485}
1486
1487/**
1488 * ctk_application_list_action_descriptions:
1489 * @application: a #CtkApplication
1490 *
1491 * Lists the detailed action names which have associated accelerators.
1492 * See ctk_application_set_accels_for_action().
1493 *
1494 * Returns: (transfer full): a %NULL-terminated array of strings,
1495 * free with g_strfreev() when done
1496 *
1497 * Since: 3.12
1498 */
1499gchar **
1500ctk_application_list_action_descriptions (CtkApplication *application)
1501{
1502 g_return_val_if_fail (CTK_IS_APPLICATION (application), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
(((void*)0)); } } while (0)
;
1503
1504 return ctk_application_accels_list_action_descriptions (application->priv->accels);
1505}
1506
1507/**
1508 * ctk_application_set_accels_for_action:
1509 * @application: a #CtkApplication
1510 * @detailed_action_name: a detailed action name, specifying an action
1511 * and target to associate accelerators with
1512 * @accels: (array zero-terminated=1): a list of accelerators in the format
1513 * understood by ctk_accelerator_parse()
1514 *
1515 * Sets zero or more keyboard accelerators that will trigger the
1516 * given action. The first item in @accels will be the primary
1517 * accelerator, which may be displayed in the UI.
1518 *
1519 * To remove all accelerators for an action, use an empty, zero-terminated
1520 * array for @accels.
1521 *
1522 * For the @detailed_action_name, see g_action_parse_detailed_name() and
1523 * g_action_print_detailed_name().
1524 *
1525 * Since: 3.12
1526 */
1527void
1528ctk_application_set_accels_for_action (CtkApplication *application,
1529 const gchar *detailed_action_name,
1530 const gchar * const *accels)
1531{
1532 gchar *action_and_target;
1533
1534 g_return_if_fail (CTK_IS_APPLICATION (application))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
; } } while (0)
;
1535 g_return_if_fail (detailed_action_name != NULL)do { if ((detailed_action_name != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "detailed_action_name != NULL"
); return; } } while (0)
;
1536 g_return_if_fail (accels != NULL)do { if ((accels != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "accels != NULL"); return
; } } while (0)
;
1537
1538 ctk_application_accels_set_accels_for_action (application->priv->accels,
1539 detailed_action_name,
1540 accels);
1541
1542 action_and_target = ctk_normalise_detailed_action_name (detailed_action_name);
1543 ctk_action_muxer_set_primary_accel (application->priv->muxer, action_and_target, accels[0]);
1544 g_free (action_and_target);
1545
1546 ctk_application_update_accels (application);
1547}
1548
1549/**
1550 * ctk_application_get_accels_for_action:
1551 * @application: a #CtkApplication
1552 * @detailed_action_name: a detailed action name, specifying an action
1553 * and target to obtain accelerators for
1554 *
1555 * Gets the accelerators that are currently associated with
1556 * the given action.
1557 *
1558 * Returns: (transfer full): accelerators for @detailed_action_name, as
1559 * a %NULL-terminated array. Free with g_strfreev() when no longer needed
1560 *
1561 * Since: 3.12
1562 */
1563gchar **
1564ctk_application_get_accels_for_action (CtkApplication *application,
1565 const gchar *detailed_action_name)
1566{
1567 g_return_val_if_fail (CTK_IS_APPLICATION (application), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
(((void*)0)); } } while (0)
;
1568 g_return_val_if_fail (detailed_action_name != NULL, NULL)do { if ((detailed_action_name != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "detailed_action_name != NULL"
); return (((void*)0)); } } while (0)
;
1569
1570 return ctk_application_accels_get_accels_for_action (application->priv->accels,
1571 detailed_action_name);
1572}
1573
1574/**
1575 * ctk_application_get_actions_for_accel:
1576 * @application: a #CtkApplication
1577 * @accel: an accelerator that can be parsed by ctk_accelerator_parse()
1578 *
1579 * Returns the list of actions (possibly empty) that @accel maps to.
1580 * Each item in the list is a detailed action name in the usual form.
1581 *
1582 * This might be useful to discover if an accel already exists in
1583 * order to prevent installation of a conflicting accelerator (from
1584 * an accelerator editor or a plugin system, for example). Note that
1585 * having more than one action per accelerator may not be a bad thing
1586 * and might make sense in cases where the actions never appear in the
1587 * same context.
1588 *
1589 * In case there are no actions for a given accelerator, an empty array
1590 * is returned. %NULL is never returned.
1591 *
1592 * It is a programmer error to pass an invalid accelerator string.
1593 * If you are unsure, check it with ctk_accelerator_parse() first.
1594 *
1595 * Returns: (transfer full): a %NULL-terminated array of actions for @accel
1596 *
1597 * Since: 3.14
1598 */
1599gchar **
1600ctk_application_get_actions_for_accel (CtkApplication *application,
1601 const gchar *accel)
1602{
1603 g_return_val_if_fail (CTK_IS_APPLICATION (application), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
(((void*)0)); } } while (0)
;
1604 g_return_val_if_fail (accel != NULL, NULL)do { if ((accel != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "accel != NULL"); return
(((void*)0)); } } while (0)
;
1605
1606 return ctk_application_accels_get_actions_for_accel (application->priv->accels, accel);
1607}
1608
1609CtkActionMuxer *
1610ctk_application_get_action_muxer (CtkApplication *application)
1611{
1612 g_assert (application->priv->muxer)do { if (application->priv->muxer) ; else g_assertion_message_expr
("Ctk", "ctkapplication.c", 1612, ((const char*) (__func__))
, "application->priv->muxer"); } while (0)
;
1613
1614 return application->priv->muxer;
1615}
1616
1617void
1618ctk_application_insert_action_group (CtkApplication *application,
1619 const gchar *name,
1620 GActionGroup *action_group)
1621{
1622 ctk_action_muxer_insert (application->priv->muxer, name, action_group);
1623}
1624
1625void
1626ctk_application_handle_window_realize (CtkApplication *application,
1627 CtkWindow *window)
1628{
1629 if (application->priv->impl)
1630 ctk_application_impl_handle_window_realize (application->priv->impl, window);
1631}
1632
1633void
1634ctk_application_handle_window_map (CtkApplication *application,
1635 CtkWindow *window)
1636{
1637 if (application->priv->impl)
1638 ctk_application_impl_handle_window_map (application->priv->impl, window);
1639}
1640
1641/**
1642 * ctk_application_get_menu_by_id:
1643 * @application: a #CtkApplication
1644 * @id: the id of the menu to look up
1645 *
1646 * Gets a menu from automatically loaded resources.
1647 * See [Automatic resources][automatic-resources]
1648 * for more information.
1649 *
1650 * Returns: (transfer none): Gets the menu with the
1651 * given id from the automatically loaded resources
1652 *
1653 * Since: 3.14
1654 */
1655GMenu *
1656ctk_application_get_menu_by_id (CtkApplication *application,
1657 const gchar *id)
1658{
1659 GObject *object;
1660
1661 g_return_val_if_fail (CTK_IS_APPLICATION (application), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((application)); GType __t = ((ctk_application_get_type ()
)); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "CTK_IS_APPLICATION (application)"); return
(((void*)0)); } } while (0)
;
1662 g_return_val_if_fail (id != NULL, NULL)do { if ((id != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "id != NULL"); return ((
(void*)0)); } } while (0)
;
1663
1664 if (!application->priv->menus_builder)
1665 return NULL((void*)0);
1666
1667 object = ctk_builder_get_object (application->priv->menus_builder, id);
1668
1669 if (!object || !G_IS_MENU (object)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(object)); GType __t = ((g_menu_get_type ())); gboolean __r; if
(!__inst) __r = (0); else if (__inst->g_class && __inst
->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a
(__inst, __t); __r; }))))
)
1670 return NULL((void*)0);
1671
1672 return G_MENU (object)((((GMenu*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((object)), ((g_menu_get_type ()))))))
;
1673}
1674
1675void
1676ctk_application_set_screensaver_active (CtkApplication *application,
1677 gboolean active)
1678{
1679 CtkApplicationPrivate *priv = ctk_application_get_instance_private (application);
1680
1681 if (priv->screensaver_active != active)
1682 {
1683 priv->screensaver_active = active;
1684 g_object_notify (G_OBJECT (application)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((application)), (((GType) ((20) << (2))))))))
, "screensaver-active");
1685 }
1686}