Optimize panel updating a bit, changing _calculate_position() calls.
authorAndriy Grytsenko <andrej@rep.kiev.ua>
Thu, 13 Nov 2014 13:49:03 +0000 (15:49 +0200)
committerAndriy Grytsenko <andrej@rep.kiev.ua>
Thu, 13 Nov 2014 13:49:03 +0000 (15:49 +0200)
Moving should not be retried panel window each time since there are
coords remembered, and those coords should be not erased on each size
request so they can be compared on size allocation eliminating those
unwanted window resizing/strut changing.
To do that _calculate_position() should fill GdkRectangle instead of
coords in Panel private data.

src/misc.c
src/panel.c
src/private.h

index 30aeb13..96ced38 100644 (file)
@@ -825,7 +825,7 @@ calculate_width(int scrw, int wtype, int allign, int margin,
 }
 
 
-void _calculate_position(LXPanel *panel)
+void _calculate_position(LXPanel *panel, GdkRectangle *rect)
 {
     Panel *np = panel->priv;
     GdkScreen *screen;
@@ -862,20 +862,20 @@ void _calculate_position(LXPanel *panel)
     }
 
     if (np->edge == EDGE_TOP || np->edge == EDGE_BOTTOM) {
-        np->aw = np->width;
-        np->ax = marea.x;
+        rect->width = np->width;
+        rect->x = marea.x;
         calculate_width(marea.width, np->widthtype, np->allign, np->margin,
-              &np->aw, &np->ax);
-        np->ah = ((( ! np->autohide) || (np->visible)) ? np->height : np->height_when_hidden);
-        np->ay = marea.y + ((np->edge == EDGE_TOP) ? 0 : (marea.height - np->ah));
+              &rect->width, &rect->x);
+        rect->height = ((( ! np->autohide) || (np->visible)) ? np->height : np->height_when_hidden);
+        rect->y = marea.y + ((np->edge == EDGE_TOP) ? 0 : (marea.height - rect->height));
 
     } else {
-        np->ah = np->width;
-        np->ay = marea.y;
+        rect->height = np->width;
+        rect->y = marea.y;
         calculate_width(marea.height, np->widthtype, np->allign, np->margin,
-              &np->ah, &np->ay);
-        np->aw = ((( ! np->autohide) || (np->visible)) ? np->height : np->height_when_hidden);
-        np->ax = marea.x + ((np->edge == EDGE_LEFT) ? 0 : (marea.width - np->aw));
+              &rect->height, &rect->y);
+        rect->width = ((( ! np->autohide) || (np->visible)) ? np->height : np->height_when_hidden);
+        rect->x = marea.x + ((np->edge == EDGE_LEFT) ? 0 : (marea.width - rect->width));
     }
     //g_debug("%s - x=%d y=%d w=%d h=%d\n", __FUNCTION__, np->ax, np->ay, np->aw, np->ah);
     RET();
@@ -883,7 +883,15 @@ void _calculate_position(LXPanel *panel)
 
 void calculate_position(Panel *np)
 {
-    _calculate_position(np->topgwin);
+    GdkRectangle rect;
+
+    rect.width = np->aw;
+    rect.height = np->ah;
+    _calculate_position(np->topgwin, &rect);
+    np->aw = rect.width;
+    np->ah = rect.height;
+    np->ax = rect.x;
+    np->ay = rect.y;
 }
 
 gchar *
index bedbbc2..ce2f921 100644 (file)
@@ -181,7 +181,9 @@ static void lxpanel_style_set(GtkWidget *widget, GtkStyle* prev)
 
 static void lxpanel_size_request(GtkWidget *widget, GtkRequisition *req)
 {
-    Panel *p = LXPANEL(widget)->priv;
+    LXPanel *panel = LXPANEL(widget);
+    Panel *p = panel->priv;
+    GdkRectangle rect;
 
     GTK_WIDGET_CLASS(lxpanel_parent_class)->size_request(widget, req);
 
@@ -190,19 +192,19 @@ static void lxpanel_size_request(GtkWidget *widget, GtkRequisition *req)
          * report 0 size.  Ask the content box instead for its size. */
         gtk_widget_size_request(p->box, req);
 
-    /* FIXME: is this ever required? */
-    if (p->widthtype == WIDTH_REQUEST)
-        p->width = (p->orientation == GTK_ORIENTATION_HORIZONTAL) ? req->width : req->height;
-    if (p->heighttype == HEIGHT_REQUEST)
-        p->height = (p->orientation == GTK_ORIENTATION_HORIZONTAL) ? req->height : req->width;
-    calculate_position(p);
-
-    gtk_widget_set_size_request( widget, p->aw, p->ah );
+    rect.width = req->width;
+    rect.height = req->height;
+    _calculate_position(panel, &rect);
+    req->width = rect.width;
+    req->height = rect.height;
 }
 
 static void lxpanel_size_allocate(GtkWidget *widget, GtkAllocation *a)
 {
-    Panel *p = LXPANEL(widget)->priv;
+    LXPanel *panel = LXPANEL(widget);
+    Panel *p = panel->priv;
+    GdkRectangle rect;
+    gint x, y;
 
     GTK_WIDGET_CLASS(lxpanel_parent_class)->size_allocate(widget, a);
 
@@ -210,10 +212,18 @@ static void lxpanel_size_allocate(GtkWidget *widget, GtkAllocation *a)
         p->width = (p->orientation == GTK_ORIENTATION_HORIZONTAL) ? a->width : a->height;
     if (p->heighttype == HEIGHT_REQUEST)
         p->height = (p->orientation == GTK_ORIENTATION_HORIZONTAL) ? a->height : a->width;
-    calculate_position(p);
-
-    if (a->width != p->aw || a->height != p->ah || a->x != p->ax || a->y != p->ay)
+    rect = *a;
+    /* get real coords since a contains 0, 0 */
+    gdk_window_get_origin(gtk_widget_get_window(widget), &x, &y);
+    _calculate_position(panel, &rect);
+    p->ax = rect.x;
+    p->ay = rect.y;
+
+    if (a->width != p->aw || a->height != p->ah || x != p->ax || y != p->ay)
     {
+        p->aw = a->width;
+        p->ah = a->height;
+        /* FIXME: should we "correct" requested sizes? */
         gtk_window_move(GTK_WINDOW(widget), p->ax, p->ay);
         _panel_set_wm_strut(LXPANEL(widget));
     }
@@ -1159,6 +1169,7 @@ panel_start_gui(LXPanel *panel, config_setting_t *list)
     p->curdesk = get_net_current_desktop();
     p->desknum = get_net_number_of_desktops();
     p->workarea = get_xaproperty (GDK_ROOT_WINDOW(), a_NET_WORKAREA, XA_CARDINAL, &p->wa_len);
+    p->ax = p->ay = p->aw = p->ah = 0;
 
     /* main toplevel window */
     /* p->topgwin =  gtk_window_new(GTK_WINDOW_TOPLEVEL); */
@@ -1220,9 +1231,9 @@ panel_start_gui(LXPanel *panel, config_setting_t *list)
     XChangeProperty(xdisplay, p->topxwin, a_NET_WM_STATE, XA_ATOM,
           32, PropModeReplace, (unsigned char *) state, 3);
 
-    _calculate_position(panel);
-    gdk_window_move_resize(gtk_widget_get_window(w), p->ax, p->ay, p->aw, p->ah);
-    _panel_set_wm_strut(panel);
+    //_calculate_position(panel);
+    //gdk_window_move_resize(gtk_widget_get_window(w), p->ax, p->ay, p->aw, p->ah);
+    //_panel_set_wm_strut(panel);
     p->initialized = TRUE;
 
     if (list) for (i = 1; (s = config_setting_get_elem(list, i)) != NULL; )
index f3f001c..5a016d7 100644 (file)
@@ -221,7 +221,7 @@ LXPanel* panel_new(const char* config_file, const char* config_name);
 
 void _panel_show_config_dialog(LXPanel *panel, GtkWidget *p, GtkWidget *dlg);
 
-void _calculate_position(LXPanel *panel);
+void _calculate_position(LXPanel *panel, GdkRectangle *rect);
 
 void _panel_determine_background_pixmap(LXPanel * p, GtkWidget * widget);
 void _panel_establish_autohide(LXPanel *p);