summaryrefslogtreecommitdiff
path: root/src/actions.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/actions.c')
-rw-r--r--src/actions.c395
1 files changed, 180 insertions, 215 deletions
diff --git a/src/actions.c b/src/actions.c
index 1240c3a..346e140 100644
--- a/src/actions.c
+++ b/src/actions.c
@@ -45,41 +45,22 @@ rp_action key_actions[] =
{XK_g, C, "abort", command},
- {XK_0, 0, "number 0", command},
- {XK_0, C, "number 0", command},
-
- {XK_1, 0, "number 1", command},
- {XK_1, C, "number 1", command},
-
- {XK_2, 0, "number 2", command},
- {XK_2, C, "number 2", command},
-
- {XK_3, 0, "number 3", command},
- {XK_3, C, "number 3", command},
-
- {XK_4, 0, "number 4", command},
- {XK_4, C, "number 4", command},
-
- {XK_5, 0, "number 5", command},
- {XK_5, C, "number 5", command},
-
- {XK_6, 0, "number 6", command},
- {XK_6, C, "number 6", command},
-
- {XK_7, 0, "number 7", command},
- {XK_7, C, "number 7", command},
-
- {XK_8, 0, "number 8", command},
- {XK_8, C, "number 8", command},
-
- {XK_9, 0, "number 9", command},
- {XK_9, C, "number 9", command},
+ {XK_0, 0, "select 0", command},
+ {XK_1, 0, "select 1", command},
+ {XK_2, 0, "select 2", command},
+ {XK_3, 0, "select 3", command},
+ {XK_4, 0, "select 4", command},
+ {XK_5, 0, "select 5", command},
+ {XK_6, 0, "select 6", command},
+ {XK_7, 0, "select 7", command},
+ {XK_8, 0, "select 8", command},
+ {XK_9, 0, "select 9", command},
{XK_A, 0, "title", command},
{XK_A, C, "title", command},
- {XK_K, 0, "kill", command},
- {XK_K, C, "kill", command},
+ {XK_K, 0, "kill", command},
+ {XK_K, C, "kill", command},
{XK_Return, 0, "next", command},
{XK_Return, C, "next", command},
@@ -96,19 +77,19 @@ rp_action key_actions[] =
{XK_e, C, "exec " EMACS_PROG, command},
{XK_exclam, 0, "exec", command},
- {XK_exclam, C, "xterm", command},
+ {XK_exclam, C, "colon exec " TERM_PROG " -e ", command},
- {XK_k, 0, "delete", command},
- {XK_k, C, "delete", command},
+ {XK_k, 0, "delete", command},
+ {XK_k, C, "delete", command},
{XK_m, 0, "maximize", command},
{XK_m, C, "maximize", command},
- {XK_n, 0, "next", command},
- {XK_n, C, "next", command},
+ {XK_n, 0, "next", command},
+ {XK_n, C, "next", command},
- {XK_p, 0, "prev", command},
- {XK_p, C, "prev", command},
+ {XK_p, 0, "prev", command},
+ {XK_p, C, "prev", command},
{XK_quoteright, 0, "select", command},
{XK_quoteright, C, "select", command},
@@ -124,29 +105,61 @@ rp_action key_actions[] =
{0, 0, 0, 0 } };
user_command user_commands[] =
- { {"abort", abort_keypress, arg_VOID},
- {"next", next_window, arg_VOID},
- {"prev", prev_window, arg_VOID},
- {"exec", shell_command, arg_STRING},
- {"xterm", xterm_command, arg_STRING},
- {"number", goto_window_number, arg_NUMBER},
- {"select", goto_win_by_name, arg_STRING},
- {"colon", command, arg_STRING},
- {"kill", kill_window, arg_VOID},
- {"delete", delete_window, arg_VOID},
- {"other", last_window, arg_VOID},
- {"windows", toggle_bar, arg_VOID},
- {"title", rename_current_window, arg_STRING},
- {"clock", show_clock, arg_VOID},
+ { {"abort", cmd_abort, arg_VOID},
+ {"next", cmd_next, arg_VOID},
+ {"prev", cmd_prev, arg_VOID},
+ {"exec", cmd_exec, arg_STRING},
+ {"select", cmd_select, arg_STRING},
+ {"colon", cmd_colon, arg_STRING},
+ {"kill", cmd_kill, arg_VOID},
+ {"delete", cmd_delete, arg_VOID},
+ {"other", cmd_other, arg_VOID},
+ {"windows", cmd_windows, arg_VOID},
+ {"title", cmd_rename, arg_STRING},
+ {"clock", cmd_clock, arg_VOID},
{"maximize", maximize, arg_VOID},
- {"newwm", switch_to, arg_STRING},
- {"generate", generate_key_event, arg_STRING},
- {"version", show_version, arg_VOID},
- {0, 0, 0} };
+ {"newwm", cmd_newwm, arg_STRING},
+ {"generate", cmd_generate, arg_STRING}, /* rename to stuff */
+ {"version", cmd_version, arg_VOID},
+
+ /* the following screen commands may or may not be able to be
+ implemented. See the screen documentation for what should be
+ emulated with these commands */
+
+ {"echo", cmd_unimplemented, arg_VOID},
+ {"stuff", cmd_unimplemented, arg_VOID},
+ {"number", cmd_unimplemented, arg_VOID},
+ {"hardcopy", cmd_unimplemented, arg_VOID},
+ {"help", cmd_unimplemented, arg_VOID},
+ {"lastmsg", cmd_unimplemented, arg_VOID},
+ {"license", cmd_unimplemented, arg_VOID},
+ {"lockscreen", cmd_unimplemented, arg_VOID},
+ {"meta", cmd_unimplemented, arg_VOID},
+ {"msgwait", cmd_unimplemented, arg_VOID},
+ {"msgminwait", cmd_unimplemented, arg_VOID},
+ {"nethack", cmd_unimplemented, arg_VOID},
+ {"quit", cmd_unimplemented, arg_VOID},
+ {"redisplay", cmd_unimplemented, arg_VOID},
+ {"screen", cmd_unimplemented, arg_VOID},
+ {"setenv", cmd_unimplemented, arg_VOID},
+ {"shell", cmd_unimplemented, arg_VOID},
+ {"shelltitle", cmd_unimplemented, arg_VOID},
+ {"sleep", cmd_unimplemented, arg_VOID},
+ {"sorendition", cmd_unimplemented, arg_VOID},
+ {"split", cmd_unimplemented, arg_VOID},
+ {"focus", cmd_unimplemented, arg_VOID},
+ {"startup_message", cmd_unimplemented, arg_VOID},
+ {0, 0, 0} };
void
-generate_key_event (void *data)
+cmd_unimplemented (void *data)
+{
+ marked_message (" FIXME: unimplemented command ",0,8);
+}
+
+void
+cmd_generate (void *data)
{
XEvent ev1, ev;
ev = *rp_current_event;
@@ -183,7 +196,7 @@ generate_key_event (void *data)
/* ev1.xkey.y_root == */
ev1.xkey.state = 0;
- ev1.xkey.keycode = XKeysymToKeycode (dpy, 's');
+ ev1.xkey.keycode = XKeysymToKeycode (dpy, KEY_PREFIX);
XSendEvent (dpy, rp_current_window->w, False, KeyPressMask, &ev1);
@@ -193,96 +206,106 @@ generate_key_event (void *data)
}
void
-prev_window (void *data)
+cmd_prev (void *data)
{
- rp_window *new_win = (rp_window *)data;
+ rp_window *w;
- if (new_win == NULL) new_win = rp_current_window;
- if (new_win != NULL)
+ if (!rp_current_window)
+ message (MESSAGE_NO_MANAGED_WINDOWS);
+ else
{
- new_win = new_win->prev;
- if (new_win == NULL)
- new_win = rp_window_tail;
- if (new_win->state == STATE_UNMAPPED)
- prev_window (new_win);
+ w = find_window_prev (rp_current_window);
+
+ if (w == rp_current_window)
+ message (MESSAGE_NO_OTHER_WINDOW);
else
- {
- if (rp_current_window == new_win)
- message (MESSAGE_NO_OTHER_WINDOW, 0, 0);
- else
- set_active_window (new_win);
- }
- }
- else
- {
- message (MESSAGE_NO_MANAGED_WINDOWS, 0, 0);
+ set_active_window (w);
}
}
-
void
-next_window (void *data)
+cmd_next (void *data)
{
- rp_window *new_win = (rp_window *)data;
+ rp_window *w;
- if (new_win == NULL) new_win = rp_current_window;
- if (new_win != NULL)
+ if (!rp_current_window)
+ message (MESSAGE_NO_MANAGED_WINDOWS);
+ else
{
- new_win = new_win->next;
- if (new_win == NULL)
- new_win = rp_window_head;
- if (new_win->state == STATE_UNMAPPED)
- next_window (new_win);
+ w = find_window_next (rp_current_window);
+
+ if (w == rp_current_window)
+ message (MESSAGE_NO_OTHER_WINDOW);
else
- {
- if (rp_current_window == new_win)
- message (MESSAGE_NO_OTHER_WINDOW, 0, 0);
- else
- set_active_window (new_win);
- }
- }
- else
- {
- message (MESSAGE_NO_MANAGED_WINDOWS, 0, 0);
+ set_active_window (w);
}
}
-
-void
-last_window (void *data)
+void
+cmd_other (void *data)
{
- rp_window *oldwin = rp_current_window;
+ rp_window *w;
+
+ w = find_window_other ();
- /* what happens if find_last_accessed_window() returns something
- funky? (rcy) */
- set_active_window (find_last_accessed_window ());
+ if (w == rp_current_window)
+ message (MESSAGE_NO_OTHER_WINDOW);
+ else
+ set_active_window (w);
+}
+
+static int
+string_to_window_number (str)
+char *str;
+{
+ int i;
+ char *s;
- if (rp_current_window == oldwin)
+ for (i = 0, s = str; *s; s++)
{
- message (MESSAGE_NO_OTHER_WINDOW, 0, 0);
+ if (*s < '0' || *s > '9')
+ break;
+ i = i * 10 + (*s - '0');
}
+ return *s ? -1 : i;
}
-
+/* switch to window number or name */
void
-goto_win_by_name (void *data)
+cmd_select (void *data)
{
- char *winname;
-
- if (rp_current_window == NULL) return;
+ char *str;
+ int n;
+ rp_window *w;
if (data == NULL)
- winname = get_input (MESSAGE_PROMPT_GOTO_WINDOW_NAME);
+ str = get_input (MESSAGE_PROMPT_SWITCH_TO_WINDOW);
else
- winname = strdup ((char *) data);
+ str = strdup ((char *) data);
- goto_window_name (winname);
+ /* try by number */
+ if ((n = string_to_window_number (str)) >= 0)
+ {
+ if ((w = find_window_number (n)))
+ set_active_window (w);
+ else
+ message ("no window by that number (FIXME: show window list)");
+ }
+ else
+ /* try by name */
+ {
+ if ((w = find_window_name (str)))
+ set_active_window (w);
+ else
+ /* we need to format a string that includes the str */
+ message ("MESSAGE_NO_WINDOW_NAMED (FIXME:)");
+ }
- free (winname);
+ free (str);
}
void
-rename_current_window (void *data)
+cmd_rename (void *data)
{
char *winname;
@@ -316,7 +339,7 @@ rename_current_window (void *data)
void
-delete_window (void *data)
+cmd_delete (void *data)
{
XEvent ev;
int status;
@@ -335,7 +358,7 @@ delete_window (void *data)
}
void
-kill_window (void *data)
+cmd_kill (void *data)
{
if (rp_current_window == NULL) return;
@@ -343,36 +366,30 @@ kill_window (void *data)
}
void
-show_version (void *data)
+cmd_version (void *data)
{
- message (" " PACKAGE " " VERSION " ", 0, 0);
+ message (" " PACKAGE " " VERSION " ");
}
-void
+void
command (void *data)
{
- char *input;
char *cmd, *rest;
- void *arg;
+ char *input;
user_command *uc;
struct sbuf *buf = NULL;
if (data == NULL)
- input = get_input (MESSAGE_PROMPT_COMMAND);
- else
- input = strdup ((char *) data);
-
- if (input == NULL)
return;
+ /* get a writable copy for strtok() */
+ input = strdup ((char *) data);
+
cmd = strtok (input, " ");
if (cmd == NULL)
- {
- free (input);
- return;
- }
+ goto done;
rest = strtok (NULL, "\0");
@@ -383,82 +400,54 @@ command (void *data)
{
if (!strcmp (cmd, uc->name))
{
- /* create an arg out of the rest */
- switch (uc->argtype)
- {
- case arg_VOID:
- arg = NULL;
- break;
-
- case arg_STRING:
- arg = rest;
- break;
-
- case arg_NUMBER:
- if (rest)
- sscanf (rest, "%d", (int*)&arg);
- else
- arg = 0;
- break;
-
- default:
- abort ();
- }
-
- uc->func (arg);
-
- free (input);
- return;
+ uc->func (rest);
+ goto done;
}
}
/* couldnt find the command name */
-
buf = sbuf_new (strlen(MESSAGE_UNKNOWN_COMMAND + strlen (cmd) + 4));
sbuf_copy (buf, MESSAGE_UNKNOWN_COMMAND);
sbuf_concat (buf, "'");
sbuf_concat (buf, cmd);
sbuf_concat (buf, "' ");
- message (sbuf_get (buf), 0, 0);
+ message (sbuf_get (buf));
sbuf_free (buf);
+ done:
free (input);
}
void
-shell_command (void *data)
+cmd_colon (void *data)
{
- char *cmd;
+ char *input;
if (data == NULL)
- cmd = get_input (MESSAGE_PROMPT_SHELL_COMMAND);
+ input = get_input (MESSAGE_PROMPT_COMMAND);
else
- cmd = strdup ((char *) data);
-
- spawn (cmd);
+ input = get_more_input (MESSAGE_PROMPT_COMMAND, data);
- free (cmd);
+ command (input);
+
+ free (input);
}
void
-xterm_command (void *data)
+cmd_exec (void *data)
{
- char *cmd, *realcmd;
+ char *cmd;
if (data == NULL)
- cmd = get_input (MESSAGE_PROMPT_XTERM_COMMAND);
+ cmd = get_input (MESSAGE_PROMPT_SHELL_COMMAND);
else
cmd = strdup ((char *) data);
- realcmd = (char *) malloc (strlen (cmd) + strlen (TERM_PROG) + 5);
-
- sprintf(realcmd, "%s -e %s", TERM_PROG, cmd);
- spawn (realcmd);
+ spawn (cmd);
- free(cmd);
- free(realcmd);
+ free (cmd);
}
@@ -489,7 +478,7 @@ spawn(void *data)
/* Switch to a different Window Manager. Thanks to
"Chr. v. Stuckrad" <stucki@math.fu-berlin.de> for the patch. */
void
-switch_to(void *data)
+cmd_newwm(void *data)
{
char *prog;
@@ -522,7 +511,7 @@ switch_to(void *data)
/* Show the current time on the bar. Thanks to
Martin Samuelsson <cosis@lysator.liu.se> for the patch. */
void
-show_clock (void *data)
+cmd_clock (void *data)
{
screen_info *s;
char *msg;
@@ -548,39 +537,15 @@ show_clock (void *data)
if (rp_current_window)
{
s = rp_current_window->scr;
- message (msg, 0, 0);
+ message (msg);
}
free(msg);
}
-void
-goto_window_number (void *data)
-{
- int n = (int)data;
- rp_window *win;
-
- win = find_window_by_number (n);
-
- if (win == NULL)
- {
- /* Display window list to indicate failure. */
- /* FIXME: We can always assume there is 1 screen, but which one
- is the active one? Need to test on multi-screen x-servers. */
- show_bar (&screens[0]);
- return;
- }
-
- if (win == rp_current_window)
- {
- /* TODO: Add message "This IS window # (xxx) */
- }
-
- set_active_window (win);
-}
/* Toggle the display of the program bar */
void
-toggle_bar (void *data)
+cmd_windows (void *data)
{
screen_info *s;
@@ -594,22 +559,22 @@ toggle_bar (void *data)
void
-abort_keypress (void *data)
+cmd_abort (void *data)
{
}
/* Send the current window the prefix key event */
-void
-generate_prefix (void *data)
-{
- XEvent ev;
- ev = *rp_current_event;
+/* void */
+/* cmd_generate_prefix (void *data) */
+/* { */
+/* XEvent ev; */
+/* ev = *rp_current_event; */
- ev.xkey.window = rp_current_window->w;
- ev.xkey.state = MODIFIER_PREFIX;
- XSendEvent (dpy, rp_current_window->w, False, KeyPressMask, &ev);
- XSync (dpy, False);
-}
+/* ev.xkey.window = rp_current_window->w; */
+/* ev.xkey.state = MODIFIER_PREFIX; */
+/* XSendEvent (dpy, rp_current_window->w, False, KeyPressMask, &ev); */
+/* XSync (dpy, False); */
+/* } */
/* Set a transient window's x,y,width,height fields to maximize the
window. */