gnome-terminal r3289 - trunk/src
- From: chpe svn gnome org
- To: svn-commits-list gnome org
- Subject: gnome-terminal r3289 - trunk/src
- Date: Tue, 27 Jan 2009 21:11:39 +0000 (UTC)
Author: chpe
Date: Tue Jan 27 21:11:38 2009
New Revision: 3289
URL: http://svn.gnome.org/viewvc/gnome-terminal?rev=3289&view=rev
Log:
Don't continually re-check the current working directory since it's only
ever needed when creating a new terminal.
Modified:
trunk/src/terminal-screen.c
trunk/src/terminal-screen.h
trunk/src/terminal-window.c
Modified: trunk/src/terminal-screen.c
==============================================================================
--- trunk/src/terminal-screen.c (original)
+++ trunk/src/terminal-screen.c Tue Jan 27 21:11:38 2009
@@ -65,13 +65,12 @@
char *cooked_title, *cooked_icon_title;
char *override_title;
gboolean icon_title_set;
+ char *initial_working_directory;
char **initial_env;
char **override_command;
- char *working_dir;
int child_pid;
int pty_fd;
double font_scale;
- guint recheck_working_dir_idle;
gboolean user_title; /* title was manually set */
GSList *match_tags;
};
@@ -137,8 +136,6 @@
static void terminal_screen_cook_title (TerminalScreen *screen);
static void terminal_screen_cook_icon_title (TerminalScreen *screen);
-static void queue_recheck_working_dir (TerminalScreen *screen);
-
static char* terminal_screen_check_match (TerminalScreen *screen,
int column,
int row,
@@ -346,14 +343,9 @@
vte_terminal_set_mouse_autohide (VTE_TERMINAL (screen), TRUE);
- priv->working_dir = g_get_current_dir ();
- if (priv->working_dir == NULL) /* shouldn't ever happen */
- priv->working_dir = g_strdup (g_get_home_dir ());
priv->child_pid = -1;
priv->pty_fd = -1;
- priv->recheck_working_dir_idle = 0;
-
priv->font_scale = PANGO_SCALE_MEDIUM;
for (i = 0; i < n_url_regexes; ++i)
@@ -653,16 +645,13 @@
terminal_screen_set_profile (screen, NULL);
- if (priv->recheck_working_dir_idle)
- g_source_remove (priv->recheck_working_dir_idle);
-
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_free (priv->working_dir);
g_strfreev (priv->initial_env);
g_slist_foreach (priv->match_tags, (GFunc) free_tag_data, NULL);
@@ -680,18 +669,19 @@
double zoom)
{
TerminalScreen *screen;
+ TerminalScreenPrivate *priv;
g_return_val_if_fail (TERMINAL_IS_PROFILE (profile), NULL);
screen = g_object_new (TERMINAL_TYPE_SCREEN, NULL);
+ priv = screen->priv;
terminal_screen_set_profile (screen, profile);
if (title)
terminal_screen_set_override_title (screen, title);
- if (working_dir)
- terminal_screen_set_working_dir (screen, working_dir);
+ priv->initial_working_directory = g_strdup (working_dir);
if (override_command)
terminal_screen_set_override_command (screen, override_command);
@@ -1512,7 +1502,7 @@
path,
argv,
env,
- terminal_screen_get_working_dir (screen),
+ priv->initial_working_directory,
terminal_profile_get_property_boolean (profile, TERMINAL_PROFILE_LOGIN_SHELL),
update_records,
update_records);
@@ -1731,65 +1721,52 @@
return screen->priv->raw_icon_title;
}
-void
-terminal_screen_set_working_dir (TerminalScreen *screen,
- const char *dirname)
+/**
+ * terminal_screen_get_current_dir:
+ * @screen:
+ *
+ * Returns: a newly allocated string containing the current working directory
+ * of the foreground process in @screen's PTY; or otherwise the initial working
+ * directory as set by terminal_screen_new()
+ */
+char*
+terminal_screen_get_current_dir (TerminalScreen *screen)
{
+ static const char patterns[][18] = {
+ "/proc/%d/cwd", /* Linux */
+ "/proc/%d/path/cwd", /* Solaris >= 10 */
+ };
TerminalScreenPrivate *priv = screen->priv;
+ int fgpid;
+ guint i;
- g_return_if_fail (TERMINAL_IS_SCREEN (screen));
+ g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL);
- g_free (priv->working_dir);
- priv->working_dir = g_strdup (dirname);
-}
+ if (priv->pty_fd == -1)
+ return priv->initial_working_directory;
-const char*
-terminal_screen_get_working_dir (TerminalScreen *screen)
-{
- TerminalScreenPrivate *priv = screen->priv;
-
- g_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL);
+ /* Get the foreground process ID */
+ fgpid = tcgetpgrp (priv->pty_fd);
+ if (fgpid == -1)
+ return priv->initial_working_directory;
- /* Try to update the working dir using various OS-specific mechanisms */
- if (priv->pty_fd >= 0)
+ /* Try to get the working directory using various OS-specific mechanisms */
+ for (i = 0; i < G_N_ELEMENTS (patterns); ++i)
{
- static const char *patterns[] = {
- "/proc/%d/cwd", /* Linux */
- "/proc/%d/path/cwd", /* Solaris >= 10 */
- };
- char *file = NULL;
- char buf[PATH_MAX+1];
- int len = 0;
- guint i;
- int fgpid;
-
- fgpid = tcgetpgrp (priv->pty_fd);
- if (fgpid == -1)
- return priv->working_dir; /* FIXME set priv->working_dir to NULL? */
-
- /* First try to update the working dir using various OS-specific mechanisms */
- file = NULL;
- for (i = 0; i < G_N_ELEMENTS (patterns); ++i)
- {
- g_free (file);
- file = g_strdup_printf (patterns[i], fgpid);
- len = readlink (file, buf, sizeof (buf) - 1);
+ char cwd_file[64];
+ char buf[PATH_MAX + 1];
+ int len;
- if (len > 0 && buf[0] == '/')
- {
- buf[len] = '\0';
-
- g_free (priv->working_dir);
- priv->working_dir = g_strdup (buf);
+ g_snprintf (cwd_file, sizeof (cwd_file), patterns[i], fgpid);
+ len = readlink (cwd_file, buf, sizeof (buf) - 1);
- break;
- }
- }
+ if (len > 0 && buf[0] == '/')
+ return g_strndup (buf, len);
- /* If that did not do it, be bold */
+ /* If that didn't do it, try this hack */
if (len <= 0)
{
- char *cwd;
+ char *cwd, *working_dir = NULL;
cwd = g_get_current_dir ();
if (cwd != NULL)
@@ -1798,50 +1775,20 @@
* link can be used as a directory, including as a target
* of chdir().
*/
- if (chdir (file) == 0)
+ if (chdir (cwd_file) == 0)
{
- g_free (priv->working_dir);
- priv->working_dir = g_get_current_dir ();
+ working_dir = g_get_current_dir ();
chdir (cwd);
}
g_free (cwd);
}
- }
- g_free (file);
+ if (working_dir)
+ return working_dir;
+ }
}
- return priv->working_dir;
-}
-
-static gboolean
-recheck_dir (void *data)
-{
- TerminalScreen *screen = data;
- TerminalScreenPrivate *priv = screen->priv;
-
- priv->recheck_working_dir_idle = 0;
-
- /* called just for side effect */
- terminal_screen_get_working_dir (screen);
-
- /* remove idle */
- return FALSE;
-}
-
-static void
-queue_recheck_working_dir (TerminalScreen *screen)
-{
- TerminalScreenPrivate *priv = screen->priv;
-
- if (priv->recheck_working_dir_idle == 0)
- {
- priv->recheck_working_dir_idle =
- g_idle_add_full (G_PRIORITY_LOW + 50,
- recheck_dir,
- screen,
- NULL);
- }
+ return priv->initial_working_directory;
}
void
@@ -1881,8 +1828,6 @@
terminal_screen_set_dynamic_title (screen,
vte_terminal_get_window_title (vte_terminal),
FALSE);
-
- queue_recheck_working_dir (screen);
}
static void
@@ -1891,9 +1836,7 @@
{
terminal_screen_set_dynamic_icon_title (screen,
vte_terminal_get_icon_title (vte_terminal),
- FALSE);
-
- queue_recheck_working_dir (screen);
+ FALSE);
}
static void
@@ -2277,7 +2220,8 @@
TerminalScreenPrivate *priv = screen->priv;
VteTerminal *terminal = VTE_TERMINAL (screen);
TerminalProfile *profile = priv->profile;
- const char *profile_id, *dir;
+ 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);
@@ -2289,9 +2233,11 @@
if (priv->override_title)
g_key_file_set_string (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_TITLE, priv->override_title);
- dir = terminal_screen_get_working_dir (screen);
- if (dir != NULL && *dir != '\0') /* should always be TRUE anyhow */
- terminal_util_key_file_set_string_escape (key_file, group, TERMINAL_CONFIG_TERMINAL_PROP_WORKING_DIRECTORY, dir);
+ /* 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);
Modified: trunk/src/terminal-screen.h
==============================================================================
--- trunk/src/terminal-screen.h (original)
+++ trunk/src/terminal-screen.h Tue Jan 27 21:11:38 2009
@@ -109,9 +109,7 @@
const char *terminal_screen_get_dynamic_title (TerminalScreen *screen);
const char *terminal_screen_get_dynamic_icon_title (TerminalScreen *screen);
-void terminal_screen_set_working_dir (TerminalScreen *screen,
- const char *dirname);
-const char *terminal_screen_get_working_dir (TerminalScreen *screen);
+char *terminal_screen_get_current_dir (TerminalScreen *screen);
void terminal_screen_set_font (TerminalScreen *screen);
void terminal_screen_set_font_scale (TerminalScreen *screen,
Modified: trunk/src/terminal-window.c
==============================================================================
--- trunk/src/terminal-window.c (original)
+++ trunk/src/terminal-window.c Tue Jan 27 21:11:38 2009
@@ -2751,6 +2751,7 @@
TerminalApp *app;
TerminalWindow *new_window;
TerminalProfile *profile;
+ char *new_working_directory;
app = terminal_app_get ();
@@ -2767,11 +2768,13 @@
new_window = terminal_app_new_window (app, gtk_widget_get_screen (GTK_WIDGET (window)));
+ new_working_directory = terminal_screen_get_current_dir (priv->active_screen);
terminal_app_new_terminal (app, new_window, profile,
NULL, NULL,
- terminal_screen_get_working_dir (priv->active_screen),
+ new_working_directory,
terminal_screen_get_initial_environment (priv->active_screen),
1.0);
+ g_free (new_working_directory);
gtk_window_present (GTK_WINDOW (new_window));
}
@@ -2783,6 +2786,7 @@
TerminalWindowPrivate *priv = window->priv;
TerminalApp *app;
TerminalProfile *profile;
+ char *new_working_directory;
app = terminal_app_get ();
profile = g_object_get_data (G_OBJECT (action), PROFILE_DATA_KEY);
@@ -2796,11 +2800,13 @@
if (_terminal_profile_get_forgotten (profile))
return;
+ new_working_directory = terminal_screen_get_current_dir (priv->active_screen);
terminal_app_new_terminal (app, window, profile,
NULL, NULL,
- terminal_screen_get_working_dir (priv->active_screen),
+ new_working_directory,
terminal_screen_get_initial_environment (priv->active_screen),
1.0);
+ g_free (new_working_directory);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]