#define SWM_ARG_ID_FOCUSNEXT (0)
#define SWM_ARG_ID_FOCUSPREV (1)
#define SWM_ARG_ID_FOCUSMAIN (2)
-#define SWM_ARG_ID_FOCUSCUR (4)
#define SWM_ARG_ID_SWAPNEXT (10)
#define SWM_ARG_ID_SWAPPREV (11)
#define SWM_ARG_ID_SWAPMAIN (12)
char *get_notify_detail_label(uint8_t);
char *get_notify_mode_label(uint8_t);
#endif
+struct ws_win *get_region_focus(struct swm_region *);
xcb_screen_t *get_screen(int);
char *get_win_name(xcb_window_t);
uint32_t getstate(xcb_window_t);
struct swm_region *this_r, *other_r;
struct ws_win *win;
struct workspace *new_ws, *old_ws;
- union arg a;
if (!(r && r->s))
return;
this_r->ws = new_ws;
new_ws->r = this_r;
+ unmap_window(old_ws->focus);
+
stack();
- a.id = SWM_ARG_ID_FOCUSCUR;
- focus(new_ws->r, &a);
+ /* unmap old windows */
+ if (unmap_old)
+ TAILQ_FOREACH(win, &old_ws->winlist, entry)
+ unmap_window(win);
+
+ new_ws->focus = get_region_focus(new_ws->r);
/* unmap old windows */
if (unmap_old)
cyclescr(struct swm_region *r, union arg *args)
{
struct swm_region *rr = NULL;
- union arg a;
int i, x, y, num_screens;
num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
xcb_warp_pointer(conn, XCB_WINDOW_NONE, rr->s[i].root, 0, 0, 0, 0,
x, y);
- a.id = SWM_ARG_ID_FOCUSCUR;
- focus(rr, &a);
+ rr->ws->focus = get_region_focus(rr);
if (rr->ws->focus) {
/* move to focus window */
return get_focus_magic(winfocus);
}
+struct ws_win *
+get_region_focus(struct swm_region *r)
+{
+ struct ws_win *winfocus = NULL;
+
+ if (!(r && r->ws))
+ return NULL;
+
+ if (r->ws->focus && !r->ws->focus->iconic)
+ winfocus = r->ws->focus;
+ else if (r->ws->focus_prev && !r->ws->focus_prev->iconic)
+ winfocus = r->ws->focus_prev;
+ else
+ TAILQ_FOREACH(winfocus, &r->ws->winlist, entry)
+ if (!winfocus->iconic)
+ break;
+
+ return get_focus_magic(winfocus);
+}
+
void
focus(struct swm_region *r, union arg *args)
{
- struct ws_win *winfocus = NULL, *head;
- struct ws_win *cur_focus = NULL;
+ struct ws_win *head, *cur_focus = NULL, *winfocus = NULL;
struct ws_win_list *wl = NULL;
struct workspace *ws = NULL;
int all_iconics;
DNPRINTF(SWM_D_FOCUS, "focus: id: %d\n", args->id);
- /* treat FOCUS_CUR special */
- if (args->id == SWM_ARG_ID_FOCUSCUR) {
- if (r->ws->focus && r->ws->focus->iconic == 0)
- winfocus = r->ws->focus;
- else if (r->ws->focus_prev && r->ws->focus_prev->iconic == 0)
- winfocus = r->ws->focus_prev;
- else
- TAILQ_FOREACH(winfocus, &r->ws->winlist, entry)
- if (winfocus->iconic == 0)
- break;
-
- r->ws->focus = get_focus_magic(winfocus);
- return;
- }
-
if ((cur_focus = r->ws->focus) == NULL)
return;
ws = r->ws;
cycle_layout(struct swm_region *r, union arg *args)
{
struct workspace *ws = r->ws;
- union arg a;
/* suppress unused warning since var is needed */
(void)args;
stack();
bar_update();
- a.id = SWM_ARG_ID_FOCUSCUR;
- focus(r, &a);
- focus_win(r->ws->focus);
+ focus_win(get_region_focus(r));
focus_flush();
}
floating_toggle(struct swm_region *r, union arg *args)
{
struct ws_win *win = r->ws->focus;
- union arg a;
/* suppress unused warning since var is needed */
(void)args;
stack();
- if (win == win->ws->focus) {
- a.id = SWM_ARG_ID_FOCUSCUR;
- focus(win->ws->r, &a);
- focus_win(win->ws->focus);
- }
+ if (win == win->ws->focus)
+ focus_win(win);
focus_flush();
}
{
struct swm_region *r, *rr;
struct ws_win *winfocus = NULL;
- union arg a;
char conf[PATH_MAX], *cfile = NULL;
struct stat sb;
int xfd, i, num_screens;
rr->s[0].root, 0, 0, 0, 0, X(rr),
Y(rr) + (bar_enabled ? bar_height : 0));
- a.id = SWM_ARG_ID_FOCUSCUR;
- focus(rr, &a);
- focus_win(rr->ws->focus);
+ focus_win(get_region_focus(rr));
focus_flush();
winfocus = NULL;
continue;