static void gw_window_constructed (GObject *object) { GwWindow *window; GwWindowPrivate *priv; gboolean os_shows_app_menu; GtkSettings *settings; //Chain the parent class { G_OBJECT_CLASS (gw_window_parent_class)->constructed (object); } window = GW_WINDOW (object); priv = window->priv; settings = gtk_settings_get_default (); g_object_get (settings, "gtk-shell-shows-app-menu", &os_shows_app_menu, NULL); gtk_widget_add_events (GTK_WIDGET (window), GDK_FOCUS_CHANGE_MASK); gtk_application_window_set_show_menubar (GTK_APPLICATION_WINDOW (window), FALSE); priv->accelgroup = gtk_accel_group_new (); gtk_window_add_accel_group (GTK_WINDOW (window), priv->accelgroup); gtk_window_set_application (GTK_WINDOW (window), GTK_APPLICATION (priv->application)); priv->builder = gtk_builder_new (); gw_window_load_ui_xml (window, priv->ui_xml); priv->toplevel = GTK_WIDGET (gw_window_get_object (GW_WINDOW (window), "toplevel")); g_signal_connect (G_OBJECT (window), "configure-event", G_CALLBACK (gw_window_configure_event_cb), NULL); g_signal_connect (window, "focus-in-event", G_CALLBACK (gw_window_focus_in_event_cb), NULL); }
static void gtk_application_window_real_get_preferred_width_for_height (GtkWidget *widget, gint height, gint *minimum_width, gint *natural_width) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); gint menubar_height; if (window->priv->menubar != NULL) gtk_widget_get_preferred_height (window->priv->menubar, &menubar_height, NULL); else menubar_height = 0; GTK_WIDGET_CLASS (gtk_application_window_parent_class) ->get_preferred_width_for_height (widget, height - menubar_height, minimum_width, natural_width); if (window->priv->menubar != NULL) { gint menubar_min_width, menubar_nat_width; gint border_width; GtkBorder border = { 0 }; gtk_widget_get_preferred_width_for_height (window->priv->menubar, menubar_height, &menubar_min_width, &menubar_nat_width); border_width = gtk_container_get_border_width (GTK_CONTAINER (widget)); _gtk_window_get_shadow_width (GTK_WINDOW (widget), &border); menubar_min_width += 2 * border_width + border.left + border.right; menubar_nat_width += 2 * border_width + border.left + border.right; *minimum_width = MAX (*minimum_width, menubar_min_width); *natural_width = MAX (*natural_width, menubar_nat_width); } }
static void gtk_application_window_real_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); if (window->priv->menubar != NULL) { GtkAllocation menubar_allocation; GtkAllocation child_allocation; gint menubar_height; GtkWidget *child; _gtk_window_set_allocation (GTK_WINDOW (widget), allocation, &child_allocation); menubar_allocation = child_allocation; gtk_widget_get_preferred_height_for_width (window->priv->menubar, menubar_allocation.width, &menubar_height, NULL); menubar_allocation.height = menubar_height; gtk_widget_size_allocate (window->priv->menubar, &menubar_allocation); child_allocation.y += menubar_height; child_allocation.height -= menubar_height; child = gtk_bin_get_child (GTK_BIN (window)); if (child != NULL && gtk_widget_get_visible (child)) gtk_widget_size_allocate (child, &child_allocation); } else GTK_WIDGET_CLASS (gtk_application_window_parent_class) ->size_allocate (widget, allocation); }
static void gtk_application_window_real_map (GtkWidget *widget) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); /* XXX could eliminate this by tweaking gtk_window_map */ if (window->priv->menubar) gtk_widget_map (window->priv->menubar); #ifdef GDK_WINDOWING_WAYLAND { GdkWindow *gdkwindow; GtkApplication *application; application = gtk_window_get_application (GTK_WINDOW (window)); gdkwindow = gtk_widget_get_window (widget); if (GDK_IS_WAYLAND_WINDOW (gdkwindow) && window->priv->session) { gdk_wayland_window_set_dbus_properties_libgtk_only (gdkwindow, g_application_get_application_id (G_APPLICATION (application)), gtk_application_get_app_menu_object_path (application), gtk_application_get_menubar_object_path (application), window->priv->object_path, g_application_get_dbus_object_path (G_APPLICATION (application)), g_dbus_connection_get_unique_name (window->priv->session)); } } #endif GTK_WIDGET_CLASS (gtk_application_window_parent_class)->map (widget); }
static void gtk_application_window_dispose (GObject *object) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (object); if (window->priv->menubar) { gtk_widget_unparent (window->priv->menubar); window->priv->menubar = NULL; } g_clear_object (&window->priv->app_menu_section); g_clear_object (&window->priv->menubar_section); G_OBJECT_CLASS (gtk_application_window_parent_class) ->dispose (object); /* We do this below the chain-up above to give us a chance to be * removed from the GtkApplication (which is done in the dispose * handler of GtkWindow). * * That reduces our chances of being watched as a GActionGroup from a * muxer constructed by GtkApplication. */ g_clear_object (&window->priv->actions); }
static void ide_workbench_constructed (GObject *object) { IdeWorkbench *self = (IdeWorkbench *)object; G_OBJECT_CLASS (ide_workbench_parent_class)->constructed (object); gtk_application_window_set_show_menubar (GTK_APPLICATION_WINDOW (self), FALSE); ide_workbench_add_perspective (self, g_object_new (IDE_TYPE_PREFERENCES_PERSPECTIVE, "visible", TRUE, NULL)); if (self->disable_greeter == FALSE) { ide_workbench_add_perspective (self, g_object_new (IDE_TYPE_GREETER_PERSPECTIVE, "visible", TRUE, NULL)); ide_workbench_set_visible_perspective_name (self, "greeter"); } ide_workbench_actions_init (self); }
static void gtk_application_window_added_x11 (GtkApplication *application, GtkWindow *window) { if (application->priv->session_bus == NULL) return; if (GTK_IS_APPLICATION_WINDOW (window)) { GtkApplicationWindow *app_window = GTK_APPLICATION_WINDOW (window); gboolean success; /* GtkApplicationWindow associates with us when it is first created, * so surely it's not realized yet... */ g_assert (!gtk_widget_get_realized (GTK_WIDGET (window))); do { gchar *window_path; guint window_id; window_id = application->priv->next_id++; window_path = g_strdup_printf ("%s/window/%d", application->priv->object_path, window_id); success = gtk_application_window_publish (app_window, application->priv->session_bus, window_path); g_free (window_path); } while (!success); } }
static void gtk_application_window_real_get_preferred_width_for_height (GtkWidget *widget, gint height, gint *minimum_width, gint *natural_width) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); gint menubar_height; if (window->priv->menubar != NULL) gtk_widget_get_preferred_height (window->priv->menubar, &menubar_height, NULL); else menubar_height = 0; GTK_WIDGET_CLASS (gtk_application_window_parent_class) ->get_preferred_width_for_height (widget, height - menubar_height, minimum_width, natural_width); if (window->priv->menubar != NULL) { gint menubar_min_width, menubar_nat_width; gtk_widget_get_preferred_width_for_height (window->priv->menubar, menubar_height, &menubar_min_width, &menubar_nat_width); *minimum_width = MAX (*minimum_width, menubar_min_width); *natural_width = MAX (*natural_width, menubar_nat_width); } }
static void gtk_application_window_real_realize (GtkWidget *widget) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); GtkApplication *application; GtkSettings *settings; application = gtk_window_get_application (GTK_WINDOW (window)); settings = gtk_widget_get_settings (widget); g_signal_connect (settings, "notify::gtk-shell-shows-app-menu", G_CALLBACK (gtk_application_window_shell_shows_app_menu_changed), window); g_signal_connect (settings, "notify::gtk-shell-shows-menubar", G_CALLBACK (gtk_application_window_shell_shows_menubar_changed), window); if (!window->priv->muxer_initialised) { g_action_muxer_insert (G_ACTION_MUXER (window->priv->muxer), "app", G_ACTION_GROUP (application)); g_action_muxer_insert (G_ACTION_MUXER (window->priv->muxer), "win", G_ACTION_GROUP (window)); window->priv->muxer_initialised = TRUE; } gtk_application_window_update_shell_shows_app_menu (window, settings); gtk_application_window_update_shell_shows_menubar (window, settings); gtk_application_window_update_menubar (window); gtk_application_window_update_accels (window); GTK_WIDGET_CLASS (gtk_application_window_parent_class) ->realize (widget); #ifdef GDK_WINDOWING_X11 { GdkWindow *gdkwindow; gdkwindow = gtk_widget_get_window (GTK_WIDGET (window)); if (GDK_IS_X11_WINDOW (gdkwindow) && window->priv->session) { gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_APPLICATION_ID", g_application_get_application_id (G_APPLICATION (application))); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_UNIQUE_BUS_NAME", g_dbus_connection_get_unique_name (window->priv->session)); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_APPLICATION_OBJECT_PATH", g_application_get_dbus_object_path (G_APPLICATION (application))); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_WINDOW_OBJECT_PATH", window->priv->object_path); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_APP_MENU_OBJECT_PATH", gtk_application_get_app_menu_object_path (application)); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_MENUBAR_OBJECT_PATH", gtk_application_get_menubar_object_path (application)); } } #endif }
static void gtk_application_window_add_action (GActionMap *action_map, GAction *action) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (action_map); g_action_map_add_action (G_ACTION_MAP (window->priv->actions), action); }
static GAction * gtk_application_window_lookup_action (GActionMap *action_map, const gchar *action_name) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (action_map); return g_action_map_lookup_action (G_ACTION_MAP (window->priv->actions), action_name); }
static void gtk_application_window_remove_action (GActionMap *action_map, const gchar *action_name) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (action_map); g_action_map_remove_action (G_ACTION_MAP (window->priv->actions), action_name); }
static void gtk_application_window_change_action_state (GActionGroup *group, const gchar *action_name, GVariant *state) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (group); return g_action_group_change_action_state (G_ACTION_GROUP (window->priv->actions), action_name, state); }
static void gtk_application_window_activate_action (GActionGroup *group, const gchar *action_name, GVariant *parameter) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (group); return g_action_group_activate_action (G_ACTION_GROUP (window->priv->actions), action_name, parameter); }
static void gtk_application_window_real_realize (GtkWidget *widget) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); GtkApplication *application; GtkSettings *settings; application = gtk_window_get_application (GTK_WINDOW (window)); settings = gtk_widget_get_settings (widget); g_signal_connect (settings, "notify::gtk-shell-shows-app-menu", G_CALLBACK (gtk_application_window_shell_shows_app_menu_changed), window); g_signal_connect (settings, "notify::gtk-shell-shows-menubar", G_CALLBACK (gtk_application_window_shell_shows_menubar_changed), window); gtk_application_window_update_shell_shows_app_menu (window, settings); gtk_application_window_update_shell_shows_menubar (window, settings); gtk_application_window_update_menubar (window); /* Update the accelerators, and ensure we do again * if the accel map changes */ gtk_application_window_update_accels (window); window->priv->accel_map_changed_id = g_signal_connect_swapped (gtk_accel_map_get (), "changed", G_CALLBACK (gtk_application_window_update_accels), window); GTK_WIDGET_CLASS (gtk_application_window_parent_class) ->realize (widget); #ifdef GDK_WINDOWING_X11 { GdkWindow *gdkwindow; gdkwindow = gtk_widget_get_window (GTK_WIDGET (window)); if (GDK_IS_X11_WINDOW (gdkwindow) && window->priv->session) { gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_APPLICATION_ID", g_application_get_application_id (G_APPLICATION (application))); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_UNIQUE_BUS_NAME", g_dbus_connection_get_unique_name (window->priv->session)); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_APPLICATION_OBJECT_PATH", g_application_get_dbus_object_path (G_APPLICATION (application))); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_WINDOW_OBJECT_PATH", window->priv->object_path); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_APP_MENU_OBJECT_PATH", gtk_application_get_app_menu_object_path (application)); gdk_x11_window_set_utf8_property (gdkwindow, "_GTK_MENUBAR_OBJECT_PATH", gtk_application_get_menubar_object_path (application)); } } #endif }
static void gtk_application_window_removed_x11 (GtkApplication *application, GtkWindow *window) { if (application->priv->session_bus == NULL) return; if (GTK_IS_APPLICATION_WINDOW (window)) gtk_application_window_unpublish (GTK_APPLICATION_WINDOW (window)); }
static char * get_object_path_for_screen (TerminalWindow *window, TerminalScreen *screen) { return g_strdelimit (g_strdup_printf (TERMINAL_RECEIVER_OBJECT_PATH_FORMAT, gtk_application_window_get_id (GTK_APPLICATION_WINDOW (window)), terminal_screen_get_uuid (screen)), "-", '_'); }
static void gtk_application_window_real_map (GtkWidget *widget) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); /* XXX could eliminate this by tweaking gtk_window_map */ if (window->priv->menubar) gtk_widget_map (window->priv->menubar); GTK_WIDGET_CLASS (gtk_application_window_parent_class)->map (widget); }
static void ide_workbench_constructed (GObject *object) { IdeWorkbench *self = (IdeWorkbench *)object; G_OBJECT_CLASS (ide_workbench_parent_class)->constructed (object); gtk_application_window_set_show_menubar (GTK_APPLICATION_WINDOW (self), FALSE); ide_workbench_actions_init (self); }
static void example_app_window_init (ExampleAppWindow *win) { ExampleAppWindowPrivate *priv; GtkBuilder *builder; GMenuModel *menu; GAction *action; priv = example_app_window_get_instance_private (win); gtk_widget_init_template (GTK_WIDGET (win)); priv->settings = g_settings_new ("com.lonelycactus.exampleapp"); g_settings_bind (priv->settings, "transition", priv->stack, "transition-type", G_SETTINGS_BIND_DEFAULT); g_settings_bind (priv->settings, "show-words", priv->sidebar, "reveal-child", G_SETTINGS_BIND_DEFAULT); g_object_bind_property (priv->search, "active", priv->searchbar, "search-mode-enabled", G_BINDING_BIDIRECTIONAL); g_signal_connect (priv->connect, "toggled", G_CALLBACK (toggle_server), win); g_signal_connect (priv->sidebar, "notify::reveal-child", G_CALLBACK (words_changed), win); builder = gtk_builder_new_from_resource ("/com/lonelycactus/exampleapp/gears-menu.ui"); menu = G_MENU_MODEL (gtk_builder_get_object (builder, "menu")); gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (priv->gears), menu); g_object_unref (builder); action = g_settings_create_action (priv->settings, "show-words"); g_action_map_add_action (G_ACTION_MAP (win), action); g_object_unref (action); action = (GAction*) g_property_action_new ("show-lines", priv->lines, "visible"); g_action_map_add_action (G_ACTION_MAP (win), action); g_object_unref (action); g_object_bind_property (priv->lines, "visible", priv->lines_label, "visible", G_BINDING_DEFAULT); service_init(); service_start_accepting_new_connections(); g_object_set (gtk_settings_get_default (), "gtk-shell-shows-app-menu", FALSE, NULL); gtk_application_window_set_show_menubar (GTK_APPLICATION_WINDOW (win), TRUE); }
static void gtk_application_window_real_forall_internal (GtkContainer *container, gboolean include_internal, GtkCallback callback, gpointer user_data) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (container); if (window->priv->menubar) callback (window->priv->menubar, user_data); GTK_CONTAINER_CLASS (gtk_application_window_parent_class) ->forall (container, include_internal, callback, user_data); }
static gboolean gtk_application_window_query_action (GActionGroup *group, const gchar *action_name, gboolean *enabled, const GVariantType **parameter_type, const GVariantType **state_type, GVariant **state_hint, GVariant **state) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (group); return g_action_group_query_action (G_ACTION_GROUP (window->priv->actions), action_name, enabled, parameter_type, state_type, state_hint, state); }
static void gtk_application_window_real_unrealize (GtkWidget *widget) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); GtkSettings *settings; settings = gtk_widget_get_settings (widget); g_signal_handlers_disconnect_by_func (settings, gtk_application_window_shell_shows_app_menu_changed, widget); g_signal_handlers_disconnect_by_func (settings, gtk_application_window_shell_shows_menubar_changed, widget); g_signal_handler_disconnect (gtk_accel_map_get (), window->priv->accel_map_changed_id); GTK_WIDGET_CLASS (gtk_application_window_parent_class) ->unrealize (widget); }
static void gtk_application_window_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (object); switch (prop_id) { case PROP_SHOW_MENUBAR: gtk_application_window_set_show_menubar (window, g_value_get_boolean (value)); break; default: g_assert_not_reached (); } }
static void gtk_application_window_real_realize (GtkWidget *widget) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); GtkSettings *settings; settings = gtk_widget_get_settings (widget); g_signal_connect (settings, "notify::gtk-shell-shows-app-menu", G_CALLBACK (gtk_application_window_shell_shows_app_menu_changed), window); g_signal_connect (settings, "notify::gtk-shell-shows-menubar", G_CALLBACK (gtk_application_window_shell_shows_menubar_changed), window); GTK_WIDGET_CLASS (gtk_application_window_parent_class)->realize (widget); gtk_application_window_update_shell_shows_app_menu (window, settings); gtk_application_window_update_shell_shows_menubar (window, settings); gtk_application_window_update_menubar (window); }
static void gtk_application_window_real_get_preferred_height (GtkWidget *widget, gint *minimum_height, gint *natural_height) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); GTK_WIDGET_CLASS (gtk_application_window_parent_class) ->get_preferred_height (widget, minimum_height, natural_height); if (window->priv->menubar != NULL) { gint menubar_min_height, menubar_nat_height; gtk_widget_get_preferred_height (window->priv->menubar, &menubar_min_height, &menubar_nat_height); *minimum_height += menubar_min_height; *natural_height += menubar_nat_height; } }
static void gtk_application_impl_dbus_window_added (GtkApplicationImpl *impl, GtkWindow *window) { GtkApplicationImplDBus *dbus = (GtkApplicationImplDBus *) impl; GActionGroup *actions; gchar *path; guint id; if (!dbus->session || !GTK_IS_APPLICATION_WINDOW (window)) return; /* Export the action group of this window, based on its id */ actions = gtk_application_window_get_action_group (GTK_APPLICATION_WINDOW (window)); path = gtk_application_impl_dbus_get_window_path (dbus, window); id = g_dbus_connection_export_action_group (dbus->session, path, actions, NULL); g_free (path); g_object_set_qdata (G_OBJECT (window), gtk_application_impl_dbus_export_id_quark (), GUINT_TO_POINTER (id)); }
static void gtk_application_window_dispose (GObject *object) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (object); if (window->priv->menubar) { gtk_widget_unparent (window->priv->menubar); window->priv->menubar = NULL; } free_accel_closures (window); g_clear_object (&window->priv->app_menu_section); g_clear_object (&window->priv->menubar_section); g_clear_object (&window->priv->actions); g_clear_object (&window->priv->accels); G_OBJECT_CLASS (gtk_application_window_parent_class) ->dispose (object); }
static void gtk_application_window_real_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkApplicationWindow *window = GTK_APPLICATION_WINDOW (widget); if (window->priv->menubar != NULL) { GtkAllocation menubar_allocation = *allocation; gint menubar_height; GtkWidget *child; _gtk_window_set_allocation (GTK_WINDOW (widget), allocation); gtk_widget_get_preferred_height_for_width (window->priv->menubar, allocation->width, &menubar_height, NULL); menubar_allocation.height = menubar_height; gtk_widget_size_allocate (window->priv->menubar, &menubar_allocation); child = gtk_bin_get_child (GTK_BIN (window)); if (child != NULL && gtk_widget_get_visible (child)) { GtkAllocation child_allocation = *allocation; gint border_width; border_width = gtk_container_get_border_width (GTK_CONTAINER (window)); child_allocation.x += border_width; child_allocation.y += border_width + menubar_height; child_allocation.width = MAX (1, child_allocation.width - border_width * 2); child_allocation.height = MAX (1, child_allocation.height - border_width * 2 - menubar_height); gtk_widget_size_allocate (child, &child_allocation); } } else GTK_WIDGET_CLASS (gtk_application_window_parent_class) ->size_allocate (widget, allocation); }
static void spektro_activate_cb(GtkApplication *app, gpointer user_data) { GtkBuilder *builder = gtk_builder_new_from_file("spektro.ui"); GtkApplicationWindow *app_window = GTK_APPLICATION_WINDOW( gtk_builder_get_object(builder, "main-window")); g_object_set(G_OBJECT(app_window), "application", app, NULL); gtk_application_window_set_show_menubar(app_window, FALSE); GtkGrid *grid = GTK_GRID(gtk_builder_get_object(builder, "grid")); // set up area where the spectrograph is displayed GtkScrolledWindow *scroll =GTK_SCROLLED_WINDOW( gtk_builder_get_object(builder, "scrolledwindow")); GtkImage *canvas = GTK_IMAGE(gtk_builder_get_object(builder, "canvas")); // file menu GtkFileChooserDialog *file_chooser = GTK_FILE_CHOOSER_DIALOG(gtk_builder_get_object(builder, "file-chooser-dialog")); GtkMenuItem *menu_open = GTK_MENU_ITEM(gtk_builder_get_object(builder, "menu-file-open")); g_signal_connect(G_OBJECT(menu_open), "activate", G_CALLBACK(open_cb), builder); GtkMenuItem *menu_quit = GTK_MENU_ITEM(gtk_builder_get_object(builder, "menu-file-quit")); g_signal_connect(G_OBJECT(menu_quit), "activate", G_CALLBACK(quit_cb), app); // open preferences window with menu GtkDialog *prefs = GTK_DIALOG(gtk_builder_get_object(builder, "preferences-dialog")); GtkMenuItem *menu_prefs = GTK_MENU_ITEM(gtk_builder_get_object(builder, "menu-edit-prefs")); g_signal_connect(G_OBJECT(menu_prefs), "activate", G_CALLBACK(prefs_cb), builder); // about dialog GtkAboutDialog *about = GTK_ABOUT_DIALOG(gtk_builder_get_object(builder, "about-dialog")); GtkMenuItem *menu_about = GTK_MENU_ITEM(gtk_builder_get_object(builder, "menu-help-about")); g_signal_connect(G_OBJECT(menu_about), "activate", G_CALLBACK(about_cb), about); return; }