+ FALSE, FALSE);
+ } else if (msgtype == prop_atoms.net_wm_state) {
+ gulong ignore_start;
+
+ /* can't compress these */
+ ob_debug("net_wm_state %s %ld %ld for 0x%lx\n",
+ (e->xclient.data.l[0] == 0 ? "Remove" :
+ e->xclient.data.l[0] == 1 ? "Add" :
+ e->xclient.data.l[0] == 2 ? "Toggle" : "INVALID"),
+ e->xclient.data.l[1], e->xclient.data.l[2],
+ client->window);
+
+ /* ignore enter events caused by these like ob actions do */
+ if (!config_focus_under_mouse)
+ ignore_start = event_start_ignore_all_enters();
+ client_set_state(client, e->xclient.data.l[0],
+ e->xclient.data.l[1], e->xclient.data.l[2]);
+ if (!config_focus_under_mouse)
+ event_end_ignore_all_enters(ignore_start);
+ } else if (msgtype == prop_atoms.net_close_window) {
+ ob_debug("net_close_window for 0x%lx\n", client->window);
+ client_close(client);
+ } else if (msgtype == prop_atoms.net_active_window) {
+ ob_debug("net_active_window for 0x%lx source=%s\n",
+ client->window,
+ (e->xclient.data.l[0] == 0 ? "unknown" :
+ (e->xclient.data.l[0] == 1 ? "application" :
+ (e->xclient.data.l[0] == 2 ? "user" : "INVALID"))));
+ /* XXX make use of data.l[2] !? */
+ if (e->xclient.data.l[0] == 1 || e->xclient.data.l[0] == 2) {
+ /* don't use the user's timestamp for client_focus, cuz if it's
+ an old broken timestamp (happens all the time) then focus
+ won't move even though we're trying to move it
+ event_curtime = e->xclient.data.l[1];*/
+ if (e->xclient.data.l[1] == 0)
+ ob_debug_type(OB_DEBUG_APP_BUGS,
+ "_NET_ACTIVE_WINDOW message for window %s is"
+ " missing a timestamp\n", client->title);
+ } else
+ ob_debug_type(OB_DEBUG_APP_BUGS,
+ "_NET_ACTIVE_WINDOW message for window %s is "
+ "missing source indication\n");
+ client_activate(client, FALSE, TRUE, TRUE,
+ (e->xclient.data.l[0] == 0 ||
+ e->xclient.data.l[0] == 2));
+ } else if (msgtype == prop_atoms.net_wm_moveresize) {
+ ob_debug("net_wm_moveresize for 0x%lx direction %d\n",
+ client->window, e->xclient.data.l[2]);
+ if ((Atom)e->xclient.data.l[2] ==
+ prop_atoms.net_wm_moveresize_size_topleft ||
+ (Atom)e->xclient.data.l[2] ==
+ prop_atoms.net_wm_moveresize_size_top ||
+ (Atom)e->xclient.data.l[2] ==
+ prop_atoms.net_wm_moveresize_size_topright ||
+ (Atom)e->xclient.data.l[2] ==
+ prop_atoms.net_wm_moveresize_size_right ||
+ (Atom)e->xclient.data.l[2] ==
+ prop_atoms.net_wm_moveresize_size_right ||
+ (Atom)e->xclient.data.l[2] ==
+ prop_atoms.net_wm_moveresize_size_bottomright ||
+ (Atom)e->xclient.data.l[2] ==
+ prop_atoms.net_wm_moveresize_size_bottom ||
+ (Atom)e->xclient.data.l[2] ==
+ prop_atoms.net_wm_moveresize_size_bottomleft ||
+ (Atom)e->xclient.data.l[2] ==
+ prop_atoms.net_wm_moveresize_size_left ||
+ (Atom)e->xclient.data.l[2] ==
+ prop_atoms.net_wm_moveresize_move ||
+ (Atom)e->xclient.data.l[2] ==
+ prop_atoms.net_wm_moveresize_size_keyboard ||
+ (Atom)e->xclient.data.l[2] ==
+ prop_atoms.net_wm_moveresize_move_keyboard) {
+
+ moveresize_start(client, e->xclient.data.l[0],
+ e->xclient.data.l[1], e->xclient.data.l[3],
+ e->xclient.data.l[2]);
+ }
+ else if ((Atom)e->xclient.data.l[2] ==
+ prop_atoms.net_wm_moveresize_cancel)
+ moveresize_end(TRUE);
+ } else if (msgtype == prop_atoms.net_moveresize_window) {
+ gint ograv, x, y, w, h;
+
+ ograv = client->gravity;
+
+ if (e->xclient.data.l[0] & 0xff)
+ client->gravity = e->xclient.data.l[0] & 0xff;
+
+ if (e->xclient.data.l[0] & 1 << 8)
+ x = e->xclient.data.l[1];
+ else
+ x = client->area.x;
+ if (e->xclient.data.l[0] & 1 << 9)
+ y = e->xclient.data.l[2];
+ else
+ y = client->area.y;
+
+ if (e->xclient.data.l[0] & 1 << 10) {
+ w = e->xclient.data.l[3];
+
+ /* if x was not given, then use gravity to figure out the new
+ x. the reference point should not be moved */
+ if (!(e->xclient.data.l[0] & 1 << 8))
+ client_gravity_resize_w(client, &x, client->area.width, w);
+ }
+ else
+ w = client->area.width;
+
+ if (e->xclient.data.l[0] & 1 << 11) {
+ h = e->xclient.data.l[4];
+
+ /* if y was not given, then use gravity to figure out the new
+ y. the reference point should not be moved */
+ if (!(e->xclient.data.l[0] & 1 << 9))
+ client_gravity_resize_h(client, &y, client->area.height,h);
+ }
+ else
+ h = client->area.height;
+
+ ob_debug("MOVERESIZE x %d %d y %d %d (gravity %d)\n",
+ e->xclient.data.l[0] & 1 << 8, x,
+ e->xclient.data.l[0] & 1 << 9, y,
+ client->gravity);
+
+ client_find_onscreen(client, &x, &y, w, h, FALSE);
+
+ client_configure(client, x, y, w, h, FALSE, TRUE, FALSE);
+
+ client->gravity = ograv;
+ } else if (msgtype == prop_atoms.net_restack_window) {
+ if (e->xclient.data.l[0] != 2) {
+ ob_debug_type(OB_DEBUG_APP_BUGS,
+ "_NET_RESTACK_WINDOW sent for window %s with "
+ "invalid source indication %ld\n",
+ client->title, e->xclient.data.l[0]);
+ } else {
+ ObClient *sibling = NULL;
+ if (e->xclient.data.l[1]) {
+ ObWindow *win = g_hash_table_lookup
+ (window_map, &e->xclient.data.l[1]);
+ if (WINDOW_IS_CLIENT(win) &&
+ WINDOW_AS_CLIENT(win) != client)
+ {
+ sibling = WINDOW_AS_CLIENT(win);
+ }
+ if (sibling == NULL)
+ ob_debug_type(OB_DEBUG_APP_BUGS,
+ "_NET_RESTACK_WINDOW sent for window %s "
+ "with invalid sibling 0x%x\n",
+ client->title, e->xclient.data.l[1]);
+ }
+ if (e->xclient.data.l[2] == Below ||
+ e->xclient.data.l[2] == BottomIf ||
+ e->xclient.data.l[2] == Above ||
+ e->xclient.data.l[2] == TopIf ||
+ e->xclient.data.l[2] == Opposite)
+ {
+ gulong ignore_start;
+
+ if (!config_focus_under_mouse)
+ ignore_start = event_start_ignore_all_enters();
+ /* just raise, don't activate */
+ stacking_restack_request(client, sibling,
+ e->xclient.data.l[2]);
+ if (!config_focus_under_mouse)
+ event_end_ignore_all_enters(ignore_start);
+
+ /* send a synthetic ConfigureNotify, cuz this is supposed
+ to be like a ConfigureRequest. */
+ client_reconfigure(client, TRUE);
+ } else
+ ob_debug_type(OB_DEBUG_APP_BUGS,
+ "_NET_RESTACK_WINDOW sent for window %s "
+ "with invalid detail %d\n",
+ client->title, e->xclient.data.l[2]);
+ }
+ }
+ break;