diff options
Diffstat (limited to 'src')
-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 |
6 files changed, 70 insertions, 9 deletions
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, |