Fix border of 'batt' plugin, it should correctly use panel settings.
authorAndriy Grytsenko <andrej@rep.kiev.ua>
Fri, 21 Nov 2014 16:06:28 +0000 (18:06 +0200)
committerAndriy Grytsenko <andrej@rep.kiev.ua>
Fri, 21 Nov 2014 16:06:28 +0000 (18:06 +0200)
Also 'Size' setting of it doesn't include border width.

ChangeLog
plugins/batt/batt.c

index 61b5446..8392529 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -61,6 +61,8 @@
 * Implemented flashing on task with urgency in grouped task list menu.
 * Disabled flashing on urgency hint if window has focus, most of window
     managers do the same on window decorations.
+* Fixed border of 'batt' plugin, it should correctly use panel settings.
+    Also 'Size' setting of it doesn't include border width.
 
 0.7.2
 -------------------------------------------------------------------------
index 408de79..9055c5f 100644 (file)
@@ -66,6 +66,7 @@ typedef struct {
         discharging1,
         discharging2;
     cairo_surface_t *pixmap;
+    GtkContainer *box;
     GtkWidget *drawingArea;
     GtkOrientation orientation;
     unsigned int alarmTime,
@@ -271,7 +272,7 @@ void update_display(lx_battery *lx_b, gboolean repaint) {
 
     set_tooltip_text(lx_b);
 
-    int chargeLevel = lx_b->b->percentage * (lx_b->length - 2 * lx_b->border) / 100;
+    int chargeLevel = lx_b->b->percentage * lx_b->length / 100;
 
     if (lx_b->orientation == GTK_ORIENTATION_HORIZONTAL) {
 
@@ -279,15 +280,13 @@ void update_display(lx_battery *lx_b, gboolean repaint) {
            color 2 for the right half */
         gdk_cairo_set_source_color(cr,
                 isCharging ? &lx_b->charging1 : &lx_b->discharging1);
-        cairo_rectangle(cr, lx_b->border,
-                lx_b->height - lx_b->border - chargeLevel, lx_b->width / 2
-                - lx_b->border, chargeLevel);
+        cairo_rectangle(cr, 0, lx_b->height - chargeLevel,
+                        lx_b->width / 2, chargeLevel);
         cairo_fill(cr);
         gdk_cairo_set_source_color(cr,
                 isCharging ? &lx_b->charging2 : &lx_b->discharging2);
-        cairo_rectangle(cr, lx_b->width / 2,
-                lx_b->height - lx_b->border - chargeLevel, (lx_b->width + 1) / 2
-                - lx_b->border, chargeLevel);
+        cairo_rectangle(cr, lx_b->width / 2, lx_b->height - chargeLevel,
+                        (lx_b->width + 1) / 2, chargeLevel);
         cairo_fill(cr);
 
     }
@@ -297,13 +296,12 @@ void update_display(lx_battery *lx_b, gboolean repaint) {
            color 2 for the bottom half */
         gdk_cairo_set_source_color(cr,
                 isCharging ? &lx_b->charging1 : &lx_b->discharging1);
-        cairo_rectangle(cr, lx_b->border,
-                lx_b->border, chargeLevel, lx_b->height / 2 - lx_b->border);
+        cairo_rectangle(cr, 0, 0, chargeLevel, lx_b->height / 2);
         cairo_fill(cr);
         gdk_cairo_set_source_color(cr,
                 isCharging ? &lx_b->charging2 : &lx_b->discharging2);
-        cairo_rectangle(cr, lx_b->border, (lx_b->height + 1)
-                / 2, chargeLevel, lx_b->height / 2 - lx_b->border);
+        cairo_rectangle(cr, 0, (lx_b->height + 1) / 2,
+                        chargeLevel, lx_b->height / 2);
         cairo_fill(cr);
 
     }
@@ -353,7 +351,6 @@ static gboolean buttonPressEvent(GtkWidget *p, GdkEventButton *event,
     return FALSE;
 }
 
-
 static gint configureEvent(GtkWidget *widget, GdkEventConfigure *event,
         lx_battery *lx_b)
 {
@@ -376,11 +373,9 @@ static gint configureEvent(GtkWidget *widget, GdkEventConfigure *event,
     lx_b->height = allocation.height;
     if (lx_b->orientation == GTK_ORIENTATION_HORIZONTAL) {
         lx_b->length = lx_b->height;
-        lx_b->thickness = lx_b->width;
     }
     else {
         lx_b->length = lx_b->width;
-        lx_b->thickness = lx_b->height;
     }
 
     lx_b->pixmap = cairo_image_surface_create (CAIRO_FORMAT_RGB24, allocation.width,
@@ -390,6 +385,9 @@ static gint configureEvent(GtkWidget *widget, GdkEventConfigure *event,
     /* Perform an update so the bar will look right in its new orientation */
     update_display(lx_b, FALSE);
 
+    /* we enforce border width here as it seems GtkEventBox doesn't apply it initially */
+    gtk_container_set_border_width(lx_b->box, lx_b->border);
+
     RET(TRUE);
 }
 
@@ -413,6 +411,18 @@ static gint exposeEvent(GtkWidget *widget, GdkEventExpose *event, lx_battery *lx
     RET(FALSE);
 }
 
+/* updates length, border, and height/width appropriate to orientation */
+static void updateSizes(lx_battery *b)
+{
+    b->length = panel_get_height(b->panel);
+    b->border = MIN(b->requestedBorder, (MAX(1, b->length) - 1) / 2);
+    b->length -= 2 * b->border;
+    if (b->orientation == GTK_ORIENTATION_HORIZONTAL)
+        b->height = b->length;
+    else
+        b->width = b->length;
+}
+
 
 static GtkWidget * constructor(LXPanel *panel, config_setting_t *settings)
 {
@@ -431,31 +441,17 @@ static GtkWidget * constructor(LXPanel *panel, config_setting_t *settings)
     p = gtk_event_box_new();
     lxpanel_plugin_set_data(p, lx_b, destructor);
     gtk_widget_set_has_window(p, FALSE);
-    gtk_container_set_border_width( GTK_CONTAINER(p), 1 );
 
+    lx_b->box = GTK_CONTAINER(p);
     lx_b->drawingArea = gtk_drawing_area_new();
     gtk_widget_add_events( lx_b->drawingArea, GDK_BUTTON_PRESS_MASK );
 
-    gtk_container_add( (GtkContainer*)p, lx_b->drawingArea );
+    gtk_container_add(lx_b->box, lx_b->drawingArea);
 
     lx_b->orientation = panel_get_orientation(panel);
-    if (lx_b->orientation == GTK_ORIENTATION_HORIZONTAL) {
-        lx_b->height = lx_b->length = 20;
-        lx_b->thickness = lx_b->width = 8;
-    }
-    else {
-        lx_b->height = lx_b->thickness = 8;
-        lx_b->length = lx_b->width = 20;
-    }
-    gtk_widget_set_size_request(lx_b->drawingArea, lx_b->width, lx_b->height);
 
     gtk_widget_show(lx_b->drawingArea);
 
-    g_signal_connect (G_OBJECT (lx_b->drawingArea),"configure-event",
-          G_CALLBACK (configureEvent), (gpointer) lx_b);
-    g_signal_connect (G_OBJECT (lx_b->drawingArea), "expose-event",
-          G_CALLBACK (exposeEvent), (gpointer) lx_b);
-
     sem_init(&(lx_b->alarmProcessLock), 0, 1);
 
     lx_b->alarmCommand = lx_b->backgroundColor = lx_b->chargingColor1 = lx_b->chargingColor2
@@ -464,6 +460,7 @@ static GtkWidget * constructor(LXPanel *panel, config_setting_t *settings)
     /* Set default values for integers */
     lx_b->alarmTime = 5;
     lx_b->requestedBorder = 1;
+    lx_b->thickness = 8;
 
     /* remember instance data */
     lx_b->panel = panel;
@@ -488,22 +485,30 @@ static GtkWidget * constructor(LXPanel *panel, config_setting_t *settings)
     if (config_setting_lookup_int(settings, "AlarmTime", &tmp_int))
         lx_b->alarmTime = MAX(0, tmp_int);
     if (config_setting_lookup_int(settings, "BorderWidth", &tmp_int))
-        lx_b->requestedBorder = MAX(0, tmp_int);
-    if (config_setting_lookup_int(settings, "Size", &tmp_int)) {
+        lx_b->requestedBorder = CLAMP(tmp_int, 0, 6);
+    if (config_setting_lookup_int(settings, "Size", &tmp_int))
         lx_b->thickness = MAX(1, tmp_int);
-        if (lx_b->orientation == GTK_ORIENTATION_HORIZONTAL)
-            lx_b->width = lx_b->thickness;
-        else
-            lx_b->height = lx_b->thickness;
-        gtk_widget_set_size_request(lx_b->drawingArea, lx_b->width,
-                                    lx_b->height);
-    }
     if (config_setting_lookup_int(settings, "ShowExtendedInformation", &tmp_int))
         lx_b->show_extended_information = (tmp_int != 0);
 
     /* Make sure the border value is acceptable */
-    lx_b->border = MIN(lx_b->requestedBorder,
-                       (MAX(1, MIN(lx_b->length, lx_b->thickness)) - 1) / 2);
+    updateSizes(lx_b);
+    if (lx_b->orientation == GTK_ORIENTATION_HORIZONTAL)
+    {
+        lx_b->width = lx_b->thickness;
+        gtk_widget_set_size_request(lx_b->drawingArea, lx_b->width, -1);
+    }
+    else
+    {
+        lx_b->height = lx_b->thickness;
+        gtk_widget_set_size_request(lx_b->drawingArea, -1, lx_b->height);
+    }
+    gtk_container_set_border_width(lx_b->box, lx_b->border);
+
+    g_signal_connect (G_OBJECT (lx_b->drawingArea),"configure-event",
+          G_CALLBACK (configureEvent), (gpointer) lx_b);
+    g_signal_connect (G_OBJECT (lx_b->drawingArea), "expose-event",
+          G_CALLBACK (exposeEvent), (gpointer) lx_b);
 
     /* Apply more default options */
     if (! lx_b->alarmCommand)
@@ -571,10 +576,17 @@ static void orientation(LXPanel *panel, GtkWidget *p) {
 
     if (b->orientation != panel_get_orientation(panel)) {
         b->orientation = panel_get_orientation(panel);
-        unsigned int swap = b->height;
-        b->height = b->width;
-        b->width = swap;
-        gtk_widget_set_size_request(b->drawingArea, b->width, b->height);
+        updateSizes(b);
+        if (b->orientation == GTK_ORIENTATION_HORIZONTAL)
+        {
+            b->width = b->thickness;
+            gtk_widget_set_size_request(b->drawingArea, b->width, -1);
+        }
+        else
+        {
+            b->height = b->thickness;
+            gtk_widget_set_size_request(b->drawingArea, -1, b->height);
+        }
     }
 
     RET();
@@ -603,16 +615,21 @@ static gboolean applyConfig(gpointer user_data)
         config_group_set_string(b->settings, "DischargingColor2", b->dischargingColor2);
 
     /* Make sure the border value is acceptable */
-    b->border = MIN(b->requestedBorder,
-                    (MAX(1, MIN(b->length, b->thickness)) - 1) / 2);
+    b->requestedBorder = MIN(b->requestedBorder, 6);
+    updateSizes(b);
 
     /* Resize the widget */
-    b->width = b->height = b->length;
+    gtk_container_set_border_width(b->box, b->border);
     if (b->orientation == GTK_ORIENTATION_HORIZONTAL)
+    {
         b->width = b->thickness;
+        gtk_widget_set_size_request(b->drawingArea, b->width, -1);
+    }
     else
+    {
         b->height = b->thickness;
-    gtk_widget_set_size_request(b->drawingArea, b->width, b->height);
+        gtk_widget_set_size_request(b->drawingArea, -1, b->height);
+    }
     /* ensure visibility if requested */
     if (!b->hide_if_no_battery)
         gtk_widget_show(user_data);