diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | NEWS | 3 | ||||
-rw-r--r-- | src/actions.c | 78 | ||||
-rw-r--r-- | src/actions.h | 1 | ||||
-rw-r--r-- | src/data.h | 2 | ||||
-rw-r--r-- | src/main.c | 1 |
6 files changed, 91 insertions, 8 deletions
@@ -1,3 +1,17 @@ +2004-04-03 Shawn Betts <sabetts@vcn.bc.ca> + + * src/main.c (init_defaults): init frame_selectors. + + * src/data.h (struct rp_defaults): new field, frame_selectors. + + * src/actions.h (cmd_defframesels): new prototype + + * src/actions.c (user_commands): new command defframesels + (frame_selector): new function + (frame_selector_match): likewise + (cmd_defframesels): likewise + (cmd_fselect): use default.frame_selectors to select a frame. + 2004-03-01 Shawn Betts <sabetts@vcn.bc.ca> * configure.in: fix check for Xinerama.h @@ -1,6 +1,9 @@ ratpoison NEWS --- history of user-visible changes. -*- outline -*- * Changes since 1.3.0-rc2 +** new command defframesels +Allow you to customize the keys used to select frames with fselect. + ** Xinerama support Each xinerama screen is handled as X11 screens normally are. The only different is that each xinerama screen can select from all the diff --git a/src/actions.c b/src/actions.c index 1f0b501..23413fb 100644 --- a/src/actions.c +++ b/src/actions.c @@ -131,6 +131,7 @@ static user_command user_commands[] = {"defbarpadding", cmd_defbarpadding, arg_STRING}, {"defresizeunit", cmd_defresizeunit, arg_STRING}, {"defwinliststyle", cmd_defwinliststyle, arg_STRING}, + {"defframesels", cmd_defframesels, arg_STRING}, /*@end (tag required for genrpbindings) */ /* Commands to help debug ratpoison. */ @@ -3265,6 +3266,45 @@ cmd_tmpwm (int interactive, char *data) return NULL; } +/* Return a new string with the frame selector or it as a string if no + selector exists for the number. */ +static char * +frame_selector (int n) +{ + if (n < strlen (defaults.frame_selectors)) + { + return xsprintf (" %c ", defaults.frame_selectors[n]); + } + else + { + return xsprintf (" %d ", n); + } +} + +/* Return true if ch is nth frame selector. */ +static int +frame_selector_match (char ch) +{ + int i; + + /* Is it in the frame selector string? */ + for (i=0; i<strlen (defaults.frame_selectors); i++) + { + if (ch == defaults.frame_selectors[i]) + return i; + } + + /* Maybe it's a number less than 9 and the frame selector doesn't + define that many selectors. */ + if (ch >= '0' && ch <= '9' + && ch - '0' >= strlen (defaults.frame_selectors)) + { + return ch - '0'; + } + + return -1; +} + /* Select a frame by number. */ char * cmd_fselect (int interactive, char *data) @@ -3297,6 +3337,8 @@ cmd_fselect (int interactive, char *data) else { KeySym c; + char keysym_buf[513]; + int keysym_bufsize = sizeof (keysym_buf); unsigned int mod; Window *wins; int i, j; @@ -3329,7 +3371,8 @@ cmd_fselect (int interactive, char *data) /* Create the string to be displayed in the window and determine the height and width of the window. */ - num = xsprintf (" %d ", cur->number); +/* num = xsprintf (" %d ", cur->number); */ + num = frame_selector (cur->number); width = defaults.bar_x_padding * 2 + XTextWidth (defaults.font, num, strlen (num)); height = (FONT_HEIGHT (defaults.font) + defaults.bar_y_padding * 2); @@ -3355,7 +3398,7 @@ cmd_fselect (int interactive, char *data) /* Read a key. */ XGrabKeyboard (dpy, current_screen()->key_window, False, GrabModeSync, GrabModeAsync, CurrentTime); - read_key (&c, &mod, NULL, 0); + read_key (&c, &mod, keysym_buf, keysym_bufsize); XUngrabKeyboard (dpy, CurrentTime); /* Destroy our number windows and free the array. */ @@ -3364,12 +3407,17 @@ cmd_fselect (int interactive, char *data) free (wins); - /* FIXME: big assumption here. We don't know for sure if all the - number keys are between XK_0 and XK_9. */ - if (c >= XK_0 && c <= XK_9) - fnum = c - XK_0; - else - return NULL; + /* FIXME: We only handle one character long keysym names. */ + if (strlen (keysym_buf) == 1) + { + fnum = frame_selector_match (keysym_buf[0]); + if (fnum == -1) + return NULL; + } + else + { + return NULL; + } } /* Now that we have a frame number to go to, let's try to jump to @@ -4096,3 +4144,17 @@ cmd_delkmap (int interactive, char *data) return NULL; } + +char * +cmd_defframesels (int interactive, char *data) +{ + if (data == NULL) + { + marked_message_printf (0, 0, " %s ", defaults.frame_selectors); + return NULL; + } + + free (defaults.frame_selectors); + defaults.frame_selectors = xstrdup (data); + return NULL; +} diff --git a/src/actions.h b/src/actions.h index 2063cc6..064de4c 100644 --- a/src/actions.h +++ b/src/actions.h @@ -140,6 +140,7 @@ char *cmd_readkey (int interactive, char *data); char *cmd_newkmap (int interactive, char *data); char *cmd_delkmap (int interactive, char *data); char *cmd_definekey (int interactive, char *data); +char *cmd_defframesels (int interactive, char *data); rp_keymap *find_keymap (char *name); void initialize_default_keybindings (void); @@ -231,6 +231,8 @@ struct rp_defaults int warp; int history_size; + + char *frame_selectors; }; /* Information about a child process. */ @@ -494,6 +494,7 @@ init_defaults () defaults.window_list_style = STYLE_ROW; defaults.history_size = 20; + defaults.frame_selectors = xstrdup (""); } int |