SELECTED_URI variable + allow variable replacing in window title in both states
authorDieter Plaetinck <dieter@plaetinck.be>
Sun, 17 May 2009 08:53:13 +0000 (10:53 +0200)
committerDieter Plaetinck <dieter@plaetinck.be>
Sun, 17 May 2009 08:53:13 +0000 (10:53 +0200)
README
docs/TODO
examples/configs/sampleconfig-dev
uzbl.c
uzbl.h

diff --git a/README b/README
index bc5baca..bdc7fa1 100644 (file)
--- a/README
+++ b/README
@@ -77,7 +77,7 @@ TODO
 ### VARIABLE REPLACEMENT
 Some of the variables are interpreted:
 
-* title bar: variable replacement (not yet actually)
+* title bar: variable replacement (long and short version, depending if statusbar is visible or not)
 * user agent: variable replacement
 * statusbar: variable replacement + pango markup
 
index 6258432..d501643 100644 (file)
--- a/docs/TODO
+++ b/docs/TODO
@@ -14,6 +14,7 @@ More or less in order of importance/urgency
 * implement getting feedback from socket
 * scrolling: make page up and page down configurable.
 * show % of location in statusbar/title if page doesn't fit entirely on view.
+* conditionals in format strings: eg if(SELECTED_URI) { "-> SELECTED_URI" } or another smart way to achieve the same.
 * make default window size configurable, and optional
 * on uzbl.org commits overview: add date+time and repository
 * how to handle different content types? (text-plain, image/png, application/pdf,... maybe a map of content-type to uzbl/command
@@ -34,7 +35,6 @@ More or less in order of importance/urgency
 * improve DCOMMIT macro.  what if WC is dirty? what if user downloaded tarball without .git?
 * DARCH is not correct (should be at runtime)
 * keybinds to open "next" or "previous" by looking for next/prev links and/or looking for numbers in the uri we can inc/decrement
-* variable replacing for title bar in "statusbar_visible" and statusbar_invisible states
 * settings iterating "state generator" so we can "open in new window" again.
 * handler for (broken) ssl certs.
 * handlers for mailto: and maybe other thingies?
index 7653407..71fc46e 100644 (file)
@@ -25,8 +25,11 @@ set shell_cmd         = sh -c %s ''
 set show_status       = 1
 # you can optionally use this setting to override the background color of the statusbar from your GTK theme.
 set status_background = #303030
-set status_format     = <span font_family="monospace"><span background="khaki" foreground="black">MODE</span> [<span weight="bold" foreground="red">KEYCMD</span>] <span foreground="#606060"> LOAD_PROGRESSBAR </span><span foreground="#99FF66">URI</span> <span foreground="khaki">NAME</span> <span foreground="orange">MSG</span></span>
+set status_format     = <span font_family="monospace"><span background="khaki" foreground="black">MODE</span> [<span weight="bold" foreground="red">KEYCMD</span>] <span foreground="#606060"> LOAD_PROGRESSBAR </span><span foreground="#99FF66">URI</span> <span foreground="khaki">NAME</span> <span foreground="orange">MSG</span><span foreground="#606060">SELECTED_URI</span></span>
 set status_top = 0
+# define how your titlebar should look like. (short = statusbar is also shown, long = show everything you must see if statusbar is off)
+set title_format_short = TITLE - Uzbl browser <NAME>
+set title_format_long = KEYCMD MODE TITLE - Uzbl browser <NAME> > SELECTED_URI
 
 set modkey = Mod1
 # reset to command mode when new page is loaded
diff --git a/uzbl.c b/uzbl.c
index aa5e440..c2a6bd9 100644 (file)
--- a/uzbl.c
+++ b/uzbl.c
@@ -69,6 +69,8 @@ const struct {
     { "status_top",         (void *)&uzbl.behave.status_top         },
     { "status_format",      (void *)&uzbl.behave.status_format      },
     { "status_background",  (void *)&uzbl.behave.status_background  },
+    { "title_format_long",  (void *)&uzbl.behave.title_format_long  },
+    { "title_format_short", (void *)&uzbl.behave.title_format_short },
     { "insert_mode",        (void *)&uzbl.behave.insert_mode        },
     { "always_insert_mode", (void *)&uzbl.behave.always_insert_mode },
     { "reset_command_mode", (void *)&uzbl.behave.reset_command_mode },
@@ -301,7 +303,7 @@ link_hover_cb (WebKitWebView* page, const gchar* title, const gchar* link, gpoin
     (void) page;
     (void) title;
     (void) data;
-    //ADD HOVER URL TO WINDOW TITLE
+    //Set selected_url state variable
     uzbl.state.selected_url[0] = '\0';
     if (link) {
         strcpy (uzbl.state.selected_url, link);
@@ -632,6 +634,11 @@ expand_template(const char *template) {
                          uzbl.gui.main_title?
                          g_markup_printf_escaped("%s", uzbl.gui.main_title):"");
                      break;
+                 case SYM_SELECTED_URI:
+                     g_string_append(ret,
+                         uzbl.state.selected_url?
+                         g_markup_printf_escaped("%s", uzbl.state.selected_url):"");
+                    break;
                  case SYM_NAME:
                      buf = itos(uzbl.xwin);
                      g_string_append(ret,
@@ -795,7 +802,9 @@ get_var_value(gchar *name) {
 
     if( (p = g_hash_table_lookup(uzbl.comm.proto_var, name)) ) {
         if(var_is("status_format", name)
-           || var_is("useragent", name)) {
+           || var_is("useragent", name)
+           || var_is("title_format_short", name)
+           || var_is("title_format_long", name)) {
             printf("VAR: %s VALUE: %s\n", name, (char *)*p);
         } else printf("VAR: %s VALUE: %d\n", name, (int)*p);
     }
@@ -856,6 +865,8 @@ set_var_value(gchar *name, gchar *val) {
         if(var_is("status_message", name)
            || var_is("status_background", name)
            || var_is("status_format", name)
+           || var_is("title_format_long", name)
+           || var_is("title_format_short", name)
            || var_is("load_finish_handler", name)
            || var_is("history_handler", name)
            || var_is("download_handler", name)
@@ -1249,42 +1260,11 @@ init_socket(gchar *dir) { /* return dir or, on error, free dir and return NULL *
 
 static void
 update_title (void) {
-    GString* string_long = g_string_new ("");
-    GString* string_short = g_string_new ("");
-    char* iname = NULL;
-    gchar *statln;
-    int iname_len;
-    State *s = &uzbl.state;
     Behaviour *b = &uzbl.behave;
 
-    if(s->instance_name) {
-            iname_len = strlen(s->instance_name)+4;
-            iname = malloc(iname_len);
-            snprintf(iname, iname_len, "<%s> ", s->instance_name);
-
-            g_string_prepend(string_long, iname);
-            g_string_prepend(string_short, iname);
-            free(iname);
-    }
-
-    g_string_append_printf(string_long, "%s ", s->keycmd->str);
-    if (!b->always_insert_mode)
-        g_string_append (string_long, (b->insert_mode ? "[I] " : "[C] "));
-    if (uzbl.gui.main_title) {
-        g_string_append (string_long, uzbl.gui.main_title);
-        g_string_append (string_short, uzbl.gui.main_title);
-    }
-    g_string_append (string_long, " - Uzbl browser");
-    g_string_append (string_short, " - Uzbl browser");
-    if (s->selected_url[0]!=0) {
-        g_string_append_printf (string_long, " -> (%s)", s->selected_url);
-    }
-
-    gchar* title_long = g_string_free (string_long, FALSE);
-    gchar* title_short = g_string_free (string_short, FALSE);
-
     if (b->show_status) {
-        gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), title_short);
+        gchar *statln;
+        gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), expand_template(b->title_format_short));
         // TODO: we should probably not do this every time we want to update the title..?
         statln = expand_template(uzbl.behave.status_format);
         gtk_label_set_markup(GTK_LABEL(uzbl.gui.mainbar_label), statln);
@@ -1296,11 +1276,8 @@ update_title (void) {
         }
         g_free(statln);
     } else {
-        gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), title_long);
+        gtk_window_set_title (GTK_WINDOW(uzbl.gui.main_window), expand_template(b->title_format_long));
     }
-
-    g_free (title_long);
-    g_free (title_short);
 }
 
 static gboolean
@@ -1591,6 +1568,11 @@ settings_init () {
     }
     if (!uzbl.behave.status_format)
         uzbl.behave.status_format = g_strdup(STATUS_DEFAULT);
+    if (!uzbl.behave.title_format_long)
+        uzbl.behave.title_format_long = g_strdup(TITLE_LONG_DEFAULT);
+    if (!uzbl.behave.title_format_short)
+        uzbl.behave.title_format_short = g_strdup(TITLE_SHORT_DEFAULT);
+
 
     g_signal_connect(n->soup_session, "request-queued", G_CALLBACK(handle_cookies), NULL);
 }
diff --git a/uzbl.h b/uzbl.h
index 506f1d3..368ad46 100644 (file)
--- a/uzbl.h
+++ b/uzbl.h
  */
 
 #define STATUS_DEFAULT "<span background=\"darkblue\" foreground=\"white\"> MODE </span> <span background=\"red\" foreground=\"white\">KEYCMD</span> (LOAD_PROGRESS%)  <b>TITLE</b>  - Uzbl browser"
+#define TITLE_LONG_DEFAULT "KEYCMD MODE TITLE - Uzbl browser <NAME> > SELECTED_URI"
+#define TITLE_SHORT_DEFAULT "TITLE - Uzbl browser <NAME>"
+
 
 enum {
   /* statusbar symbols */
   SYM_TITLE, SYM_URI, SYM_NAME,
   SYM_LOADPRGS, SYM_LOADPRGSBAR,
   SYM_KEYCMD, SYM_MODE, SYM_MSG,
+  SYM_SELECTED_URI,
   /* useragent symbols */
   SYM_WK_MAJ, SYM_WK_MIN, SYM_WK_MIC,
   SYM_SYSNAME, SYM_NODENAME,
@@ -33,6 +37,7 @@ const struct {
     {"NAME",                 SYM_NAME},
     {"URI",                  SYM_URI},
     {"TITLE",                SYM_TITLE},
+    {"SELECTED_URI",         SYM_SELECTED_URI},
     {"KEYCMD",               SYM_KEYCMD},
     {"MODE",                 SYM_MODE},
     {"MSG",                  SYM_MSG},
@@ -124,6 +129,8 @@ typedef struct {
 typedef struct {
     gchar*   load_finish_handler;
     gchar*   status_format;
+    gchar*   title_format_short;
+    gchar*   title_format_long;
     gchar*   status_background;
     gchar*   history_handler;
     gchar*   fifo_dir;