summaryrefslogtreecommitdiff
path: root/src/terminal-screen.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/terminal-screen.c')
-rw-r--r--src/terminal-screen.c3299
1 files changed, 1659 insertions, 1640 deletions
diff --git a/src/terminal-screen.c b/src/terminal-screen.c
index 3899e30..b71bdb4 100644
--- a/src/terminal-screen.c
+++ b/src/terminal-screen.c
@@ -48,82 +48,83 @@
typedef struct
{
- int tag;
- TerminalURLFlavour flavor;
+ int tag;
+ TerminalURLFlavour flavor;
} TagData;
struct _TerminalScreenPrivate
{
- TerminalProfile *profile; /* may be NULL at times */
- guint profile_changed_id;
- guint profile_forgotten_id;
- char *raw_title, *raw_icon_title;
- char *cooked_title, *cooked_icon_title;
- char *override_title;
- gboolean icon_title_set;
- char *initial_working_directory;
- char **initial_env;
- char **override_command;
- int child_pid;
- int pty_fd;
- double font_scale;
- gboolean user_title; /* title was manually set */
- GSList *match_tags;
- guint launch_child_source_id;
+ TerminalProfile *profile; /* may be NULL at times */
+ guint profile_changed_id;
+ guint profile_forgotten_id;
+ char *raw_title, *raw_icon_title;
+ char *cooked_title, *cooked_icon_title;
+ char *override_title;
+ gboolean icon_title_set;
+ char *initial_working_directory;
+ char **initial_env;
+ char **override_command;
+ int child_pid;
+ int pty_fd;
+ double font_scale;
+ gboolean user_title; /* title was manually set */
+ GSList *match_tags;
+ guint launch_child_source_id;
};
enum
{
- PROFILE_SET,
- SHOW_POPUP_MENU,
- MATCH_CLICKED,
- CLOSE_SCREEN,
- LAST_SIGNAL
+ PROFILE_SET,
+ SHOW_POPUP_MENU,
+ MATCH_CLICKED,
+ CLOSE_SCREEN,
+ LAST_SIGNAL
};
-enum {
- PROP_0,
- PROP_PROFILE,
- PROP_ICON_TITLE,
- PROP_ICON_TITLE_SET,
- PROP_OVERRIDE_COMMAND,
- PROP_TITLE,
- PROP_INITIAL_ENVIRONMENT
+enum
+{
+ PROP_0,
+ PROP_PROFILE,
+ PROP_ICON_TITLE,
+ PROP_ICON_TITLE_SET,
+ PROP_OVERRIDE_COMMAND,
+ PROP_TITLE,
+ PROP_INITIAL_ENVIRONMENT
};
enum
{
- TARGET_COLOR,
- TARGET_BGIMAGE,
- TARGET_RESET_BG,
- TARGET_MOZ_URL,
- TARGET_NETSCAPE_URL,
- TARGET_TAB
+ TARGET_COLOR,
+ TARGET_BGIMAGE,
+ TARGET_RESET_BG,
+ TARGET_MOZ_URL,
+ TARGET_NETSCAPE_URL,
+ TARGET_TAB
};
static void terminal_screen_dispose (GObject *object);
static void terminal_screen_finalize (GObject *object);
static void terminal_screen_drag_data_received (GtkWidget *widget,
- GdkDragContext *context,
- gint x,
- gint y,
- GtkSelectionData *selection_data,
- guint info,
- guint time);
+ GdkDragContext *context,
+ gint x,
+ gint y,
+ GtkSelectionData *selection_data,
+ guint info,
+ guint time);
static void terminal_screen_system_font_notify_cb (TerminalApp *app,
- GParamSpec *pspec,
- TerminalScreen *screen);
+ GParamSpec *pspec,
+ TerminalScreen *screen);
static void terminal_screen_change_font (TerminalScreen *screen);
static gboolean terminal_screen_popup_menu (GtkWidget *widget);
static gboolean terminal_screen_button_press (GtkWidget *widget,
- GdkEventButton *event);
+ GdkEventButton *event);
static void terminal_screen_launch_child_on_idle (TerminalScreen *screen);
static void terminal_screen_child_exited (VteTerminal *terminal);
static void terminal_screen_window_title_changed (VteTerminal *vte_terminal,
- TerminalScreen *screen);
+ TerminalScreen *screen);
static void terminal_screen_icon_title_changed (VteTerminal *vte_terminal,
- TerminalScreen *screen);
+ TerminalScreen *screen);
static void update_color_scheme (TerminalScreen *screen);
@@ -133,9 +134,9 @@ static void terminal_screen_cook_title (TerminalScreen *screen);
static void terminal_screen_cook_icon_title (TerminalScreen *screen);
static char* terminal_screen_check_match (TerminalScreen *screen,
- int column,
- int row,
- int *flavor);
+ int column,
+ int row,
+ int *flavor);
static guint signals[LAST_SIGNAL];
@@ -151,18 +152,20 @@ static guint signals[LAST_SIGNAL];
#define USERPASS USERCHARS_CLASS "+(?:" PASSCHARS_CLASS "+)?"
#define URLPATH "(?:(/"PATHCHARS_CLASS"+(?:[(]"PATHCHARS_CLASS"*[)])*"PATHCHARS_CLASS"*)*"PATHTERM_CLASS")?"
-typedef struct {
- const char *pattern;
- TerminalURLFlavour flavor;
- GRegexCompileFlags flags;
+typedef struct
+{
+ const char *pattern;
+ TerminalURLFlavour flavor;
+ GRegexCompileFlags flags;
} TerminalRegexPattern;
-static const TerminalRegexPattern url_regex_patterns[] = {
- { SCHEME "//(?:" USERPASS "\\@)?" HOST PORT URLPATH, FLAVOR_AS_IS, G_REGEX_CASELESS },
- { "(?:www|ftp)" HOSTCHARS_CLASS "*\\." HOST PORT URLPATH , FLAVOR_DEFAULT_TO_HTTP, G_REGEX_CASELESS },
- { "(?:callto:|h323:|sip:)" USERCHARS_CLASS "[" USERCHARS ".]*(?:" PORT "/[a-z0-9]+)?\\@" HOST, FLAVOR_VOIP_CALL, G_REGEX_CASELESS },
- { "(?:mailto:)?" USERCHARS_CLASS "[" USERCHARS ".]*\\@" HOSTCHARS_CLASS "+\\." HOST, FLAVOR_EMAIL, G_REGEX_CASELESS },
- { "news:[[:alnum:]\\Q^_{|}~!\"#$%&'()*+,./;:=?`\\E]+", FLAVOR_AS_IS, G_REGEX_CASELESS },
+static const TerminalRegexPattern url_regex_patterns[] =
+{
+ { SCHEME "//(?:" USERPASS "\\@)?" HOST PORT URLPATH, FLAVOR_AS_IS, G_REGEX_CASELESS },
+ { "(?:www|ftp)" HOSTCHARS_CLASS "*\\." HOST PORT URLPATH , FLAVOR_DEFAULT_TO_HTTP, G_REGEX_CASELESS },
+ { "(?:callto:|h323:|sip:)" USERCHARS_CLASS "[" USERCHARS ".]*(?:" PORT "/[a-z0-9]+)?\\@" HOST, FLAVOR_VOIP_CALL, G_REGEX_CASELESS },
+ { "(?:mailto:)?" USERCHARS_CLASS "[" USERCHARS ".]*\\@" HOSTCHARS_CLASS "+\\." HOST, FLAVOR_EMAIL, G_REGEX_CASELESS },
+ { "news:[[:alnum:]\\Q^_{|}~!\"#$%&'()*+,./;:=?`\\E]+", FLAVOR_AS_IS, G_REGEX_CASELESS },
};
static GRegex **url_regexes;
@@ -170,9 +173,10 @@ static TerminalURLFlavour *url_regex_flavors;
static guint n_url_regexes;
#ifdef ENABLE_SKEY
-static const TerminalRegexPattern skey_regex_patterns[] = {
- { "s/key [[:digit:]]* [-[:alnum:]]*", FLAVOR_AS_IS },
- { "otp-[a-z0-9]* [[:digit:]]* [-[:alnum:]]*", FLAVOR_AS_IS },
+static const TerminalRegexPattern skey_regex_patterns[] =
+{
+ { "s/key [[:digit:]]* [-[:alnum:]]*", FLAVOR_AS_IS },
+ { "otp-[a-z0-9]* [[:digit:]]* [-[:alnum:]]*", FLAVOR_AS_IS },
};
static GRegex **skey_regexes;
@@ -186,141 +190,142 @@ G_DEFINE_TYPE (TerminalScreen, terminal_screen, VTE_TYPE_TERMINAL)
static char *
cwd_of_pid (int pid)
{
- static const char patterns[][18] = {
- "/proc/%d/cwd", /* Linux */
- "/proc/%d/path/cwd", /* Solaris >= 10 */
- };
- guint i;
-
- if (pid == -1)
- return NULL;
-
- /* Try to get the working directory using various OS-specific mechanisms */
- for (i = 0; i < G_N_ELEMENTS (patterns); ++i)
- {
- char cwd_file[64];
- char buf[PATH_MAX + 1];
- int len;
-
- g_snprintf (cwd_file, sizeof (cwd_file), patterns[i], pid);
- len = readlink (cwd_file, buf, sizeof (buf) - 1);
-
- if (len > 0 && buf[0] == '/')
- return g_strndup (buf, len);
-
- /* If that didn't do it, try this hack */
- if (len <= 0)
- {
- char *cwd, *working_dir = NULL;
-
- cwd = g_get_current_dir ();
- if (cwd != NULL)
- {
- /* On Solaris, readlink returns an empty string, but the
- * link can be used as a directory, including as a target
- * of chdir().
- */
- if (chdir (cwd_file) == 0)
- {
- working_dir = g_get_current_dir ();
- (void) chdir (cwd);
- }
- g_free (cwd);
- }
-
- if (working_dir)
- return working_dir;
- }
- }
-
- return NULL;
+ static const char patterns[][18] =
+ {
+ "/proc/%d/cwd", /* Linux */
+ "/proc/%d/path/cwd", /* Solaris >= 10 */
+ };
+ guint i;
+
+ if (pid == -1)
+ return NULL;
+
+ /* Try to get the working directory using various OS-specific mechanisms */
+ for (i = 0; i < G_N_ELEMENTS (patterns); ++i)
+ {
+ char cwd_file[64];
+ char buf[PATH_MAX + 1];
+ int len;
+
+ g_snprintf (cwd_file, sizeof (cwd_file), patterns[i], pid);
+ len = readlink (cwd_file, buf, sizeof (buf) - 1);
+
+ if (len > 0 && buf[0] == '/')
+ return g_strndup (buf, len);
+
+ /* If that didn't do it, try this hack */
+ if (len <= 0)
+ {
+ char *cwd, *working_dir = NULL;
+
+ cwd = g_get_current_dir ();
+ if (cwd != NULL)
+ {
+ /* On Solaris, readlink returns an empty string, but the
+ * link can be used as a directory, including as a target
+ * of chdir().
+ */
+ if (chdir (cwd_file) == 0)
+ {
+ working_dir = g_get_current_dir ();
+ (void) chdir (cwd);
+ }
+ g_free (cwd);
+ }
+
+ if (working_dir)
+ return working_dir;
+ }
+ }
+
+ return NULL;
}
static void
free_tag_data (TagData *tagdata)
{
- g_slice_free (TagData, tagdata);
+ g_slice_free (TagData, tagdata);
}
static void
terminal_screen_class_enable_menu_bar_accel_notify_cb (TerminalApp *app,
- GParamSpec *pspec,
- TerminalScreenClass *klass)
+ GParamSpec *pspec,
+ TerminalScreenClass *klass)
{
- static gboolean is_enabled = TRUE; /* the binding is enabled by default since GtkWidgetClass installs it */
- gboolean enable;
- GtkBindingSet *binding_set;
+ static gboolean is_enabled = TRUE; /* the binding is enabled by default since GtkWidgetClass installs it */
+ gboolean enable;
+ GtkBindingSet *binding_set;
- g_object_get (app, TERMINAL_APP_ENABLE_MENU_BAR_ACCEL, &enable, NULL);
+ g_object_get (app, TERMINAL_APP_ENABLE_MENU_BAR_ACCEL, &enable, NULL);
- /* Only remove the 'skip' entry when we have added it previously! */
- if (enable == is_enabled)
- return;
+ /* Only remove the 'skip' entry when we have added it previously! */
+ if (enable == is_enabled)
+ return;
- is_enabled = enable;
+ is_enabled = enable;
- binding_set = gtk_binding_set_by_class (klass);
- if (enable)
- gtk_binding_entry_remove (binding_set, GDK_F10, GDK_SHIFT_MASK);
- else
- gtk_binding_entry_skip (binding_set, GDK_F10, GDK_SHIFT_MASK);
+ binding_set = gtk_binding_set_by_class (klass);
+ if (enable)
+ gtk_binding_entry_remove (binding_set, GDK_F10, GDK_SHIFT_MASK);
+ else
+ gtk_binding_entry_skip (binding_set, GDK_F10, GDK_SHIFT_MASK);
}
static TerminalWindow *
terminal_screen_get_window (TerminalScreen *screen)
{
- GtkWidget *widget = GTK_WIDGET (screen);
- GtkWidget *toplevel;
+ GtkWidget *widget = GTK_WIDGET (screen);
+ GtkWidget *toplevel;
- toplevel = gtk_widget_get_toplevel (widget);
- if (!gtk_widget_is_toplevel (toplevel))
- return NULL;
+ toplevel = gtk_widget_get_toplevel (widget);
+ if (!gtk_widget_is_toplevel (toplevel))
+ return NULL;
- return TERMINAL_WINDOW (toplevel);
+ return TERMINAL_WINDOW (toplevel);
}
static gboolean
window_uses_argb_visual (TerminalScreen *screen)
{
- TerminalWindow *window;
+ TerminalWindow *window;
- window = terminal_screen_get_window (screen);
- if (window == NULL || !gtk_widget_get_realized (GTK_WIDGET (window)))
- return FALSE;
+ window = terminal_screen_get_window (screen);
+ if (window == NULL || !gtk_widget_get_realized (GTK_WIDGET (window)))
+ return FALSE;
- return terminal_window_uses_argb_visual (window);
+ return terminal_window_uses_argb_visual (window);
}
static void
terminal_screen_realize (GtkWidget *widget)
{
- TerminalScreen *screen = TERMINAL_SCREEN (widget);
- TerminalScreenPrivate *priv = screen->priv;
- TerminalBackgroundType bg_type;
+ TerminalScreen *screen = TERMINAL_SCREEN (widget);
+ TerminalScreenPrivate *priv = screen->priv;
+ TerminalBackgroundType bg_type;
- GTK_WIDGET_CLASS (terminal_screen_parent_class)->realize (widget);
+ GTK_WIDGET_CLASS (terminal_screen_parent_class)->realize (widget);
- /* FIXME: Don't enable this if we have a compmgr. */
- bg_type = terminal_profile_get_property_enum (priv->profile, TERMINAL_PROFILE_BACKGROUND_TYPE);
- vte_terminal_set_background_transparent (VTE_TERMINAL (screen),
- bg_type == TERMINAL_BACKGROUND_TRANSPARENT &&
- !window_uses_argb_visual (screen));
+ /* FIXME: Don't enable this if we have a compmgr. */
+ bg_type = terminal_profile_get_property_enum (priv->profile, TERMINAL_PROFILE_BACKGROUND_TYPE);
+ vte_terminal_set_background_transparent (VTE_TERMINAL (screen),
+ bg_type == TERMINAL_BACKGROUND_TRANSPARENT &&
+ !window_uses_argb_visual (screen));
}
static void
terminal_screen_style_set (GtkWidget *widget,
GtkStyle *previous_style)
{
- TerminalScreen *screen = TERMINAL_SCREEN (widget);
- void (* style_set) (GtkWidget*, GtkStyle*) = GTK_WIDGET_CLASS (terminal_screen_parent_class)->style_set;
+ TerminalScreen *screen = TERMINAL_SCREEN (widget);
+ void (* style_set) (GtkWidget*, GtkStyle*) = GTK_WIDGET_CLASS (terminal_screen_parent_class)->style_set;
- if (style_set)
- style_set (widget, previous_style);
+ if (style_set)
+ style_set (widget, previous_style);
- update_color_scheme (screen);
+ update_color_scheme (screen);
- if (gtk_widget_get_realized (widget))
- terminal_screen_change_font (screen);
+ if (gtk_widget_get_realized (widget))
+ terminal_screen_change_font (screen);
}
#ifdef MATE_ENABLE_DEBUG
@@ -328,97 +333,98 @@ static void
size_request (GtkWidget *widget,
GtkRequisition *req)
{
- _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY,
- "[screen %p] size-request %d : %d\n",
- widget, req->width, req->height);
+ _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY,
+ "[screen %p] size-request %d : %d\n",
+ widget, req->width, req->height);
}
static void
size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
- _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY,
- "[screen %p] size-alloc %d : %d at (%d, %d)\n",
- widget, allocation->width, allocation->height, allocation->x, allocation->y);
+ _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY,
+ "[screen %p] size-alloc %d : %d at (%d, %d)\n",
+ widget, allocation->width, allocation->height, allocation->x, allocation->y);
}
#endif
static void
terminal_screen_init (TerminalScreen *screen)
{
- const GtkTargetEntry target_table[] = {
- { "GTK_NOTEBOOK_TAB", GTK_TARGET_SAME_APP, TARGET_TAB },
- { "application/x-color", 0, TARGET_COLOR },
- { "property/bgimage", 0, TARGET_BGIMAGE },
- { "x-special/mate-reset-background", 0, TARGET_RESET_BG },
- { "text/x-moz-url", 0, TARGET_MOZ_URL },
- { "_NETSCAPE_URL", 0, TARGET_NETSCAPE_URL }
- };
- VteTerminal *terminal = VTE_TERMINAL (screen);
- TerminalScreenPrivate *priv;
- GtkTargetList *target_list;
- GtkTargetEntry *targets;
- int n_targets;
- guint i;
-
- priv = screen->priv = G_TYPE_INSTANCE_GET_PRIVATE (screen, TERMINAL_TYPE_SCREEN, TerminalScreenPrivate);
-
- vte_terminal_set_mouse_autohide (VTE_TERMINAL (screen), TRUE);
-
- priv->child_pid = -1;
- priv->pty_fd = -1;
-
- priv->font_scale = PANGO_SCALE_MEDIUM;
-
- for (i = 0; i < n_url_regexes; ++i)
- {
- TagData *tag_data;
-
- tag_data = g_slice_new (TagData);
- tag_data->flavor = url_regex_flavors[i];
- tag_data->tag = vte_terminal_match_add_gregex (terminal, url_regexes[i], 0);
- vte_terminal_match_set_cursor_type (terminal, tag_data->tag, URL_MATCH_CURSOR);
-
- priv->match_tags = g_slist_prepend (priv->match_tags, tag_data);
- }
-
- /* Setup DND */
- target_list = gtk_target_list_new (NULL, 0);
- gtk_target_list_add_uri_targets (target_list, 0);
- gtk_target_list_add_text_targets (target_list, 0);
- gtk_target_list_add_table (target_list, target_table, G_N_ELEMENTS (target_table));
-
- targets = gtk_target_table_new_from_list (target_list, &n_targets);
-
- gtk_drag_dest_set (GTK_WIDGET (screen),
- GTK_DEST_DEFAULT_MOTION |
- GTK_DEST_DEFAULT_HIGHLIGHT |
- GTK_DEST_DEFAULT_DROP,
- targets, n_targets,
- GDK_ACTION_COPY | GDK_ACTION_MOVE);
-
- gtk_target_table_free (targets, n_targets);
- gtk_target_list_unref (target_list);
-
- priv->override_title = NULL;
- priv->user_title = FALSE;
-
- g_signal_connect (screen, "window-title-changed",
- G_CALLBACK (terminal_screen_window_title_changed),
- screen);
- g_signal_connect (screen, "icon-title-changed",
- G_CALLBACK (terminal_screen_icon_title_changed),
- screen);
-
- g_signal_connect (terminal_app_get (), "notify::system-font",
- G_CALLBACK (terminal_screen_system_font_notify_cb), screen);
+ const GtkTargetEntry target_table[] =
+ {
+ { "GTK_NOTEBOOK_TAB", GTK_TARGET_SAME_APP, TARGET_TAB },
+ { "application/x-color", 0, TARGET_COLOR },
+ { "property/bgimage", 0, TARGET_BGIMAGE },
+ { "x-special/mate-reset-background", 0, TARGET_RESET_BG },
+ { "text/x-moz-url", 0, TARGET_MOZ_URL },
+ { "_NETSCAPE_URL", 0, TARGET_NETSCAPE_URL }
+ };
+ VteTerminal *terminal = VTE_TERMINAL (screen);
+ TerminalScreenPrivate *priv;
+ GtkTargetList *target_list;
+ GtkTargetEntry *targets;
+ int n_targets;
+ guint i;
+
+ priv = screen->priv = G_TYPE_INSTANCE_GET_PRIVATE (screen, TERMINAL_TYPE_SCREEN, TerminalScreenPrivate);
+
+ vte_terminal_set_mouse_autohide (VTE_TERMINAL (screen), TRUE);
+
+ priv->child_pid = -1;
+ priv->pty_fd = -1;
+
+ priv->font_scale = PANGO_SCALE_MEDIUM;
+
+ for (i = 0; i < n_url_regexes; ++i)
+ {
+ TagData *tag_data;
+
+ tag_data = g_slice_new (TagData);
+ tag_data->flavor = url_regex_flavors[i];
+ tag_data->tag = vte_terminal_match_add_gregex (terminal, url_regexes[i], 0);
+ vte_terminal_match_set_cursor_type (terminal, tag_data->tag, URL_MATCH_CURSOR);
+
+ priv->match_tags = g_slist_prepend (priv->match_tags, tag_data);
+ }
+
+ /* Setup DND */
+ target_list = gtk_target_list_new (NULL, 0);
+ gtk_target_list_add_uri_targets (target_list, 0);
+ gtk_target_list_add_text_targets (target_list, 0);
+ gtk_target_list_add_table (target_list, target_table, G_N_ELEMENTS (target_table));
+
+ targets = gtk_target_table_new_from_list (target_list, &n_targets);
+
+ gtk_drag_dest_set (GTK_WIDGET (screen),
+ GTK_DEST_DEFAULT_MOTION |
+ GTK_DEST_DEFAULT_HIGHLIGHT |
+ GTK_DEST_DEFAULT_DROP,
+ targets, n_targets,
+ GDK_ACTION_COPY | GDK_ACTION_MOVE);
+
+ gtk_target_table_free (targets, n_targets);
+ gtk_target_list_unref (target_list);
+
+ priv->override_title = NULL;
+ priv->user_title = FALSE;
+
+ g_signal_connect (screen, "window-title-changed",
+ G_CALLBACK (terminal_screen_window_title_changed),
+ screen);
+ g_signal_connect (screen, "icon-title-changed",
+ G_CALLBACK (terminal_screen_icon_title_changed),
+ screen);
+
+ g_signal_connect (terminal_app_get (), "notify::system-font",
+ G_CALLBACK (terminal_screen_system_font_notify_cb), screen);
#ifdef MATE_ENABLE_DEBUG
- _TERMINAL_DEBUG_IF (TERMINAL_DEBUG_GEOMETRY)
- {
- g_signal_connect_after (screen, "size-request", G_CALLBACK (size_request), NULL);
- g_signal_connect_after (screen, "size-allocate", G_CALLBACK (size_allocate), NULL);
- }
+ _TERMINAL_DEBUG_IF (TERMINAL_DEBUG_GEOMETRY)
+ {
+ g_signal_connect_after (screen, "size-request", G_CALLBACK (size_request), NULL);
+ g_signal_connect_after (screen, "size-allocate", G_CALLBACK (size_allocate), NULL);
+ }
#endif
}
@@ -428,32 +434,32 @@ terminal_screen_get_property (GObject *object,
GValue *value,
GParamSpec *pspec)
{
- TerminalScreen *screen = TERMINAL_SCREEN (object);
-
- switch (prop_id)
- {
- case PROP_PROFILE:
- g_value_set_object (value, terminal_screen_get_profile (screen));
- break;
- case PROP_ICON_TITLE:
- g_value_set_string (value, terminal_screen_get_icon_title (screen));
- break;
- case PROP_ICON_TITLE_SET:
- g_value_set_boolean (value, terminal_screen_get_icon_title_set (screen));
- break;
- case PROP_OVERRIDE_COMMAND:
- g_value_set_boxed (value, terminal_screen_get_override_command (screen));
- break;
- case PROP_INITIAL_ENVIRONMENT:
- g_value_set_boxed (value, terminal_screen_get_initial_environment (screen));
- break;
- case PROP_TITLE:
- g_value_set_string (value, terminal_screen_get_title (screen));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
+ TerminalScreen *screen = TERMINAL_SCREEN (object);
+
+ switch (prop_id)
+ {
+ case PROP_PROFILE:
+ g_value_set_object (value, terminal_screen_get_profile (screen));
+ break;
+ case PROP_ICON_TITLE:
+ g_value_set_string (value, terminal_screen_get_icon_title (screen));
+ break;
+ case PROP_ICON_TITLE_SET:
+ g_value_set_boolean (value, terminal_screen_get_icon_title_set (screen));
+ break;
+ case PROP_OVERRIDE_COMMAND:
+ g_value_set_boxed (value, terminal_screen_get_override_command (screen));
+ break;
+ case PROP_INITIAL_ENVIRONMENT:
+ g_value_set_boxed (value, terminal_screen_get_initial_environment (screen));
+ break;
+ case PROP_TITLE:
+ g_value_set_string (value, terminal_screen_get_title (screen));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
}
static void
@@ -462,232 +468,233 @@ terminal_screen_set_property (GObject *object,
const GValue *value,
GParamSpec *pspec)
{
- TerminalScreen *screen = TERMINAL_SCREEN (object);
-
- switch (prop_id)
- {
- case PROP_PROFILE: {
- TerminalProfile *profile;
-
- profile = g_value_get_object (value);
- g_assert (profile != NULL);
- terminal_screen_set_profile (screen, profile);
- break;
- }
- case PROP_OVERRIDE_COMMAND:
- terminal_screen_set_override_command (screen, g_value_get_boxed (value));
- break;
- case PROP_INITIAL_ENVIRONMENT:
- terminal_screen_set_initial_environment (screen, g_value_get_boxed (value));
- break;
- case PROP_ICON_TITLE:
- case PROP_ICON_TITLE_SET:
- case PROP_TITLE:
- /* not writable */
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
+ TerminalScreen *screen = TERMINAL_SCREEN (object);
+
+ switch (prop_id)
+ {
+ case PROP_PROFILE:
+ {
+ TerminalProfile *profile;
+
+ profile = g_value_get_object (value);
+ g_assert (profile != NULL);
+ terminal_screen_set_profile (screen, profile);
+ break;
+ }
+ case PROP_OVERRIDE_COMMAND:
+ terminal_screen_set_override_command (screen, g_value_get_boxed (value));
+ break;
+ case PROP_INITIAL_ENVIRONMENT:
+ terminal_screen_set_initial_environment (screen, g_value_get_boxed (value));
+ break;
+ case PROP_ICON_TITLE:
+ case PROP_ICON_TITLE_SET:
+ case PROP_TITLE:
+ /* not writable */
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
}
static void
terminal_screen_class_init (TerminalScreenClass *klass)
{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
- GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
- VteTerminalClass *terminal_class = VTE_TERMINAL_CLASS (klass);
- TerminalApp *app;
- guint i;
-
- object_class->dispose = terminal_screen_dispose;
- object_class->finalize = terminal_screen_finalize;
- object_class->get_property = terminal_screen_get_property;
- object_class->set_property = terminal_screen_set_property;
-
- widget_class->realize = terminal_screen_realize;
- widget_class->style_set = terminal_screen_style_set;
- widget_class->drag_data_received = terminal_screen_drag_data_received;
- widget_class->button_press_event = terminal_screen_button_press;
- widget_class->popup_menu = terminal_screen_popup_menu;
-
- terminal_class->child_exited = terminal_screen_child_exited;
-
- signals[PROFILE_SET] =
- g_signal_new (I_("profile-set"),
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (TerminalScreenClass, profile_set),
- NULL, NULL,
- g_cclosure_marshal_VOID__OBJECT,
- G_TYPE_NONE,
- 1, TERMINAL_TYPE_PROFILE);
-
- signals[SHOW_POPUP_MENU] =
- g_signal_new (I_("show-popup-menu"),
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (TerminalScreenClass, show_popup_menu),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE,
- 1,
- G_TYPE_POINTER);
-
- signals[MATCH_CLICKED] =
- g_signal_new (I_("match-clicked"),
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (TerminalScreenClass, match_clicked),
- g_signal_accumulator_true_handled, NULL,
- _terminal_marshal_BOOLEAN__STRING_INT_UINT,
- G_TYPE_BOOLEAN,
- 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_UINT);
-
- signals[CLOSE_SCREEN] =
- g_signal_new (I_("close-screen"),
- G_OBJECT_CLASS_TYPE (object_class),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (TerminalScreenClass, close_screen),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE,
- 0);
-
- g_object_class_install_property
- (object_class,
- PROP_PROFILE,
- g_param_spec_string ("profile", NULL, NULL,
- NULL,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- g_object_class_install_property
- (object_class,
- PROP_ICON_TITLE,
- g_param_spec_string ("icon-title", NULL, NULL,
- NULL,
- G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- g_object_class_install_property
- (object_class,
- PROP_ICON_TITLE_SET,
- g_param_spec_boolean ("icon-title-set", NULL, NULL,
- FALSE,
- G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- g_object_class_install_property
- (object_class,
- PROP_OVERRIDE_COMMAND,
- g_param_spec_boxed ("override-command", NULL, NULL,
- G_TYPE_STRV,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- g_object_class_install_property
- (object_class,
- PROP_TITLE,
- g_param_spec_string ("title", NULL, NULL,
- NULL,
- G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- g_object_class_install_property
- (object_class,
- PROP_INITIAL_ENVIRONMENT,
- g_param_spec_boxed ("initial-environment", NULL, NULL,
- G_TYPE_STRV,
- G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
-
- g_type_class_add_private (object_class, sizeof (TerminalScreenPrivate));
-
- /* Precompile the regexes */
- n_url_regexes = G_N_ELEMENTS (url_regex_patterns);
- url_regexes = g_new0 (GRegex*, n_url_regexes);
- url_regex_flavors = g_new0 (TerminalURLFlavour, n_url_regexes);
-
- for (i = 0; i < n_url_regexes; ++i)
- {
- GError *error = NULL;
-
- url_regexes[i] = g_regex_new (url_regex_patterns[i].pattern,
- url_regex_patterns[i].flags | G_REGEX_OPTIMIZE,
- 0, &error);
- if (error)
- {
- g_message ("%s", error->message);
- g_error_free (error);
- }
-
- url_regex_flavors[i] = url_regex_patterns[i].flavor;
- }
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
+ VteTerminalClass *terminal_class = VTE_TERMINAL_CLASS (klass);
+ TerminalApp *app;
+ guint i;
+
+ object_class->dispose = terminal_screen_dispose;
+ object_class->finalize = terminal_screen_finalize;
+ object_class->get_property = terminal_screen_get_property;
+ object_class->set_property = terminal_screen_set_property;
+
+ widget_class->realize = terminal_screen_realize;
+ widget_class->style_set = terminal_screen_style_set;
+ widget_class->drag_data_received = terminal_screen_drag_data_received;
+ widget_class->button_press_event = terminal_screen_button_press;
+ widget_class->popup_menu = terminal_screen_popup_menu;
+
+ terminal_class->child_exited = terminal_screen_child_exited;
+
+ signals[PROFILE_SET] =
+ g_signal_new (I_("profile-set"),
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (TerminalScreenClass, profile_set),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__OBJECT,
+ G_TYPE_NONE,
+ 1, TERMINAL_TYPE_PROFILE);
+
+ signals[SHOW_POPUP_MENU] =
+ g_signal_new (I_("show-popup-menu"),
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (TerminalScreenClass, show_popup_menu),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__POINTER,
+ G_TYPE_NONE,
+ 1,
+ G_TYPE_POINTER);
+
+ signals[MATCH_CLICKED] =
+ g_signal_new (I_("match-clicked"),
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (TerminalScreenClass, match_clicked),
+ g_signal_accumulator_true_handled, NULL,
+ _terminal_marshal_BOOLEAN__STRING_INT_UINT,
+ G_TYPE_BOOLEAN,
+ 3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_UINT);
+
+ signals[CLOSE_SCREEN] =
+ g_signal_new (I_("close-screen"),
+ G_OBJECT_CLASS_TYPE (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (TerminalScreenClass, close_screen),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
+ g_object_class_install_property
+ (object_class,
+ PROP_PROFILE,
+ g_param_spec_string ("profile", NULL, NULL,
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+
+ g_object_class_install_property
+ (object_class,
+ PROP_ICON_TITLE,
+ g_param_spec_string ("icon-title", NULL, NULL,
+ NULL,
+ G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+
+ g_object_class_install_property
+ (object_class,
+ PROP_ICON_TITLE_SET,
+ g_param_spec_boolean ("icon-title-set", NULL, NULL,
+ FALSE,
+ G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+
+ g_object_class_install_property
+ (object_class,
+ PROP_OVERRIDE_COMMAND,
+ g_param_spec_boxed ("override-command", NULL, NULL,
+ G_TYPE_STRV,
+ G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+
+ g_object_class_install_property
+ (object_class,
+ PROP_TITLE,
+ g_param_spec_string ("title", NULL, NULL,
+ NULL,
+ G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+
+ g_object_class_install_property
+ (object_class,
+ PROP_INITIAL_ENVIRONMENT,
+ g_param_spec_boxed ("initial-environment", NULL, NULL,
+ G_TYPE_STRV,
+ G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
+
+ g_type_class_add_private (object_class, sizeof (TerminalScreenPrivate));
+
+ /* Precompile the regexes */
+ n_url_regexes = G_N_ELEMENTS (url_regex_patterns);
+ url_regexes = g_new0 (GRegex*, n_url_regexes);
+ url_regex_flavors = g_new0 (TerminalURLFlavour, n_url_regexes);
+
+ for (i = 0; i < n_url_regexes; ++i)
+ {
+ GError *error = NULL;
+
+ url_regexes[i] = g_regex_new (url_regex_patterns[i].pattern,
+ url_regex_patterns[i].flags | G_REGEX_OPTIMIZE,
+ 0, &error);
+ if (error)
+ {
+ g_message ("%s", error->message);
+ g_error_free (error);
+ }
+
+ url_regex_flavors[i] = url_regex_patterns[i].flavor;
+ }
#ifdef ENABLE_SKEY
- n_skey_regexes = G_N_ELEMENTS (skey_regex_patterns);
- skey_regexes = g_new0 (GRegex*, n_skey_regexes);
-
- for (i = 0; i < n_skey_regexes; ++i)
- {
- GError *error = NULL;
-
- skey_regexes[i] = g_regex_new (skey_regex_patterns[i].pattern, G_REGEX_OPTIMIZE, 0, &error);
- if (error)
- {
- g_message ("%s", error->message);
- g_error_free (error);
- }
- }
+ n_skey_regexes = G_N_ELEMENTS (skey_regex_patterns);
+ skey_regexes = g_new0 (GRegex*, n_skey_regexes);
+
+ for (i = 0; i < n_skey_regexes; ++i)
+ {
+ GError *error = NULL;
+
+ skey_regexes[i] = g_regex_new (skey_regex_patterns[i].pattern, G_REGEX_OPTIMIZE, 0, &error);
+ if (error)
+ {
+ g_message ("%s", error->message);
+ g_error_free (error);
+ }
+ }
#endif /* ENABLE_SKEY */
- /* This fixes bug #329827 */
- app = terminal_app_get ();
- terminal_screen_class_enable_menu_bar_accel_notify_cb (app, NULL, klass);
- g_signal_connect (app, "notify::" TERMINAL_APP_ENABLE_MENU_BAR_ACCEL,
- G_CALLBACK (terminal_screen_class_enable_menu_bar_accel_notify_cb), klass);
+ /* This fixes bug #329827 */
+ app = terminal_app_get ();
+ terminal_screen_class_enable_menu_bar_accel_notify_cb (app, NULL, klass);
+ g_signal_connect (app, "notify::" TERMINAL_APP_ENABLE_MENU_BAR_ACCEL,
+ G_CALLBACK (terminal_screen_class_enable_menu_bar_accel_notify_cb), klass);
}
static void
terminal_screen_dispose (GObject *object)
{
- TerminalScreen *screen = TERMINAL_SCREEN (object);
- TerminalScreenPrivate *priv = screen->priv;
- GtkSettings *settings;
+ TerminalScreen *screen = TERMINAL_SCREEN (object);
+ TerminalScreenPrivate *priv = screen->priv;
+ GtkSettings *settings;
- settings = gtk_widget_get_settings (GTK_WIDGET (screen));
- g_signal_handlers_disconnect_matched (settings, G_SIGNAL_MATCH_DATA,
- 0, 0, NULL, NULL,
- screen);
+ settings = gtk_widget_get_settings (GTK_WIDGET (screen));
+ g_signal_handlers_disconnect_matched (settings, G_SIGNAL_MATCH_DATA,
+ 0, 0, NULL, NULL,
+ screen);
- if (priv->launch_child_source_id != 0)
- {
- g_source_remove (priv->launch_child_source_id);
- priv->launch_child_source_id = 0;
- }
+ if (priv->launch_child_source_id != 0)
+ {
+ g_source_remove (priv->launch_child_source_id);
+ priv->launch_child_source_id = 0;
+ }
- G_OBJECT_CLASS (terminal_screen_parent_class)->dispose (object);
+ G_OBJECT_CLASS (terminal_screen_parent_class)->dispose (object);
}
static void
terminal_screen_finalize (GObject *object)
{
- TerminalScreen *screen = TERMINAL_SCREEN (object);
- TerminalScreenPrivate *priv = screen->priv;
+ TerminalScreen *screen = TERMINAL_SCREEN (object);
+ TerminalScreenPrivate *priv = screen->priv;
- g_signal_handlers_disconnect_by_func (terminal_app_get (),
- G_CALLBACK (terminal_screen_system_font_notify_cb),
- screen);
+ g_signal_handlers_disconnect_by_func (terminal_app_get (),
+ G_CALLBACK (terminal_screen_system_font_notify_cb),
+ screen);
- terminal_screen_set_profile (screen, NULL);
+ terminal_screen_set_profile (screen, NULL);
- g_free (priv->raw_title);
- g_free (priv->cooked_title);
- g_free (priv->override_title);
- g_free (priv->raw_icon_title);
- g_free (priv->cooked_icon_title);
- g_free (priv->initial_working_directory);
- g_strfreev (priv->override_command);
- g_strfreev (priv->initial_env);
+ g_free (priv->raw_title);
+ g_free (priv->cooked_title);
+ g_free (priv->override_title);
+ g_free (priv->raw_icon_title);
+ g_free (priv->cooked_icon_title);
+ g_free (priv->initial_working_directory);
+ g_strfreev (priv->override_command);
+ g_strfreev (priv->initial_env);
- g_slist_foreach (priv->match_tags, (GFunc) free_tag_data, NULL);
- g_slist_free (priv->match_tags);
+ g_slist_foreach (priv->match_tags, (GFunc) free_tag_data, NULL);
+ g_slist_free (priv->match_tags);
- G_OBJECT_CLASS (terminal_screen_parent_class)->finalize (object);
+ G_OBJECT_CLASS (terminal_screen_parent_class)->finalize (object);
}
TerminalScreen *
@@ -698,87 +705,88 @@ terminal_screen_new (TerminalProfile *profile,
char **child_env,
double zoom)
{
- TerminalScreen *screen;
- TerminalScreenPrivate *priv;
+ TerminalScreen *screen;
+ TerminalScreenPrivate *priv;
- g_return_val_if_fail (TERMINAL_IS_PROFILE (profile), NULL);
+ g_return_val_if_fail (TERMINAL_IS_PROFILE (profile), NULL);
- screen = g_object_new (TERMINAL_TYPE_SCREEN, NULL);
- priv = screen->priv;
+ screen = g_object_new (TERMINAL_TYPE_SCREEN, NULL);
+ priv = screen->priv;
- terminal_screen_set_profile (screen, profile);
+ terminal_screen_set_profile (screen, profile);
- if (terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_USE_CUSTOM_DEFAULT_SIZE)) {
- vte_terminal_set_size (VTE_TERMINAL (screen),
- terminal_profile_get_property_int (profile, TERMINAL_PROFILE_DEFAULT_SIZE_COLUMNS),
- terminal_profile_get_property_int (profile, TERMINAL_PROFILE_DEFAULT_SIZE_ROWS));
- }
+ if (terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_USE_CUSTOM_DEFAULT_SIZE))
+ {
+ vte_terminal_set_size (VTE_TERMINAL (screen),
+ terminal_profile_get_property_int (profile, TERMINAL_PROFILE_DEFAULT_SIZE_COLUMNS),
+ terminal_profile_get_property_int (profile, TERMINAL_PROFILE_DEFAULT_SIZE_ROWS));
+ }
- if (title)
- terminal_screen_set_override_title (screen, title);
+ if (title)
+ terminal_screen_set_override_title (screen, title);
- priv->initial_working_directory = g_strdup (working_dir);
+ priv->initial_working_directory = g_strdup (working_dir);
- if (override_command)
- terminal_screen_set_override_command (screen, override_command);
+ if (override_command)
+ terminal_screen_set_override_command (screen, override_command);
- if (child_env)
- terminal_screen_set_initial_environment (screen, child_env);
+ if (child_env)
+ terminal_screen_set_initial_environment (screen, child_env);
- terminal_screen_set_font_scale (screen, zoom);
- terminal_screen_set_font (screen);
+ terminal_screen_set_font_scale (screen, zoom);
+ terminal_screen_set_font (screen);
- /* Launch the child on idle */
- terminal_screen_launch_child_on_idle (screen);
+ /* Launch the child on idle */
+ terminal_screen_launch_child_on_idle (screen);
- return screen;
+ return screen;
}
const char*
terminal_screen_get_raw_title (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
-
- if (priv->raw_title)
- return priv->raw_title;
+ TerminalScreenPrivate *priv = screen->priv;
+
+ if (priv->raw_title)
+ return priv->raw_title;
- return "";
+ return "";
}
const char*
terminal_screen_get_title (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
-
- if (priv->cooked_title == NULL)
- terminal_screen_cook_title (screen);
+ TerminalScreenPrivate *priv = screen->priv;
- /* cooked_title may still be NULL */
- if (priv->cooked_title != NULL)
- return priv->cooked_title;
- else
- return "";
+ if (priv->cooked_title == NULL)
+ terminal_screen_cook_title (screen);
+
+ /* cooked_title may still be NULL */
+ if (priv->cooked_title != NULL)
+ return priv->cooked_title;
+ else
+ return "";
}
const char*
terminal_screen_get_icon_title (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
-
- if (priv->cooked_icon_title == NULL)
- terminal_screen_cook_icon_title (screen);
+ TerminalScreenPrivate *priv = screen->priv;
+
+ if (priv->cooked_icon_title == NULL)
+ terminal_screen_cook_icon_title (screen);
- /* cooked_icon_title may still be NULL */
- if (priv->cooked_icon_title != NULL)
- return priv->cooked_icon_title;
- else
- return "";
+ /* cooked_icon_title may still be NULL */
+ if (priv->cooked_icon_title != NULL)
+ return priv->cooked_icon_title;
+ else
+ return "";
}
gboolean
terminal_screen_get_icon_title_set (TerminalScreen *screen)
{
- return screen->priv->icon_title_set;
+ return screen->priv->icon_title_set;
}
/* Supported format specifiers:
@@ -790,15 +798,16 @@ terminal_screen_get_icon_title_set (TerminalScreen *screen)
static const char *
terminal_screen_get_title_format (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
- static const char *formats[] = {
- "%A" /* TERMINAL_TITLE_REPLACE */,
- "%D%-%S" /* TERMINAL_TITLE_BEFORE */,
- "%S%-%D" /* TERMINAL_TITLE_AFTER */,
- "%S" /* TERMINAL_TITLE_IGNORE */
- };
+ TerminalScreenPrivate *priv = screen->priv;
+ static const char *formats[] =
+ {
+ "%A" /* TERMINAL_TITLE_REPLACE */,
+ "%D%-%S" /* TERMINAL_TITLE_BEFORE */,
+ "%S%-%D" /* TERMINAL_TITLE_AFTER */,
+ "%S" /* TERMINAL_TITLE_IGNORE */
+ };
- return formats[terminal_profile_get_property_enum (priv->profile, TERMINAL_PROFILE_TITLE_MODE)];
+ return formats[terminal_profile_get_property_enum (priv->profile, TERMINAL_PROFILE_TITLE_MODE)];
}
/**
@@ -806,7 +815,7 @@ terminal_screen_get_title_format (TerminalScreen *screen)
* @screen:
* @raw_title: main ingredient
* @titleptr <inout>: pointer of the current title string
- *
+ *
* Format title according @format, and stores it in <literal>*titleptr</literal>.
* Always ensures that *titleptr will be non-NULL.
*
@@ -817,86 +826,86 @@ terminal_screen_format_title (TerminalScreen *screen,
const char *raw_title,
char **titleptr)
{
- TerminalScreenPrivate *priv = screen->priv;
- const char *format, *arg;
- const char *static_title = NULL;
- GString *title;
- gboolean add_sep = FALSE;
-
- g_assert (titleptr);
-
- /* use --title argument if one was supplied, otherwise ask the profile */
- if (priv->override_title)
- static_title = priv->override_title;
- else
- static_title = terminal_profile_get_property_string (priv->profile, TERMINAL_PROFILE_TITLE);
-
- //title = g_string_sized_new (strlen (static_title) + strlen (raw_title) + 3 + 1);
- title = g_string_sized_new (128);
-
- format = terminal_screen_get_title_format (screen);
- for (arg = format; *arg; arg += 2)
- {
- const char *text_to_append = NULL;
-
- g_assert (arg[0] == '%');
-
- switch (arg[1])
- {
- case 'A':
- text_to_append = raw_title ? raw_title : static_title;
- break;
- case 'D':
- text_to_append = raw_title;
- break;
- case 'S':
- text_to_append = static_title;
- break;
- case '-':
- text_to_append = NULL;
- add_sep = TRUE;
- break;
- default:
- g_assert_not_reached ();
- }
-
- if (!text_to_append || !text_to_append[0])
- continue;
-
- if (add_sep && title->len > 0)
- g_string_append (title, " - ");
-
- g_string_append (title, text_to_append);
- add_sep = FALSE;
- }
-
- if (*titleptr == NULL || strcmp (title->str, *titleptr) != 0)
- {
- g_free (*titleptr);
- *titleptr = g_string_free (title, FALSE);
- return TRUE;
- }
-
- g_string_free (title, TRUE);
- return FALSE;
-}
-
-static void
+ TerminalScreenPrivate *priv = screen->priv;
+ const char *format, *arg;
+ const char *static_title = NULL;
+ GString *title;
+ gboolean add_sep = FALSE;
+
+ g_assert (titleptr);
+
+ /* use --title argument if one was supplied, otherwise ask the profile */
+ if (priv->override_title)
+ static_title = priv->override_title;
+ else
+ static_title = terminal_profile_get_property_string (priv->profile, TERMINAL_PROFILE_TITLE);
+
+ //title = g_string_sized_new (strlen (static_title) + strlen (raw_title) + 3 + 1);
+ title = g_string_sized_new (128);
+
+ format = terminal_screen_get_title_format (screen);
+ for (arg = format; *arg; arg += 2)
+ {
+ const char *text_to_append = NULL;
+
+ g_assert (arg[0] == '%');
+
+ switch (arg[1])
+ {
+ case 'A':
+ text_to_append = raw_title ? raw_title : static_title;
+ break;
+ case 'D':
+ text_to_append = raw_title;
+ break;
+ case 'S':
+ text_to_append = static_title;
+ break;
+ case '-':
+ text_to_append = NULL;
+ add_sep = TRUE;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ if (!text_to_append || !text_to_append[0])
+ continue;
+
+ if (add_sep && title->len > 0)
+ g_string_append (title, " - ");
+
+ g_string_append (title, text_to_append);
+ add_sep = FALSE;
+ }
+
+ if (*titleptr == NULL || strcmp (title->str, *titleptr) != 0)
+ {
+ g_free (*titleptr);
+ *titleptr = g_string_free (title, FALSE);
+ return TRUE;
+ }
+
+ g_string_free (title, TRUE);
+ return FALSE;
+}
+
+static void
terminal_screen_cook_title (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
-
- if (terminal_screen_format_title (screen, priv->raw_title, &priv->cooked_title))
- g_object_notify (G_OBJECT (screen), "title");
+ TerminalScreenPrivate *priv = screen->priv;
+
+ if (terminal_screen_format_title (screen, priv->raw_title, &priv->cooked_title))
+ g_object_notify (G_OBJECT (screen), "title");
}
-static void
+static void
terminal_screen_cook_icon_title (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
+ TerminalScreenPrivate *priv = screen->priv;
- if (terminal_screen_format_title (screen, priv->raw_icon_title, &priv->cooked_icon_title))
- g_object_notify (G_OBJECT (screen), "icon-title");
+ if (terminal_screen_format_title (screen, priv->raw_icon_title, &priv->cooked_icon_title))
+ g_object_notify (G_OBJECT (screen), "icon-title");
}
static void
@@ -904,234 +913,234 @@ terminal_screen_profile_notify_cb (TerminalProfile *profile,
GParamSpec *pspec,
TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
- GObject *object = G_OBJECT (screen);
- VteTerminal *vte_terminal = VTE_TERMINAL (screen);
- const char *prop_name;
- TerminalBackgroundType bg_type;
- TerminalWindow *window;
-
- if (pspec)
- prop_name = pspec->name;
- else
- prop_name = NULL;
-
- g_object_freeze_notify (object);
-
- if ((window = terminal_screen_get_window (screen)))
- {
- /* We need these in line for the set_size in
- * update_on_realize
- */
- terminal_window_update_geometry (window);
- }
-
- if (!prop_name || prop_name == I_(TERMINAL_PROFILE_SCROLLBAR_POSITION))
- _terminal_screen_update_scrollbar (screen);
-
- if (!prop_name ||
- prop_name == I_(TERMINAL_PROFILE_TITLE_MODE) ||
- prop_name == I_(TERMINAL_PROFILE_TITLE))
- {
- terminal_screen_cook_title (screen);
- terminal_screen_cook_icon_title (screen);
- }
-
- if (gtk_widget_get_realized (GTK_WIDGET (screen)) &&
- (!prop_name ||
- prop_name == I_(TERMINAL_PROFILE_USE_SYSTEM_FONT) ||
- prop_name == I_(TERMINAL_PROFILE_FONT)))
- terminal_screen_change_font (screen);
-
- if (!prop_name ||
- prop_name == I_(TERMINAL_PROFILE_USE_THEME_COLORS) ||
- prop_name == I_(TERMINAL_PROFILE_FOREGROUND_COLOR) ||
- prop_name == I_(TERMINAL_PROFILE_BACKGROUND_COLOR) ||
- prop_name == I_(TERMINAL_PROFILE_BOLD_COLOR_SAME_AS_FG) ||
- prop_name == I_(TERMINAL_PROFILE_BOLD_COLOR) ||
- prop_name == I_(TERMINAL_PROFILE_PALETTE))
- update_color_scheme (screen);
-
- if (!prop_name || prop_name == I_(TERMINAL_PROFILE_SILENT_BELL))
- vte_terminal_set_audible_bell (vte_terminal, !terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_SILENT_BELL));
-
- if (!prop_name || prop_name == I_(TERMINAL_PROFILE_WORD_CHARS))
- vte_terminal_set_word_chars (vte_terminal,
- terminal_profile_get_property_string (profile, TERMINAL_PROFILE_WORD_CHARS));
- if (!prop_name || prop_name == I_(TERMINAL_PROFILE_SCROLL_ON_KEYSTROKE))
- vte_terminal_set_scroll_on_keystroke (vte_terminal,
- terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_SCROLL_ON_KEYSTROKE));
- if (!prop_name || prop_name == I_(TERMINAL_PROFILE_SCROLL_ON_OUTPUT))
- vte_terminal_set_scroll_on_output (vte_terminal,
- terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_SCROLL_ON_OUTPUT));
- if (!prop_name ||
- prop_name == I_(TERMINAL_PROFILE_SCROLLBACK_LINES) ||
- prop_name == I_(TERMINAL_PROFILE_SCROLLBACK_UNLIMITED))
- {
- glong lines = terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_SCROLLBACK_UNLIMITED) ?
- -1 : terminal_profile_get_property_int (profile, TERMINAL_PROFILE_SCROLLBACK_LINES);
- vte_terminal_set_scrollback_lines (vte_terminal, lines);
- }
+ TerminalScreenPrivate *priv = screen->priv;
+ GObject *object = G_OBJECT (screen);
+ VteTerminal *vte_terminal = VTE_TERMINAL (screen);
+ const char *prop_name;
+ TerminalBackgroundType bg_type;
+ TerminalWindow *window;
+
+ if (pspec)
+ prop_name = pspec->name;
+ else
+ prop_name = NULL;
+
+ g_object_freeze_notify (object);
+
+ if ((window = terminal_screen_get_window (screen)))
+ {
+ /* We need these in line for the set_size in
+ * update_on_realize
+ */
+ terminal_window_update_geometry (window);
+ }
+
+ if (!prop_name || prop_name == I_(TERMINAL_PROFILE_SCROLLBAR_POSITION))
+ _terminal_screen_update_scrollbar (screen);
+
+ if (!prop_name ||
+ prop_name == I_(TERMINAL_PROFILE_TITLE_MODE) ||
+ prop_name == I_(TERMINAL_PROFILE_TITLE))
+ {
+ terminal_screen_cook_title (screen);
+ terminal_screen_cook_icon_title (screen);
+ }
+
+ if (gtk_widget_get_realized (GTK_WIDGET (screen)) &&
+ (!prop_name ||
+ prop_name == I_(TERMINAL_PROFILE_USE_SYSTEM_FONT) ||
+ prop_name == I_(TERMINAL_PROFILE_FONT)))
+ terminal_screen_change_font (screen);
+
+ if (!prop_name ||
+ prop_name == I_(TERMINAL_PROFILE_USE_THEME_COLORS) ||
+ prop_name == I_(TERMINAL_PROFILE_FOREGROUND_COLOR) ||
+ prop_name == I_(TERMINAL_PROFILE_BACKGROUND_COLOR) ||
+ prop_name == I_(TERMINAL_PROFILE_BOLD_COLOR_SAME_AS_FG) ||
+ prop_name == I_(TERMINAL_PROFILE_BOLD_COLOR) ||
+ prop_name == I_(TERMINAL_PROFILE_PALETTE))
+ update_color_scheme (screen);
+
+ if (!prop_name || prop_name == I_(TERMINAL_PROFILE_SILENT_BELL))
+ vte_terminal_set_audible_bell (vte_terminal, !terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_SILENT_BELL));
+
+ if (!prop_name || prop_name == I_(TERMINAL_PROFILE_WORD_CHARS))
+ vte_terminal_set_word_chars (vte_terminal,
+ terminal_profile_get_property_string (profile, TERMINAL_PROFILE_WORD_CHARS));
+ if (!prop_name || prop_name == I_(TERMINAL_PROFILE_SCROLL_ON_KEYSTROKE))
+ vte_terminal_set_scroll_on_keystroke (vte_terminal,
+ terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_SCROLL_ON_KEYSTROKE));
+ if (!prop_name || prop_name == I_(TERMINAL_PROFILE_SCROLL_ON_OUTPUT))
+ vte_terminal_set_scroll_on_output (vte_terminal,
+ terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_SCROLL_ON_OUTPUT));
+ if (!prop_name ||
+ prop_name == I_(TERMINAL_PROFILE_SCROLLBACK_LINES) ||
+ prop_name == I_(TERMINAL_PROFILE_SCROLLBACK_UNLIMITED))
+ {
+ glong lines = terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_SCROLLBACK_UNLIMITED) ?
+ -1 : terminal_profile_get_property_int (profile, TERMINAL_PROFILE_SCROLLBACK_LINES);
+ vte_terminal_set_scrollback_lines (vte_terminal, lines);
+ }
#ifdef ENABLE_SKEY
- if (!prop_name || prop_name == I_(TERMINAL_PROFILE_USE_SKEY))
- {
- if (terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_USE_SKEY))
- {
- guint i;
-
- for (i = 0; i < n_skey_regexes; ++i)
- {
- TagData *tag_data;
-
- tag_data = g_slice_new (TagData);
- tag_data->flavor = FLAVOR_SKEY;
- tag_data->tag = vte_terminal_match_add_gregex (vte_terminal, skey_regexes[i], 0);
- vte_terminal_match_set_cursor_type (vte_terminal, tag_data->tag, SKEY_MATCH_CURSOR);
-
- priv->match_tags = g_slist_prepend (priv->match_tags, tag_data);
- }
- }
- else
- {
- terminal_screen_skey_match_remove (screen);
- }
- }
+ if (!prop_name || prop_name == I_(TERMINAL_PROFILE_USE_SKEY))
+ {
+ if (terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_USE_SKEY))
+ {
+ guint i;
+
+ for (i = 0; i < n_skey_regexes; ++i)
+ {
+ TagData *tag_data;
+
+ tag_data = g_slice_new (TagData);
+ tag_data->flavor = FLAVOR_SKEY;
+ tag_data->tag = vte_terminal_match_add_gregex (vte_terminal, skey_regexes[i], 0);
+ vte_terminal_match_set_cursor_type (vte_terminal, tag_data->tag, SKEY_MATCH_CURSOR);
+
+ priv->match_tags = g_slist_prepend (priv->match_tags, tag_data);
+ }
+ }
+ else
+ {
+ terminal_screen_skey_match_remove (screen);
+ }
+ }
#endif /* ENABLE_SKEY */
- if (!prop_name ||
- prop_name == I_(TERMINAL_PROFILE_BACKGROUND_TYPE) ||
- prop_name == I_(TERMINAL_PROFILE_BACKGROUND_IMAGE) ||
- prop_name == I_(TERMINAL_PROFILE_BACKGROUND_DARKNESS) ||
- prop_name == I_(TERMINAL_PROFILE_SCROLL_BACKGROUND))
- {
- bg_type = terminal_profile_get_property_enum (profile, TERMINAL_PROFILE_BACKGROUND_TYPE);
-
- if (bg_type == TERMINAL_BACKGROUND_IMAGE)
- {
- vte_terminal_set_background_image (vte_terminal,
- terminal_profile_get_property_object (profile, TERMINAL_PROFILE_BACKGROUND_IMAGE));
- vte_terminal_set_scroll_background (vte_terminal,
- terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_SCROLL_BACKGROUND));
- }
- else
- {
- vte_terminal_set_background_image (vte_terminal, NULL);
- vte_terminal_set_scroll_background (vte_terminal, FALSE);
- }
-
- if (bg_type == TERMINAL_BACKGROUND_IMAGE ||
- bg_type == TERMINAL_BACKGROUND_TRANSPARENT)
- {
- vte_terminal_set_background_saturation (vte_terminal,
- 1.0 - terminal_profile_get_property_double (profile, TERMINAL_PROFILE_BACKGROUND_DARKNESS));
- vte_terminal_set_opacity (vte_terminal,
- 0xffff * terminal_profile_get_property_double (profile, TERMINAL_PROFILE_BACKGROUND_DARKNESS));
- }
- else
- {
- vte_terminal_set_background_saturation (vte_terminal, 1.0); /* normal color */
- vte_terminal_set_opacity (vte_terminal, 0xffff);
- }
-
- /* FIXME: Don't enable this if we have a compmgr. */
- vte_terminal_set_background_transparent (vte_terminal,
- bg_type == TERMINAL_BACKGROUND_TRANSPARENT &&
- !window_uses_argb_visual (screen));
- }
-
- if (!prop_name || prop_name == I_(TERMINAL_PROFILE_BACKSPACE_BINDING))
- vte_terminal_set_backspace_binding (vte_terminal,
- terminal_profile_get_property_enum (profile, TERMINAL_PROFILE_BACKSPACE_BINDING));
-
- if (!prop_name || prop_name == I_(TERMINAL_PROFILE_DELETE_BINDING))
- vte_terminal_set_delete_binding (vte_terminal,
- terminal_profile_get_property_enum (profile, TERMINAL_PROFILE_DELETE_BINDING));
-
- if (!prop_name || prop_name == I_(TERMINAL_PROFILE_ALLOW_BOLD))
- vte_terminal_set_allow_bold (vte_terminal,
- terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_ALLOW_BOLD));
-
- if (!prop_name || prop_name == I_(TERMINAL_PROFILE_CURSOR_BLINK_MODE))
- vte_terminal_set_cursor_blink_mode (vte_terminal,
- terminal_profile_get_property_enum (priv->profile, TERMINAL_PROFILE_CURSOR_BLINK_MODE));
-
- if (!prop_name || prop_name == I_(TERMINAL_PROFILE_CURSOR_SHAPE))
- vte_terminal_set_cursor_shape (vte_terminal,
- terminal_profile_get_property_enum (priv->profile, TERMINAL_PROFILE_CURSOR_SHAPE));
-
- g_object_thaw_notify (object);
+ if (!prop_name ||
+ prop_name == I_(TERMINAL_PROFILE_BACKGROUND_TYPE) ||
+ prop_name == I_(TERMINAL_PROFILE_BACKGROUND_IMAGE) ||
+ prop_name == I_(TERMINAL_PROFILE_BACKGROUND_DARKNESS) ||
+ prop_name == I_(TERMINAL_PROFILE_SCROLL_BACKGROUND))
+ {
+ bg_type = terminal_profile_get_property_enum (profile, TERMINAL_PROFILE_BACKGROUND_TYPE);
+
+ if (bg_type == TERMINAL_BACKGROUND_IMAGE)
+ {
+ vte_terminal_set_background_image (vte_terminal,
+ terminal_profile_get_property_object (profile, TERMINAL_PROFILE_BACKGROUND_IMAGE));
+ vte_terminal_set_scroll_background (vte_terminal,
+ terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_SCROLL_BACKGROUND));
+ }
+ else
+ {
+ vte_terminal_set_background_image (vte_terminal, NULL);
+ vte_terminal_set_scroll_background (vte_terminal, FALSE);
+ }
+
+ if (bg_type == TERMINAL_BACKGROUND_IMAGE ||
+ bg_type == TERMINAL_BACKGROUND_TRANSPARENT)
+ {
+ vte_terminal_set_background_saturation (vte_terminal,
+ 1.0 - terminal_profile_get_property_double (profile, TERMINAL_PROFILE_BACKGROUND_DARKNESS));
+ vte_terminal_set_opacity (vte_terminal,
+ 0xffff * terminal_profile_get_property_double (profile, TERMINAL_PROFILE_BACKGROUND_DARKNESS));
+ }
+ else
+ {
+ vte_terminal_set_background_saturation (vte_terminal, 1.0); /* normal color */
+ vte_terminal_set_opacity (vte_terminal, 0xffff);
+ }
+
+ /* FIXME: Don't enable this if we have a compmgr. */
+ vte_terminal_set_background_transparent (vte_terminal,
+ bg_type == TERMINAL_BACKGROUND_TRANSPARENT &&
+ !window_uses_argb_visual (screen));
+ }
+
+ if (!prop_name || prop_name == I_(TERMINAL_PROFILE_BACKSPACE_BINDING))
+ vte_terminal_set_backspace_binding (vte_terminal,
+ terminal_profile_get_property_enum (profile, TERMINAL_PROFILE_BACKSPACE_BINDING));
+
+ if (!prop_name || prop_name == I_(TERMINAL_PROFILE_DELETE_BINDING))
+ vte_terminal_set_delete_binding (vte_terminal,
+ terminal_profile_get_property_enum (profile, TERMINAL_PROFILE_DELETE_BINDING));
+
+ if (!prop_name || prop_name == I_(TERMINAL_PROFILE_ALLOW_BOLD))
+ vte_terminal_set_allow_bold (vte_terminal,
+ terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_ALLOW_BOLD));
+
+ if (!prop_name || prop_name == I_(TERMINAL_PROFILE_CURSOR_BLINK_MODE))
+ vte_terminal_set_cursor_blink_mode (vte_terminal,
+ terminal_profile_get_property_enum (priv->profile, TERMINAL_PROFILE_CURSOR_BLINK_MODE));
+
+ if (!prop_name || prop_name == I_(TERMINAL_PROFILE_CURSOR_SHAPE))
+ vte_terminal_set_cursor_shape (vte_terminal,
+ terminal_profile_get_property_enum (priv->profile, TERMINAL_PROFILE_CURSOR_SHAPE));
+
+ g_object_thaw_notify (object);
}
static void
update_color_scheme (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
- TerminalProfile *profile = priv->profile;
- GtkStyle *style;
- GdkColor colors[TERMINAL_PALETTE_SIZE];
- const GdkColor *fg_color, *bg_color, *bold_color;
- GdkColor fg, bg;
- guint n_colors;
-
- style = gtk_widget_get_style (GTK_WIDGET (screen));
- if (!style)
- return;
-
- fg = style->text[GTK_STATE_NORMAL];
- bg = style->base[GTK_STATE_NORMAL];
- bold_color = NULL;
-
- if (!terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_USE_THEME_COLORS))
- {
- fg_color = terminal_profile_get_property_boxed (profile, TERMINAL_PROFILE_FOREGROUND_COLOR);
- bg_color = terminal_profile_get_property_boxed (profile, TERMINAL_PROFILE_BACKGROUND_COLOR);
-
- if (!terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_BOLD_COLOR_SAME_AS_FG))
- bold_color = terminal_profile_get_property_boxed (profile, TERMINAL_PROFILE_BOLD_COLOR);
-
- if (fg_color)
- fg = *fg_color;
- if (bg_color)
- bg = *bg_color;
- }
-
- n_colors = G_N_ELEMENTS (colors);
- terminal_profile_get_palette (priv->profile, colors, &n_colors);
- vte_terminal_set_colors (VTE_TERMINAL (screen), &fg, &bg,
- colors, n_colors);
- if (bold_color)
- vte_terminal_set_color_bold (VTE_TERMINAL (screen), bold_color);
- vte_terminal_set_background_tint_color (VTE_TERMINAL (screen), &bg);
+ TerminalScreenPrivate *priv = screen->priv;
+ TerminalProfile *profile = priv->profile;
+ GtkStyle *style;
+ GdkColor colors[TERMINAL_PALETTE_SIZE];
+ const GdkColor *fg_color, *bg_color, *bold_color;
+ GdkColor fg, bg;
+ guint n_colors;
+
+ style = gtk_widget_get_style (GTK_WIDGET (screen));
+ if (!style)
+ return;
+
+ fg = style->text[GTK_STATE_NORMAL];
+ bg = style->base[GTK_STATE_NORMAL];
+ bold_color = NULL;
+
+ if (!terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_USE_THEME_COLORS))
+ {
+ fg_color = terminal_profile_get_property_boxed (profile, TERMINAL_PROFILE_FOREGROUND_COLOR);
+ bg_color = terminal_profile_get_property_boxed (profile, TERMINAL_PROFILE_BACKGROUND_COLOR);
+
+ if (!terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_BOLD_COLOR_SAME_AS_FG))
+ bold_color = terminal_profile_get_property_boxed (profile, TERMINAL_PROFILE_BOLD_COLOR);
+
+ if (fg_color)
+ fg = *fg_color;
+ if (bg_color)
+ bg = *bg_color;
+ }
+
+ n_colors = G_N_ELEMENTS (colors);
+ terminal_profile_get_palette (priv->profile, colors, &n_colors);
+ vte_terminal_set_colors (VTE_TERMINAL (screen), &fg, &bg,
+ colors, n_colors);
+ if (bold_color)
+ vte_terminal_set_color_bold (VTE_TERMINAL (screen), bold_color);
+ vte_terminal_set_background_tint_color (VTE_TERMINAL (screen), &bg);
}
void
terminal_screen_set_font (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
- TerminalProfile *profile;
- PangoFontDescription *desc;
+ TerminalScreenPrivate *priv = screen->priv;
+ TerminalProfile *profile;
+ PangoFontDescription *desc;
- profile = priv->profile;
-
- if (terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_USE_SYSTEM_FONT))
- g_object_get (terminal_app_get (), "system-font", &desc, NULL);
- else
- g_object_get (profile, TERMINAL_PROFILE_FONT, &desc, NULL);
- g_assert (desc);
+ profile = priv->profile;
- if (pango_font_description_get_size_is_absolute (desc))
- pango_font_description_set_absolute_size (desc,
- priv->font_scale *
- pango_font_description_get_size (desc));
- else
- pango_font_description_set_size (desc,
- priv->font_scale *
- pango_font_description_get_size (desc));
+ if (terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_USE_SYSTEM_FONT))
+ g_object_get (terminal_app_get (), "system-font", &desc, NULL);
+ else
+ g_object_get (profile, TERMINAL_PROFILE_FONT, &desc, NULL);
+ g_assert (desc);
- vte_terminal_set_font (VTE_TERMINAL (screen), desc);
+ if (pango_font_description_get_size_is_absolute (desc))
+ pango_font_description_set_absolute_size (desc,
+ priv->font_scale *
+ pango_font_description_get_size (desc));
+ else
+ pango_font_description_set_size (desc,
+ priv->font_scale *
+ pango_font_description_get_size (desc));
- pango_font_description_free (desc);
+ vte_terminal_set_font (VTE_TERMINAL (screen), desc);
+
+ pango_font_description_free (desc);
}
static void
@@ -1139,138 +1148,138 @@ terminal_screen_system_font_notify_cb (TerminalApp *app,
GParamSpec *pspec,
TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
+ TerminalScreenPrivate *priv = screen->priv;
- if (!gtk_widget_get_realized (GTK_WIDGET (screen)))
- return;
+ if (!gtk_widget_get_realized (GTK_WIDGET (screen)))
+ return;
- if (!terminal_profile_get_property_boolean (priv->profile, TERMINAL_PROFILE_USE_SYSTEM_FONT))
- return;
+ if (!terminal_profile_get_property_boolean (priv->profile, TERMINAL_PROFILE_USE_SYSTEM_FONT))
+ return;
- terminal_screen_change_font (screen);
+ terminal_screen_change_font (screen);
}
static void
terminal_screen_change_font (TerminalScreen *screen)
{
- TerminalWindow *window;
+ TerminalWindow *window;
- terminal_screen_set_font (screen);
+ terminal_screen_set_font (screen);
- window = terminal_screen_get_window (screen);
- terminal_window_set_size (window, screen, TRUE);
+ window = terminal_screen_get_window (screen);
+ terminal_window_set_size (window, screen, TRUE);
}
static void
profile_forgotten_callback (TerminalProfile *profile,
TerminalScreen *screen)
{
- TerminalProfile *new_profile;
+ TerminalProfile *new_profile;
- new_profile = terminal_app_get_profile_for_new_term (terminal_app_get ());
- g_assert (new_profile != NULL);
- terminal_screen_set_profile (screen, new_profile);
+ new_profile = terminal_app_get_profile_for_new_term (terminal_app_get ());
+ g_assert (new_profile != NULL);
+ terminal_screen_set_profile (screen, new_profile);
}
void
terminal_screen_set_profile (TerminalScreen *screen,
TerminalProfile *profile)
{
- TerminalScreenPrivate *priv = screen->priv;
- TerminalProfile *old_profile;
-
- old_profile = priv->profile;
- if (profile == old_profile)
- return;
-
- if (priv->profile_changed_id)
- {
- g_signal_handler_disconnect (G_OBJECT (priv->profile),
- priv->profile_changed_id);
- priv->profile_changed_id = 0;
- }
-
- if (priv->profile_forgotten_id)
- {
- g_signal_handler_disconnect (G_OBJECT (priv->profile),
- priv->profile_forgotten_id);
- priv->profile_forgotten_id = 0;
- }
-
- priv->profile = profile;
- if (profile)
- {
- g_object_ref (profile);
- priv->profile_changed_id =
- g_signal_connect (profile, "notify",
- G_CALLBACK (terminal_screen_profile_notify_cb),
- screen);
- priv->profile_forgotten_id =
- g_signal_connect (G_OBJECT (profile),
- "forgotten",
- G_CALLBACK (profile_forgotten_callback),
- screen);
-
- terminal_screen_profile_notify_cb (profile, NULL, screen);
-
- g_signal_emit (G_OBJECT (screen), signals[PROFILE_SET], 0, old_profile);
- }
-
- if (old_profile)
- g_object_unref (old_profile);
-
- g_object_notify (G_OBJECT (screen), "profile");
+ TerminalScreenPrivate *priv = screen->priv;
+ TerminalProfile *old_profile;
+
+ old_profile = priv->profile;
+ if (profile == old_profile)
+ return;
+
+ if (priv->profile_changed_id)
+ {
+ g_signal_handler_disconnect (G_OBJECT (priv->profile),
+ priv->profile_changed_id);
+ priv->profile_changed_id = 0;
+ }
+
+ if (priv->profile_forgotten_id)
+ {
+ g_signal_handler_disconnect (G_OBJECT (priv->profile),
+ priv->profile_forgotten_id);
+ priv->profile_forgotten_id = 0;
+ }
+
+ priv->profile = profile;
+ if (profile)
+ {
+ g_object_ref (profile);
+ priv->profile_changed_id =
+ g_signal_connect (profile, "notify",
+ G_CALLBACK (terminal_screen_profile_notify_cb),
+ screen);
+ priv->profile_forgotten_id =
+ g_signal_connect (G_OBJECT (profile),
+ "forgotten",
+ G_CALLBACK (profile_forgotten_callback),
+ screen);
+
+ terminal_screen_profile_notify_cb (profile, NULL, screen);
+
+ g_signal_emit (G_OBJECT (screen), signals[PROFILE_SET], 0, old_profile);
+ }
+
+ if (old_profile)
+ g_object_unref (old_profile);
+
+ g_object_notify (G_OBJECT (screen), "profile");
}
TerminalProfile*
terminal_screen_get_profile (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
+ TerminalScreenPrivate *priv = screen->priv;
- g_assert (priv->profile != NULL);
- return priv->profile;
+ g_assert (priv->profile != NULL);
+ return priv->profile;
}
void
terminal_screen_set_override_command (TerminalScreen *screen,
char **argv)
{
- TerminalScreenPrivate *priv;
+ TerminalScreenPrivate *priv;
- g_return_if_fail (TERMINAL_IS_SCREEN (screen));
+ g_return_if_fail (TERMINAL_IS_SCREEN (screen));
- priv = screen->priv;
- g_strfreev (priv->override_command);
- priv->override_command = g_strdupv (argv);
+ priv = screen->priv;
+ g_strfreev (priv->override_command);
+ priv->override_command = g_strdupv (argv);
}
const char**
terminal_screen_get_override_command (TerminalScreen *screen)
{
- g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL);
+ g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL);
- return (const char**) screen->priv->override_command;
+ return (const char**) screen->priv->override_command;
}
void
terminal_screen_set_initial_environment (TerminalScreen *screen,
- char **argv)
+ char **argv)
{
- TerminalScreenPrivate *priv;
+ TerminalScreenPrivate *priv;
- g_return_if_fail (TERMINAL_IS_SCREEN (screen));
+ g_return_if_fail (TERMINAL_IS_SCREEN (screen));
- priv = screen->priv;
- g_assert (priv->initial_env == NULL);
- priv->initial_env = g_strdupv (argv);
+ priv = screen->priv;
+ g_assert (priv->initial_env == NULL);
+ priv->initial_env = g_strdupv (argv);
}
char**
terminal_screen_get_initial_environment (TerminalScreen *screen)
{
- g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL);
+ g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL);
- return screen->priv->initial_env;
+ return screen->priv->initial_env;
}
static gboolean
@@ -1280,134 +1289,135 @@ get_child_command (TerminalScreen *screen,
char ***argv_p,
GError **err)
{
- TerminalScreenPrivate *priv = screen->priv;
- TerminalProfile *profile;
- char **argv;
+ TerminalScreenPrivate *priv = screen->priv;
+ TerminalProfile *profile;
+ char **argv;
- g_assert (spawn_flags_p != NULL && argv_p != NULL);
+ g_assert (spawn_flags_p != NULL && argv_p != NULL);
- profile = priv->profile;
+ profile = priv->profile;
- *argv_p = argv = NULL;
+ *argv_p = argv = NULL;
- if (priv->override_command)
- {
- argv = g_strdupv (priv->override_command);
+ if (priv->override_command)
+ {
+ argv = g_strdupv (priv->override_command);
- *spawn_flags_p |= G_SPAWN_SEARCH_PATH;
- }
- else if (terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_USE_CUSTOM_COMMAND))
- {
- if (!g_shell_parse_argv (terminal_profile_get_property_string (profile, TERMINAL_PROFILE_CUSTOM_COMMAND),
- NULL, &argv,
- err))
- return FALSE;
+ *spawn_flags_p |= G_SPAWN_SEARCH_PATH;
+ }
+ else if (terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_USE_CUSTOM_COMMAND))
+ {
+ if (!g_shell_parse_argv (terminal_profile_get_property_string (profile, TERMINAL_PROFILE_CUSTOM_COMMAND),
+ NULL, &argv,
+ err))
+ return FALSE;
- *spawn_flags_p |= G_SPAWN_SEARCH_PATH;
- }
- else
- {
- const char *only_name;
- char *shell;
- int argc = 0;
+ *spawn_flags_p |= G_SPAWN_SEARCH_PATH;
+ }
+ else
+ {
+ const char *only_name;
+ char *shell;
+ int argc = 0;
- shell = egg_shell (shell_env);
+ shell = egg_shell (shell_env);
- only_name = strrchr (shell, '/');
- if (only_name != NULL)
- only_name++;
- else
- only_name = shell;
+ only_name = strrchr (shell, '/');
+ if (only_name != NULL)
+ only_name++;
+ else
+ only_name = shell;
- argv = g_new (char*, 3);
+ argv = g_new (char*, 3);
- argv[argc++] = shell;
+ argv[argc++] = shell;
- if (terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_LOGIN_SHELL))
- argv[argc++] = g_strconcat ("-", only_name, NULL);
- else
- argv[argc++] = g_strdup (only_name);
+ if (terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_LOGIN_SHELL))
+ argv[argc++] = g_strconcat ("-", only_name, NULL);
+ else
+ argv[argc++] = g_strdup (only_name);
- argv[argc++] = NULL;
+ argv[argc++] = NULL;
- *spawn_flags_p |= G_SPAWN_FILE_AND_ARGV_ZERO;
- }
+ *spawn_flags_p |= G_SPAWN_FILE_AND_ARGV_ZERO;
+ }
- *argv_p = argv;
+ *argv_p = argv;
- return TRUE;
+ return TRUE;
}
static char**
get_child_environment (TerminalScreen *screen,
char **shell)
{
- TerminalScreenPrivate *priv = screen->priv;
- GtkWidget *term = GTK_WIDGET (screen);
- GtkWidget *window;
- char **env;
- char *e, *v;
- GHashTable *env_table;
- GHashTableIter iter;
- GPtrArray *retval;
- guint i;
-
- window = gtk_widget_get_toplevel (term);
- g_assert (window != NULL);
- g_assert (gtk_widget_is_toplevel (window));
-
- env_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
-
- /* First take the factory's environment */
- env = g_listenv ();
- for (i = 0; env[i]; ++i)
- g_hash_table_insert (env_table, env[i], g_strdup (g_getenv (env[i])));
- g_free (env); /* the strings themselves are now owned by the hash table */
-
- /* and then merge the child environment, if any */
- env = priv->initial_env;
- if (env)
- {
- for (i = 0; env[i]; ++i)
- {
- v = strchr (env[i], '=');
- if (v)
- g_hash_table_replace (env_table, g_strndup (env[i], v - env[i]), g_strdup (v + 1));
- else
- g_hash_table_replace (env_table, g_strdup (env[i]), NULL);
- }
- }
-
- g_hash_table_remove (env_table, "COLUMNS");
- g_hash_table_remove (env_table, "LINES");
- g_hash_table_remove (env_table, "MATE_DESKTOP_ICON");
-
- g_hash_table_replace (env_table, g_strdup ("COLORTERM"), g_strdup (EXECUTABLE_NAME));
- g_hash_table_replace (env_table, g_strdup ("TERM"), g_strdup ("xterm")); /* FIXME configurable later? */
-
+ TerminalScreenPrivate *priv = screen->priv;
+ GtkWidget *term = GTK_WIDGET (screen);
+ GtkWidget *window;
+ char **env;
+ char *e, *v;
+ GHashTable *env_table;
+ GHashTableIter iter;
+ GPtrArray *retval;
+ guint i;
+
+ window = gtk_widget_get_toplevel (term);
+ g_assert (window != NULL);
+ g_assert (gtk_widget_is_toplevel (window));
+
+ env_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+
+ /* First take the factory's environment */
+ env = g_listenv ();
+ for (i = 0; env[i]; ++i)
+ g_hash_table_insert (env_table, env[i], g_strdup (g_getenv (env[i])));
+ g_free (env); /* the strings themselves are now owned by the hash table */
+
+ /* and then merge the child environment, if any */
+ env = priv->initial_env;
+ if (env)
+ {
+ for (i = 0; env[i]; ++i)
+ {
+ v = strchr (env[i], '=');
+ if (v)
+ g_hash_table_replace (env_table, g_strndup (env[i], v - env[i]), g_strdup (v + 1));
+ else
+ g_hash_table_replace (env_table, g_strdup (env[i]), NULL);
+ }
+ }
+
+ g_hash_table_remove (env_table, "COLUMNS");
+ g_hash_table_remove (env_table, "LINES");
+ g_hash_table_remove (env_table, "MATE_DESKTOP_ICON");
+
+ g_hash_table_replace (env_table, g_strdup ("COLORTERM"), g_strdup (EXECUTABLE_NAME));
+ g_hash_table_replace (env_table, g_strdup ("TERM"), g_strdup ("xterm")); /* FIXME configurable later? */
+
#ifdef GDK_WINDOWING_X11
- /* FIXME: moving the tab between windows, or the window between displays will make the next two invalid... */
- g_hash_table_replace (env_table, g_strdup ("WINDOWID"), g_strdup_printf ("%ld", GDK_WINDOW_XWINDOW (gtk_widget_get_window (window))));
- g_hash_table_replace (env_table, g_strdup ("DISPLAY"), g_strdup (gdk_display_get_name (gtk_widget_get_display (window))));
+ /* FIXME: moving the tab between windows, or the window between displays will make the next two invalid... */
+ g_hash_table_replace (env_table, g_strdup ("WINDOWID"), g_strdup_printf ("%ld", GDK_WINDOW_XWINDOW (gtk_widget_get_window (window))));
+ g_hash_table_replace (env_table, g_strdup ("DISPLAY"), g_strdup (gdk_display_get_name (gtk_widget_get_display (window))));
#endif
- terminal_util_add_proxy_env (env_table);
+ terminal_util_add_proxy_env (env_table);
- retval = g_ptr_array_sized_new (g_hash_table_size (env_table));
- g_hash_table_iter_init (&iter, env_table);
- while (g_hash_table_iter_next (&iter, (gpointer *) &e, (gpointer *) &v))
- g_ptr_array_add (retval, g_strdup_printf ("%s=%s", e, v ? v : ""));
- g_ptr_array_add (retval, NULL);
+ retval = g_ptr_array_sized_new (g_hash_table_size (env_table));
+ g_hash_table_iter_init (&iter, env_table);
+ while (g_hash_table_iter_next (&iter, (gpointer *) &e, (gpointer *) &v))
+ g_ptr_array_add (retval, g_strdup_printf ("%s=%s", e, v ? v : ""));
+ g_ptr_array_add (retval, NULL);
- *shell = g_strdup (g_hash_table_lookup (env_table, "SHELL"));
+ *shell = g_strdup (g_hash_table_lookup (env_table, "SHELL"));
- g_hash_table_destroy (env_table);
- return (char **) g_ptr_array_free (retval, FALSE);
+ g_hash_table_destroy (env_table);
+ return (char **) g_ptr_array_free (retval, FALSE);
}
-enum {
- RESPONSE_RELAUNCH,
- RESPONSE_EDIT_PROFILE
+enum
+{
+ RESPONSE_RELAUNCH,
+ RESPONSE_EDIT_PROFILE
};
static void
@@ -1415,325 +1425,327 @@ info_bar_response_cb (GtkWidget *info_bar,
int response,
TerminalScreen *screen)
{
- gtk_widget_grab_focus (GTK_WIDGET (screen));
-
- switch (response) {
- case GTK_RESPONSE_CANCEL:
- gtk_widget_destroy (info_bar);
- g_signal_emit (screen, signals[CLOSE_SCREEN], 0);
- break;
- case RESPONSE_RELAUNCH:
- gtk_widget_destroy (info_bar);
- terminal_screen_launch_child_on_idle (screen);
- break;
- case RESPONSE_EDIT_PROFILE:
- terminal_app_edit_profile (terminal_app_get (),
- terminal_screen_get_profile (screen),
- GTK_WINDOW (terminal_screen_get_window (screen)),
- "custom-command-entry");
- break;
- default:
- gtk_widget_destroy (info_bar);
- break;
- }
+ gtk_widget_grab_focus (GTK_WIDGET (screen));
+
+ switch (response)
+ {
+ case GTK_RESPONSE_CANCEL:
+ gtk_widget_destroy (info_bar);
+ g_signal_emit (screen, signals[CLOSE_SCREEN], 0);
+ break;
+ case RESPONSE_RELAUNCH:
+ gtk_widget_destroy (info_bar);
+ terminal_screen_launch_child_on_idle (screen);
+ break;
+ case RESPONSE_EDIT_PROFILE:
+ terminal_app_edit_profile (terminal_app_get (),
+ terminal_screen_get_profile (screen),
+ GTK_WINDOW (terminal_screen_get_window (screen)),
+ "custom-command-entry");
+ break;
+ default:
+ gtk_widget_destroy (info_bar);
+ break;
+ }
}
static gboolean
terminal_screen_launch_child_cb (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
- VteTerminal *terminal = VTE_TERMINAL (screen);
- TerminalProfile *profile;
- char **env, **argv;
- char *shell = NULL;
- GError *err = NULL;
- const char *working_dir;
- VtePtyFlags pty_flags = VTE_PTY_DEFAULT;
- GSpawnFlags spawn_flags = 0;
- GPid pid;
-
- priv->launch_child_source_id = 0;
-
- _terminal_debug_print (TERMINAL_DEBUG_PROCESSES,
- "[screen %p] now launching the child process\n",
- screen);
-
- profile = priv->profile;
-
- env = get_child_environment (screen, &shell);
-
- if (priv->initial_working_directory)
- working_dir = priv->initial_working_directory;
- else
- working_dir = g_get_home_dir ();
-
- if (!terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_LOGIN_SHELL))
- pty_flags |= VTE_PTY_NO_LASTLOG;
- if (!terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_UPDATE_RECORDS))
- pty_flags |= VTE_PTY_NO_UTMP | VTE_PTY_NO_WTMP;
-
- if (!get_child_command (screen, shell, &spawn_flags, &argv, &err) ||
- !vte_terminal_fork_command_full (terminal,
- pty_flags,
- working_dir,
- argv,
- env,
- spawn_flags,
- NULL, NULL,
- &pid,
- &err)) {
- GtkWidget *info_bar;
-
- info_bar = terminal_info_bar_new (GTK_MESSAGE_ERROR,
- _("_Profile Preferences"), RESPONSE_EDIT_PROFILE,
- _("_Relaunch"), RESPONSE_RELAUNCH,
- NULL);
- terminal_info_bar_format_text (TERMINAL_INFO_BAR (info_bar),
- _("There was an error creating the child process for this terminal"));
- terminal_info_bar_format_text (TERMINAL_INFO_BAR (info_bar),
- "%s", err->message);
- g_signal_connect (info_bar, "response",
- G_CALLBACK (info_bar_response_cb), screen);
-
- gtk_box_pack_start (GTK_BOX (terminal_screen_container_get_from_screen (screen)),
- info_bar, FALSE, FALSE, 0);
- gtk_info_bar_set_default_response (GTK_INFO_BAR (info_bar), GTK_RESPONSE_CANCEL);
- gtk_widget_show (info_bar);
-
- g_error_free (err);
- g_strfreev (env);
- g_free (shell);
-
- return FALSE;
- }
-
- priv->child_pid = pid;
- priv->pty_fd = vte_terminal_get_pty (terminal);
-
- g_free (shell);
- g_strfreev (argv);
- g_strfreev (env);
-
- return FALSE; /* don't run again */
+ TerminalScreenPrivate *priv = screen->priv;
+ VteTerminal *terminal = VTE_TERMINAL (screen);
+ TerminalProfile *profile;
+ char **env, **argv;
+ char *shell = NULL;
+ GError *err = NULL;
+ const char *working_dir;
+ VtePtyFlags pty_flags = VTE_PTY_DEFAULT;
+ GSpawnFlags spawn_flags = 0;
+ GPid pid;
+
+ priv->launch_child_source_id = 0;
+
+ _terminal_debug_print (TERMINAL_DEBUG_PROCESSES,
+ "[screen %p] now launching the child process\n",
+ screen);
+
+ profile = priv->profile;
+
+ env = get_child_environment (screen, &shell);
+
+ if (priv->initial_working_directory)
+ working_dir = priv->initial_working_directory;
+ else
+ working_dir = g_get_home_dir ();
+
+ if (!terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_LOGIN_SHELL))
+ pty_flags |= VTE_PTY_NO_LASTLOG;
+ if (!terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_UPDATE_RECORDS))
+ pty_flags |= VTE_PTY_NO_UTMP | VTE_PTY_NO_WTMP;
+
+ if (!get_child_command (screen, shell, &spawn_flags, &argv, &err) ||
+ !vte_terminal_fork_command_full (terminal,
+ pty_flags,
+ working_dir,
+ argv,
+ env,
+ spawn_flags,
+ NULL, NULL,
+ &pid,
+ &err))
+ {
+ GtkWidget *info_bar;
+
+ info_bar = terminal_info_bar_new (GTK_MESSAGE_ERROR,
+ _("_Profile Preferences"), RESPONSE_EDIT_PROFILE,
+ _("_Relaunch"), RESPONSE_RELAUNCH,
+ NULL);
+ terminal_info_bar_format_text (TERMINAL_INFO_BAR (info_bar),
+ _("There was an error creating the child process for this terminal"));
+ terminal_info_bar_format_text (TERMINAL_INFO_BAR (info_bar),
+ "%s", err->message);
+ g_signal_connect (info_bar, "response",
+ G_CALLBACK (info_bar_response_cb), screen);
+
+ gtk_box_pack_start (GTK_BOX (terminal_screen_container_get_from_screen (screen)),
+ info_bar, FALSE, FALSE, 0);
+ gtk_info_bar_set_default_response (GTK_INFO_BAR (info_bar), GTK_RESPONSE_CANCEL);
+ gtk_widget_show (info_bar);
+
+ g_error_free (err);
+ g_strfreev (env);
+ g_free (shell);
+
+ return FALSE;
+ }
+
+ priv->child_pid = pid;
+ priv->pty_fd = vte_terminal_get_pty (terminal);
+
+ g_free (shell);
+ g_strfreev (argv);
+ g_strfreev (env);
+
+ return FALSE; /* don't run again */
}
static void
terminal_screen_launch_child_on_idle (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
+ TerminalScreenPrivate *priv = screen->priv;
- if (priv->launch_child_source_id != 0)
- return;
+ if (priv->launch_child_source_id != 0)
+ return;
- _terminal_debug_print (TERMINAL_DEBUG_PROCESSES,
- "[screen %p] scheduling launching the child process on idle\n",
- screen);
+ _terminal_debug_print (TERMINAL_DEBUG_PROCESSES,
+ "[screen %p] scheduling launching the child process on idle\n",
+ screen);
- priv->launch_child_source_id = g_idle_add ((GSourceFunc) terminal_screen_launch_child_cb, screen);
+ priv->launch_child_source_id = g_idle_add ((GSourceFunc) terminal_screen_launch_child_cb, screen);
}
static TerminalScreenPopupInfo *
terminal_screen_popup_info_new (TerminalScreen *screen)
{
- TerminalScreenPopupInfo *info;
+ TerminalScreenPopupInfo *info;
- info = g_slice_new0 (TerminalScreenPopupInfo);
- info->ref_count = 1;
- info->screen = g_object_ref (screen);
- info->window = terminal_screen_get_window (screen);
+ info = g_slice_new0 (TerminalScreenPopupInfo);
+ info->ref_count = 1;
+ info->screen = g_object_ref (screen);
+ info->window = terminal_screen_get_window (screen);
- return info;
+ return info;
}
TerminalScreenPopupInfo *
terminal_screen_popup_info_ref (TerminalScreenPopupInfo *info)
{
- g_return_val_if_fail (info != NULL, NULL);
+ g_return_val_if_fail (info != NULL, NULL);
- info->ref_count++;
- return info;
+ info->ref_count++;
+ return info;
}
void
terminal_screen_popup_info_unref (TerminalScreenPopupInfo *info)
{
- g_return_if_fail (info != NULL);
+ g_return_if_fail (info != NULL);
- if (--info->ref_count > 0)
- return;
+ if (--info->ref_count > 0)
+ return;
- g_object_unref (info->screen);
- g_free (info->string);
- g_slice_free (TerminalScreenPopupInfo, info);
+ g_object_unref (info->screen);
+ g_free (info->string);
+ g_slice_free (TerminalScreenPopupInfo, info);
}
static gboolean
terminal_screen_popup_menu (GtkWidget *widget)
{
- TerminalScreen *screen = TERMINAL_SCREEN (widget);
- TerminalScreenPopupInfo *info;
+ TerminalScreen *screen = TERMINAL_SCREEN (widget);
+ TerminalScreenPopupInfo *info;
- info = terminal_screen_popup_info_new (screen);
- info->button = 0;
- info->timestamp = gtk_get_current_event_time ();
+ info = terminal_screen_popup_info_new (screen);
+ info->button = 0;
+ info->timestamp = gtk_get_current_event_time ();
- g_signal_emit (screen, signals[SHOW_POPUP_MENU], 0, info);
- terminal_screen_popup_info_unref (info);
+ g_signal_emit (screen, signals[SHOW_POPUP_MENU], 0, info);
+ terminal_screen_popup_info_unref (info);
- return TRUE;
+ return TRUE;
}
static gboolean
terminal_screen_button_press (GtkWidget *widget,
GdkEventButton *event)
{
- TerminalScreen *screen = TERMINAL_SCREEN (widget);
- gboolean (* button_press_event) (GtkWidget*, GdkEventButton*) =
- GTK_WIDGET_CLASS (terminal_screen_parent_class)->button_press_event;
- int char_width, char_height, row, col;
- char *matched_string;
- int matched_flavor = 0;
- guint state;
- GtkBorder *inner_border = NULL;
-
- state = event->state & gtk_accelerator_get_default_mod_mask ();
-
- terminal_screen_get_cell_size (screen, &char_width, &char_height);
-
- gtk_widget_style_get (widget, "inner-border", &inner_border, NULL);
- row = (event->x - (inner_border ? inner_border->left : 0)) / char_width;
- col = (event->y - (inner_border ? inner_border->top : 0)) / char_height;
- gtk_border_free (inner_border);
-
- /* FIXMEchpe: add vte API to do this check by widget coords instead of grid coords */
- matched_string = terminal_screen_check_match (screen, row, col, &matched_flavor);
-
- if (matched_string != NULL &&
- (event->button == 1 || event->button == 2) &&
- (state & GDK_CONTROL_MASK))
- {
- gboolean handled = FALSE;
+ TerminalScreen *screen = TERMINAL_SCREEN (widget);
+ gboolean (* button_press_event) (GtkWidget*, GdkEventButton*) =
+ GTK_WIDGET_CLASS (terminal_screen_parent_class)->button_press_event;
+ int char_width, char_height, row, col;
+ char *matched_string;
+ int matched_flavor = 0;
+ guint state;
+ GtkBorder *inner_border = NULL;
-#ifdef ENABLE_SKEY
- if (matched_flavor != FLAVOR_SKEY ||
- terminal_profile_get_property_boolean (screen->priv->profile, TERMINAL_PROFILE_USE_SKEY))
-#endif
- {
- g_signal_emit (screen, signals[MATCH_CLICKED], 0,
- matched_string,
- matched_flavor,
- state,
- &handled);
- }
+ state = event->state & gtk_accelerator_get_default_mod_mask ();
- g_free (matched_string);
+ terminal_screen_get_cell_size (screen, &char_width, &char_height);
- if (handled)
- return TRUE; /* don't do anything else such as select with the click */
- }
+ gtk_widget_style_get (widget, "inner-border", &inner_border, NULL);
+ row = (event->x - (inner_border ? inner_border->left : 0)) / char_width;
+ col = (event->y - (inner_border ? inner_border->top : 0)) / char_height;
+ gtk_border_free (inner_border);
- if (event->button == 3 &&
- (state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)) == 0)
- {
- TerminalScreenPopupInfo *info;
+ /* FIXMEchpe: add vte API to do this check by widget coords instead of grid coords */
+ matched_string = terminal_screen_check_match (screen, row, col, &matched_flavor);
- info = terminal_screen_popup_info_new (screen);
- info->button = event->button;
- info->state = state;
- info->timestamp = event->time;
- info->string = matched_string; /* adopted */
- info->flavour = matched_flavor;
+ if (matched_string != NULL &&
+ (event->button == 1 || event->button == 2) &&
+ (state & GDK_CONTROL_MASK))
+ {
+ gboolean handled = FALSE;
+
+#ifdef ENABLE_SKEY
+ if (matched_flavor != FLAVOR_SKEY ||
+ terminal_profile_get_property_boolean (screen->priv->profile, TERMINAL_PROFILE_USE_SKEY))
+#endif
+ {
+ g_signal_emit (screen, signals[MATCH_CLICKED], 0,
+ matched_string,
+ matched_flavor,
+ state,
+ &handled);
+ }
+
+ g_free (matched_string);
+
+ if (handled)
+ return TRUE; /* don't do anything else such as select with the click */
+ }
- g_signal_emit (screen, signals[SHOW_POPUP_MENU], 0, info);
- terminal_screen_popup_info_unref (info);
+ if (event->button == 3 &&
+ (state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)) == 0)
+ {
+ TerminalScreenPopupInfo *info;
- return TRUE;
- }
+ info = terminal_screen_popup_info_new (screen);
+ info->button = event->button;
+ info->state = state;
+ info->timestamp = event->time;
+ info->string = matched_string; /* adopted */
+ info->flavour = matched_flavor;
- /* default behavior is to let the terminal widget deal with it */
- if (button_press_event)
- return button_press_event (widget, event);
+ g_signal_emit (screen, signals[SHOW_POPUP_MENU], 0, info);
+ terminal_screen_popup_info_unref (info);
- return FALSE;
+ return TRUE;
+ }
+
+ /* default behavior is to let the terminal widget deal with it */
+ if (button_press_event)
+ return button_press_event (widget, event);
+
+ return FALSE;
}
static void
terminal_screen_set_dynamic_title (TerminalScreen *screen,
const char *title,
- gboolean userset)
+ gboolean userset)
{
- TerminalScreenPrivate *priv = screen->priv;
+ TerminalScreenPrivate *priv = screen->priv;
- g_assert (TERMINAL_IS_SCREEN (screen));
-
- if ((priv->user_title && !userset) ||
- (priv->raw_title && title &&
- strcmp (priv->raw_title, title) == 0))
- return;
+ g_assert (TERMINAL_IS_SCREEN (screen));
- g_free (priv->raw_title);
- priv->raw_title = g_strdup (title);
- terminal_screen_cook_title (screen);
+ if ((priv->user_title && !userset) ||
+ (priv->raw_title && title &&
+ strcmp (priv->raw_title, title) == 0))
+ return;
+
+ g_free (priv->raw_title);
+ priv->raw_title = g_strdup (title);
+ terminal_screen_cook_title (screen);
}
static void
terminal_screen_set_dynamic_icon_title (TerminalScreen *screen,
const char *icon_title,
- gboolean userset)
+ gboolean userset)
{
- TerminalScreenPrivate *priv = screen->priv;
- GObject *object = G_OBJECT (screen);
-
- g_assert (TERMINAL_IS_SCREEN (screen));
+ TerminalScreenPrivate *priv = screen->priv;
+ GObject *object = G_OBJECT (screen);
+
+ g_assert (TERMINAL_IS_SCREEN (screen));
- if ((priv->user_title && !userset) ||
- (priv->icon_title_set &&
- priv->raw_icon_title &&
- icon_title &&
- strcmp (priv->raw_icon_title, icon_title) == 0))
- return;
+ if ((priv->user_title && !userset) ||
+ (priv->icon_title_set &&
+ priv->raw_icon_title &&
+ icon_title &&
+ strcmp (priv->raw_icon_title, icon_title) == 0))
+ return;
- g_object_freeze_notify (object);
+ g_object_freeze_notify (object);
- g_free (priv->raw_icon_title);
- priv->raw_icon_title = g_strdup (icon_title);
- priv->icon_title_set = TRUE;
+ g_free (priv->raw_icon_title);
+ priv->raw_icon_title = g_strdup (icon_title);
+ priv->icon_title_set = TRUE;
- g_object_notify (object, "icon-title-set");
- terminal_screen_cook_icon_title (screen);
+ g_object_notify (object, "icon-title-set");
+ terminal_screen_cook_icon_title (screen);
- g_object_thaw_notify (object);
+ g_object_thaw_notify (object);
}
void
terminal_screen_set_override_title (TerminalScreen *screen,
const char *title)
{
- TerminalScreenPrivate *priv = screen->priv;
- char *old_title;
+ TerminalScreenPrivate *priv = screen->priv;
+ char *old_title;
- old_title = priv->override_title;
- priv->override_title = g_strdup (title);
- g_free (old_title);
+ old_title = priv->override_title;
+ priv->override_title = g_strdup (title);
+ g_free (old_title);
- terminal_screen_set_dynamic_title (screen, title, FALSE);
- terminal_screen_set_dynamic_icon_title (screen, title, FALSE);
+ terminal_screen_set_dynamic_title (screen, title, FALSE);
+ terminal_screen_set_dynamic_icon_title (screen, title, FALSE);
}
const char*
terminal_screen_get_dynamic_title (TerminalScreen *screen)
{
- g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL);
-
- return screen->priv->raw_title;
+ g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL);
+
+ return screen->priv->raw_title;
}
const char*
terminal_screen_get_dynamic_icon_title (TerminalScreen *screen)
{
- g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL);
-
- return screen->priv->raw_icon_title;
+ g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL);
+
+ return screen->priv->raw_icon_title;
}
/**
@@ -1743,31 +1755,32 @@ terminal_screen_get_dynamic_icon_title (TerminalScreen *screen)
* Tries to determine the current working directory of the foreground process
* in @screen's PTY, falling back to the current working directory of the
* primary child.
- *
+ *
* Returns: a newly allocated string containing the current working directory,
* or %NULL on failure
*/
char*
terminal_screen_get_current_dir (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
- char *cwd;
+ TerminalScreenPrivate *priv = screen->priv;
+ char *cwd;
- if (priv->pty_fd != -1) {
+ if (priv->pty_fd != -1)
+ {
#if 0
- /* Get the foreground process ID */
- cwd = cwd_of_pid (tcgetpgrp (priv->pty_fd));
- if (cwd != NULL)
- return cwd;
+ /* Get the foreground process ID */
+ cwd = cwd_of_pid (tcgetpgrp (priv->pty_fd));
+ if (cwd != NULL)
+ return cwd;
#endif
- /* If that didn't work, try falling back to the primary child. See bug #575184. */
- cwd = cwd_of_pid (priv->child_pid);
- if (cwd != NULL)
- return cwd;
- }
+ /* If that didn't work, try falling back to the primary child. See bug #575184. */
+ cwd = cwd_of_pid (priv->child_pid);
+ if (cwd != NULL)
+ return cwd;
+ }
- return NULL;
+ return NULL;
}
/**
@@ -1777,145 +1790,151 @@ terminal_screen_get_current_dir (TerminalScreen *screen)
* Like terminal_screen_get_current_dir(), but falls back to returning
* @screen's initial working directory, with a further fallback to the
* user's home directory.
- *
+ *
* Returns: a newly allocated string containing the current working directory,
* or %NULL on failure
*/
char*
terminal_screen_get_current_dir_with_fallback (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
+ TerminalScreenPrivate *priv = screen->priv;
- if (priv->pty_fd == -1)
- return g_strdup (priv->initial_working_directory);
+ if (priv->pty_fd == -1)
+ return g_strdup (priv->initial_working_directory);
- return terminal_screen_get_current_dir (screen);
+ return terminal_screen_get_current_dir (screen);
}
void
terminal_screen_set_font_scale (TerminalScreen *screen,
double factor)
{
- TerminalScreenPrivate *priv = screen->priv;
-
- g_return_if_fail (TERMINAL_IS_SCREEN (screen));
+ TerminalScreenPrivate *priv = screen->priv;
- if (factor < TERMINAL_SCALE_MINIMUM)
- factor = TERMINAL_SCALE_MINIMUM;
- if (factor > TERMINAL_SCALE_MAXIMUM)
- factor = TERMINAL_SCALE_MAXIMUM;
-
- priv->font_scale = factor;
-
- if (gtk_widget_get_realized (GTK_WIDGET (screen)))
- {
- /* Update the font */
- terminal_screen_change_font (screen);
- }
+ g_return_if_fail (TERMINAL_IS_SCREEN (screen));
+
+ if (factor < TERMINAL_SCALE_MINIMUM)
+ factor = TERMINAL_SCALE_MINIMUM;
+ if (factor > TERMINAL_SCALE_MAXIMUM)
+ factor = TERMINAL_SCALE_MAXIMUM;
+
+ priv->font_scale = factor;
+
+ if (gtk_widget_get_realized (GTK_WIDGET (screen)))
+ {
+ /* Update the font */
+ terminal_screen_change_font (screen);
+ }
}
double
terminal_screen_get_font_scale (TerminalScreen *screen)
{
- g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), 1.0);
-
- return screen->priv->font_scale;
+ g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), 1.0);
+
+ return screen->priv->font_scale;
}
static void
terminal_screen_window_title_changed (VteTerminal *vte_terminal,
TerminalScreen *screen)
{
- terminal_screen_set_dynamic_title (screen,
- vte_terminal_get_window_title (vte_terminal),
- FALSE);
+ terminal_screen_set_dynamic_title (screen,
+ vte_terminal_get_window_title (vte_terminal),
+ FALSE);
}
static void
terminal_screen_icon_title_changed (VteTerminal *vte_terminal,
TerminalScreen *screen)
{
- terminal_screen_set_dynamic_icon_title (screen,
- vte_terminal_get_icon_title (vte_terminal),
- FALSE);
+ terminal_screen_set_dynamic_icon_title (screen,
+ vte_terminal_get_icon_title (vte_terminal),
+ FALSE);
}
static void
terminal_screen_child_exited (VteTerminal *terminal)
{
- TerminalScreen *screen = TERMINAL_SCREEN (terminal);
- TerminalScreenPrivate *priv = screen->priv;
- TerminalExitAction action;
-
- /* No need to chain up to VteTerminalClass::child_exited since it's NULL */
-
- _terminal_debug_print (TERMINAL_DEBUG_PROCESSES,
- "[screen %p] child process exited\n",
- screen);
-
- priv->child_pid = -1;
- priv->pty_fd = -1;
-
- action = terminal_profile_get_property_enum (priv->profile, TERMINAL_PROFILE_EXIT_ACTION);
-
- switch (action)
- {
- case TERMINAL_EXIT_CLOSE:
- g_signal_emit (screen, signals[CLOSE_SCREEN], 0);
- break;
- case TERMINAL_EXIT_RESTART:
- terminal_screen_launch_child_on_idle (screen);
- break;
- case TERMINAL_EXIT_HOLD: {
- GtkWidget *info_bar;
- int status;
-
- status = vte_terminal_get_child_exit_status (terminal);
-
- info_bar = terminal_info_bar_new (GTK_MESSAGE_INFO,
- _("_Relaunch"), RESPONSE_RELAUNCH,
- NULL);
- if (WIFEXITED (status)) {
- terminal_info_bar_format_text (TERMINAL_INFO_BAR (info_bar),
- _("The child process exited normally with status %d."), WEXITSTATUS (status));
- } else if (WIFSIGNALED (status)) {
- terminal_info_bar_format_text (TERMINAL_INFO_BAR (info_bar),
- _("The child process was terminated by signal %d."), WTERMSIG (status));
- } else {
- terminal_info_bar_format_text (TERMINAL_INFO_BAR (info_bar),
- _("The child process was terminated."));
- }
- g_signal_connect (info_bar, "response",
- G_CALLBACK (info_bar_response_cb), screen);
-
- gtk_box_pack_start (GTK_BOX (terminal_screen_container_get_from_screen (screen)),
- info_bar, FALSE, FALSE, 0);
- gtk_info_bar_set_default_response (GTK_INFO_BAR (info_bar), RESPONSE_RELAUNCH);
- gtk_widget_show (info_bar);
- break;
- }
-
- default:
- break;
- }
+ TerminalScreen *screen = TERMINAL_SCREEN (terminal);
+ TerminalScreenPrivate *priv = screen->priv;
+ TerminalExitAction action;
+
+ /* No need to chain up to VteTerminalClass::child_exited since it's NULL */
+
+ _terminal_debug_print (TERMINAL_DEBUG_PROCESSES,
+ "[screen %p] child process exited\n",
+ screen);
+
+ priv->child_pid = -1;
+ priv->pty_fd = -1;
+
+ action = terminal_profile_get_property_enum (priv->profile, TERMINAL_PROFILE_EXIT_ACTION);
+
+ switch (action)
+ {
+ case TERMINAL_EXIT_CLOSE:
+ g_signal_emit (screen, signals[CLOSE_SCREEN], 0);
+ break;
+ case TERMINAL_EXIT_RESTART:
+ terminal_screen_launch_child_on_idle (screen);
+ break;
+ case TERMINAL_EXIT_HOLD:
+ {
+ GtkWidget *info_bar;
+ int status;
+
+ status = vte_terminal_get_child_exit_status (terminal);
+
+ info_bar = terminal_info_bar_new (GTK_MESSAGE_INFO,
+ _("_Relaunch"), RESPONSE_RELAUNCH,
+ NULL);
+ if (WIFEXITED (status))
+ {
+ terminal_info_bar_format_text (TERMINAL_INFO_BAR (info_bar),
+ _("The child process exited normally with status %d."), WEXITSTATUS (status));
+ }
+ else if (WIFSIGNALED (status))
+ {
+ terminal_info_bar_format_text (TERMINAL_INFO_BAR (info_bar),
+ _("The child process was terminated by signal %d."), WTERMSIG (status));
+ }
+ else
+ {
+ terminal_info_bar_format_text (TERMINAL_INFO_BAR (info_bar),
+ _("The child process was terminated."));
+ }
+ g_signal_connect (info_bar, "response",
+ G_CALLBACK (info_bar_response_cb), screen);
+
+ gtk_box_pack_start (GTK_BOX (terminal_screen_container_get_from_screen (screen)),
+ info_bar, FALSE, FALSE, 0);
+ gtk_info_bar_set_default_response (GTK_INFO_BAR (info_bar), RESPONSE_RELAUNCH);
+ gtk_widget_show (info_bar);
+ break;
+ }
+
+ default:
+ break;
+ }
}
void
terminal_screen_set_user_title (TerminalScreen *screen,
const char *text)
{
- TerminalScreenPrivate *priv = screen->priv;
+ TerminalScreenPrivate *priv = screen->priv;
- /* The user set the title to nothing, let's understand that as a
- request to revert to dynamically setting the title again. */
- if (!text || !text[0])
- priv->user_title = FALSE;
- else
- {
- priv->user_title = TRUE;
- terminal_screen_set_dynamic_title (screen, text, TRUE);
- terminal_screen_set_dynamic_icon_title (screen, text, TRUE);
- }
+ /* The user set the title to nothing, let's understand that as a
+ request to revert to dynamically setting the title again. */
+ if (!text || !text[0])
+ priv->user_title = FALSE;
+ else
+ {
+ priv->user_title = TRUE;
+ terminal_screen_set_dynamic_title (screen, text, TRUE);
+ terminal_screen_set_dynamic_icon_title (screen, text, TRUE);
+ }
}
static void
@@ -1927,334 +1946,334 @@ terminal_screen_drag_data_received (GtkWidget *widget,
guint info,
guint timestamp)
{
- TerminalScreen *screen = TERMINAL_SCREEN (widget);
- TerminalScreenPrivate *priv = screen->priv;
- const guchar *selection_data_data;
- GdkAtom selection_data_target;
- gint selection_data_length, selection_data_format;
+ TerminalScreen *screen = TERMINAL_SCREEN (widget);
+ TerminalScreenPrivate *priv = screen->priv;
+ const guchar *selection_data_data;
+ GdkAtom selection_data_target;
+ gint selection_data_length, selection_data_format;
- selection_data_data = gtk_selection_data_get_data (selection_data);
- selection_data_target = gtk_selection_data_get_target (selection_data);
- selection_data_length = gtk_selection_data_get_length (selection_data);
- selection_data_format = gtk_selection_data_get_format (selection_data);
+ selection_data_data = gtk_selection_data_get_data (selection_data);
+ selection_data_target = gtk_selection_data_get_target (selection_data);
+ selection_data_length = gtk_selection_data_get_length (selection_data);
+ selection_data_format = gtk_selection_data_get_format (selection_data);
#if 0
- {
- GList *tmp;
-
- g_print ("info: %d\n", info);
- tmp = context->targets;
- while (tmp != NULL)
- {
- GdkAtom atom = GDK_POINTER_TO_ATOM (tmp->data);
-
- g_print ("Target: %s\n", gdk_atom_name (atom));
-
- tmp = tmp->next;
- }
-
- g_print ("Chosen target: %s\n", gdk_atom_name (selection_data->target));
- }
+ {
+ GList *tmp;
+
+ g_print ("info: %d\n", info);
+ tmp = context->targets;
+ while (tmp != NULL)
+ {
+ GdkAtom atom = GDK_POINTER_TO_ATOM (tmp->data);
+
+ g_print ("Target: %s\n", gdk_atom_name (atom));
+
+ tmp = tmp->next;
+ }
+
+ g_print ("Chosen target: %s\n", gdk_atom_name (selection_data->target));
+ }
#endif
- if (gtk_targets_include_uri (&selection_data_target, 1))
- {
- char **uris;
- char *text;
- gsize len;
-
- uris = gtk_selection_data_get_uris (selection_data);
- if (!uris)
- return;
-
- terminal_util_transform_uris_to_quoted_fuse_paths (uris);
-
- text = terminal_util_concat_uris (uris, &len);
- vte_terminal_feed_child (VTE_TERMINAL (screen), text, len);
- g_free (text);
-
- g_strfreev (uris);
- }
- else if (gtk_targets_include_text (&selection_data_target, 1))
- {
- char *text;
-
- text = (char *) gtk_selection_data_get_text (selection_data);
- if (text && text[0])
- vte_terminal_feed_child (VTE_TERMINAL (screen), text, strlen (text));
- g_free (text);
- }
- else switch (info)
- {
- case TARGET_COLOR:
- {
- guint16 *data = (guint16 *)selection_data_data;
- GdkColor color;
-
- /* We accept drops with the wrong format, since the KDE color
- * chooser incorrectly drops application/x-color with format 8.
- * So just check for the data length.
- */
- if (selection_data_length != 8)
- return;
-
- color.red = data[0];
- color.green = data[1];
- color.blue = data[2];
- /* FIXME: use opacity from data[3] */
-
- g_object_set (priv->profile,
- TERMINAL_PROFILE_BACKGROUND_TYPE, TERMINAL_BACKGROUND_SOLID,
- TERMINAL_PROFILE_USE_THEME_COLORS, FALSE,
- TERMINAL_PROFILE_BACKGROUND_COLOR, &color,
- NULL);
- }
- break;
-
- case TARGET_MOZ_URL:
- {
- char *utf8_data, *newline, *text;
- char *uris[2];
- gsize len;
-
- /* MOZ_URL is in UCS-2 but in format 8. BROKEN!
- *
- * The data contains the URL, a \n, then the
- * title of the web page.
- */
- if (selection_data_format != 8 ||
- selection_data_length == 0 ||
- (selection_data_length % 2) != 0)
- return;
-
- utf8_data = g_utf16_to_utf8 ((const gunichar2*) selection_data_data,
- selection_data_length / 2,
- NULL, NULL, NULL);
- if (!utf8_data)
- return;
-
- newline = strchr (utf8_data, '\n');
- if (newline)
- *newline = '\0';
-
- uris[0] = utf8_data;
- uris[1] = NULL;
- terminal_util_transform_uris_to_quoted_fuse_paths (uris); /* This may replace uris[0] */
-
- text = terminal_util_concat_uris (uris, &len);
- vte_terminal_feed_child (VTE_TERMINAL (screen), text, len);
- g_free (text);
- g_free (uris[0]);
- }
- break;
-
- case TARGET_NETSCAPE_URL:
- {
- char *utf8_data, *newline, *text;
- char *uris[2];
- gsize len;
-
- /* The data contains the URL, a \n, then the
- * title of the web page.
- */
- if (selection_data_length < 0 || selection_data_format != 8)
- return;
-
- utf8_data = g_strndup ((char *) selection_data_data, selection_data_length);
- newline = strchr (utf8_data, '\n');
- if (newline)
- *newline = '\0';
-
- uris[0] = utf8_data;
- uris[1] = NULL;
- terminal_util_transform_uris_to_quoted_fuse_paths (uris); /* This may replace uris[0] */
-
- text = terminal_util_concat_uris (uris, &len);
- vte_terminal_feed_child (VTE_TERMINAL (screen), text, len);
- g_free (text);
- g_free (uris[0]);
- }
- break;
-
- case TARGET_BGIMAGE:
- {
- char *utf8_data;
- char **uris;
-
- if (selection_data_length < 0 || selection_data_format != 8)
- return;
-
- utf8_data = g_strndup ((char *) selection_data_data, selection_data_length);
- uris = g_uri_list_extract_uris (utf8_data);
- g_free (utf8_data);
-
- /* FIXME: use terminal_util_transform_uris_to_quoted_fuse_paths? */
-
- if (uris && uris[0])
- {
- char *filename;
-
- filename = g_filename_from_uri (uris[0], NULL, NULL);
- if (filename)
- {
- g_object_set (priv->profile,
- TERMINAL_PROFILE_BACKGROUND_TYPE, TERMINAL_BACKGROUND_IMAGE,
- TERMINAL_PROFILE_BACKGROUND_IMAGE_FILE, filename,
- NULL);
- }
-
- g_free (filename);
- }
-
- g_strfreev (uris);
- }
- break;
-
- case TARGET_RESET_BG:
- g_object_set (priv->profile,
- TERMINAL_PROFILE_BACKGROUND_TYPE, TERMINAL_BACKGROUND_SOLID,
- NULL);
- break;
-
- case TARGET_TAB:
- {
- GtkWidget *container;
- TerminalScreen *moving_screen;
- TerminalWindow *source_window;
- TerminalWindow *dest_window;
- GtkWidget *dest_notebook;
- int page_num;
-
- container = *(GtkWidget**) selection_data_data;
- if (!GTK_IS_WIDGET (container))
- return;
-
- moving_screen = terminal_screen_container_get_screen (TERMINAL_SCREEN_CONTAINER (container));
- g_return_if_fail (TERMINAL_IS_SCREEN (moving_screen));
- if (!TERMINAL_IS_SCREEN (moving_screen))
- return;
-
- source_window = terminal_screen_get_window (moving_screen);
- dest_window = terminal_screen_get_window (screen);
- dest_notebook = terminal_window_get_notebook (dest_window);
- page_num = gtk_notebook_page_num (GTK_NOTEBOOK (dest_notebook),
- GTK_WIDGET (screen));
- terminal_window_move_screen (source_window, dest_window, moving_screen, page_num + 1);
-
- gtk_drag_finish (context, TRUE, TRUE, timestamp);
- }
- break;
-
- default:
- g_assert_not_reached ();
- }
+ if (gtk_targets_include_uri (&selection_data_target, 1))
+ {
+ char **uris;
+ char *text;
+ gsize len;
+
+ uris = gtk_selection_data_get_uris (selection_data);
+ if (!uris)
+ return;
+
+ terminal_util_transform_uris_to_quoted_fuse_paths (uris);
+
+ text = terminal_util_concat_uris (uris, &len);
+ vte_terminal_feed_child (VTE_TERMINAL (screen), text, len);
+ g_free (text);
+
+ g_strfreev (uris);
+ }
+ else if (gtk_targets_include_text (&selection_data_target, 1))
+ {
+ char *text;
+
+ text = (char *) gtk_selection_data_get_text (selection_data);
+ if (text && text[0])
+ vte_terminal_feed_child (VTE_TERMINAL (screen), text, strlen (text));
+ g_free (text);
+ }
+ else switch (info)
+ {
+ case TARGET_COLOR:
+ {
+ guint16 *data = (guint16 *)selection_data_data;
+ GdkColor color;
+
+ /* We accept drops with the wrong format, since the KDE color
+ * chooser incorrectly drops application/x-color with format 8.
+ * So just check for the data length.
+ */
+ if (selection_data_length != 8)
+ return;
+
+ color.red = data[0];
+ color.green = data[1];
+ color.blue = data[2];
+ /* FIXME: use opacity from data[3] */
+
+ g_object_set (priv->profile,
+ TERMINAL_PROFILE_BACKGROUND_TYPE, TERMINAL_BACKGROUND_SOLID,
+ TERMINAL_PROFILE_USE_THEME_COLORS, FALSE,
+ TERMINAL_PROFILE_BACKGROUND_COLOR, &color,
+ NULL);
+ }
+ break;
+
+ case TARGET_MOZ_URL:
+ {
+ char *utf8_data, *newline, *text;
+ char *uris[2];
+ gsize len;
+
+ /* MOZ_URL is in UCS-2 but in format 8. BROKEN!
+ *
+ * The data contains the URL, a \n, then the
+ * title of the web page.
+ */
+ if (selection_data_format != 8 ||
+ selection_data_length == 0 ||
+ (selection_data_length % 2) != 0)
+ return;
+
+ utf8_data = g_utf16_to_utf8 ((const gunichar2*) selection_data_data,
+ selection_data_length / 2,
+ NULL, NULL, NULL);
+ if (!utf8_data)
+ return;
+
+ newline = strchr (utf8_data, '\n');
+ if (newline)
+ *newline = '\0';
+
+ uris[0] = utf8_data;
+ uris[1] = NULL;
+ terminal_util_transform_uris_to_quoted_fuse_paths (uris); /* This may replace uris[0] */
+
+ text = terminal_util_concat_uris (uris, &len);
+ vte_terminal_feed_child (VTE_TERMINAL (screen), text, len);
+ g_free (text);
+ g_free (uris[0]);
+ }
+ break;
+
+ case TARGET_NETSCAPE_URL:
+ {
+ char *utf8_data, *newline, *text;
+ char *uris[2];
+ gsize len;
+
+ /* The data contains the URL, a \n, then the
+ * title of the web page.
+ */
+ if (selection_data_length < 0 || selection_data_format != 8)
+ return;
+
+ utf8_data = g_strndup ((char *) selection_data_data, selection_data_length);
+ newline = strchr (utf8_data, '\n');
+ if (newline)
+ *newline = '\0';
+
+ uris[0] = utf8_data;
+ uris[1] = NULL;
+ terminal_util_transform_uris_to_quoted_fuse_paths (uris); /* This may replace uris[0] */
+
+ text = terminal_util_concat_uris (uris, &len);
+ vte_terminal_feed_child (VTE_TERMINAL (screen), text, len);
+ g_free (text);
+ g_free (uris[0]);
+ }
+ break;
+
+ case TARGET_BGIMAGE:
+ {
+ char *utf8_data;
+ char **uris;
+
+ if (selection_data_length < 0 || selection_data_format != 8)
+ return;
+
+ utf8_data = g_strndup ((char *) selection_data_data, selection_data_length);
+ uris = g_uri_list_extract_uris (utf8_data);
+ g_free (utf8_data);
+
+ /* FIXME: use terminal_util_transform_uris_to_quoted_fuse_paths? */
+
+ if (uris && uris[0])
+ {
+ char *filename;
+
+ filename = g_filename_from_uri (uris[0], NULL, NULL);
+ if (filename)
+ {
+ g_object_set (priv->profile,
+ TERMINAL_PROFILE_BACKGROUND_TYPE, TERMINAL_BACKGROUND_IMAGE,
+ TERMINAL_PROFILE_BACKGROUND_IMAGE_FILE, filename,
+ NULL);
+ }
+
+ g_free (filename);
+ }
+
+ g_strfreev (uris);
+ }
+ break;
+
+ case TARGET_RESET_BG:
+ g_object_set (priv->profile,
+ TERMINAL_PROFILE_BACKGROUND_TYPE, TERMINAL_BACKGROUND_SOLID,
+ NULL);
+ break;
+
+ case TARGET_TAB:
+ {
+ GtkWidget *container;
+ TerminalScreen *moving_screen;
+ TerminalWindow *source_window;
+ TerminalWindow *dest_window;
+ GtkWidget *dest_notebook;
+ int page_num;
+
+ container = *(GtkWidget**) selection_data_data;
+ if (!GTK_IS_WIDGET (container))
+ return;
+
+ moving_screen = terminal_screen_container_get_screen (TERMINAL_SCREEN_CONTAINER (container));
+ g_return_if_fail (TERMINAL_IS_SCREEN (moving_screen));
+ if (!TERMINAL_IS_SCREEN (moving_screen))
+ return;
+
+ source_window = terminal_screen_get_window (moving_screen);
+ dest_window = terminal_screen_get_window (screen);
+ dest_notebook = terminal_window_get_notebook (dest_window);
+ page_num = gtk_notebook_page_num (GTK_NOTEBOOK (dest_notebook),
+ GTK_WIDGET (screen));
+ terminal_window_move_screen (source_window, dest_window, moving_screen, page_num + 1);
+
+ gtk_drag_finish (context, TRUE, TRUE, timestamp);
+ }
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
}
void
_terminal_screen_update_scrollbar (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
- TerminalScreenContainer *container;
- GtkPolicyType policy = GTK_POLICY_ALWAYS;
- GtkCornerType corner = GTK_CORNER_TOP_LEFT;
-
- container = terminal_screen_container_get_from_screen (screen);
- if (container == NULL)
- return;
-
- switch (terminal_profile_get_property_enum (priv->profile, TERMINAL_PROFILE_SCROLLBAR_POSITION))
- {
- case TERMINAL_SCROLLBAR_HIDDEN:
- policy = GTK_POLICY_NEVER;
- break;
- case TERMINAL_SCROLLBAR_RIGHT:
- policy = GTK_POLICY_ALWAYS;
- corner = GTK_CORNER_TOP_LEFT;
- break;
- case TERMINAL_SCROLLBAR_LEFT:
- policy = GTK_POLICY_ALWAYS;
- corner = GTK_CORNER_TOP_RIGHT;
- break;
- default:
- g_assert_not_reached ();
- break;
- }
-
- terminal_screen_container_set_placement (container, corner);
- terminal_screen_container_set_policy (container, GTK_POLICY_NEVER, policy);
+ TerminalScreenPrivate *priv = screen->priv;
+ TerminalScreenContainer *container;
+ GtkPolicyType policy = GTK_POLICY_ALWAYS;
+ GtkCornerType corner = GTK_CORNER_TOP_LEFT;
+
+ container = terminal_screen_container_get_from_screen (screen);
+ if (container == NULL)
+ return;
+
+ switch (terminal_profile_get_property_enum (priv->profile, TERMINAL_PROFILE_SCROLLBAR_POSITION))
+ {
+ case TERMINAL_SCROLLBAR_HIDDEN:
+ policy = GTK_POLICY_NEVER;
+ break;
+ case TERMINAL_SCROLLBAR_RIGHT:
+ policy = GTK_POLICY_ALWAYS;
+ corner = GTK_CORNER_TOP_LEFT;
+ break;
+ case TERMINAL_SCROLLBAR_LEFT:
+ policy = GTK_POLICY_ALWAYS;
+ corner = GTK_CORNER_TOP_RIGHT;
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ terminal_screen_container_set_placement (container, corner);
+ terminal_screen_container_set_policy (container, GTK_POLICY_NEVER, policy);
}
void
terminal_screen_get_size (TerminalScreen *screen,
- int *width_chars,
- int *height_chars)
+ int *width_chars,
+ int *height_chars)
{
- VteTerminal *terminal = VTE_TERMINAL (screen);
+ VteTerminal *terminal = VTE_TERMINAL (screen);
- *width_chars = vte_terminal_get_column_count (terminal);
- *height_chars = vte_terminal_get_row_count (terminal);
+ *width_chars = vte_terminal_get_column_count (terminal);
+ *height_chars = vte_terminal_get_row_count (terminal);
}
void
terminal_screen_get_cell_size (TerminalScreen *screen,
- int *cell_width_pixels,
- int *cell_height_pixels)
+ int *cell_width_pixels,
+ int *cell_height_pixels)
{
- VteTerminal *terminal = VTE_TERMINAL (screen);
+ VteTerminal *terminal = VTE_TERMINAL (screen);
- *cell_width_pixels = vte_terminal_get_char_width (terminal);
- *cell_height_pixels = vte_terminal_get_char_height (terminal);
+ *cell_width_pixels = vte_terminal_get_char_width (terminal);
+ *cell_height_pixels = vte_terminal_get_char_height (terminal);
}
#ifdef ENABLE_SKEY
static void
terminal_screen_skey_match_remove (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
- GSList *l, *next;
+ TerminalScreenPrivate *priv = screen->priv;
+ GSList *l, *next;
- l = priv->match_tags;
- while (l != NULL)
- {
- TagData *tag_data = (TagData *) l->data;
+ l = priv->match_tags;
+ while (l != NULL)
+ {
+ TagData *tag_data = (TagData *) l->data;
- next = l->next;
- if (tag_data->flavor == FLAVOR_SKEY)
- {
- vte_terminal_match_remove (VTE_TERMINAL (screen), tag_data->tag);
- priv->match_tags = g_slist_delete_link (priv->match_tags, l);
- }
+ next = l->next;
+ if (tag_data->flavor == FLAVOR_SKEY)
+ {
+ vte_terminal_match_remove (VTE_TERMINAL (screen), tag_data->tag);
+ priv->match_tags = g_slist_delete_link (priv->match_tags, l);
+ }
- l = next;
- }
+ l = next;
+ }
}
#endif /* ENABLE_SKEY */
static char*
terminal_screen_check_match (TerminalScreen *screen,
- int column,
- int row,
+ int column,
+ int row,
int *flavor)
{
- TerminalScreenPrivate *priv = screen->priv;
- GSList *tags;
- int tag;
- char *match;
+ TerminalScreenPrivate *priv = screen->priv;
+ GSList *tags;
+ int tag;
+ char *match;
- match = vte_terminal_match_check (VTE_TERMINAL (screen), column, row, &tag);
- for (tags = priv->match_tags; tags != NULL; tags = tags->next)
- {
- TagData *tag_data = (TagData*) tags->data;
- if (tag_data->tag == tag)
+ match = vte_terminal_match_check (VTE_TERMINAL (screen), column, row, &tag);
+ for (tags = priv->match_tags; tags != NULL; tags = tags->next)
{
- if (flavor)
- *flavor = tag_data->flavor;
- return match;
+ TagData *tag_data = (TagData*) tags->data;
+ if (tag_data->tag == tag)
+ {
+ if (flavor)
+ *flavor = tag_data->flavor;
+ return match;
+ }
}
- }
- g_free (match);
- return NULL;
+ g_free (match);
+ return NULL;
}
void
@@ -2262,34 +2281,34 @@ terminal_screen_save_config (TerminalScreen *screen,
GKeyFile *key_file,
const char *group)
{
- TerminalScreenPrivate *priv = screen->priv;
- VteTerminal *terminal = VTE_TERMINAL (screen);
- TerminalProfile *profile = priv->profile;
- const char *profile_id;
- char *working_directory;
+ TerminalScreenPrivate *priv = screen->priv;
+ VteTerminal *terminal = VTE_TERMINAL (screen);
+ TerminalProfile *profile = priv->profile;
+ const char *profile_id;
+ char *working_directory;
- profile_id = terminal_profile_get_property_string (profile, TERMINAL_PROFILE_NAME);
- g_key_file_set_string (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_PROFILE_ID, profile_id);
+ profile_id = terminal_profile_get_property_string (profile, TERMINAL_PROFILE_NAME);
+ g_key_file_set_string (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_PROFILE_ID, profile_id);
- if (priv->override_command)
- terminal_util_key_file_set_argv (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_COMMAND,
- -1, priv->override_command);
+ if (priv->override_command)
+ terminal_util_key_file_set_argv (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_COMMAND,
+ -1, priv->override_command);
- if (priv->override_title)
- g_key_file_set_string (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_TITLE, priv->override_title);
+ if (priv->override_title)
+ g_key_file_set_string (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_TITLE, priv->override_title);
- /* FIXMEchpe: use the initial_working_directory instead?? */
- working_directory = terminal_screen_get_current_dir (screen);
- if (working_directory)
- terminal_util_key_file_set_string_escape (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_WORKING_DIRECTORY, working_directory);
- g_free (working_directory);
+ /* FIXMEchpe: use the initial_working_directory instead?? */
+ working_directory = terminal_screen_get_current_dir (screen);
+ if (working_directory)
+ terminal_util_key_file_set_string_escape (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_WORKING_DIRECTORY, working_directory);
+ g_free (working_directory);
- g_key_file_set_double (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_ZOOM, priv->font_scale);
+ g_key_file_set_double (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_ZOOM, priv->font_scale);
- g_key_file_set_integer (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_WIDTH,
- vte_terminal_get_column_count (terminal));
- g_key_file_set_integer (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_HEIGHT,
- vte_terminal_get_row_count (terminal));
+ g_key_file_set_integer (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_WIDTH,
+ vte_terminal_get_column_count (terminal));
+ g_key_file_set_integer (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_HEIGHT,
+ vte_terminal_get_row_count (terminal));
}
/**
@@ -2298,46 +2317,46 @@ terminal_screen_save_config (TerminalScreen *screen,
*
* Checks whether there's a foreground process running in
* this terminal.
- *
+ *
* Returns: %TRUE iff there's a foreground process running in @screen
*/
gboolean
terminal_screen_has_foreground_process (TerminalScreen *screen)
{
- TerminalScreenPrivate *priv = screen->priv;
- int fgpid;
+ TerminalScreenPrivate *priv = screen->priv;
+ int fgpid;
- if (priv->pty_fd == -1)
- return FALSE;
+ if (priv->pty_fd == -1)
+ return FALSE;
- fgpid = tcgetpgrp (priv->pty_fd);
- if (fgpid == -1 || fgpid == priv->child_pid)
- return FALSE;
+ fgpid = tcgetpgrp (priv->pty_fd);
+ if (fgpid == -1 || fgpid == priv->child_pid)
+ return FALSE;
- return TRUE;
+ return TRUE;
#if 0
- char *cmdline, *basename, *name;
- gsize len;
- char filename[64];
+ char *cmdline, *basename, *name;
+ gsize len;
+ char filename[64];
- g_snprintf (filename, sizeof (filename), "/proc/%d/cmdline", fgpid);
- if (!g_file_get_contents (filename, &cmdline, &len, NULL))
- return TRUE;
+ g_snprintf (filename, sizeof (filename), "/proc/%d/cmdline", fgpid);
+ if (!g_file_get_contents (filename, &cmdline, &len, NULL))
+ return TRUE;
- basename = g_path_get_basename (cmdline);
- g_free (cmdline);
- if (!basename)
- return TRUE;
+ basename = g_path_get_basename (cmdline);
+ g_free (cmdline);
+ if (!basename)
+ return TRUE;
- name = g_filename_to_utf8 (basename, -1, NULL, NULL, NULL);
- g_free (basename);
- if (!name)
- return TRUE;
+ name = g_filename_to_utf8 (basename, -1, NULL, NULL, NULL);
+ g_free (basename);
+ if (!name)
+ return TRUE;
- if (process_name)
- *process_name = name;
+ if (process_name)
+ *process_name = name;
- return TRUE;
+ return TRUE;
#endif
}