summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikael Magnusson <mikachu@gmail.com>2014-10-06 19:52:14 +0200
committerMikael Magnusson <mikachu@gmail.com>2014-10-06 22:05:26 +0200
commit1b3afcff1fea0d1334b50dff378a6667e264b557 (patch)
tree28cf965ff507f6fbaf853ddb26c35c757df40740
parentc5c5b7b455334ec2987b0f04e18d817f6d3767d0 (diff)
Move common gravity application to screen.c
-rw-r--r--openbox/menuframe.c32
-rw-r--r--openbox/place.c24
-rw-r--r--openbox/screen.c27
-rw-r--r--openbox/screen.h5
4 files changed, 36 insertions, 52 deletions
diff --git a/openbox/menuframe.c b/openbox/menuframe.c
index aa646779..20104542 100644
--- a/openbox/menuframe.c
+++ b/openbox/menuframe.c
@@ -232,41 +232,13 @@ void menu_frame_move(ObMenuFrame *self, gint x, gint y)
XMoveWindow(obt_display, self->window, self->area.x, self->area.y);
}
-static void calc_position(ObMenuFrame *self, GravityPoint *position,
- gint *x, gint *y, gint monitor)
-{
- const Rect *area = screen_physical_area_monitor(monitor);
-
- if (position->x.center)
- *x = area->width / 2 - self->area.width / 2;
- else {
- *x = position->x.pos;
- if (position->x.denom)
- *x = (*x * area->width) / position->x.denom;
- if (position->x.opposite)
- *x = area->width - self->area.width - *x;
- }
-
- if (position->y.center)
- *y = area->height / 2 - self->area.height / 2;
- else {
- *y = position->y.pos;
- if (position->y.denom)
- *y = (*y * area->height) / position->y.denom;
- if (position->y.opposite)
- *y = area->height - self->area.height - *y;
- }
-
- *x += area->x;
- *y += area->y;
-}
-
static void menu_frame_place_topmenu(ObMenuFrame *self, GravityPoint *pos,
gint *x, gint *y, gint monitor)
{
gint dx, dy;
- calc_position(self, pos, x, y, monitor);
+ screen_apply_gravity_point(x, y, self->area.width, self->area.height,
+ pos, screen_physical_area_monitor(monitor));
if (config_menu_middle) {
gint myx;
diff --git a/openbox/place.c b/openbox/place.c
index 1dc16c4f..aa3ff636 100644
--- a/openbox/place.c
+++ b/openbox/place.c
@@ -295,28 +295,8 @@ static gboolean place_per_app_setting_position(ObClient *client, Rect *screen,
ob_debug("placing by per-app settings");
- if (settings->position.x.center)
- *x = screen->width / 2 - client->area.width / 2;
- else {
- *x = settings->position.x.pos;
- if (settings->position.x.denom)
- *x = (*x * screen->width) / settings->position.x.denom;
- if (settings->position.x.opposite)
- *x = screen->width - frame_size.width - *x;
- }
-
- if (settings->position.y.center)
- *y = screen->height / 2 - client->area.height / 2;
- else {
- *y = settings->position.y.pos;
- if (settings->position.y.denom)
- *y = (*y * screen->height) / settings->position.y.denom;
- if (settings->position.y.opposite)
- *y = screen->height - frame_size.height - *y;
- }
-
- *x += screen->x;
- *y += screen->y;
+ screen_apply_gravity_point(x, y, frame_size.width, frame_size.height,
+ &settings->position, screen);
return TRUE;
}
diff --git a/openbox/screen.c b/openbox/screen.c
index 0198c36c..4b75b3e7 100644
--- a/openbox/screen.c
+++ b/openbox/screen.c
@@ -1928,3 +1928,30 @@ gboolean screen_compare_desktops(guint a, guint b)
b = screen_desktop;
return a == b;
}
+
+void screen_apply_gravity_point(gint *x, gint *y, gint width, gint height,
+ GravityPoint *position, const Rect *area)
+{
+ if (position->x.center)
+ *x = area->width / 2 - width / 2;
+ else {
+ *x = position->x.pos;
+ if (position->x.denom)
+ *x = (*x * area->width) / position->x.denom;
+ if (position->x.opposite)
+ *x = area->width - width - *x;
+ }
+
+ if (position->y.center)
+ *y = area->height / 2 - height / 2;
+ else {
+ *y = position->y.pos;
+ if (position->y.denom)
+ *y = (*y * area->height) / position->y.denom;
+ if (position->y.opposite)
+ *y = area->height - height - *y;
+ }
+
+ *x += area->x;
+ *y += area->y;
+}
diff --git a/openbox/screen.h b/openbox/screen.h
index 673a994d..56fa6c99 100644
--- a/openbox/screen.h
+++ b/openbox/screen.h
@@ -182,4 +182,9 @@ guint screen_monitor_pointer(void);
*/
gboolean screen_compare_desktops(guint a, guint b);
+/*! Resolve a gravity point into absolute coordinates.
+ * width and height are the size of the object being placed, used for
+ * aligning to right/bottom edges of the area. */
+void screen_apply_gravity_point(gint *x, gint *y, gint width, gint height,
+ GravityPoint *position, const Rect *area);
#endif