diff options
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | conf.h | 2 | ||||
-rw-r--r-- | data.h | 2 | ||||
-rw-r--r-- | events.c | 21 | ||||
-rw-r--r-- | list.c | 41 | ||||
-rw-r--r-- | list.h | 1 | ||||
-rw-r--r-- | main.c | 4 | ||||
-rw-r--r-- | manage.c | 5 | ||||
-rw-r--r-- | ratpoison.h | 1 |
9 files changed, 75 insertions, 6 deletions
@@ -10,8 +10,8 @@ LIBS = -lX11 LDFLAGS = -L/usr/X11R6/lib CFLAGS = -g -Wall -I/usr/X11R6/include -SRC = main.o events.o manage.o list.o bar.o number.o -HEADERS = bar.h conf.h data.h events.h list.h manage.h ratpoison.h number.h +SRC = main.o events.o manage.o list.o bar.o number.o input.o +HEADERS = bar.h conf.h data.h events.h list.h manage.h ratpoison.h number.h input.h all: ratpoison ratpoison.info @@ -27,6 +27,7 @@ #define KEY_LASTWINDOW 't' /* key to toggle between the current window and the last visitted one */ #define KEY_TOGGLEBAR 'w' /* key to toggle the display of the program bar */ #define KEY_DELETE 'k' /* delete a window SHIFT+key will Destroy the window */ +#define KEY_WINBYNAME '\'' /* key to jump to a window by name */ #define TERM_PROG "rxvt" /* command to boot an xterm */ #define EMACS_PROG "emacs" /* command to boot emacs */ @@ -39,3 +40,4 @@ #define BAR_PADDING 3 /* The amount of padding on the top and bottom of the program bar */ #define BAR_LOCATION 3 /* 0=bottom-left 1=top-left 2=bottom-right 3=top-right */ #define BAR_TIMEOUT 5 /* Number of seconds before the progam bar autohides 0=don't autohide */ + @@ -49,7 +49,7 @@ struct screen_info GC bold_gc; XFontStruct *font; /* The font we want to use. */ XWindowAttributes root_attr; - Window root, bar_window, key_window; + Window root, bar_window, key_window, input_window; int bar_is_raised; int screen_num; /* Our screen number as dictated my X */ Colormap def_cmap; @@ -64,7 +64,8 @@ new_window (XCreateWindowEvent *e) s = find_screen (e->parent); win = find_window (e->window); - if (s && !win && e->window != s->key_window && e->window != s->bar_window) + if (s && !win && e->window != s->key_window && e->window != s->bar_window + && e->window != s->input_window) { win = add_to_window_list (s, e->window); win->state = STATE_UNMAPPED; @@ -82,6 +83,10 @@ unmap_notify (XEvent *ev) if (s && win) { + /* Give back the window number. the window will get another one, + if it in remapped. */ + return_window_number (win->number); + win->number = -1; win->state = STATE_UNMAPPED; update_window_names (s); } @@ -241,6 +246,17 @@ client_msg (XClientMessageEvent *ev) } static void +goto_win_by_name (screen_info *s) +{ + char winname[100]; + + get_input (s, "Window: ", winname, 100); + printf ("user entered: %s\n", winname); + + goto_window_name (winname); +} + +static void handle_key (screen_info *s) { int revert; @@ -293,6 +309,9 @@ handle_key (screen_info *s) case KEY_LASTWINDOW: last_window (); break; + case KEY_WINBYNAME: + goto_win_by_name (s); + break; case KEY_DELETE: if (ev.xkey.state & ShiftMask) kill_window (); else delete_window (); @@ -19,6 +19,8 @@ #include <stdio.h> #include <stdlib.h> +#include <string.h> +#include <ctype.h> #include "ratpoison.h" @@ -155,6 +157,45 @@ find_window_by_number (int n) return NULL; } +/* A case insensitive strncmp. */ +static int +str_comp (char *s1, char *s2, int len) +{ + int i; + + for (i=0; i<len; i++) + if (toupper (s1[i]) != toupper (s2[i])) return 0; + + return 1; +} + +static rp_window * +find_window_by_name (char *name) +{ + rp_window *cur; + + for (cur=rp_window_head; cur; cur=cur->next) + { + if (str_comp (name, cur->name, strlen (name))) return cur; + } + + return NULL; +} + +void +goto_window_name (char *name) +{ + rp_window *win; + + if ((win = find_window_by_name (name)) == NULL) + { + return; + } + + rp_current_window = win; + set_active_window (rp_current_window); +} + void goto_window_number (int n) { @@ -31,4 +31,5 @@ void maximize_current_window (); void set_active_window (rp_window *rp_w); void set_current_window (rp_window *win); void goto_window_number (int n); +void goto_window_name (char *name); #endif /* _LIST_H */ @@ -233,6 +233,10 @@ init_screen (screen_info *s, int screen_num) XMapWindow (dpy, s->key_window); grab_keys (s); + /* Create the input window. */ + s->input_window = XCreateSimpleWindow (dpy, s->root, 0, 0, + 1, 1, 1, fg_color.pixel, bg_color.pixel); + XSelectInput (dpy, s->input_window, KeyPressMask); scanwins (s); } @@ -57,6 +57,8 @@ grab_keys (screen_info *s) GrabModeAsync, GrabModeAsync); XGrabKey(dpy, XKeysymToKeycode (dpy, KEY_PREFIX ), AnyModifier, s->key_window, True, GrabModeAsync, GrabModeAsync); + XGrabKey(dpy, XKeysymToKeycode (dpy, KEY_WINBYNAME ), AnyModifier, s->key_window, True, + GrabModeAsync, GrabModeAsync); } static void @@ -163,9 +165,8 @@ scanwins(screen_info *s) for (i = 0; i < nwins; i++) { XGetWindowAttributes(dpy, wins[i], &attr); - if (wins[i] == s->bar_window || wins[i] == s->key_window) continue; + if (wins[i] == s->bar_window || wins[i] == s->key_window || wins[i] == s->input_window) continue; - if (attr.override_redirect != True) { win = add_to_window_list (s, wins[i]); diff --git a/ratpoison.h b/ratpoison.h index b683196..3528422 100644 --- a/ratpoison.h +++ b/ratpoison.h @@ -28,6 +28,7 @@ #include "bar.h" #include "events.h" #include "number.h" +#include "input.h" void clean_up (); screen_info *find_screen (Window w); |