gnome-terminal r3289 - trunk/src



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]