if (data->client.c)
client_set_desktop(data->client.c,
data->client.c->desktop == DESKTOP_ALL ?
- screen_desktop : DESKTOP_ALL);
+ screen_desktop : DESKTOP_ALL, FALSE);
}
void action_move_relative_horz(union ActionData *data)
if (data->sendto.c)
if (data->sendto.desktop < screen_num_desktops ||
data->sendto.desktop == DESKTOP_ALL)
- client_set_desktop(data->sendto.c, data->sendto.desktop);
+ client_set_desktop(data->sendto.c, data->sendto.desktop, TRUE);
}
void action_send_to_next_desktop(union ActionData *data)
if (!data->sendtonextprev.wrap) return;
d = 0;
}
- client_set_desktop(data->sendtonextprev.c, d);
+ client_set_desktop(data->sendtonextprev.c, d, data->sendtonextprev.follow);
if (data->sendtonextprev.follow) screen_set_desktop(d);
}
if (!data->sendtonextprev.wrap) return;
d = screen_num_desktops - 1;
}
- client_set_desktop(data->sendtonextprev.c, d);
+ client_set_desktop(data->sendtonextprev.c, d, data->sendtonextprev.follow);
if (data->sendtonextprev.follow) screen_set_desktop(d);
}
XUnmapWindow(ob_display, self->window);
} else {
if (curdesk)
- client_set_desktop(self, screen_desktop);
+ client_set_desktop(self, screen_desktop, FALSE);
self->wmstate = self->shaded ? IconicState : NormalState;
XMapWindow(ob_display, self->window);
}
XKillClient(ob_display, self->window);
}
-void client_set_desktop(Client *self, guint target)
+void client_set_desktop(Client *self, guint target, gboolean donthide)
{
guint old, i;
+ ConfigValue focus_new;
if (target == self->desktop) return;
- g_message("Setting desktop %u\n", target);
+ g_message("Setting desktop %u", target);
g_assert(target < screen_num_desktops || target == DESKTOP_ALL);
/* the frame can display the current desktop state */
engine_frame_adjust_state(self->frame);
/* 'move' the window to the new desktop */
- client_showhide(self);
+ if (!donthide)
+ client_showhide(self);
+ stacking_raise(self);
screen_update_struts();
/* update the focus lists */
+ if (!config_get("focusNew", Config_Bool, &focus_new))
+ g_assert_not_reached();
if (old == DESKTOP_ALL) {
for (i = 0; i < screen_num_desktops; ++i)
focus_order[i] = g_list_remove(focus_order[i], self);
- focus_order[target] = g_list_prepend(focus_order[target], self);
+ if (focus_new.bool)
+ focus_order[target] = g_list_prepend(focus_order[target], self);
+ else
+ focus_order[target] = g_list_append(focus_order[target], self);
} else {
focus_order[old] = g_list_remove(focus_order[old], self);
if (target == DESKTOP_ALL)
- for (i = 0; i < screen_num_desktops; ++i)
- focus_order[i] = g_list_prepend(focus_order[i], self);
+ for (i = 0; i < screen_num_desktops; ++i) {
+ if (focus_new.bool)
+ focus_order[i] = g_list_prepend(focus_order[i], self);
+ else
+ focus_order[i] = g_list_append(focus_order[i], self);
+ }
}
dispatch_client(Event_Client_Desktop, self, target, old);
void client_kill(Client *self);
/*! Sends the window to the specified desktop */
-void client_set_desktop(Client *self, guint target);
+void client_set_desktop(Client *self, guint target, gboolean donthide);
/*! Return a modal child of the client window
@return A modal child of the client window, or 0 if none was found.
}
if ((unsigned)e->xclient.data.l[0] < screen_num_desktops ||
(unsigned)e->xclient.data.l[0] == DESKTOP_ALL)
- client_set_desktop(client, (unsigned)e->xclient.data.l[0]);
+ client_set_desktop(client, (unsigned)e->xclient.data.l[0],
+ FALSE);
} else if (msgtype == prop_atoms.net_wm_state) {
/* can't compress these */
g_message("net_wm_state %s %ld %ld for 0x%lx",
for (it = client_list; it != NULL; it = it->next) {
Client *c = it->data;
if (c->desktop >= num)
- client_set_desktop(c, num - 1);
+ client_set_desktop(c, num - 1, FALSE);
}
dispatch_ob(Event_Ob_NumDesktops, num, old);