1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
/* Functionality for a bar across the bottom of the screen listing the
windows currently managed. */
#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 i;
int size = 1;
rp_window *cur;
for (i=0, cur = rp_window_head; cur; cur = cur->next)
{
if (cur->state == STATE_UNMAPPED) continue;
sprintf (str, "%d-%s", i, cur->name);
size += 10 + XTextWidth (font, str, strlen (str));
i++;
}
return size;
}
static int
bar_x (screen_info *s, int width)
{
if (BAR_LOCATION >= 2) return s->root_attr.width - width;
else return 0;
}
static 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 i;
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;
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, 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));
i++;
}
}
|