summaryrefslogtreecommitdiff
path: root/src/bar.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bar.c')
-rw-r--r--src/bar.c141
1 files changed, 141 insertions, 0 deletions
diff --git a/src/bar.c b/src/bar.c
new file mode 100644
index 0000000..d06dcc8
--- /dev/null
+++ b/src/bar.c
@@ -0,0 +1,141 @@
+/* Functionality for a bar across the bottom of the screen listing the
+ * windows currently managed.
+ *
+ * Copyright (C) 2000 Shawn Betts
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
+ * Boston, MA 02111-1307 USA */
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "ratpoison.h"
+
+int
+hide_bar (screen_info *s)
+{
+ if (s->bar_is_raised)
+ {
+ s->bar_is_raised = 0;
+ XUnmapWindow (dpy, s->bar_window);
+ return 1;
+ }
+
+ return 0;
+}
+
+int
+show_bar (screen_info *s)
+{
+ if (!s->bar_is_raised)
+ {
+ s->bar_is_raised = 1;
+ XMapWindow (dpy, s->bar_window);
+ update_window_names (s);
+
+ /* Set an alarm to auto-hide the bar BAR_TIMEOUT seconds later */
+ alarm (BAR_TIMEOUT);
+ return 1;
+ }
+
+ return 0;
+}
+
+/* Toggle the display of the program bar */
+void
+toggle_bar (screen_info *s)
+{
+ if (!hide_bar (s)) show_bar (s);
+}
+
+static int
+calc_bar_width (XFontStruct *font)
+{
+ char str[100]; /* window names are capped at 99 chars */
+ int size = 1;
+ rp_window *cur;
+
+ for (cur = rp_window_head; cur; cur = cur->next)
+ {
+ if (cur->state == STATE_UNMAPPED) continue;
+
+ sprintf (str, "%d-%s", cur->number, cur->name);
+ size += 10 + XTextWidth (font, str, strlen (str));
+ }
+
+ return size;
+}
+
+int
+bar_x (screen_info *s, int width)
+{
+ if (BAR_LOCATION >= 2) return s->root_attr.width - width;
+ else return 0;
+}
+
+int
+bar_y (screen_info *s)
+{
+ if (BAR_LOCATION % 2) return 0;
+ else return s->root_attr.height - (FONT_HEIGHT (s->font) + BAR_PADDING * 2) - 2;
+}
+
+void
+update_window_names (screen_info *s)
+{
+ char str[100]; /* window names are capped at 99 chars */
+ int width = calc_bar_width (s->font);
+ rp_window *cur;
+ int cur_x = 5;
+
+ if (!s->bar_is_raised) return;
+
+ XMoveResizeWindow (dpy, s->bar_window,
+ bar_x (s, width), bar_y (s),
+ width,
+ (FONT_HEIGHT (s->font) + BAR_PADDING * 2));
+ XClearWindow (dpy, s->bar_window);
+ XRaiseWindow (dpy, s->bar_window);
+
+ if (rp_window_head == NULL) return;
+
+ /* Draw them in reverse order they were added in, so the oldest
+ windows appear on the left and the newest on the right end of the
+ program bar. */
+ for (cur = rp_window_head; cur; cur = cur->next)
+ {
+ if (cur->state == STATE_UNMAPPED) continue;
+
+ sprintf (str, "%d-%s", cur->number, cur->name);
+ if ( rp_current_window == cur)
+ {
+ XDrawString (dpy, s->bar_window, s->bold_gc, cur_x,
+ 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, str, strlen (str));
+ }
+
+ cur_x += 10 + XTextWidth (s->font, str, strlen (str));
+ }
+}