#endif
struct ws_win *get_pointer_win(xcb_window_t);
struct ws_win *get_region_focus(struct swm_region *);
+int get_region_index(struct swm_region *);
xcb_screen_t *get_screen(int);
#ifdef SWM_DEBUG
char *get_stack_mode_name(uint8_t);
return (NULL);
}
+int
+get_region_index(struct swm_region *r)
+{
+ struct swm_region *rr;
+ int ridx = 0;
+
+ if (r == NULL)
+ return -1;
+
+ TAILQ_FOREACH(rr, &r->s->rl, entry) {
+ if (rr == r)
+ break;
+ ++ridx;
+ }
+
+ if (rr == NULL)
+ return -1;
+
+ return ridx;
+}
+
void
focus_flush(void)
{
if (r == NULL)
return;
- /* Skip if only one region on this screen. */
- rf = TAILQ_FIRST(&r->s->rl);
- if (TAILQ_NEXT(rf, entry) == NULL)
- goto out;
-
rf = r->s->r_focus;
/* Unfocus old region bar. */
if (rf) {
xcb_change_window_attributes(conn, r->bar->id,
XCB_CW_BORDER_PIXEL, &r->s->c[SWM_S_COLOR_BAR_BORDER].pixel);
-out:
r->s->r_focus = r;
}
{
struct swm_geometry gg = *g;
struct ws_win *w, *win = NULL, *parent = NULL;
- int winno, num_screens;
+ int winno;
DNPRINTF(SWM_D_STACK, "max_stack: workspace: %d\n", ws->idx);
DNPRINTF(SWM_D_STACK, "max_stack: win: 0x%x\n", win->id);
/* maximize all top level windows */
- num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
TAILQ_FOREACH(w, &ws->winlist, entry) {
if (w->transient || w->iconic)
continue;
+ if (!win->mapped && w != win)
+ map_window(w);
+
if (w->floating && !w->floatmaxed) {
/*
* retain geometry for retrieval on exit from
update_window(w);
}
-
- /* Unmap unwanted windows if not multi-screen. */
- if (num_screens <= 1 && outputs <= 1 && w != win &&
- w != parent && w->transient != win->id)
- unmap_window(w);
}
- /* If a parent exists, map it first. */
+ /* If a parent exists, map/raise it first. */
if (parent) {
map_window(parent);
}
}
- /* Map focused window. */
+ /* Map/raise focused window. */
map_window(win);
- /* Finally, map children of focus window. */
+ /* Finally, map/raise children of focus window. */
TAILQ_FOREACH(w, &ws->winlist, entry)
if (w->transient == win->id && !w->iconic) {
stack_floater(w, ws->r);
strdup(r->s->c[SWM_S_COLOR_UNFOCUS].name))
== NULL)
err(1, "spawn_custom color unfocus");
+ } else if (!strcasecmp(ap, "$region_index")) {
+ if (asprintf(&real_args[i], "%d",
+ get_region_index(r) + 1) < 1)
+ err(1, "spawn_custom region index");
+ } else if (!strcasecmp(ap, "$workspace_index")) {
+ if (asprintf(&real_args[i], "%d", r->ws->idx + 1) < 1)
+ err(1, "spawn_custom workspace index");
} else {
/* no match --> copy as is */
if ((real_args[i] = strdup(ap)) == NULL)