X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=scrotwm.c;h=4730a0f20143a61460ef0dce3034803e981c9464;hb=af1157519cecb67d3039e1861d99bf070f0cfba0;hp=e5d1c7e5ee8440bac38266c39f3d561486ca74c0;hpb=dd4354b774f8427706d879f0c2316e4bb80b7777;p=spectrwm.git diff --git a/scrotwm.c b/scrotwm.c index e5d1c7e..4730a0f 100644 --- a/scrotwm.c +++ b/scrotwm.c @@ -55,7 +55,7 @@ static const char *cvstag = "$scrotwm$"; -#define SWM_VERSION "0.9.32" +#define SWM_VERSION "0.9.34" #include #include @@ -87,6 +87,7 @@ static const char *cvstag = #include #include #include +#include #ifdef __OSX__ #include @@ -220,6 +221,7 @@ int bar_verbose = 1; int bar_height = 0; int stack_enabled = 1; int clock_enabled = 1; +int urgent_enabled = 0; char *clock_format = NULL; int title_name_enabled = 0; int title_class_enabled = 0; @@ -329,10 +331,10 @@ struct layout { void (*l_string)(struct workspace *); } layouts[] = { /* stack, configure */ - { vertical_stack, vertical_config, 0, fancy_stacker }, - { horizontal_stack, horizontal_config, 0, fancy_stacker }, + { vertical_stack, vertical_config, 0, plain_stacker }, + { horizontal_stack, horizontal_config, 0, plain_stacker }, { max_stack, NULL, - SWM_L_MAPONFOCUS | SWM_L_FOCUSPREV, fancy_stacker }, + SWM_L_MAPONFOCUS | SWM_L_FOCUSPREV, plain_stacker }, { NULL, NULL, 0, NULL }, }; @@ -612,12 +614,11 @@ void ewmh_autoquirk(struct ws_win *win) { int success, i; - unsigned long *data = NULL; - unsigned long n; + unsigned long *data = NULL, n; Atom type; success = get_property(win->id, ewmh[_NET_WM_WINDOW_TYPE].atom, (~0L), - XA_ATOM, &n, (unsigned char **)&data); + XA_ATOM, &n, (void *)&data); if (!success) { XFree(data); @@ -806,7 +807,7 @@ ewmh_get_win_state(struct ws_win *win) win->ewmh_flags |= SWM_F_MANUAL; success = get_property(win->id, ewmh[_NET_WM_STATE].atom, - (~0L), XA_ATOM, &n, (unsigned char **)&states); + (~0L), XA_ATOM, &n, (void *)&states); if (!success) return; @@ -1165,8 +1166,8 @@ custom_region(char *val) if (w < 1 || h < 1) errx(1, "region %ux%u+%u+%u too small\n", w, h, x, y); - if (x < 0 || x > DisplayWidth(display, sidx) || - y < 0 || y > DisplayHeight(display, sidx) || + if (x > DisplayWidth(display, sidx) || + y > DisplayHeight(display, sidx) || w + x > DisplayWidth(display, sidx) || h + y > DisplayHeight(display, sidx)) { fprintf(stderr, "ignoring region %ux%u+%u+%u " @@ -1261,6 +1262,44 @@ bar_window_name(char *s, ssize_t sz, struct ws_win *cur_focus) } } +int urgent[SWM_WS_MAX]; +void +bar_urgent(char *s, ssize_t sz) +{ + XWMHints *wmh = NULL; + struct ws_win *win; + int i, j; + char b[8]; + + if (urgent_enabled == 0) + return; + + for (i = 0; i < SWM_WS_MAX; i++) + urgent[i] = 0; + + for (i = 0; i < ScreenCount(display); i++) + for (j = 0; j < SWM_WS_MAX; j++) + TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry) { + wmh = XGetWMHints(display, win->id); + if (wmh == NULL) + continue; + + if (wmh->flags & XUrgencyHint) + urgent[j] = 1; + XFree(wmh); + } + + strlcat(s, "* ", sz); + for (i = 0; i < SWM_WS_MAX; i++) { + if (urgent[i]) + snprintf(b, sizeof b, "%d ", i + 1); + else + snprintf(b, sizeof b, "- "); + strlcat(s, b, sz); + } + strlcat(s, "* ", sz); +} + void bar_update(void) { @@ -1305,6 +1344,7 @@ bar_update(void) TAILQ_FOREACH(r, &screens[i].rl, entry) { strlcpy(cn, "", sizeof cn); if (r && r->ws) { + bar_urgent(cn, sizeof cn); bar_class_name(cn, sizeof cn, r->ws->focus); bar_window_name(cn, sizeof cn, r->ws->focus); } @@ -3017,7 +3057,8 @@ send_to_ws(struct swm_region *r, union arg *args) /* Try to update the window's workspace property */ ws_idx_atom = XInternAtom(display, "_SWM_WS", False); if (ws_idx_atom && - snprintf(ws_idx_str, SWM_PROPLEN, "%d", nws->idx) < SWM_PROPLEN) { + snprintf((char *)ws_idx_str, SWM_PROPLEN, "%d", nws->idx) < + SWM_PROPLEN) { DNPRINTF(SWM_D_PROP, "setting property _SWM_WS to %s\n", ws_idx_str); XChangeProperty(display, win->id, ws_idx_atom, XA_STRING, 8, @@ -3028,6 +3069,13 @@ send_to_ws(struct swm_region *r, union arg *args) } void +pressbutton(struct swm_region *r, union arg *args) +{ + XTestFakeButtonEvent(display, args->id, True, CurrentTime); + XTestFakeButtonEvent(display, args->id, False, CurrentTime); +} + +void raise_toggle(struct swm_region *r, union arg *args) { if (r && r->ws == NULL) @@ -3091,7 +3139,7 @@ uniconify(struct swm_region *r, union arg *args) { struct ws_win *win; FILE *lfile; - char *name; + unsigned char *name; int count = 0; unsigned long len; @@ -3142,7 +3190,8 @@ search_do_resp(void) { ssize_t rbytes; struct ws_win *win; - char *name, *resp, *s; + unsigned char *name; + char *resp, *s; unsigned long len; DNPRINTF(SWM_D_MISC, "search_do_resp:\n"); @@ -3526,6 +3575,7 @@ enum keyfuncid { kf_iconify, kf_uniconify, kf_raise_toggle, + kf_button2, kf_dumpwins, /* MUST BE LAST */ kf_invalid }; @@ -3603,6 +3653,7 @@ struct keyfunc { { "iconify", iconify, {0} }, { "uniconify", uniconify, {0} }, { "raise_toggle", raise_toggle, {0} }, + { "button2", pressbutton, {2} }, { "dumpwins", dumpwins, {0} }, /* MUST BE LAST */ { "invalid key func", NULL, {0} }, }; @@ -4195,6 +4246,7 @@ setup_keys(void) setkeybinding(MODKEY, XK_w, kf_iconify, NULL); setkeybinding(MODKEY|ShiftMask, XK_w, kf_uniconify, NULL); setkeybinding(MODKEY|ShiftMask, XK_r, kf_raise_toggle,NULL); + setkeybinding(MODKEY, XK_v, kf_button2, NULL); #ifdef SWM_DEBUG setkeybinding(MODKEY|ShiftMask, XK_d, kf_dumpwins, NULL); #endif @@ -4433,7 +4485,7 @@ enum { SWM_S_BAR_DELAY, SWM_S_BAR_ENABLED, SWM_S_BAR_BORDER_WIDTH, SWM_S_STACK_ENABLED, SWM_S_CLOCK_ENABLED, SWM_S_CLOCK_FORMAT, SWM_S_CYCLE_EMPTY, SWM_S_CYCLE_VISIBLE, SWM_S_SS_ENABLED, SWM_S_TERM_WIDTH, SWM_S_TITLE_CLASS_ENABLED, - SWM_S_TITLE_NAME_ENABLED, SWM_S_WINDOW_NAME_ENABLED, + SWM_S_TITLE_NAME_ENABLED, SWM_S_WINDOW_NAME_ENABLED, SWM_S_URGENT_ENABLED, SWM_S_FOCUS_MODE, SWM_S_DISABLE_BORDER, SWM_S_BORDER_WIDTH, SWM_S_BAR_FONT, SWM_S_BAR_ACTION, SWM_S_SPAWN_TERM, SWM_S_SS_APP, SWM_S_DIALOG_RATIO, SWM_S_BAR_AT_BOTTOM, @@ -4491,6 +4543,9 @@ setconfvalue(char *selector, char *value, int flags) case SWM_S_TITLE_NAME_ENABLED: title_name_enabled = atoi(value); break; + case SWM_S_URGENT_ENABLED: + urgent_enabled = atoi(value); + break; case SWM_S_FOCUS_MODE: if (!strcmp(value, "default")) focus_mode = SWM_FOCUS_DEFAULT; @@ -4531,7 +4586,7 @@ setconfvalue(char *selector, char *value, int flags) break; case SWM_S_VERBOSE_LAYOUT: verbose_layout = atoi(value); - for (i=0; layouts[i].l_stack != NULL; i++) { + for (i = 0; layouts[i].l_stack != NULL; i++) { if (verbose_layout) layouts[i].l_string = fancy_stacker; else @@ -4738,6 +4793,7 @@ struct config_option configopt[] = { { "screenshot_enabled", setconfvalue, SWM_S_SS_ENABLED }, { "screenshot_app", setconfvalue, SWM_S_SS_APP }, { "window_name_enabled", setconfvalue, SWM_S_WINDOW_NAME_ENABLED }, + { "urgent_enabled", setconfvalue, SWM_S_URGENT_ENABLED }, { "term_width", setconfvalue, SWM_S_TERM_WIDTH }, { "title_class_enabled", setconfvalue, SWM_S_TITLE_CLASS_ENABLED }, { "title_name_enabled", setconfvalue, SWM_S_TITLE_NAME_ENABLED }, @@ -4933,7 +4989,7 @@ tryharder: if (prop == NULL) return (0); - ret = strtonum(prop, 0, UINT_MAX, &errstr); + ret = strtonum((const char *)prop, 0, UINT_MAX, &errstr); /* ignore error because strtonum returns 0 anyway */ XFree(prop); @@ -5027,7 +5083,7 @@ manage_window(Window id) p = NULL; } else if (prop && win->transient == 0) { DNPRINTF(SWM_D_PROP, "got property _SWM_WS=%s\n", prop); - ws_idx = strtonum(prop, 0, 9, &errstr); + ws_idx = strtonum((const char *)prop, 0, 9, &errstr); if (errstr) { DNPRINTF(SWM_D_EVENT, "window idx is %s: %s", errstr, prop); @@ -5068,7 +5124,8 @@ manage_window(Window id) /* Set window properties so we can remember this after reincarnation */ if (ws_idx_atom && prop == NULL && - snprintf(ws_idx_str, SWM_PROPLEN, "%d", ws->idx) < SWM_PROPLEN) { + snprintf((char *)ws_idx_str, SWM_PROPLEN, "%d", ws->idx) < + SWM_PROPLEN) { DNPRINTF(SWM_D_PROP, "setting property _SWM_WS to %s\n", ws_idx_str); XChangeProperty(display, win->id, ws_idx_atom, XA_STRING, 8, @@ -6155,7 +6212,6 @@ main(int argc, char *argv[]) setup_ewmh(); /* set some values to work around bad programs */ workaround(); - /* grab existing windows (before we build the bars) */ grab_windows();