make a GravityPoint and GravityCoord data structures for those --x, ++y type values
authorDana Jansens <danakj@orodu.net>
Sat, 12 Jan 2008 01:58:03 +0000 (20:58 -0500)
committerDana Jansens <danakj@orodu.net>
Sat, 12 Jan 2008 01:58:03 +0000 (20:58 -0500)
openbox/config.c
openbox/config.h
openbox/geom.h
openbox/moveresize.c
openbox/place.c

index 0585366..7ec2b3e 100644 (file)
@@ -64,12 +64,7 @@ gboolean         config_resize_redraw;
 gboolean         config_resize_four_corners;
 gint             config_resize_popup_show;
 ObResizePopupPos config_resize_popup_pos;
-gboolean         config_resize_popup_x_center;
-gboolean         config_resize_popup_y_center;
-gboolean         config_resize_popup_x_opposite;
-gboolean         config_resize_popup_y_opposite;
-gint             config_resize_popup_x;
-gint             config_resize_popup_y;
+GravityPoint     config_resize_popup_fixed;
 
 ObStackingLayer config_dock_layer;
 gboolean        config_dock_floating;
@@ -143,16 +138,28 @@ void config_app_settings_copy_non_defaults(const ObAppSettings *src,
 
     if (src->pos_given) {
         dst->pos_given = TRUE;
-        dst->center_x = src->center_x;
-        dst->center_y = src->center_y;
-        dst->opposite_x = src->opposite_x;
-        dst->opposite_y = src->opposite_y;
-        dst->position.x = src->position.x;
-        dst->position.y = src->position.y;
+        dst->position = src->position;
         dst->monitor = src->monitor;
     }
 }
 
+static void config_parse_gravity_coord(xmlDocPtr doc, xmlNodePtr node,
+                                       GravityCoord *c)
+{
+    gchar *s = parse_string(doc, node);
+    if (!g_ascii_strcasecmp(s, "center"))
+        c->center = TRUE;
+    else {
+        if (s[0] == '-')
+            c->opposite = TRUE;
+        if (s[0] == '-' || s[0] == '+')
+            c->pos = atoi(s+1);
+        else
+            c->pos = atoi(s);
+    }
+    g_free(s);
+}
+
 /*
   <applications>
     <application name="aterm">
@@ -218,38 +225,16 @@ static void parse_per_app_settings(ObParseInst *inst, xmlDocPtr doc,
             if ((n = parse_find_node("position", app->children))) {
                 if ((c = parse_find_node("x", n->children)))
                     if (!parse_contains("default", doc, c)) {
-                        gchar *s = parse_string(doc, c);
-                        if (!g_ascii_strcasecmp(s, "center")) {
-                            settings->center_x = TRUE;
-                            x_pos_given = TRUE;
-                        } else {
-                            if (s[0] == '-')
-                                settings->opposite_x = TRUE;
-                            if (s[0] == '-' || s[0] == '+')
-                                settings->position.x = atoi(s+1);
-                            else
-                                settings->position.x = atoi(s);
-                            x_pos_given = TRUE;
-                        }
-                        g_free(s);
+                        config_parse_gravity_coord(doc, c,
+                                                   &settings->position.x);
+                        settings->pos_given = TRUE;
                     }
 
                 if (x_pos_given && (c = parse_find_node("y", n->children)))
                     if (!parse_contains("default", doc, c)) {
-                        gchar *s = parse_string(doc, c);
-                        if (!g_ascii_strcasecmp(s, "center")) {
-                            settings->center_y = TRUE;
-                            settings->pos_given = TRUE;
-                        } else {
-                            if (s[0] == '-')
-                                settings->opposite_y = TRUE;
-                            if (s[0] == '-' || s[0] == '+')
-                                settings->position.y = atoi(s+1);
-                            else
-                                settings->position.y = atoi(s);
-                            settings->pos_given = TRUE;
-                        }
-                        g_free(s);
+                        config_parse_gravity_coord(doc, c,
+                                                   &settings->position.y);
+                        settings->pos_given = TRUE;
                     }
 
                 if (settings->pos_given &&
@@ -677,34 +662,12 @@ static void parse_resize(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
             if ((n = parse_find_node("popupFixedPosition", node))) {
                 xmlNodePtr n2;
 
-                if ((n2 = parse_find_node("x", n->children))) {
-                    gchar *s = parse_string(doc, n2);
-                    if (!g_ascii_strcasecmp(s, "center"))
-                        config_resize_popup_x_center = TRUE;
-                    else {
-                        if (s[0] == '-')
-                            config_resize_popup_x_opposite = TRUE;
-                        if (s[0] == '-' || s[0] == '+')
-                            config_resize_popup_x = atoi(s+1);
-                        else
-                            config_resize_popup_x = atoi(s);
-                    }
-                }
-                if ((n2 = parse_find_node("y", n->children))) {
-                    gchar *s = parse_string(doc, n2);
-                    if (!g_ascii_strcasecmp(s, "center"))
-                        config_resize_popup_y_center = TRUE;
-                    else {
-                        if (s[0] == '-')
-                            config_resize_popup_y_opposite = TRUE;
-                        if (s[0] == '-' || s[0] == '+')
-                            config_resize_popup_y = atoi(s+1);
-                        else
-                            config_resize_popup_y = atoi(s);
-                    }
-                }
-                g_print("X %d %d %d\n", config_resize_popup_x_center, config_resize_popup_x_opposite, config_resize_popup_x);
-                g_print("Y %d %d %d\n", config_resize_popup_y_center, config_resize_popup_y_opposite, config_resize_popup_y);
+                if ((n2 = parse_find_node("x", n->children)))
+                    config_parse_gravity_coord(doc, n2,
+                                               &config_resize_popup_fixed.x);
+                if ((n2 = parse_find_node("y", n->children)))
+                    config_parse_gravity_coord(doc, n2,
+                                               &config_resize_popup_fixed.y);
             }
         }
     }
@@ -956,12 +919,8 @@ void config_startup(ObParseInst *i)
     config_resize_four_corners = FALSE;
     config_resize_popup_show = 1; /* nonpixel increments */
     config_resize_popup_pos = OB_RESIZE_POS_CENTER;
-    config_resize_popup_x_center = FALSE;
-    config_resize_popup_x_opposite = FALSE;
-    config_resize_popup_x = 0;
-    config_resize_popup_y_center = FALSE;
-    config_resize_popup_y_opposite = FALSE;
-    config_resize_popup_y = 0;
+    GRAVITY_COORD_SET(config_resize_popup_fixed.x, 0, FALSE, FALSE);
+    GRAVITY_COORD_SET(config_resize_popup_fixed.y, 0, FALSE, FALSE);
 
     parse_register(i, "resize", parse_resize, NULL);
 
index 4fa9c70..240b04f 100644 (file)
@@ -39,11 +39,7 @@ struct _ObAppSettings
     GPatternSpec *name;
     GPatternSpec *role;
 
-    Point position;
-    gboolean center_x;
-    gboolean center_y;
-    gboolean opposite_x;
-    gboolean opposite_y;
+    GravityPoint position;
     gboolean pos_given;
 
     guint desktop;
@@ -95,22 +91,8 @@ extern gboolean config_resize_redraw;
 extern gint config_resize_popup_show;
 /*! where to show the resize popup */
 extern ObResizePopupPos config_resize_popup_pos;
-/*! if the resize popup should be centered horizontally if it is being
-  placed in a fixed position */
-extern gboolean config_resize_popup_x_center;
-/*! if the resize popup should be centered vertically if it is being
-  placed in a fixed position */
-extern gboolean config_resize_popup_y_center;
-/*! if the resize popup should be placed from the right side of the screen when
-  placed in a fixed position */
-extern gboolean config_resize_popup_x_opposite;
-/*! if the resize popup should be placed from the bottom side of the screen
-  when placed in a fixed position */
-extern gboolean config_resize_popup_y_opposite;
-/*! where the resize popup should be if it is placed in a fixed position */
-extern gint config_resize_popup_x;
-/*! where the resize popup should be if it is placed in a fixed position */
-extern gint config_resize_popup_y;
+/*! where to place the popup if it's in a fixed position */
+extern GravityPoint config_resize_popup_fixed;
 
 /*! The stacking layer the dock will reside in */
 extern ObStackingLayer config_dock_layer;
index 43eb8ea..bdcd3c5 100644 (file)
 #ifndef __geom_h
 #define __geom_h
 
+#include <glib.h>
+
+typedef struct _GravityCoord {
+    int pos;
+    gboolean center;
+    gboolean opposite;
+} GravityCoord;
+
+typedef struct _GravityPoint {
+    GravityCoord x;
+    GravityCoord y;
+} GravityPoint;
+
+#define GRAVITY_COORD_SET(c, p, cen, opp) \
+    (c).pos = (p), (c).center = (cen), (c).opposite = (opp)
+  
+
 typedef struct _Point {
     int x;
     int y;
index 07b8e22..8dc122c 100644 (file)
@@ -116,36 +116,42 @@ static void popup_coords(ObClient *c, const gchar *format, gint a, gint b)
         Rect *area = screen_physical_area_active();
         gint gravity, x, y;
 
-        x = config_resize_popup_x;
-        if (config_resize_popup_x_center) x = area->x + area->width/2;
-        else if (config_resize_popup_x_opposite) x = RECT_RIGHT(*area) - x;
-        else x = area->x + x;
-
-        y = config_resize_popup_y;
-        if (config_resize_popup_y_center) y = area->y + area->height/2;
-        else if (config_resize_popup_y_opposite) y = RECT_BOTTOM(*area) - y;
-        else y = area->y + y;
-
-        if (config_resize_popup_x_center) {
-            if (config_resize_popup_y_center)
+        x = config_resize_popup_fixed.x.pos;
+        if (config_resize_popup_fixed.x.center)
+            x = area->x + area->width/2;
+        else if (config_resize_popup_fixed.x.opposite)
+            x = RECT_RIGHT(*area) - x;
+        else
+            x = area->x + x;
+
+        y = config_resize_popup_fixed.y.pos;
+        if (config_resize_popup_fixed.y.center)
+            y = area->y + area->width/2;
+        else if (config_resize_popup_fixed.y.opposite)
+            y = RECT_RIGHT(*area) - y;
+        else
+            y = area->y + y;
+
+        if (config_resize_popup_fixed.x.center) {
+            if (config_resize_popup_fixed.y.center)
                 gravity = CenterGravity;
-            else if (config_resize_popup_y_opposite)
+            else if (config_resize_popup_fixed.y.opposite)
                 gravity = SouthGravity;
             else
                 gravity = NorthGravity;
         }
-        else if (config_resize_popup_x_opposite) {
-            if (config_resize_popup_y_center)
+        else if (config_resize_popup_fixed.x.opposite) {
+            if (config_resize_popup_fixed.y.center)
                 gravity = EastGravity;
-            else if (config_resize_popup_y_opposite)
+            else if (config_resize_popup_fixed.y.opposite)
                 gravity = SouthEastGravity;
             else
                 gravity = NorthEastGravity;
         }
         else {
-            if (config_resize_popup_y_center)
+            if (config_resize_popup_fixed.y.center)
                 gravity = WestGravity;
-            else if (config_resize_popup_y_opposite)
+            else if (config_resize_popup_fixed.y.opposite)
                 gravity = SouthWestGravity;
             else
                 gravity = NorthWestGravity;
index 276d928..058bbfb 100644 (file)
@@ -407,21 +407,21 @@ static gboolean place_per_app_setting(ObClient *client, gint *x, gint *y,
         g_free(areas);
     }
 
-    if (settings->center_x)
+    if (settings->position.x.center)
         *x = screen->x + screen->width / 2 - client->area.width / 2;
-    else if (settings->opposite_x)
+    else if (settings->position.x.opposite)
         *x = screen->x + screen->width - client->frame->area.width -
-            settings->position.x;
+            settings->position.x.pos;
     else
-        *x = screen->x + settings->position.x;
+        *x = screen->x + settings->position.x.pos;
 
-    if (settings->center_y)
+    if (settings->position.y.center)
         *y = screen->y + screen->height / 2 - client->area.height / 2;
-    else if (settings->opposite_y)
+    else if (settings->position.y.opposite)
         *y = screen->y + screen->height - client->frame->area.height -
-            settings->position.y;
+            settings->position.y.pos;
     else
-        *y = screen->y + settings->position.y;
+        *y = screen->y + settings->position.y.pos;
 
     g_free(screen);
     return TRUE;