mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-20 21:08:08 +01:00
Maximus: Some cleanups and bug fixes
Let's ignore hidden windows and also adjust the coordinates a bit, to avoid ~2 pixels of overlap. I thank Paul Harris for pointing out these bugs.
This commit is contained in:
@@ -420,9 +420,9 @@ static void find_Maximus_geometry(WWindow *wwin, WArea usableArea, int *new_x, i
|
|||||||
int new_x_0, new_y_0, new_botton_0, new_right_border_0, new_height_0;
|
int new_x_0, new_y_0, new_botton_0, new_right_border_0, new_height_0;
|
||||||
int x_j, y_j, width_j, height_j, botton_j, top_j, right_border_j;
|
int x_j, y_j, width_j, height_j, botton_j, top_j, right_border_j;
|
||||||
int x_intsect, y_intsect;
|
int x_intsect, y_intsect;
|
||||||
/* Assume that the window w_0 has titlebar etc */
|
short int tbar_height_0 = 0, rbar_height_0 = 0;
|
||||||
int has_titlebar = 1, has_resizebar = 1, has_border = 1;
|
short int bd_width_0 = 0, bd_width_j = 0;
|
||||||
int adjust_height, adjust_width;
|
short int adjust_height;
|
||||||
|
|
||||||
/* Try to fully maximize first, then readjust later */
|
/* Try to fully maximize first, then readjust later */
|
||||||
new_x_0 = usableArea.x1;
|
new_x_0 = usableArea.x1;
|
||||||
@@ -430,41 +430,50 @@ static void find_Maximus_geometry(WWindow *wwin, WArea usableArea, int *new_x, i
|
|||||||
new_botton_0 = usableArea.y2;
|
new_botton_0 = usableArea.y2;
|
||||||
new_right_border_0 = usableArea.x2;
|
new_right_border_0 = usableArea.x2;
|
||||||
|
|
||||||
if (!HAS_TITLEBAR(wwin))
|
if (HAS_TITLEBAR(wwin))
|
||||||
has_titlebar = 0;
|
tbar_height_0 = TITLEBAR_HEIGHT;
|
||||||
if (!HAS_RESIZEBAR(wwin))
|
if (HAS_RESIZEBAR(wwin))
|
||||||
has_resizebar = 0;
|
rbar_height_0 = RESIZEBAR_HEIGHT;
|
||||||
if (!HAS_BORDER(wwin))
|
if (HAS_BORDER(wwin))
|
||||||
has_border = 0;
|
bd_width_0 = FRAME_BORDER_WIDTH;
|
||||||
|
|
||||||
/* the lengths to be subtracted if w_0 has titlebar, etc */
|
/* the lengths to be subtracted if w_0 has titlebar, etc */
|
||||||
adjust_height = TITLEBAR_HEIGHT * has_titlebar
|
adjust_height = tbar_height_0 + 2 * bd_width_0 + rbar_height_0;
|
||||||
+ 2 * FRAME_BORDER_WIDTH * has_border + RESIZEBAR_HEIGHT * has_resizebar;
|
|
||||||
adjust_width = 2 * FRAME_BORDER_WIDTH * has_border;
|
|
||||||
|
|
||||||
tmp = wwin;
|
tmp = wwin;
|
||||||
/* TODO: Is the focused window always the last in the list? */
|
/* The focused window is always the last in the list */
|
||||||
while (tmp->prev) {
|
while (tmp->prev) {
|
||||||
/* ignore windows in other workspaces or minimized */
|
/* ignore windows in other workspaces etc */
|
||||||
if (tmp->prev->frame->workspace != wwin->screen_ptr->current_workspace
|
if (tmp->prev->frame->workspace != wwin->screen_ptr->current_workspace
|
||||||
|| tmp->prev->flags.miniaturized) {
|
|| tmp->prev->flags.miniaturized || tmp->prev->flags.hidden) {
|
||||||
tmp = tmp->prev;
|
tmp = tmp->prev;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
tmp = tmp->prev;
|
tmp = tmp->prev;
|
||||||
|
|
||||||
/* set the w_j window coordinates */
|
if (HAS_BORDER(tmp))
|
||||||
x_j = tmp->frame_x;
|
bd_width_j = FRAME_BORDER_WIDTH;
|
||||||
y_j = tmp->frame_y;
|
else
|
||||||
|
bd_width_j = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set the w_j window coordinates. It is convenient
|
||||||
|
* to not use "corrected" sizes for width and height,
|
||||||
|
* otherwise bottom_j and right_border_j would be
|
||||||
|
* incorrect.
|
||||||
|
*/
|
||||||
|
x_j = tmp->frame_x - bd_width_j;
|
||||||
|
y_j = tmp->frame_y - bd_width_j;
|
||||||
width_j = tmp->frame->core->width;
|
width_j = tmp->frame->core->width;
|
||||||
height_j = tmp->frame->core->height;
|
height_j = tmp->frame->core->height;
|
||||||
botton_j = y_j + height_j;
|
botton_j = y_j + height_j + bd_width_j;
|
||||||
top_j = y_j;
|
top_j = y_j - bd_width_j;
|
||||||
right_border_j = x_j + width_j;
|
right_border_j = x_j + width_j + bd_width_j;
|
||||||
|
|
||||||
/* Try to maximize in the y direction first */
|
/* Try to maximize in the y direction first */
|
||||||
x_intsect = calcIntersectionLength(x_0, width_0, x_j, width_j);
|
x_intsect = calcIntersectionLength(x_0, width_0, x_j, width_j);
|
||||||
if (x_intsect != 0) {
|
if (x_intsect != 0) {
|
||||||
|
/* TODO: Consider the case when coords are equal */
|
||||||
if (botton_j < y_0 && botton_j > new_y_0) {
|
if (botton_j < y_0 && botton_j > new_y_0) {
|
||||||
/* w_0 is below the botton of w_j */
|
/* w_0 is below the botton of w_j */
|
||||||
new_y_0 = botton_j;
|
new_y_0 = botton_j;
|
||||||
@@ -478,22 +487,26 @@ static void find_Maximus_geometry(WWindow *wwin, WArea usableArea, int *new_x, i
|
|||||||
|
|
||||||
tmp = wwin;
|
tmp = wwin;
|
||||||
while (tmp->prev) {
|
while (tmp->prev) {
|
||||||
/* ignore windows in other workspaces or minimized */
|
|
||||||
if (tmp->prev->frame->workspace != wwin->screen_ptr->current_workspace
|
if (tmp->prev->frame->workspace != wwin->screen_ptr->current_workspace
|
||||||
|| tmp->prev->flags.miniaturized) {
|
|| tmp->prev->flags.miniaturized || tmp->prev->flags.hidden) {
|
||||||
tmp = tmp->prev;
|
tmp = tmp->prev;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
tmp = tmp->prev;
|
tmp = tmp->prev;
|
||||||
|
|
||||||
|
if (HAS_BORDER(tmp))
|
||||||
|
bd_width_j = FRAME_BORDER_WIDTH;
|
||||||
|
else
|
||||||
|
bd_width_j = 0;
|
||||||
|
|
||||||
/* set the w_j window coordinates */
|
/* set the w_j window coordinates */
|
||||||
x_j = tmp->frame_x;
|
x_j = tmp->frame_x - bd_width_j;
|
||||||
y_j = tmp->frame_y;
|
y_j = tmp->frame_y - bd_width_j;
|
||||||
width_j = tmp->frame->core->width;
|
width_j = tmp->frame->core->width;
|
||||||
height_j = tmp->frame->core->height;
|
height_j = tmp->frame->core->height;
|
||||||
botton_j = y_j + height_j;
|
botton_j = y_j + height_j + bd_width_j;
|
||||||
top_j = y_j;
|
top_j = y_j - bd_width_j;
|
||||||
right_border_j = x_j + width_j;
|
right_border_j = x_j + width_j + bd_width_j;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Use the updated y coordinates from the above step to account
|
* Use the updated y coordinates from the above step to account
|
||||||
@@ -505,11 +518,11 @@ static void find_Maximus_geometry(WWindow *wwin, WArea usableArea, int *new_x, i
|
|||||||
if (y_intsect != 0) {
|
if (y_intsect != 0) {
|
||||||
if (right_border_j < x_0 && right_border_j > new_x_0) {
|
if (right_border_j < x_0 && right_border_j > new_x_0) {
|
||||||
/* w_0 is completely to the right of w_j */
|
/* w_0 is completely to the right of w_j */
|
||||||
new_x_0 = right_border_j;
|
new_x_0 = right_border_j + 1;
|
||||||
}
|
}
|
||||||
if (right_border_0 < x_j && x_j < new_right_border_0) {
|
if (right_border_0 < x_j && x_j < new_right_border_0) {
|
||||||
/* w_0 is completely to the left of w_j */
|
/* w_0 is completely to the left of w_j */
|
||||||
new_right_border_0 = x_j;
|
new_right_border_0 = x_j - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -518,7 +531,7 @@ static void find_Maximus_geometry(WWindow *wwin, WArea usableArea, int *new_x, i
|
|||||||
*new_x = new_x_0;
|
*new_x = new_x_0;
|
||||||
*new_y = new_y_0;
|
*new_y = new_y_0;
|
||||||
*new_height = new_height_0;
|
*new_height = new_height_0;
|
||||||
*new_width = new_right_border_0 - new_x_0 - adjust_width;
|
*new_width = new_right_border_0 - new_x_0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wUnmaximizeWindow(WWindow * wwin)
|
void wUnmaximizeWindow(WWindow * wwin)
|
||||||
|
|||||||
Reference in New Issue
Block a user