summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-03-11 17:34:07 +0000
committerDana Jansens <danakj@orodu.net>2007-03-11 17:34:07 +0000
commit7229bea3c60de23a5fa4ad46bcae6171044ade81 (patch)
tree71d5aade8f35a15510fd596079e706466941c567
parentfe317164865f5a08e18bb0b4fa9519fa4ca48a45 (diff)
client_configure_full is trying to move a window, it shouldn't determine the window's monitor from its current position, but from the new position instead. move client_monitor()'s logic into screen, more generically, and let client_configure_full use that
-rw-r--r--openbox/client.c31
-rw-r--r--openbox/screen.c24
-rw-r--r--openbox/screen.h5
3 files changed, 35 insertions, 25 deletions
diff --git a/openbox/client.c b/openbox/client.c
index 5bc79847..5896ece0 100644
--- a/openbox/client.c
+++ b/openbox/client.c
@@ -2105,6 +2105,7 @@ void client_configure_full(ObClient *self, ObCorner anchor,
gboolean moved = FALSE, resized = FALSE;
guint fdecor = self->frame->decorations;
gboolean fhorz = self->frame->max_horz;
+ Rect desired_area = {x, y, w, h};
/* make the frame recalculate its dimentions n shit without changing
anything visible for real, this way the constraints below can work with
@@ -2121,7 +2122,7 @@ void client_configure_full(ObClient *self, ObCorner anchor,
Rect *a;
guint i;
- i = client_monitor(self);
+ i = screen_find_monitor(&desired_area);
a = screen_physical_area_monitor(i);
x = a->x;
@@ -2132,8 +2133,10 @@ void client_configure_full(ObClient *self, ObCorner anchor,
user = FALSE; /* ignore that increment etc shit when in fullscreen */
} else {
Rect *a;
+ guint i;
- a = screen_area_monitor(self->desktop, client_monitor(self));
+ i = screen_find_monitor(&desired_area);
+ a = screen_area_monitor(self->desktop, i);
/* set the size and position if maximized */
if (self->max_horz) {
@@ -3204,31 +3207,9 @@ void client_set_undecorated(ObClient *self, gboolean undecorated)
}
}
-/* Determines which physical monitor a client is on by calculating the
- area of the part of the client on each monitor. The number of the
- monitor containing the greatest area of the client is returned.*/
guint client_monitor(ObClient *self)
{
- guint i;
- guint most = 0;
- guint mostv = 0;
-
- for (i = 0; i < screen_num_monitors; ++i) {
- Rect *area = screen_physical_area_monitor(i);
- if (RECT_INTERSECTS_RECT(*area, self->frame->area)) {
- Rect r;
- guint v;
-
- RECT_SET_INTERSECTION(r, *area, self->frame->area);
- v = r.width * r.height;
-
- if (v > mostv) {
- mostv = v;
- most = i;
- }
- }
- }
- return most;
+ return screen_find_monitor(&self->frame->area);
}
GSList *client_search_top_transients(ObClient *self)
diff --git a/openbox/screen.c b/openbox/screen.c
index d97a732b..3542dfdc 100644
--- a/openbox/screen.c
+++ b/openbox/screen.c
@@ -1172,6 +1172,30 @@ Rect *screen_area_monitor(guint desktop, guint head)
return &area[desktop][head];
}
+guint screen_find_monitor(Rect *search)
+{
+ guint i;
+ guint most = 0;
+ guint mostv = 0;
+
+ for (i = 0; i < screen_num_monitors; ++i) {
+ Rect *area = screen_physical_area_monitor(i);
+ if (RECT_INTERSECTS_RECT(*area, *search)) {
+ Rect r;
+ guint v;
+
+ RECT_SET_INTERSECTION(r, *area, *search);
+ v = r.width * r.height;
+
+ if (v > mostv) {
+ mostv = v;
+ most = i;
+ }
+ }
+ }
+ return most;
+}
+
Rect *screen_physical_area()
{
return screen_physical_area_monitor(screen_num_monitors);
diff --git a/openbox/screen.h b/openbox/screen.h
index 5e9b5670..07a2cae0 100644
--- a/openbox/screen.h
+++ b/openbox/screen.h
@@ -96,6 +96,11 @@ Rect *screen_area(guint desktop);
Rect *screen_area_monitor(guint desktop, guint head);
+/*! Determines which physical monitor a rectangle is on by calculating the
+ area of the part of the rectable on each monitor. The number of the
+ monitor containing the greatest area of the rectangle is returned.*/
+guint screen_find_monitor(Rect *search);
+
/*! Sets the root cursor. This function decides which cursor to use, but you
gotta call it to let it know it should change. */
void screen_set_root_cursor();