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
This commit is contained in:
parent
fe31716486
commit
7229bea3c6
3 changed files with 35 additions and 25 deletions
|
@ -2105,6 +2105,7 @@ void client_configure_full(ObClient *self, ObCorner anchor,
|
||||||
gboolean moved = FALSE, resized = FALSE;
|
gboolean moved = FALSE, resized = FALSE;
|
||||||
guint fdecor = self->frame->decorations;
|
guint fdecor = self->frame->decorations;
|
||||||
gboolean fhorz = self->frame->max_horz;
|
gboolean fhorz = self->frame->max_horz;
|
||||||
|
Rect desired_area = {x, y, w, h};
|
||||||
|
|
||||||
/* make the frame recalculate its dimentions n shit without changing
|
/* make the frame recalculate its dimentions n shit without changing
|
||||||
anything visible for real, this way the constraints below can work with
|
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;
|
Rect *a;
|
||||||
guint i;
|
guint i;
|
||||||
|
|
||||||
i = client_monitor(self);
|
i = screen_find_monitor(&desired_area);
|
||||||
a = screen_physical_area_monitor(i);
|
a = screen_physical_area_monitor(i);
|
||||||
|
|
||||||
x = a->x;
|
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 */
|
user = FALSE; /* ignore that increment etc shit when in fullscreen */
|
||||||
} else {
|
} else {
|
||||||
Rect *a;
|
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 */
|
/* set the size and position if maximized */
|
||||||
if (self->max_horz) {
|
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 client_monitor(ObClient *self)
|
||||||
{
|
{
|
||||||
guint i;
|
return screen_find_monitor(&self->frame->area);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GSList *client_search_top_transients(ObClient *self)
|
GSList *client_search_top_transients(ObClient *self)
|
||||||
|
|
|
@ -1172,6 +1172,30 @@ Rect *screen_area_monitor(guint desktop, guint head)
|
||||||
return &area[desktop][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()
|
Rect *screen_physical_area()
|
||||||
{
|
{
|
||||||
return screen_physical_area_monitor(screen_num_monitors);
|
return screen_physical_area_monitor(screen_num_monitors);
|
||||||
|
|
|
@ -96,6 +96,11 @@ Rect *screen_area(guint desktop);
|
||||||
|
|
||||||
Rect *screen_area_monitor(guint desktop, guint head);
|
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
|
/*! Sets the root cursor. This function decides which cursor to use, but you
|
||||||
gotta call it to let it know it should change. */
|
gotta call it to let it know it should change. */
|
||||||
void screen_set_root_cursor();
|
void screen_set_root_cursor();
|
||||||
|
|
Loading…
Reference in a new issue