add force_reply back to client_configure(). client_reconfigure is nicer this time around. eat enter events in client_configure when user is FALSE.
This commit is contained in:
parent
84b8cf165a
commit
0813e4451d
4 changed files with 50 additions and 58 deletions
|
@ -1808,24 +1808,6 @@ static void client_change_allowed_actions(ObClient *self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void client_reconfigure(ObClient *self, gboolean force)
|
|
||||||
{
|
|
||||||
gint x, y, w, h, lw, lh;
|
|
||||||
|
|
||||||
RECT_TO_DIMS(self->area, x, y, w, h);
|
|
||||||
if (!force)
|
|
||||||
client_try_configure(self, &x, &y, &w, &h, &lw, &lh, FALSE);
|
|
||||||
if (force || !RECT_EQUAL_DIMS(self->area, x, y, w, h)) {
|
|
||||||
gulong ignore_start;
|
|
||||||
|
|
||||||
ob_debug("Reconfiguring client x %d y %d w %d h %d\n",
|
|
||||||
x, y, w, h);
|
|
||||||
ignore_start = event_start_ignore_all_enters();
|
|
||||||
client_configure(self, x, y, w, h, FALSE, TRUE);
|
|
||||||
event_end_ignore_all_enters(ignore_start);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void client_update_wmhints(ObClient *self)
|
void client_update_wmhints(ObClient *self)
|
||||||
{
|
{
|
||||||
XWMHints *hints;
|
XWMHints *hints;
|
||||||
|
@ -2630,7 +2612,7 @@ static void client_apply_startup_state(ObClient *self,
|
||||||
/* if the window hasn't been configured yet, then do so now */
|
/* if the window hasn't been configured yet, then do so now */
|
||||||
if (!fullscreen && !max_vert && !max_horz) {
|
if (!fullscreen && !max_vert && !max_horz) {
|
||||||
self->area = oldarea;
|
self->area = oldarea;
|
||||||
client_configure(self, x, y, w, h, FALSE, TRUE);
|
client_configure(self, x, y, w, h, FALSE, TRUE, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set the desktop hint, to make sure that it always exists */
|
/* set the desktop hint, to make sure that it always exists */
|
||||||
|
@ -2873,11 +2855,11 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
|
||||||
|
|
||||||
|
|
||||||
void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
|
void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
|
||||||
gboolean user, gboolean final)
|
gboolean user, gboolean final, gboolean force_reply)
|
||||||
{
|
{
|
||||||
gint oldw, oldh;
|
gint oldw, oldh;
|
||||||
gboolean send_resize_client;
|
gboolean send_resize_client;
|
||||||
gboolean moved = FALSE, resized = FALSE;
|
gboolean moved = FALSE, resized = FALSE, rootmoved = FALSE;
|
||||||
gboolean fmoved, fresized;
|
gboolean fmoved, fresized;
|
||||||
guint fdecor = self->frame->decorations;
|
guint fdecor = self->frame->decorations;
|
||||||
gboolean fhorz = self->frame->max_horz;
|
gboolean fhorz = self->frame->max_horz;
|
||||||
|
@ -2926,26 +2908,20 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* adjust the frame */
|
/* adjust the frame */
|
||||||
if (fmoved || fresized)
|
if (fmoved || fresized) {
|
||||||
|
gulong ignore_start;
|
||||||
|
if (!user)
|
||||||
|
ignore_start = event_start_ignore_all_enters();
|
||||||
|
|
||||||
frame_adjust_area(self->frame, fmoved, fresized, FALSE);
|
frame_adjust_area(self->frame, fmoved, fresized, FALSE);
|
||||||
|
|
||||||
/* This is kinda tricky and should not be changed.. let me explain!
|
if (!user)
|
||||||
|
event_end_ignore_all_enters(ignore_start);
|
||||||
When user = FALSE, then the request is coming from the application
|
}
|
||||||
itself, and we are more strict about when to send a synthetic
|
|
||||||
ConfigureNotify. We strictly follow the rules of the ICCCM sec 4.1.5
|
|
||||||
in this case.
|
|
||||||
|
|
||||||
When user = TRUE, then the request is coming from "us", like when we
|
|
||||||
maximize a window or sometihng. In this case we are more lenient. We
|
|
||||||
used to follow the same rules as above, but _Java_ Swing can't handle
|
|
||||||
this. So just to appease Swing, when user = TRUE, we always send
|
|
||||||
a synthetic ConfigureNotify to give the window its root coordinates.
|
|
||||||
*/
|
|
||||||
if ((!user && !resized) || (user && final))
|
|
||||||
{
|
|
||||||
XEvent event;
|
|
||||||
|
|
||||||
|
if (!user || final) {
|
||||||
|
gint oldrx = self->root_pos.x;
|
||||||
|
gint oldry = self->root_pos.y;
|
||||||
/* we have reset the client to 0 border width, so don't include
|
/* we have reset the client to 0 border width, so don't include
|
||||||
it in these coords */
|
it in these coords */
|
||||||
POINT_SET(self->root_pos,
|
POINT_SET(self->root_pos,
|
||||||
|
@ -2953,6 +2929,26 @@ void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
|
||||||
self->border_width,
|
self->border_width,
|
||||||
self->frame->area.y + self->frame->size.top -
|
self->frame->area.y + self->frame->size.top -
|
||||||
self->border_width);
|
self->border_width);
|
||||||
|
if (self->root_pos.x != oldrx || self->root_pos.y != oldry)
|
||||||
|
rootmoved = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is kinda tricky and should not be changed.. let me explain!
|
||||||
|
|
||||||
|
When user = FALSE, then the request is coming from the application
|
||||||
|
itself, and we are more strict about when to send a synthetic
|
||||||
|
ConfigureNotify. We strictly follow the rules of the ICCCM sec 4.1.5
|
||||||
|
in this case (if force_reply is true)
|
||||||
|
|
||||||
|
When user = TRUE, then the request is coming from "us", like when we
|
||||||
|
maximize a window or sometihng. In this case we are more lenient. We
|
||||||
|
used to follow the same rules as above, but _Java_ Swing can't handle
|
||||||
|
this. So just to appease Swing, when user = TRUE, we always send
|
||||||
|
a synthetic ConfigureNotify to give the window its root coordinates.
|
||||||
|
*/
|
||||||
|
if ((!user && !resized && (rootmoved || force_reply)) || (user && final))
|
||||||
|
{
|
||||||
|
XEvent event;
|
||||||
|
|
||||||
event.type = ConfigureNotify;
|
event.type = ConfigureNotify;
|
||||||
event.xconfigure.display = ob_display;
|
event.xconfigure.display = ob_display;
|
||||||
|
|
|
@ -379,16 +379,21 @@ void client_convert_gravity_resize(ObClient *self, gint gravity,
|
||||||
gint w, gint h);
|
gint w, gint h);
|
||||||
|
|
||||||
#define client_move(self, x, y) \
|
#define client_move(self, x, y) \
|
||||||
client_configure(self, x, y, self->area.width, self->area.height, TRUE, TRUE)
|
client_configure(self, x, y, self->area.width, self->area.height, TRUE, TRUE,\
|
||||||
|
FALSE)
|
||||||
#define client_resize(self, w, h) \
|
#define client_resize(self, w, h) \
|
||||||
client_configure(self, self->area.x, self->area.y, w, h, TRUE, TRUE)
|
client_configure(self, self->area.x, self->area.y, w, h, TRUE, TRUE, FALSE)
|
||||||
#define client_move_resize(self, x, y, w, h) \
|
#define client_move_resize(self, x, y, w, h) \
|
||||||
client_configure(self, x, y, w, h, TRUE, TRUE)
|
client_configure(self, x, y, w, h, TRUE, TRUE, FALSE)
|
||||||
|
#define client_reconfigure(self, force) \
|
||||||
|
client_configure(self, ((ObClient*)self)->area.x, ((ObClient*)self)->area.y, \
|
||||||
|
((ObClient*)self)->area.width, \
|
||||||
|
((ObClient*)self)->area.height, FALSE, TRUE, force)
|
||||||
|
|
||||||
/*! Figure out where a window will end up and what size it will be if you
|
/*! Figure out where a window will end up and what size it will be if you
|
||||||
told it to move/resize to these coordinates.
|
told it to move/resize to these coordinates.
|
||||||
|
|
||||||
These values are what client_configure_full will give the window.
|
These values are what client_configure will give the window.
|
||||||
|
|
||||||
@param x The x coordiante of the new position for the client.
|
@param x The x coordiante of the new position for the client.
|
||||||
@param y The y coordiante of the new position for the client.
|
@param y The y coordiante of the new position for the client.
|
||||||
|
@ -422,12 +427,10 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
|
||||||
interactive move/resize, and then be TRUE for the last call
|
interactive move/resize, and then be TRUE for the last call
|
||||||
only.
|
only.
|
||||||
@param force_reply Send a ConfigureNotify to the client regardless of if
|
@param force_reply Send a ConfigureNotify to the client regardless of if
|
||||||
the position changed.
|
the position/size changed.
|
||||||
*/
|
*/
|
||||||
void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
|
void client_configure(ObClient *self, gint x, gint y, gint w, gint h,
|
||||||
gboolean user, gboolean final);
|
gboolean user, gboolean final, gboolean force_reply);
|
||||||
|
|
||||||
void client_reconfigure(ObClient *self, gboolean force);
|
|
||||||
|
|
||||||
/*! Finds coordinates to keep a client on the screen.
|
/*! Finds coordinates to keep a client on the screen.
|
||||||
@param self The client
|
@param self The client
|
||||||
|
|
|
@ -1160,7 +1160,6 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
|
|
||||||
{
|
{
|
||||||
gint lw,lh;
|
gint lw,lh;
|
||||||
gulong ignore_start;
|
|
||||||
|
|
||||||
client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE);
|
client_try_configure(client, &x, &y, &w, &h, &lw, &lh, FALSE);
|
||||||
|
|
||||||
|
@ -1179,9 +1178,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
|
|
||||||
ob_debug("Granting ConfigureRequest x %d y %d w %d h %d\n",
|
ob_debug("Granting ConfigureRequest x %d y %d w %d h %d\n",
|
||||||
x, y, w, h);
|
x, y, w, h);
|
||||||
ignore_start = event_start_ignore_all_enters();
|
client_configure(client, x, y, w, h, FALSE, TRUE, TRUE);
|
||||||
client_configure(client, x, y, w, h, FALSE, TRUE);
|
|
||||||
event_end_ignore_all_enters(ignore_start);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1343,7 +1340,6 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
moveresize_end(TRUE);
|
moveresize_end(TRUE);
|
||||||
} else if (msgtype == prop_atoms.net_moveresize_window) {
|
} else if (msgtype == prop_atoms.net_moveresize_window) {
|
||||||
gint ograv, x, y, w, h;
|
gint ograv, x, y, w, h;
|
||||||
gulong ignore_start;
|
|
||||||
|
|
||||||
ograv = client->gravity;
|
ograv = client->gravity;
|
||||||
|
|
||||||
|
@ -1388,10 +1384,7 @@ static void event_handle_client(ObClient *client, XEvent *e)
|
||||||
|
|
||||||
client_find_onscreen(client, &x, &y, w, h, FALSE);
|
client_find_onscreen(client, &x, &y, w, h, FALSE);
|
||||||
|
|
||||||
/* ignore enter events caused by these like ob actions do */
|
client_configure(client, x, y, w, h, FALSE, TRUE, FALSE);
|
||||||
ignore_start = event_start_ignore_all_enters();
|
|
||||||
client_configure(client, x, y, w, h, FALSE, TRUE);
|
|
||||||
event_end_ignore_all_enters(ignore_start);
|
|
||||||
|
|
||||||
client->gravity = ograv;
|
client->gravity = ograv;
|
||||||
} else if (msgtype == prop_atoms.net_restack_window) {
|
} else if (msgtype == prop_atoms.net_restack_window) {
|
||||||
|
|
|
@ -299,7 +299,7 @@ void moveresize_end(gboolean cancel)
|
||||||
client_configure(moveresize_client, x, y,
|
client_configure(moveresize_client, x, y,
|
||||||
(cancel ? start_cw : cur_x),
|
(cancel ? start_cw : cur_x),
|
||||||
(cancel ? start_ch : cur_y),
|
(cancel ? start_ch : cur_y),
|
||||||
TRUE, TRUE);
|
TRUE, TRUE, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
moveresize_in_progress = FALSE;
|
moveresize_in_progress = FALSE;
|
||||||
|
@ -319,7 +319,7 @@ static void do_move(gboolean keyboard)
|
||||||
client_configure(moveresize_client, cur_x, cur_y,
|
client_configure(moveresize_client, cur_x, cur_y,
|
||||||
moveresize_client->area.width,
|
moveresize_client->area.width,
|
||||||
moveresize_client->area.height,
|
moveresize_client->area.height,
|
||||||
TRUE, FALSE);
|
TRUE, FALSE, FALSE);
|
||||||
if (config_resize_popup_show == 2) /* == "Always" */
|
if (config_resize_popup_show == 2) /* == "Always" */
|
||||||
popup_coords(moveresize_client, "%d x %d",
|
popup_coords(moveresize_client, "%d x %d",
|
||||||
moveresize_client->frame->area.x,
|
moveresize_client->frame->area.x,
|
||||||
|
@ -377,7 +377,7 @@ static void do_resize()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
get_resize_position(&x, &y, FALSE);
|
get_resize_position(&x, &y, FALSE);
|
||||||
client_configure(moveresize_client, x, y, cur_x, cur_y, TRUE, FALSE);
|
client_configure(moveresize_client, x, y, cur_x, cur_y, TRUE, FALSE, FALSE);
|
||||||
|
|
||||||
/* this would be better with a fixed width font ... XXX can do it better
|
/* this would be better with a fixed width font ... XXX can do it better
|
||||||
if there are 2 text boxes */
|
if there are 2 text boxes */
|
||||||
|
|
Loading…
Reference in a new issue