/* by making this pass FALSE for user, we avoid the emacs event storm where
every configurenotify causes an update in its normal hints, i think this
is generally what we want anyways... */
- client_configure(self, self->area.x, self->area.y,
- self->area.width, self->area.height, FALSE, TRUE);
+ client_configure_full(self, self->area.x, self->area.y,
+ self->area.width, self->area.height, FALSE, TRUE);
}
void client_update_wmhints(ObClient *self)
gint oldw, oldh;
gboolean send_resize_client;
gboolean moved = FALSE, resized = FALSE;
+ gboolean fmoved, fresized;
guint fdecor = self->frame->decorations;
gboolean fhorz = self->frame->max_horz;
gint logicalw, logicalh;
}
/* find the frame's dimensions and move/resize it */
+ fmoved = moved;
+ fresized = resized;
if (self->decorations != fdecor || self->max_horz != fhorz)
- moved = resized = TRUE;
- if (moved || resized)
- frame_adjust_area(self->frame, moved, resized, FALSE);
+ fmoved = fresized = TRUE;
+ if (fmoved || fresized)
+ frame_adjust_area(self->frame, fmoved, fresized, FALSE);
if ((!user || (user && final)) && !resized)
{
client_calc_layer(self);
}
- /* These things below can change focus so we can't grab pointer for them */
- ungrab_pointer();
-
if (modal != self->modal) {
self->modal = modal;
/* when a window changes modality, then its stacking order with its
transients needs to change */
stacking_raise(CLIENT_AS_WINDOW(self));
+
+ /* These things below can change focus so we can't grab pointer for
+ them. Note how we have two ungrab_pointers.. */
+ ungrab_pointer();
+
/* it also may get focused. if something is focused that shouldn't
be focused anymore, then move the focus */
if (focus_client && client_focus_target(focus_client) != focus_client)
client_focus(focus_client);
}
+ else
+ /* These things below can change focus so we can't grab pointer for
+ them. Note how we have two ungrab_pointers.. */
+ ungrab_pointer();
+
if (iconic != self->iconic)
client_iconify(self, iconic, FALSE, FALSE);
if (self->undecorated != undecorated) {
self->undecorated = undecorated;
client_setup_decor_and_functions(self);
- /* Make sure the client knows it might have moved. Maybe there is a
- * better way of doing this so only one client_configure is sent, but
- * since 125 of these are sent per second when moving the window (with
- * user = FALSE) i doubt it matters much.
- */
- client_configure(self, self->area.x, self->area.y,
- self->area.width, self->area.height, TRUE, TRUE);
client_change_state(self); /* reflect this in the state hints */
}
}
gint w, gint h);
#define client_move(self, x, y) \
- client_configure(self, x, y, self->area.width, self->area.height, \
- TRUE, TRUE)
+ client_configure_full(self, x, y, self->area.width, self->area.height, \
+ TRUE, TRUE)
#define client_resize(self, w, h) \
- client_configure(self, self->area.x, self->area.y, w, h, TRUE, TRUE)
+ client_configure_full(self, self->area.x, self->area.y, w, h, TRUE, TRUE)
#define client_move_resize(self, x, y, w, h) \
- client_configure(self, x, y, w, h, TRUE, TRUE)
-
-#define client_configure(self, x, y, w, h, user, final) \
- client_configure_full(self, x, y, w, h, user, final)
+ client_configure_full(self, x, y, w, h, TRUE, TRUE)
/*! Figure out where a window will end up and what size it will be if you
told it to move/resize to these coordinates.
#include "config.h"
#include "screen.h"
#include "frame.h"
+#include "grab.h"
#include "menu.h"
#include "menuframe.h"
#include "keyboard.h"
if (config) {
client_find_onscreen(client, &x, &y, w, h, FALSE);
+
+ /* don't create enter events from clients moving themselves */
+ grab_pointer(FALSE, FALSE, OB_CURSOR_NONE);
client_configure_full(client, x, y, w, h, FALSE, TRUE);
+ ungrab_pointer();
}
break;
}
e->xclient.data.l[0] & 1 << 9, y);
client_convert_gravity(client, grav, &x, &y, w, h);
client_find_onscreen(client, &x, &y, w, h, FALSE);
- client_configure(client, x, y, w, h, FALSE, TRUE);
+
+ /* don't create enter events from clients moving themselves */
+ grab_pointer(FALSE, FALSE, OB_CURSOR_NONE);
+ client_configure_full(client, x, y, w, h, FALSE, TRUE);
+ ungrab_pointer();
} else if (msgtype == prop_atoms.net_restack_window) {
if (e->xclient.data.l[0] != 2) {
ob_debug_type(OB_DEBUG_APP_BUGS,
#endif
get_resize_position(&x, &y, cancel);
- client_configure(moveresize_client, x, y,
- (cancel ? start_cw : cur_x),
- (cancel ? start_ch : cur_y), TRUE, TRUE);
+ client_configure_full(moveresize_client, x, y,
+ (cancel ? start_cw : cur_x),
+ (cancel ? start_ch : cur_y), TRUE, TRUE);
}
moveresize_in_progress = FALSE;
if (!keyboard) resist = config_resist_edge;
resist_move_monitors(moveresize_client, resist, &cur_x, &cur_y);
- client_configure(moveresize_client, cur_x, cur_y,
- moveresize_client->area.width,
- moveresize_client->area.height, TRUE, FALSE);
+ client_configure_full(moveresize_client, cur_x, cur_y,
+ moveresize_client->area.width,
+ moveresize_client->area.height, TRUE, FALSE);
if (config_resize_popup_show == 2) /* == "Always" */
popup_coords(moveresize_client, "%d x %d",
moveresize_client->frame->area.x,
{
gint x, y;
get_resize_position(&x, &y, FALSE);
- client_configure(moveresize_client, x, y, cur_x, cur_y, TRUE, FALSE);
+ client_configure_full(moveresize_client,
+ x, y, cur_x, cur_y, TRUE, FALSE);
}
/* this would be better with a fixed width font ... XXX can do it better