* looking for address@hidden/ratpoison--xinerama--1.3--patch-9 to compare with * comparing to address@hidden/ratpoison--xinerama--1.3--patch-9 M ratpoison/src/actions.c M ratpoison/src/actions.h * modified files --- orig/ratpoison/src/actions.c +++ mod/ratpoison/src/actions.c @@ -92,6 +92,7 @@ {"fselect", cmd_fselect, arg_VOID}, {"fdump", cmd_fdump, arg_STRING}, {"frestore", cmd_frestore, arg_STRING}, + {"scrselect", cmd_scrselect, arg_STRING}, {"screens", cmd_screens, arg_STRING}, {"verbexec", cmd_verbexec, arg_STRING}, {"unmanage", cmd_unmanage, arg_STRING}, @@ -1564,6 +1565,95 @@ } char * +cmd_scrselect (int interactive, char *data) +{ + int new_screen; + + if (interactive) { + /* stolen shameless from cmd_fselect() */ + KeySym c; + unsigned int mod; + Window *wins; + XSetWindowAttributes attr; + int i; + + wins = xmalloc(sizeof(Window) * num_screens); + + for (i=0; ifg_color; + attr.background_pixel = s->bg_color; + attr.override_redirect = True; + + numbuf = xsprintf(" %d ", i); + width = 2*defaults.bar_x_padding + + XTextWidth(defaults.font, numbuf, + strlen(numbuf)); + height = 2*defaults.bar_y_padding + + (FONT_HEIGHT(defaults.font)); + + wins[i] = XCreateWindow(dpy, s->root, s->left, s->top, + width, height, 1, + CopyFromParent, CopyFromParent, + CopyFromParent, + CWOverrideRedirect | CWBorderPixel | CWBackPixel, + &attr); + XMapWindow(dpy, wins[i]); + XClearWindow(dpy, wins[i]); + + /* Display the number in the window */ + XDrawString(dpy, wins[i], s->normal_gc, + defaults.bar_x_padding, + defaults.bar_y_padding + defaults.font->max_bounds.ascent, + numbuf, strlen(numbuf)); + free(numbuf); + } + XSync(dpy, False); + + + /* Read a key. */ + XGrabKeyboard (dpy, current_screen()->key_window, False, GrabModeSync, GrabModeAsync, CurrentTime); + read_key (&c, &mod, NULL, 0); + XUngrabKeyboard (dpy, CurrentTime); + + /* Destroy our number windows and free the array. */ + for (i=0; i= XK_0 && c <= XK_9) + new_screen = c - XK_0; + else + return NULL; + + } else { + if (data == NULL) { + message(" scrselect: would like precisely one argument "); + return NULL; + } + if (sscanf(data, "%d", &new_screen) != 1) { + message(" scrselect: would like an integer argument "); + } + } + + if (new_screen >= num_screens || new_screen < 0) { + char *errmsg = xsprintf(" scrselect: no such screen %d ", new_screen); + message(errmsg); + free(errmsg); + return NULL; + } + + set_active_frame (screen_get_frame (&screens[new_screen], screens[new_screen].current_frame)); + return NULL; +} + +char * cmd_screens (int interactively, char *data) { struct sbuf *s; --- orig/ratpoison/src/actions.h +++ mod/ratpoison/src/actions.h @@ -71,6 +71,7 @@ char *cmd_escape (int interactive, char *data); char *cmd_exec (int interactive, char *data); char *cmd_fdump (int interactively, char *data); +char *cmd_scrselect (int interactively, char *data); char *cmd_screens (int interactively, char *data); char *cmd_focusdown (int interactive, char *data); char *cmd_focuslast (int interactive, char *data);