This patch will added possibility to configure xterm title through MC_XTITLE environment variable (like a zsh/bash promt)
%% - percent '%' character %$,%# - '#' for root, '$' for normal user %w,%d - working directory with edit/view filename %W,%C - working directory (last component only) with edit/view filename %p - process id (pid) %u,%n - username %h,m - hostname up to the first dot %H,M - hostname.domainname %t,%y - tty connected to stdin without /dev/ %l - tty connected to stdin without /dev/ and tty (if present) %V - mc version --- edit/editwidget.c.orig Fri May 27 20:19:18 2005 +++ edit/editwidget.c Thu Aug 16 12:59:49 2007 @@ -28,6 +28,9 @@ #include "../src/widget.h" /* redraw_labels() */ #include "../src/menu.h" /* menubar_new() */ #include "../src/key.h" /* is_idle() */ +#include "../src/main.h" /* xterm_filename */ +#include "../src/win.h" /* xterm_flag */ +#include "../src/layout.h" /* xterm_title */ WEdit *wedit; struct WMenu *edit_menubar; @@ -168,6 +171,11 @@ edit_file (const char *_file, int line) static int made_directory = 0; Dlg_head *edit_dlg; WButtonBar *edit_bar; + + if (xterm_flag && xterm_title) { + xterm_filename = _file; + update_xterm_title_path (); + } if (option_backup_ext_int != -1) { option_backup_ext = g_malloc (sizeof (int) + 1); --- src/main.c.orig Sat Jul 23 22:52:02 2005 +++ src/main.c Thu Aug 16 16:00:33 2007 @@ -279,6 +279,8 @@ char *mc_home = NULL; char cmd_buf[512]; +char *xterm_filename = NULL; + static void reload_panelized (WPanel *panel) { @@ -1600,22 +1602,159 @@ midnight_callback (struct Dlg_head *h, d #define xtoolkit_panel_setup() -/* Show current directory in the xterm title */ +/* Show current directory in the xterm title + Added possibility to configure xterm title through MC_XTITLE environment variable (like a zsh/bash promt). + %% - percent '%' character + %$,%# - '#' for root, '$' for normal user + %w,%d - working directory with edit/view filename + %W,%C - working directory (last component only) with edit/view filename + %p - process id (pid) + %u,%n - username + %h,m - hostname up to the first dot + %H,M - hostname.domainname + %t,%y - tty connected to stdin without /dev/ + %l - tty connected to stdin without /dev/ and tty (if present) + %V - mc version */ + void update_xterm_title_path (void) { + int i = 0; unsigned char *p, *s; + unsigned char title [BUF_MEDIUM+1],hostname[MAXHOSTNAMELEN+1],domainname[MAXHOSTNAMELEN+1],nametty[BUF_SMALL+1]; if (xterm_flag && xterm_title) { - p = s = g_strdup (strip_home_and_password (current_panel->cwd)); + /* Use special environment variable to format title */ + if ((p = getenv ("MC_XTITLE")) == NULL) { + p = "mc - [EMAIL PROTECTED]:%w"; + } + do { + if (*p != '%') { + title [i++] = *p; + continue; + } + if (!*++p) + break; + + /* Substitute '%' special characters + * (meaning the same as for bash, but preceded by '%', not '\') + */ + s = NULL; + switch (*p) { + case '%' : /* % - percent '%' character */ + title [i++] = '%'; + break; + case '#' : + case '$' : /* %$ or %# - '#' for root, '$' for normal user */ + title [i++] = (geteuid()==0 ? '#' : '$'); + break; + case 'd' : + case 'w' : /* %w or %d - working directory */ + if (xterm_filename==NULL) { + s = g_strdup (strip_home_and_password (current_panel->cwd)); + } else { + if (view_one_file == NULL) { + if (g_ascii_strcasecmp (strip_home_and_password (current_panel->cwd),"/")==0) { + s = g_strdup_printf("/%s",xterm_filename); + } else { + s = g_strdup_printf("%s/%s",strip_home_and_password (current_panel->cwd),xterm_filename); + } + } else { + s = g_strdup_printf("%s",strip_home_and_password (xterm_filename)); + } + } + break; + case 'C' : + case 'W' : /* %W or %C- working directory (last component only) */ + if (xterm_filename==NULL) { + s = g_strdup (g_path_get_basename ((strip_home_and_password (current_panel->cwd)))); + } else { + if (view_one_file == NULL) { + s = g_strdup_printf ("%s/%s",x_basename (strip_home_and_password (current_panel->cwd)),xterm_filename); + } else { + s = g_strdup_printf ("%s/%s",x_basename (g_path_get_dirname (strip_home_and_password (xterm_filename))),x_basename(strip_home_and_password(xterm_filename))); + } + } + break; + case 'p' : /* %p - process id (pid) */ + s = g_strdup_printf ("%d", getpid ()); + break; + case 'n' : + case 'u' : /* %u or %n - username */ + s = g_strdup (getpwuid (getuid ()) -> pw_name); + break; + case 'm' : + case 'h' : /* %h or %m - hostname up to the first dot */ + if (gethostname (hostname,MAXHOSTNAMELEN) == 0) { + hostname [strcspn(hostname,".")] = '\0'; + s = g_strdup(hostname); + } + break; + case 'M' : + case 'H' : /* %H or %M - hostname.domainname */ + if (gethostname (hostname,MAXHOSTNAMELEN) == 0) { + hostname [MAXHOSTNAMELEN] = '\0'; + if (getdomainname (domainname, MAXHOSTNAMELEN) == 0) { + domainname [MAXHOSTNAMELEN] = '\0'; + if (strlen(g_strstrip(hostname))>0 && strlen(g_strstrip(domainname))==0) { + s = g_strdup(hostname); + } else if (strlen(g_strstrip(hostname))==0 && strlen(g_strstrip(domainname))>0) { + s = g_strdup (domainname); + } else if (strlen(g_strstrip(hostname))>0 && strlen(g_strstrip(domainname))>0) { + if (g_str_has_suffix (g_strstrip(hostname), ".") || g_str_has_prefix (g_strstrip(domainname), ".")) { + s = g_strconcat(hostname,domainname,NULL); + } else { + s = g_strconcat(hostname,".",domainname,NULL); + } + } + } + } + break; + case 'y' : + case 't' : /* %t or %y - tty connected to stdin without /dev/ */ + s = g_strdup (x_basename(ttyname (0))); + break; + case 'l' : /* %l - tty connected to stdin */ + if (ttyname_r (0,nametty,BUF_SMALL) == 0) { + nametty [BUF_SMALL] = '\0'; + if (g_str_has_prefix (nametty, "/dev/tty")) { + strncpy(nametty,nametty+8,BUF_SMALL-8); + s = g_strdup(g_strstrip(nametty)); + } else { + s = g_strdup(x_basename(nametty)); + } + } + break; + case 'V' : /* %V - mc version */ + s = g_strdup (VERSION); + break; + } + + /* Append substituted string */ + if (s) { + strncpy (title+i, s, BUF_MEDIUM-i); + title [BUF_MEDIUM] = '\0'; + i = strlen (title); + g_free (s); + } + } while (*++p && i<BUF_MEDIUM); + title [i] = '\0'; + + /* Replace non-printable characters with '?' */ + s = title; + while (*s) { + if (!is_printable (*s)) *s = '?'; - } while (*++s); - fprintf (stdout, "\33]0;mc - %s\7", p); + s++; + } + + /* Use xterm escape sequence to set window title */ + fprintf (stdout, "\33]0;%s\7", title); fflush (stdout); - g_free (p); } + xterm_filename=NULL; } /* --- src/main.h.orig Fri Jul 1 21:47:06 2005 +++ src/main.h Thu Aug 16 13:05:33 2007 @@ -64,6 +64,7 @@ extern int alternate_plus_minus; extern int only_leading_plus_minus; extern int output_starts_shell; extern int midnight_shutdown; +extern char *xterm_filename; extern char cmd_buf [512]; extern const char *shell; --- src/view.c.orig Fri May 27 20:19:18 2005 +++ src/view.c Tue Aug 14 12:10:25 2007 @@ -2654,6 +2654,11 @@ view (const char *_command, const char * WButtonBar *bar; Dlg_head *view_dlg; + if (xterm_flag && xterm_title) { + xterm_filename = _file; + update_xterm_title_path (); + } + /* Create dialog and widgets, put them on the dialog */ view_dlg = create_dlg (0, 0, LINES, COLS, NULL, view_dialog_callback, _______________________________________________ Mc-devel mailing list http://mail.gnome.org/mailman/listinfo/mc-devel