static void sync_tab_label (TerminalScreen *screen, GParamSpec *pspec, GtkWidget *label) { GtkWidget *hbox; const char *title; TerminalWindow *window; title = terminal_screen_get_title (screen); hbox = gtk_widget_get_parent (label); gtk_label_set_text (GTK_LABEL (label), title && title[0] ? title : _("Terminal")); gtk_widget_set_tooltip_text (hbox, title); /* This call updates the window size: bug 732588. * FIXMEchpe: This is probably a GTK+ bug, should get them fix it. */ window = TERMINAL_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (label), TERMINAL_TYPE_WINDOW)); if (window != NULL) terminal_window_update_size (window); }
static void app_menu_quit_cb (GSimpleAction *action, GVariant *parameter, gpointer user_data) { GtkApplication *application = user_data; GtkWindow *window; window = gtk_application_get_active_window (application); if (TERMINAL_IS_WINDOW (window)) terminal_window_request_close (TERMINAL_WINDOW (window)); else /* a dialogue */ gtk_widget_destroy (GTK_WIDGET (window)); }
static gboolean terminal_factory_impl_create_instance (TerminalFactory *factory, GDBusMethodInvocation *invocation, GVariant *options) { TerminalApp *app = terminal_app_get (); TerminalSettingsList *profiles_list; GDBusObjectManagerServer *object_manager; TerminalWindow *window; TerminalScreen *screen; TerminalReceiverImpl *impl; TerminalObjectSkeleton *skeleton; char *object_path; GSettings *profile = NULL; const char *profile_uuid, *title, *encoding; gboolean zoom_set = FALSE; gdouble zoom = 1.0; guint window_id; gboolean show_menubar; gboolean active; gboolean have_new_window, present_window, present_window_set; GError *err = NULL; /* Look up the profile */ if (!g_variant_lookup (options, "profile", "&s", &profile_uuid)) profile_uuid = NULL; if (!g_variant_lookup (options, "encoding", "&s", &encoding)) encoding = NULL; /* use profile encoding */ profiles_list = terminal_app_get_profiles_list (app); profile = terminal_profiles_list_ref_profile_by_uuid (profiles_list, profile_uuid, &err); if (profile == NULL) { g_dbus_method_invocation_return_gerror (invocation, err); g_error_free (err); goto out; } if (g_variant_lookup (options, "window-id", "u", &window_id)) { GtkWindow *win; win = gtk_application_get_window_by_id (GTK_APPLICATION (app), window_id); if (!TERMINAL_IS_WINDOW (win)) { g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "Nonexisting window %u referenced", window_id); goto out; } window = TERMINAL_WINDOW (win); have_new_window = FALSE; } else { const char *startup_id, *display_name, *role; gboolean start_maximized, start_fullscreen; int screen_number; GdkScreen *gdk_screen; /* Create a new window */ if (!g_variant_lookup (options, "display", "^&ay", &display_name)) { g_dbus_method_invocation_return_error_literal (invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No display specified"); goto out; } screen_number = 0; gdk_screen = terminal_util_get_screen_by_display_name (display_name, screen_number); if (gdk_screen == NULL) { g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No screen %d on display \"%s\"", screen_number, display_name); goto out; } window = terminal_app_new_window (app, gdk_screen); if (g_variant_lookup (options, "desktop-startup-id", "^&ay", &startup_id)) gtk_window_set_startup_id (GTK_WINDOW (window), startup_id); /* Overwrite the default, unique window role set in terminal_window_init */ if (g_variant_lookup (options, "role", "&s", &role)) gtk_window_set_role (GTK_WINDOW (window), role); if (g_variant_lookup (options, "show-menubar", "b", &show_menubar)) terminal_window_set_menubar_visible (window, show_menubar); if (g_variant_lookup (options, "fullscreen-window", "b", &start_fullscreen) && start_fullscreen) { gtk_window_fullscreen (GTK_WINDOW (window)); } if (g_variant_lookup (options, "maximize-window", "b", &start_maximized) && start_maximized) { gtk_window_maximize (GTK_WINDOW (window)); } have_new_window = TRUE; } g_assert (window != NULL); if (!g_variant_lookup (options, "title", "&s", &title)) title = NULL; if (g_variant_lookup (options, "zoom", "d", &zoom)) zoom_set = TRUE; screen = terminal_screen_new (profile, encoding, NULL, title, NULL, NULL, zoom_set ? zoom : 1.0); terminal_window_add_screen (window, screen, -1); object_path = get_object_path_for_screen (window, screen); g_assert (g_variant_is_object_path (object_path)); skeleton = terminal_object_skeleton_new (object_path); impl = terminal_receiver_impl_new (screen); terminal_object_skeleton_set_receiver (skeleton, TERMINAL_RECEIVER (impl)); g_object_unref (impl); object_manager = terminal_app_get_object_manager (app); g_dbus_object_manager_server_export (object_manager, G_DBUS_OBJECT_SKELETON (skeleton)); g_object_set_data_full (G_OBJECT (screen), RECEIVER_IMPL_SKELETON_DATA_KEY, skeleton, (GDestroyNotify) g_object_unref); g_signal_connect (screen, "destroy", G_CALLBACK (screen_destroy_cb), app); if (g_variant_lookup (options, "active", "b", &active) && active) { terminal_window_switch_screen (window, screen); gtk_widget_grab_focus (GTK_WIDGET (screen)); } if (g_variant_lookup (options, "present-window", "b", &present_window)) present_window_set = TRUE; else present_window_set = FALSE; if (have_new_window) { const char *geometry; if (g_variant_lookup (options, "geometry", "&s", &geometry) && !terminal_window_parse_geometry (window, geometry)) _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY, "Invalid geometry string \"%s\"", geometry); } if (have_new_window || (present_window_set && present_window)) gtk_window_present (GTK_WINDOW (window)); terminal_factory_complete_create_instance (factory, invocation, object_path); g_free (object_path); out: if (profile) g_object_unref (profile); return TRUE; /* handled */ }
/** * terminal_profile_edit: * @profile: a #GSettings * @transient_parent: a #GtkWindow, or %NULL * @widget_name: a widget name in the profile editor's UI, or %NULL * * Shows the profile editor with @profile, anchored to @transient_parent. * If @widget_name is non-%NULL, focuses the corresponding widget and * switches the notebook to its containing page. */ void terminal_profile_edit (GSettings *profile, GtkWindow *transient_parent, const char *widget_name) { TerminalSettingsList *profiles_list; GtkBuilder *builder; GError *error = NULL; GtkWidget *editor, *w; gs_free char *uuid = NULL; guint i; gfloat style_darkness; editor = g_object_get_data (G_OBJECT (profile), "editor-window"); if (editor) { terminal_util_dialog_focus_widget (editor, widget_name); gtk_window_set_transient_for (GTK_WINDOW (editor), NULL); gtk_window_present (GTK_WINDOW (editor)); return; } fixup_color_chooser_button (); profiles_list = terminal_app_get_profiles_list (terminal_app_get ()); builder = gtk_builder_new (); gtk_builder_add_from_resource (builder, "/org/gnome/terminal/ui/profile-preferences.ui", &error); g_assert_no_error (error); editor = (GtkWidget *) gtk_builder_get_object (builder, "profile-editor-dialog"); g_object_set_data_full (G_OBJECT (editor), "builder", builder, (GDestroyNotify) g_object_unref); /* Store the dialogue on the profile, so we can acccess it above to check if * there's already a profile editor for this profile. */ g_object_set_data (G_OBJECT (profile), "editor-window", editor); g_signal_connect (editor, "destroy", G_CALLBACK (profile_editor_destroyed), profile); w = (GtkWidget *) gtk_builder_get_object (builder, "close-button"); g_signal_connect (w, "clicked", G_CALLBACK (editor_close_button_clicked_cb), editor); w = (GtkWidget *) gtk_builder_get_object (builder, "help-button"); g_signal_connect (w, "clicked", G_CALLBACK (editor_help_button_clicked_cb), editor); w = (GtkWidget *) gtk_builder_get_object (builder, "profile-editor-notebook"); gtk_widget_add_events (w, GDK_BUTTON_PRESS_MASK | GDK_SCROLL_MASK); g_signal_connect (w, "scroll-event", G_CALLBACK (scroll_event_cb), NULL); uuid = terminal_settings_list_dup_uuid_from_child (profiles_list, profile); gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "profile-uuid")), uuid); g_signal_connect (gtk_builder_get_object (builder, "default-size-reset-button"), "clicked", G_CALLBACK (default_size_reset_cb), profile); w = (GtkWidget *) gtk_builder_get_object (builder, "color-scheme-combobox"); init_color_scheme_menu (w); /* Hook up the palette colorpickers and combo box */ for (i = 0; i < TERMINAL_PALETTE_SIZE; ++i) { char name[32]; char *text; g_snprintf (name, sizeof (name), "palette-colorpicker-%u", i + 1); w = (GtkWidget *) gtk_builder_get_object (builder, name); g_object_set_data (G_OBJECT (w), "palette-entry-index", GUINT_TO_POINTER (i)); text = g_strdup_printf (_("Choose Palette Color %u"), i + 1); gtk_color_button_set_title (GTK_COLOR_BUTTON (w), text); g_free (text); text = g_strdup_printf (_("Palette entry %u"), i + 1); gtk_widget_set_tooltip_text (w, text); g_free (text); g_signal_connect (w, "notify::rgba", G_CALLBACK (palette_color_notify_cb), profile); } gtk_widget_style_get (GTK_WIDGET ( terminal_window_get_active (TERMINAL_WINDOW (transient_parent))), "background-darkness", &style_darkness, NULL); gtk_widget_set_visible (gtk_builder_get_object ( builder, "use-theme-transparency-checkbutton"), style_darkness >= 0); profile_palette_notify_colorpickers_cb (profile, TERMINAL_PROFILE_PALETTE_KEY, editor); g_signal_connect (profile, "changed::" TERMINAL_PROFILE_PALETTE_KEY, G_CALLBACK (profile_palette_notify_colorpickers_cb), editor); w = (GtkWidget *) gtk_builder_get_object (builder, "palette-combobox"); g_signal_connect (w, "notify::active", G_CALLBACK (palette_scheme_combo_changed_cb), profile); profile_palette_notify_scheme_combo_cb (profile, TERMINAL_PROFILE_PALETTE_KEY, GTK_COMBO_BOX (w)); g_signal_connect (profile, "changed::" TERMINAL_PROFILE_PALETTE_KEY, G_CALLBACK (profile_palette_notify_scheme_combo_cb), w); /* Hook up the color scheme pickers and combo box */ w = (GtkWidget *) gtk_builder_get_object (builder, "color-scheme-combobox"); g_signal_connect (w, "notify::active", G_CALLBACK (color_scheme_combo_changed_cb), profile); profile_colors_notify_scheme_combo_cb (profile, NULL, GTK_COMBO_BOX (w)); g_signal_connect (profile, "changed::" TERMINAL_PROFILE_FOREGROUND_COLOR_KEY, G_CALLBACK (profile_colors_notify_scheme_combo_cb), w); g_signal_connect (profile, "changed::" TERMINAL_PROFILE_BACKGROUND_COLOR_KEY, G_CALLBACK (profile_colors_notify_scheme_combo_cb), w); w = GTK_WIDGET (gtk_builder_get_object (builder, "custom-command-entry")); custom_command_entry_changed_cb (GTK_ENTRY (w)); g_signal_connect (w, "changed", G_CALLBACK (custom_command_entry_changed_cb), NULL); g_signal_connect (gtk_builder_get_object (builder, "reset-compat-defaults-button"), "clicked", G_CALLBACK (reset_compat_defaults_cb), profile); g_settings_bind_with_mapping (profile, TERMINAL_PROFILE_VISIBLE_NAME_KEY, editor, "title", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_NO_SENSITIVITY, (GSettingsBindGetMapping) string_to_window_title, NULL, NULL, NULL); g_settings_bind (profile, TERMINAL_PROFILE_ALLOW_BOLD_KEY, gtk_builder_get_object (builder, "allow-bold-checkbutton"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind_with_mapping (profile, TERMINAL_PROFILE_BACKGROUND_COLOR_KEY, gtk_builder_get_object (builder, "background-colorpicker"), "rgba", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET, (GSettingsBindGetMapping) s_to_rgba, (GSettingsBindSetMapping) rgba_to_s, NULL, NULL); g_settings_bind_with_mapping (profile, TERMINAL_PROFILE_BACKSPACE_BINDING_KEY, gtk_builder_get_object (builder, "backspace-binding-combobox"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET, (GSettingsBindGetMapping) string_to_enum, (GSettingsBindSetMapping) enum_to_string, vte_erase_binding_get_type, NULL); g_settings_bind (profile, TERMINAL_PROFILE_BOLD_COLOR_SAME_AS_FG_KEY, gtk_builder_get_object (builder, "bold-color-same-as-fg-checkbox"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind (profile, TERMINAL_PROFILE_BOLD_COLOR_SAME_AS_FG_KEY, gtk_builder_get_object (builder, "bold-colorpicker-box"), "sensitive", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_INVERT_BOOLEAN | G_SETTINGS_BIND_NO_SENSITIVITY); g_settings_bind_with_mapping (profile, TERMINAL_PROFILE_BOLD_COLOR_KEY, gtk_builder_get_object (builder, "bold-colorpicker"), "rgba", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET, (GSettingsBindGetMapping) s_to_rgba, (GSettingsBindSetMapping) rgba_to_s, NULL, NULL); g_settings_bind_with_mapping (profile, TERMINAL_PROFILE_CURSOR_SHAPE_KEY, gtk_builder_get_object (builder, "cursor-shape-combobox"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET, (GSettingsBindGetMapping) string_to_enum, (GSettingsBindSetMapping) enum_to_string, vte_cursor_shape_get_type, NULL); g_settings_bind (profile, TERMINAL_PROFILE_CUSTOM_COMMAND_KEY, gtk_builder_get_object (builder, "custom-command-entry"), "text", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind (profile, TERMINAL_PROFILE_DEFAULT_SIZE_COLUMNS_KEY, gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "default-size-columns-spinbutton"))), "value", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind (profile, TERMINAL_PROFILE_DEFAULT_SIZE_ROWS_KEY, gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "default-size-rows-spinbutton"))), "value", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind_with_mapping (profile, TERMINAL_PROFILE_DELETE_BINDING_KEY, gtk_builder_get_object (builder, "delete-binding-combobox"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET, (GSettingsBindGetMapping) string_to_enum, (GSettingsBindSetMapping) enum_to_string, vte_erase_binding_get_type, NULL); g_settings_bind_with_mapping (profile, TERMINAL_PROFILE_EXIT_ACTION_KEY, gtk_builder_get_object (builder, "exit-action-combobox"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET, (GSettingsBindGetMapping) string_to_enum, (GSettingsBindSetMapping) enum_to_string, terminal_exit_action_get_type, NULL); g_settings_bind (profile, TERMINAL_PROFILE_FONT_KEY, gtk_builder_get_object (builder, "font-selector"), "font-name", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind_with_mapping (profile, TERMINAL_PROFILE_FOREGROUND_COLOR_KEY, gtk_builder_get_object (builder, "foreground-colorpicker"), "rgba", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET, (GSettingsBindGetMapping) s_to_rgba, (GSettingsBindSetMapping) rgba_to_s, NULL, NULL); g_settings_bind (profile, TERMINAL_PROFILE_LOGIN_SHELL_KEY, gtk_builder_get_object (builder, "login-shell-checkbutton"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind (profile, TERMINAL_PROFILE_VISIBLE_NAME_KEY, gtk_builder_get_object (builder, "profile-name-entry"), "text", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind (profile, TERMINAL_PROFILE_SCROLLBACK_LINES_KEY, gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "scrollback-lines-spinbutton"))), "value", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind (profile, TERMINAL_PROFILE_SCROLLBACK_UNLIMITED_KEY, gtk_builder_get_object (builder, "scrollback-limited-checkbutton"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET | G_SETTINGS_BIND_INVERT_BOOLEAN); g_settings_bind (profile, TERMINAL_PROFILE_SCROLLBACK_UNLIMITED_KEY, gtk_builder_get_object (builder, "scrollback-box"), "sensitive", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_INVERT_BOOLEAN | G_SETTINGS_BIND_NO_SENSITIVITY); g_settings_bind_with_mapping (profile, TERMINAL_PROFILE_SCROLLBAR_POLICY_KEY, gtk_builder_get_object (builder, "scrollbar-checkbutton"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET, (GSettingsBindGetMapping) scrollbar_policy_to_bool, (GSettingsBindSetMapping) bool_to_scrollbar_policy, NULL, NULL); g_settings_bind (profile, TERMINAL_PROFILE_SCROLL_ON_KEYSTROKE_KEY, gtk_builder_get_object (builder, "scroll-on-keystroke-checkbutton"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind (profile, TERMINAL_PROFILE_SCROLL_ON_OUTPUT_KEY, gtk_builder_get_object (builder, "scroll-on-output-checkbutton"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind (profile, TERMINAL_PROFILE_USE_SYSTEM_FONT_KEY, gtk_builder_get_object (builder, "custom-font-checkbutton"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET | G_SETTINGS_BIND_INVERT_BOOLEAN); g_settings_bind (profile, TERMINAL_PROFILE_USE_CUSTOM_COMMAND_KEY, gtk_builder_get_object (builder, "use-custom-command-checkbutton"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind (profile, TERMINAL_PROFILE_USE_THEME_COLORS_KEY, gtk_builder_get_object (builder, "use-theme-colors-checkbutton"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind (profile, TERMINAL_PROFILE_AUDIBLE_BELL_KEY, gtk_builder_get_object (builder, "bell-checkbutton"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind (profile, TERMINAL_PROFILE_USE_CUSTOM_COMMAND_KEY, gtk_builder_get_object (builder, "custom-command-box"), "sensitive", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_NO_SENSITIVITY); g_settings_bind (profile, TERMINAL_PROFILE_USE_SYSTEM_FONT_KEY, gtk_builder_get_object (builder, "font-selector"), "sensitive", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_INVERT_BOOLEAN | G_SETTINGS_BIND_NO_SENSITIVITY); g_settings_bind (profile, TERMINAL_PROFILE_USE_THEME_COLORS_KEY, gtk_builder_get_object (builder, "colors-box"), "sensitive", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_INVERT_BOOLEAN | G_SETTINGS_BIND_NO_SENSITIVITY); g_settings_bind_writable (profile, TERMINAL_PROFILE_PALETTE_KEY, gtk_builder_get_object (builder, "palette-box"), "sensitive", FALSE); g_settings_bind (profile, TERMINAL_PROFILE_REWRAP_ON_RESIZE_KEY, gtk_builder_get_object (builder, "rewrap-on-resize-checkbutton"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); /* Compatibility options */ w = (GtkWidget *) gtk_builder_get_object (builder, "encoding-combobox"); init_encodings_combo (w); g_settings_bind (profile, TERMINAL_PROFILE_ENCODING_KEY, w, "active-id", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); w = (GtkWidget *) gtk_builder_get_object (builder, "cjk-ambiguous-width-combobox"); g_settings_bind (profile, TERMINAL_PROFILE_CJK_UTF8_AMBIGUOUS_WIDTH_KEY, w, "active-id", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind (profile, TERMINAL_PROFILE_USE_TRANSPARENT_BACKGROUND, gtk_builder_get_object (builder, "use-transparent-background"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind (profile, TERMINAL_PROFILE_USE_TRANSPARENT_BACKGROUND, gtk_builder_get_object (builder, "background-transparent-scale-box"), "sensitive", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_NO_SENSITIVITY); g_settings_bind (profile, TERMINAL_PROFILE_BACKGROUND_TRANSPARENCY_PERCENT, gtk_builder_get_object (builder, "background-transparent-adjustment"), "value", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); g_settings_bind (profile, TERMINAL_PROFILE_USE_THEME_TRANSPARENCY, gtk_builder_get_object (builder, "use-theme-transparency-checkbutton"), "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET); if (style_darkness >= 0) g_settings_bind (profile, TERMINAL_PROFILE_USE_THEME_TRANSPARENCY, gtk_builder_get_object (builder, "use-transparent-background-box"), "sensitive", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_INVERT_BOOLEAN | G_SETTINGS_BIND_NO_SENSITIVITY); /* Finished! */ terminal_util_bind_mnemonic_label_sensitivity (editor); terminal_util_dialog_focus_widget (editor, widget_name); gtk_window_set_transient_for (GTK_WINDOW (editor), NULL); gtk_window_present (GTK_WINDOW (editor)); }