summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile17
-rw-r--r--bar.c25
-rw-r--r--events.c66
-rw-r--r--list.c33
-rw-r--r--list.h1
-rw-r--r--main.c16
-rw-r--r--manage.c6
7 files changed, 105 insertions, 59 deletions
diff --git a/Makefile b/Makefile
index 2453f96..0d7e393 100644
--- a/Makefile
+++ b/Makefile
@@ -1,18 +1,25 @@
-CC = gcc
+# Where to install the ratpoison executable
+INSTALL_DIR=/usr/local/bin
-SRC = main.o events.o manage.o list.o bar.o
-LIBS = -lX11
+# Spew lots of debug messages
+DEBUG = -DDEBUG
+CC = gcc
+LIBS = -lX11
LDFLAGS = -L/usr/X11R6/lib
CFLAGS = -g -Wall -I/usr/X11R6/include
-DEBUG = -DDEBUG
+SRC = main.o events.o manage.o list.o bar.o
+HEADERS = bar.h conf.h data.h events.h list.h manage.h ratpoison.h
ratpoison: $(SRC)
gcc $(SRC) -o $@ $(CFLAGS) $(LDFLAGS) $(LIBS)
-%.o : %.c ratpoison.h conf.h
+install: ratpoison
+ cp ratpoison $(INSTALL_DIR)
+
+%.o : %.c $(HEADERS)
$(CC) -c $(CFLAGS) $(DEBUG) $< -o $@
clean :
diff --git a/bar.c b/bar.c
index d5ac700..91c67ad 100644
--- a/bar.c
+++ b/bar.c
@@ -52,13 +52,18 @@ toggle_bar (screen_info *s)
static int
calc_bar_width (XFontStruct *font)
{
+ char str[100]; /* window names are capped at 99 chars */
+ int i;
int size = 1;
rp_window *cur;
- for (cur = rp_window_head; cur; cur = cur->next)
+ for (i=0, cur = rp_window_head; cur; cur = cur->next)
{
if (cur->state == STATE_UNMAPPED) continue;
- size += 10 + XTextWidth (font, cur->name, strlen (cur->name));
+
+ sprintf (str, "%d-%s", i, cur->name);
+ size += 10 + XTextWidth (font, str, strlen (str));
+ i++;
}
return size;
@@ -81,6 +86,8 @@ bar_y (screen_info *s)
void
update_window_names (screen_info *s)
{
+ char str[100]; /* window names are capped at 99 chars */
+ int i;
int width = calc_bar_width (s->font);
rp_window *cur;
int cur_x = 5;
@@ -95,23 +102,23 @@ update_window_names (screen_info *s)
XRaiseWindow (dpy, s->bar_window);
if (rp_window_head == NULL) return;
- for (cur = rp_window_head; cur; cur = cur->next)
+ for (i=0, cur = rp_window_head; cur; cur = cur->next)
{
if (cur->state == STATE_UNMAPPED) continue;
+ sprintf (str, "%d-%s", i, cur->name);
if ( rp_current_window == cur)
{
XDrawString (dpy, s->bar_window, s->bold_gc, cur_x,
- BAR_PADDING + s->font->max_bounds.ascent, cur->name, strlen (cur->name));
+ BAR_PADDING + s->font->max_bounds.ascent, str, strlen (str));
}
else
{
XDrawString (dpy, s->bar_window, s->normal_gc, cur_x,
- BAR_PADDING + s->font->max_bounds.ascent, cur->name, strlen (cur->name));
+ BAR_PADDING + s->font->max_bounds.ascent, str, strlen (str));
}
- cur_x += 10 + XTextWidth (s->font, cur->name, strlen (cur->name));
+
+ cur_x += 10 + XTextWidth (s->font, str, strlen (str));
+ i++;
}
}
-
-
-
diff --git a/events.c b/events.c
index f148314..9383c1c 100644
--- a/events.c
+++ b/events.c
@@ -101,8 +101,6 @@ map_request (XEvent *ev)
void
destroy_window (XDestroyWindowEvent *ev)
{
- int tmp;
- Window fwin;
screen_info *s;
rp_window *win;
@@ -110,20 +108,10 @@ destroy_window (XDestroyWindowEvent *ev)
win = find_window (ev->window);
if (s && win)
{
- unmanage (win);
- }
+ /* Goto the last accessed window. */
+ if (win->state == STATE_MAPPED) last_window ();
- XGetInputFocus (dpy, &fwin, &tmp);
- win = find_window (fwin);
-
- if (win)
- {
- rp_current_window = win;
- set_active_window (win);
- }
- else
- {
- update_window_names (s);
+ unmanage (win);
}
#ifdef DEBUG
@@ -135,36 +123,12 @@ void
configure_request (XConfigureRequestEvent *e)
{
XConfigureEvent ce;
- // XWindowChanges wc;
rp_window *win;
win = find_window (e->window);
if (win)
{
-/* if (e->value_mask & CWX) */
-/* wc->x = e->x; */
-/* if (e->value_mask & CWY) */
-/* wc->y = e->y; */
-/* if (e->value_mask & CWWidth) */
-/* wc->dx = e->width; */
-/* if (e->value_mask & CWHeight) */
-/* wc->dy = e->height; */
-/* if (e->value_mask & CWBorderWidth) */
-/* wc->border_width = e->border_width; */
-
-/* if (e->value_mask & CWStackMode) { */
-/* if (wc.stack_mode == Above); */
-/* else */
-/* we->value_mask &= ~CWStackMode; */
-/* } */
-
-/* wc.sibling = None; */
-/* wc.stack_mode = e.detail; */
-
-/* XConfigureWindow (dpy, e->window, e->value_mask, &wc); */
-
-
ce.type = ConfigureNotify;
ce.event = e->window;
ce.window = e->window;
@@ -172,9 +136,23 @@ configure_request (XConfigureRequestEvent *e)
ce.y = 0;
ce.width = win->scr->root_attr.width;
ce.height = win->scr->root_attr.height;
- ce.border_width = 0;
+ ce.border_width = 0;
ce.above = None;
ce.override_redirect = 0;
+
+ if (e->value_mask & CWStackMode && win->state == STATE_MAPPED)
+ {
+ if (e->detail == Above)
+ {
+ rp_current_window = win;
+ set_active_window (rp_current_window);
+ }
+ else if (e->detail == Below && win == rp_current_window)
+ {
+ last_window ();
+ }
+ }
+
XSendEvent(dpy, win->w, False, StructureNotifyMask, (XEvent*)&ce);
}
}
@@ -182,6 +160,7 @@ configure_request (XConfigureRequestEvent *e)
static void
client_msg (XClientMessageEvent *ev)
{
+ printf ("Recieved client message.\n");
}
static void
@@ -210,6 +189,13 @@ handle_key (screen_info *s)
return;
}
+ if (XLookupKeysym((XKeyEvent *) &ev, 0) >= '0'
+ && XLookupKeysym((XKeyEvent *) &ev, 0) <= '9')
+ {
+ goto_window_number (XLookupKeysym((XKeyEvent *) &ev, 0) - '0');
+ return;
+ }
+
switch (XLookupKeysym((XKeyEvent *) &ev, 0))
{
case KEY_XTERM:
diff --git a/list.c b/list.c
index ff38476..919aa5a 100644
--- a/list.c
+++ b/list.c
@@ -121,6 +121,37 @@ prev_window ()
}
rp_window *
+find_window_by_number (int n)
+{
+ int i;
+ rp_window *cur;
+
+ for (i=0, cur=rp_window_head; cur; cur=cur->next)
+ {
+ if (cur->state != STATE_MAPPED) continue;
+
+ if (i == n) return cur;
+ else i++;
+ }
+
+ return NULL;
+}
+
+void
+goto_window_number (int n)
+{
+ rp_window *win;
+
+ if ((win = find_window_by_number (n)) == NULL)
+ {
+ return;
+ }
+
+ rp_current_window = win;
+ set_active_window (rp_current_window);
+}
+
+rp_window *
find_last_accessed_window ()
{
int last_access = 0;
@@ -128,7 +159,7 @@ find_last_accessed_window ()
for (cur=rp_window_head; cur; cur=cur->next)
{
- if (cur->last_access > last_access
+ if (cur->last_access >= last_access
&& cur != rp_current_window
&& cur->state == STATE_MAPPED)
{
diff --git a/list.h b/list.h
index bbbea95..98e5cbd 100644
--- a/list.h
+++ b/list.h
@@ -13,4 +13,5 @@ rp_window *find_window (Window w);
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);
#endif /* _LIST_H */
diff --git a/main.c b/main.c
index 5038d93..bba63cb 100644
--- a/main.c
+++ b/main.c
@@ -69,13 +69,17 @@ alrm_handler ()
int
handler (Display *d, XErrorEvent *e)
{
+ char msg[100];
+
if (e->request_code == X_ChangeWindowAttributes && e->error_code == BadAccess) {
fprintf(stderr, "ratpoison: There can be only ONE.\n");
exit(EXIT_FAILURE);
}
- fprintf (stderr, "ratpoison: Ya some error happened, but whatever.\n");
- return 0;
+ XGetErrorText (d, e->error_code, msg, sizeof (msg));
+ fprintf (stderr, "ratpoison: %s!\n", msg);
+
+ exit (EXIT_FAILURE);
}
int
@@ -116,11 +120,15 @@ main (int argc, char *argv[])
}
/* Setup signal handlers. */
- // XSetErrorHandler(handler);
+ // XSetErrorHandler(handler);
if (signal (SIGALRM, alrm_handler) == SIG_IGN) signal (SIGALRM, SIG_IGN);
if (signal (SIGTERM, sighandler) == SIG_IGN) signal (SIGTERM, SIG_IGN);
if (signal (SIGINT, sighandler) == SIG_IGN) signal (SIGINT, SIG_IGN);
- if (signal (SIGHUP, hup_handler) == SIG_IGN) signal (SIGHUP, SIG_IGN);
+ if (signal (SIGHUP, hup_handler) == SIG_IGN)
+ {
+ printf ("Ignoring HUP.\n");
+ signal (SIGHUP, SIG_IGN);
+ }
/* Set our Atoms */
wm_state = XInternAtom(dpy, "WM_STATE", False);
diff --git a/manage.c b/manage.c
index 59dc185..8221819 100644
--- a/manage.c
+++ b/manage.c
@@ -17,6 +17,12 @@ extern Atom wm_state;
void
grab_keys (screen_info *s)
{
+ int i;
+
+ for (i='0'; i<='9'; i++)
+ XGrabKey(dpy, XKeysymToKeycode (dpy, i ), AnyModifier, s->key_window, True,
+ GrabModeAsync, GrabModeAsync);
+
XGrabKey(dpy, XKeysymToKeycode (dpy, KEY_XTERM ), AnyModifier, s->key_window, True,
GrabModeAsync, GrabModeAsync);
XGrabKey(dpy, XKeysymToKeycode (dpy, KEY_EMACS ), AnyModifier, s->key_window, True,