Fix bug that openbox don't draw title on new window
authorBenoit Gschwind (Noth <doth.gschwind@gmail.com>
Sat, 16 Feb 2008 15:41:55 +0000 (16:41 +0100)
committerDana Jansens <danakj@orodu.net>
Thu, 21 Feb 2008 17:05:34 +0000 (12:05 -0500)
engines/default/plugin.c
engines/default/plugin.h
engines/default/render.c
openbox/client.c
openbox/engine_interface.h

index 1f5f689af63c6f56928461c8e539f5bfeed0a541..4d2e622732d520beab7e82518d1de430830d689b 100644 (file)
@@ -183,6 +183,7 @@ gpointer frame_new(struct _ObClient * client)
     self->rgriptop = createWindow(self->window, NULL, mask, &attrib);
     self->rgripbottom = createWindow(self->window, NULL, mask, &attrib);
 
+    self->stitle = g_strdup("");
     self->focused = FALSE;
 
     /* the other stuff is shown based on decor settings */
@@ -252,6 +253,8 @@ void frame_free(gpointer self)
     XDestroyWindow(plugin.ob_display, OBDEFAULTFRAME(self)->window);
     if (OBDEFAULTFRAME(self)->colormap)
         XFreeColormap(plugin.ob_display, OBDEFAULTFRAME(self)->colormap);
+    
+    g_free(OBDEFAULTFRAME(self)->stitle);
     g_free(self);
 }
 
@@ -1309,6 +1312,12 @@ gint frame_get_decorations(gpointer self)
     return OBDEFAULTFRAME(self)->decorations;
 }
 
+void frame_update_title (gpointer self, const gchar * src)
+{
+    g_free(OBDEFAULTFRAME(self)->stitle);
+    OBDEFAULTFRAME(self)->stitle = g_strdup(src);
+}
+
 gboolean frame_is_visible(gpointer self)
 {
     return OBDEFAULTFRAME(self)->visible;
@@ -1847,7 +1856,8 @@ ObFramePlugin plugin = { 0, //gpointer handler;
         "libdefault.la", //gchar * filename;
         "Default", //gchar * name;
         init, //gint (*init) (Display * display, gint screen);
-        0, frame_new, //gpointer (*frame_new) (struct _ObClient *c);
+        0, /* */
+        frame_new, //gpointer (*frame_new) (struct _ObClient *c);
         frame_free, //void (*frame_free) (gpointer self);
         frame_show, //void (*frame_show) (gpointer self);
         frame_hide, //void (*frame_hide) (gpointer self);
@@ -1868,6 +1878,8 @@ ObFramePlugin plugin = { 0, //gpointer handler;
         frame_iconify_animating, /* */
 
         frame_set_decorations, /* */
+        
+        frame_update_title, /* */
         /* This give the window area */
         frame_get_window_area, /* */
         frame_set_client_area, /* */
index 32fc01036e4ebcfa4a6c6929999f5c13703fc7a9..024ec812088ab8ef99018016ae74bde0838bb36f 100644 (file)
@@ -33,6 +33,8 @@ struct _ObDefaultFrame
 
     Window window;
 
+    gchar * stitle; /* The current title we draw */
+    
     gboolean visible;
 
     gboolean max_horz; /* when maxed some decorations are hidden */
@@ -205,6 +207,8 @@ Strut frame_get_size(gpointer self);
 Rect frame_get_area(gpointer self);
 gint frame_get_decorations(gpointer self);
 
+void frame_update_title (gpointer, const gchar *);
+
 gboolean frame_is_visible(gpointer self);
 gboolean frame_is_max_horz(gpointer self);
 gboolean frame_is_max_vert(gpointer self);
index 43fe0de7fc14504dc36a7389cf73042be2af8e03..8846bd84d1e4290eea9222df93523c17d5d0105c 100644 (file)
@@ -321,7 +321,7 @@ static void framerender_label(ObDefaultFrame *self, RrAppearance *a)
     if (!self->label_on)
         return;
     /* set the texture's text! */
-    a->texture[0].data.text.string = self->client->title;
+    a->texture[0].data.text.string = self->stitle;
     RrPaint(a, self->label, self->label_width, theme_config.label_height);
 }
 
index fcfd854294ba5dfb545e4ed5f6601533a39cf839..aacb6ebfd41fb541e7abb7b9b05443d0382be8b9 100644 (file)
@@ -279,6 +279,7 @@ void client_manage(Window window, ObPrompt *prompt)
     render_plugin->frame_set_press_flag (self->frame, OB_BUTTON_NONE);
     render_plugin->frame_set_is_focus (self->frame, FALSE);
     render_plugin->frame_set_decorations (self->frame, self->decorations);
+    render_plugin->frame_update_title (self->frame, self->title);
     render_plugin->frame_update_layout (self->frame, FALSE, TRUE);
     render_plugin->frame_update_skin (self->frame);
 
@@ -583,7 +584,9 @@ ObClient *client_fake_manage(Window window)
     /* create the decoration frame for the client window and adjust its size */
     self->frame = render_plugin->frame_new(self);
     render_plugin->frame_set_decorations (self->frame, self->decorations);
+    render_plugin->frame_update_title (self->frame, self->title);
     render_plugin->frame_update_layout (self->frame, FALSE, FALSE);
+    render_plugin->frame_update_skin (self->frame);
 
     ob_debug("gave extents left %d right %d top %d bottom %d",
              render_plugin->frame_get_size(self->frame).left, render_plugin->frame_get_size(self->frame).right,
@@ -1965,8 +1968,11 @@ void client_update_title(ObClient *self)
     OBT_PROP_SETS(self->window, NET_WM_VISIBLE_NAME, utf8, visible);
     self->title = visible;
 
-    if (self->frame)
-    render_plugin->frame_update_layout (self->frame, FALSE, FALSE);
+    if (self->frame) {
+        /* update title render */
+        render_plugin->frame_update_title (self->frame, self->title);
+        render_plugin->frame_update_skin (self->frame);
+    }
 
     /* update the icon title */
     data = NULL;
index 28f04082dd4b3fea7919674a62f33913982e958e..b0ffd4a18df7e4023cae226f192e84592f36100d 100644 (file)
@@ -162,6 +162,8 @@ struct _ObFramePlugin
 
     /* Set the layout wanted by client */
     void (*frame_set_decorations)(gpointer, ObFrameDecorations);
+    
+    void (*frame_update_title)(gpointer, const gchar *);
 
     /* get the current window area */
     Rect (*frame_get_window_area)(gpointer);