diff options
-rw-r--r-- | ChangeLog | 17 | ||||
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | doc/ratpoison.texi | 5 | ||||
-rw-r--r-- | src/actions.c | 60 | ||||
-rw-r--r-- | src/actions.h | 1 | ||||
-rw-r--r-- | src/bar.c | 8 | ||||
-rw-r--r-- | src/conf.h | 3 | ||||
-rw-r--r-- | src/input.c | 4 | ||||
-rw-r--r-- | src/split.c | 3 |
9 files changed, 96 insertions, 9 deletions
@@ -1,5 +1,22 @@ 2001-10-18 shawn <sabetts@vcn.bc.ca> + * src/split.c (show_frame_indicator): call XSync after clearing the window. + + * src/input.c (get_more_input): clear the window after it is + raised. Call XSync aftwards. + + * src/conf.h (MAX_LINK_DEPTH): new define + + * src/bar.c (marked_message): clear the window after it is + raised. Call XSync aftwards. + + * src/actions.h (cmd_link): new prototype + + * src/actions.c (user_command): new command 'link' + (find_command_by_keydesc): new function + (resolve_command_from_keydesc): likewise + (cmd_link): likewise + * src/split.h (find_last_frame): new prototype * src/split.c (update_last_access): new function @@ -1,6 +1,10 @@ ratpoison NEWS --- history of user-visible changes. -*- outline -*- * Changes since 1.0.0 +** new command "link" +Call the command that a keybinding is bound to. for instance, 'link +C-t' would call the command 'other'. + ** new command "focuslast" Switch between the current frame and the last focused frame. It is bound to C-t M-Tab. diff --git a/doc/ratpoison.texi b/doc/ratpoison.texi index 2b3efbe..94c8dac 100644 --- a/doc/ratpoison.texi +++ b/doc/ratpoison.texi @@ -491,6 +491,11 @@ misbehaving window this command should do the trick. Also available as @item lastmsg Display the last message. +@item link @var{key} +Call the command that @var{key} is bound to. For instance +@command{link C-t} would call the command @command{other} and switch +to the last window. + @item redisplay Redisplay the current window, just like @kbd{C-t l} would do. diff --git a/src/actions.c b/src/actions.c index 3f10ffe..0efc8c3 100644 --- a/src/actions.c +++ b/src/actions.c @@ -77,6 +77,7 @@ static user_command user_commands[] = {"lastmsg", cmd_lastmsg, arg_VOID}, {"restart", cmd_restart, arg_VOID}, {"startup_message", cmd_startup_message, arg_STRING}, + {"link", cmd_link, arg_STRING}, /* Commands to set default behavior. */ {"defbarloc", cmd_defbarloc, arg_STRING}, @@ -139,6 +140,46 @@ find_keybinding (KeySym keysym, int state) return NULL; } +static char * +find_command_by_keydesc (char *desc) +{ + int i = 0; + char *keysym_name; + + while (i < key_actions_last) + { + keysym_name = keysym_to_string (key_actions[i].key, key_actions[i].state); + if (!strcmp (keysym_name, desc)) + { + free (keysym_name); + return key_actions[i].data; + } + free (keysym_name); + i++; + } + + return NULL; +} + +static char * +resolve_command_from_keydesc (char *desc, int depth) +{ + char *cmd, *command; + + command = find_command_by_keydesc (desc); + if (!command) + return NULL; + + /* is it a link? */ + if (strncmp (command, "link", 4) || depth > MAX_LINK_DEPTH) + /* it is not */ + return command; + + cmd = resolve_command_from_keydesc (&command[5], depth + 1); + return (cmd != NULL) ? cmd : command; +} + + static void add_keybinding (KeySym keysym, int state, char *cmd) { @@ -1227,9 +1268,7 @@ cmd_help (int interactive, void *data) keysym_name, strlen (keysym_name)); if (XTextWidth (defaults.font, keysym_name, strlen (keysym_name)) > max_width) - { - max_width = XTextWidth (defaults.font, keysym_name, strlen (keysym_name)); - } + max_width = XTextWidth (defaults.font, keysym_name, strlen (keysym_name)); free (keysym_name); } @@ -1938,3 +1977,18 @@ cmd_focuslast (int interactive, void *data) return NULL; } + +char * +cmd_link (int interactive, void *data) +{ + char *cmd = NULL; + + if (!data) + return NULL; + + cmd = resolve_command_from_keydesc ((char *)data, 0); + if (cmd) + return command (interactive, cmd); + + return NULL; +} diff --git a/src/actions.h b/src/actions.h index c675374..04175e8 100644 --- a/src/actions.h +++ b/src/actions.h @@ -102,6 +102,7 @@ char * cmd_focusright (int interactive, void *data); char * cmd_restart (int interactive, void *data); char * cmd_startup_message (int interactive, void *data); char * cmd_focuslast (int interactive, void *data); +char * cmd_link (int interactive, void *data); /* void cmd_xterm (void *data); */ @@ -186,15 +186,15 @@ marked_message (char *msg, int mark_start, int mark_end) width, height); - XClearWindow (dpy, s->bar_window); XRaiseWindow (dpy, s->bar_window); - + XClearWindow (dpy, s->bar_window); + XSync (dpy, False); XDrawString (dpy, s->bar_window, s->normal_gc, defaults.bar_x_padding, defaults.bar_y_padding + defaults.font->max_bounds.ascent, msg, strlen (msg)); - - + XSync (dpy, False); + /* Crop to boundary conditions. */ if (mark_start < 0) mark_start = 0; @@ -47,4 +47,7 @@ mostly for use with hand-helds. */ #define UNMANAGED_WINDOW_LIST "xapm","xclock","xscribble" +/* Maximum depth of a link. Used in the 'link' command. */ +#define MAX_LINK_DEPTH 16 + #endif /* !_ _RATPOISON_CONF_H */ diff --git a/src/input.c b/src/input.c index cf8e833..9c6c14b 100644 --- a/src/input.c +++ b/src/input.c @@ -281,6 +281,7 @@ update_input_window (screen_info *s, char *prompt, char *input, int input_len) (FONT_HEIGHT (defaults.font) + defaults.bar_y_padding * 2)); XClearWindow (dpy, s->input_window); + XSync (dpy, False); XDrawString (dpy, s->input_window, s->normal_gc, defaults.bar_x_padding, @@ -333,8 +334,9 @@ get_more_input (char *prompt, char *preinput) hide_bar (s); XMapWindow (dpy, s->input_window); - XClearWindow (dpy, s->input_window); XRaiseWindow (dpy, s->input_window); + XClearWindow (dpy, s->input_window); + XSync (dpy, False); update_input_window (s, prompt, str, cur_len); diff --git a/src/split.c b/src/split.c index 2090b53..f63412d 100644 --- a/src/split.c +++ b/src/split.c @@ -630,8 +630,9 @@ show_frame_indicator () width, height); XMapRaised (dpy, current_screen()->frame_window); - XClearWindow (dpy, s->frame_window); + XSync (dpy, False); + XDrawString (dpy, s->frame_window, s->normal_gc, defaults.bar_x_padding, defaults.bar_y_padding + defaults.font->max_bounds.ascent, |