pixmap_mask *ob_s_iconify_mask;
pixmap_mask *ob_s_desk_set_mask;
pixmap_mask *ob_s_desk_unset_mask;
+pixmap_mask *ob_s_shade_set_mask;
+pixmap_mask *ob_s_shade_unset_mask;
pixmap_mask *ob_s_close_mask;
/* global appearances */
Appearance *ob_a_unfocused_unpressed_desk;
Appearance *ob_a_unfocused_pressed_desk;
Appearance *ob_a_unfocused_pressed_set_desk;
+Appearance *ob_a_focused_unpressed_shade;
+Appearance *ob_a_focused_pressed_shade;
+Appearance *ob_a_focused_pressed_set_shade;
+Appearance *ob_a_unfocused_unpressed_shade;
+Appearance *ob_a_unfocused_pressed_shade;
+Appearance *ob_a_unfocused_pressed_set_shade;
Appearance *ob_a_focused_unpressed_iconify;
Appearance *ob_a_focused_pressed_iconify;
Appearance *ob_a_unfocused_unpressed_iconify;
g_quark_from_string("brcorner");
g_quark_from_string("maximize");
g_quark_from_string("alldesktops");
+ g_quark_from_string("shade");
g_quark_from_string("iconify");
g_quark_from_string("icon");
g_quark_from_string("close");
ob_s_winfont = NULL;
ob_s_max_set_mask = ob_s_max_unset_mask = NULL;
ob_s_desk_set_mask = ob_s_desk_unset_mask = NULL;
+ ob_s_shade_set_mask = ob_s_shade_unset_mask = NULL;
ob_s_iconify_mask = ob_s_close_mask = NULL;
ob_a_focused_unpressed_max = appearance_new(Surface_Planar, 1);
ob_a_unfocused_unpressed_desk = NULL;
ob_a_unfocused_pressed_desk = NULL;
ob_a_unfocused_pressed_set_desk = NULL;
+ ob_a_focused_unpressed_shade = NULL;
+ ob_a_focused_pressed_shade = NULL;
+ ob_a_focused_pressed_set_shade = NULL;
+ ob_a_unfocused_unpressed_shade = NULL;
+ ob_a_unfocused_pressed_shade = NULL;
+ ob_a_unfocused_pressed_set_shade = NULL;
ob_a_focused_unpressed_iconify = NULL;
ob_a_focused_pressed_iconify = NULL;
ob_a_unfocused_unpressed_iconify = NULL;
BUTTON_SIZE, BUTTON_SIZE);
RECT_SET(ob_a_unfocused_unpressed_desk->area, 0, 0,
BUTTON_SIZE, BUTTON_SIZE);
+ RECT_SET(ob_a_focused_pressed_shade->area, 0, 0,
+ BUTTON_SIZE, BUTTON_SIZE);
+ RECT_SET(ob_a_focused_pressed_set_shade->area, 0, 0,
+ BUTTON_SIZE, BUTTON_SIZE);
+ RECT_SET(ob_a_focused_unpressed_shade->area, 0, 0,
+ BUTTON_SIZE, BUTTON_SIZE);
+ RECT_SET(ob_a_unfocused_pressed_shade->area, 0, 0,
+ BUTTON_SIZE, BUTTON_SIZE);
+ RECT_SET(ob_a_unfocused_pressed_set_shade->area, 0, 0,
+ BUTTON_SIZE, BUTTON_SIZE);
+ RECT_SET(ob_a_unfocused_unpressed_shade->area, 0, 0,
+ BUTTON_SIZE, BUTTON_SIZE);
RECT_SET(ob_a_focused_pressed_iconify->area, 0, 0,
BUTTON_SIZE, BUTTON_SIZE);
RECT_SET(ob_a_focused_unpressed_iconify->area, 0, 0,
pixmap_mask_free(ob_s_desk_set_mask);
if (ob_s_desk_unset_mask != NULL)
pixmap_mask_free(ob_s_desk_unset_mask);
+ if (ob_s_shade_set_mask != NULL)
+ pixmap_mask_free(ob_s_shade_set_mask);
+ if (ob_s_shade_unset_mask != NULL)
+ pixmap_mask_free(ob_s_shade_unset_mask);
if (ob_s_iconify_mask != NULL)
pixmap_mask_free(ob_s_iconify_mask);
if (ob_s_close_mask != NULL)
appearance_free(ob_a_unfocused_unpressed_desk);
if (ob_a_unfocused_pressed_desk != NULL)
appearance_free(ob_a_unfocused_pressed_desk);
+ if (ob_a_focused_unpressed_shade != NULL)
+ appearance_free(ob_a_focused_unpressed_shade);
+ if (ob_a_focused_pressed_shade != NULL)
+ appearance_free(ob_a_focused_pressed_shade);
+ if (ob_a_unfocused_unpressed_shade != NULL)
+ appearance_free(ob_a_unfocused_unpressed_shade);
+ if (ob_a_unfocused_pressed_shade != NULL)
+ appearance_free(ob_a_unfocused_pressed_shade);
if (ob_a_focused_unpressed_iconify != NULL)
appearance_free(ob_a_focused_unpressed_iconify);
if (ob_a_focused_pressed_iconify != NULL)
self->max = createWindow(self->title, mask, &attrib);
self->close = createWindow(self->title, mask, &attrib);
self->desk = createWindow(self->title, mask, &attrib);
+ self->shade = createWindow(self->title, mask, &attrib);
self->icon = createWindow(self->title, mask, &attrib);
self->iconify = createWindow(self->title, mask, &attrib);
self->handle = createWindow(self->frame.window, mask, &attrib);
XResizeWindow(ob_display, self->icon, BUTTON_SIZE, BUTTON_SIZE);
XResizeWindow(ob_display, self->close, BUTTON_SIZE, BUTTON_SIZE);
XResizeWindow(ob_display, self->desk, BUTTON_SIZE, BUTTON_SIZE);
+ XResizeWindow(ob_display, self->shade, BUTTON_SIZE, BUTTON_SIZE);
XResizeWindow(ob_display, self->lgrip, GRIP_WIDTH, ob_s_handle_height);
XResizeWindow(ob_display, self->rgrip, GRIP_WIDTH, ob_s_handle_height);
self->a_icon = appearance_copy(ob_a_icon);
self->max_press = self->close_press = self->desk_press =
- self->iconify_press = FALSE;
+ self->iconify_press = self->shade_press = FALSE;
dispatch_register(Event_X_ButtonPress | Event_X_ButtonRelease,
(EventHandler)mouse_event, self);
/* they all default off, they're turned on in layout_title */
self->icon_x = -1;
self->desk_x = -1;
+ self->shade_x = -1;
self->icon_x = -1;
self->label_x = -1;
self->max_x = -1;
/* layout the title bar elements */
layout_title(self);
- } else {
+ } else
XUnmapWindow(ob_display, self->title);
- /* make all the titlebar stuff not render */
- self->frame.client->decorations &= ~(Decor_Icon | Decor_Iconify |
- Decor_Maximize | Decor_Close |
- Decor_AllDesktops);
- }
if (self->frame.client->decorations & Decor_Handle) {
XMoveResizeWindow(ob_display, self->handle,
g_hash_table_insert(client_map, &self->max, client);
g_hash_table_insert(client_map, &self->close, client);
g_hash_table_insert(client_map, &self->desk, client);
+ g_hash_table_insert(client_map, &self->shade, client);
g_hash_table_insert(client_map, &self->icon, client);
g_hash_table_insert(client_map, &self->iconify, client);
g_hash_table_insert(client_map, &self->handle, client);
g_hash_table_remove(client_map, &self->max);
g_hash_table_remove(client_map, &self->close);
g_hash_table_remove(client_map, &self->desk);
+ g_hash_table_remove(client_map, &self->shade);
g_hash_table_remove(client_map, &self->icon);
g_hash_table_remove(client_map, &self->iconify);
g_hash_table_remove(client_map, &self->handle);
{
char *lc;
int x;
- gboolean n, d, i, l, m ,c;
+ gboolean n, d, i, l, m, c, s;
ConfigValue layout;
- n = d = i = l = m = c = FALSE;
+ n = d = i = l = m = c = s = FALSE;
if (!config_get("titlebar.layout", Config_String, &layout)) {
layout.string = "NDLIMC";
d = TRUE;
self->label_width -= BUTTON_SIZE + ob_s_bevel + 1;
break;
+ case 'S':
+ if (!(self->frame.client->decorations & Decor_Shade)) break;
+ if (s) { *lc = ' '; break; } /* rm duplicates */
+ s = TRUE;
+ self->label_width -= BUTTON_SIZE + ob_s_bevel + 1;
+ break;
case 'I':
if (!(self->frame.client->decorations & Decor_Iconify)) break;
if (i) { *lc = ' '; break; } /* rm duplicates */
if (!n) XUnmapWindow(ob_display, self->icon);
if (!d) XUnmapWindow(ob_display, self->desk);
+ if (!s) XUnmapWindow(ob_display, self->shade);
if (!i) XUnmapWindow(ob_display, self->iconify);
if (!l) XUnmapWindow(ob_display, self->label);
if (!m) XUnmapWindow(ob_display, self->max);
XMoveWindow(ob_display, self->desk, x, ob_s_bevel + 1);
x += BUTTON_SIZE + ob_s_bevel + 1;
break;
+ case 'S':
+ if (!s) break;
+ self->shade_x = x;
+ XMapWindow(ob_display, self->shade);
+ XMoveWindow(ob_display, self->shade, x, ob_s_bevel + 1);
+ x += BUTTON_SIZE + ob_s_bevel + 1;
+ break;
case 'I':
if (!i) break;
self->iconify_x = x;
} else if (win == self->desk) {
self->desk_press = press;
obrender_frame(self);
+ } else if (win == self->shade) {
+ self->shade_press = press;
+ obrender_frame(self);
}
}
if (win == self->close) return g_quark_try_string("close");
if (win == self->icon) return g_quark_try_string("icon");
if (win == self->desk) return g_quark_try_string("alldesktops");
+ if (win == self->shade) return g_quark_try_string("shade");
return g_quark_try_string("none");
}
static void obrender_icon(ObFrame *self, Appearance *a);
static void obrender_iconify(ObFrame *self, Appearance *a);
static void obrender_desk(ObFrame *self, Appearance *a);
+static void obrender_shade(ObFrame *self, Appearance *a);
static void obrender_close(ObFrame *self, Appearance *a);
void obrender_frame(ObFrame *self)
}
if (self->frame.client->decorations & Decor_Titlebar) {
- Appearance *t, *l, *m, *n, *i, *d, *c;
+ Appearance *t, *l, *m, *n, *i, *d, *s, *c;
t = (client_focused(self->frame.client) ?
self->a_focused_title : self->a_unfocused_title);
ob_a_unfocused_pressed_set_desk :
(self->desk_press ?
ob_a_unfocused_pressed_desk : ob_a_unfocused_unpressed_desk)));
+ s = (client_focused(self->frame.client) ?
+ (self->frame.client->shaded ?
+ ob_a_focused_pressed_set_shade :
+ (self->shade_press ?
+ ob_a_focused_pressed_shade : ob_a_focused_unpressed_shade)) :
+ (self->frame.client->shaded ?
+ ob_a_unfocused_pressed_set_shade :
+ (self->shade_press ?
+ ob_a_unfocused_pressed_shade :ob_a_unfocused_unpressed_shade)));
c = (client_focused(self->frame.client) ?
(self->close_press ?
ob_a_focused_pressed_close : ob_a_focused_unpressed_close) :
d->surface.data.planar.parentx = self->desk_x;
d->surface.data.planar.parenty = ob_s_bevel + 1;
+ s->surface.data.planar.parent = t;
+ s->surface.data.planar.parentx = self->shade_x;
+ s->surface.data.planar.parenty = ob_s_bevel + 1;
+
c->surface.data.planar.parent = t;
c->surface.data.planar.parentx = self->close_x;
c->surface.data.planar.parenty = ob_s_bevel + 1;
obrender_icon(self, n);
obrender_iconify(self, i);
obrender_desk(self, d);
+ obrender_shade(self, s);
obrender_close(self, c);
}
paint(self->desk, a);
}
+static void obrender_shade(ObFrame *self, Appearance *a)
+{
+ if (self->shade_x < 0) return;
+
+ RECT_SET(a->texture[0].position, 0, 0, BUTTON_SIZE,BUTTON_SIZE);
+ paint(self->shade, a);
+}
+
static void obrender_close(ObFrame *self, Appearance *a)
{
if (self->close_x < 0) return;
}
}
+ if (read_mask(db, "window.button.shade.mask",
+ &ob_s_shade_unset_mask)) {
+ if (!read_mask(db, "window.button.shade.toggled.mask",
+ &ob_s_shade_set_mask)) {
+ ob_s_shade_set_mask =
+ pixmap_mask_copy(ob_s_shade_unset_mask);
+ }
+ } else {
+ {
+ char data[] = { 0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x00 };
+ ob_s_shade_unset_mask = pixmap_mask_new(7, 7, data);
+ }
+ {
+ char data[] = { 0x7f, 0x7f, 0x7f, 0x00, 0x00, 0x00, 0x7f };
+ ob_s_shade_set_mask = pixmap_mask_new(7, 7, data);
+ }
+ }
+
if (!read_mask(db, "window.button.close.mask",
&ob_s_close_mask)) {
char data[] = { 0x63, 0x77, 0x3e, 0x1c, 0x3e, 0x77, 0x63 };
ob_a_focused_unpressed_desk = appearance_copy(ob_a_focused_unpressed_max);
ob_a_focused_pressed_desk = appearance_copy(ob_a_focused_pressed_max);
ob_a_focused_pressed_set_desk = appearance_copy(ob_a_focused_pressed_max);
+ ob_a_unfocused_unpressed_shade =
+ appearance_copy(ob_a_unfocused_unpressed_max);
+ ob_a_unfocused_pressed_shade = appearance_copy(ob_a_unfocused_pressed_max);
+ ob_a_unfocused_pressed_set_shade =
+ appearance_copy(ob_a_unfocused_pressed_max);
+ ob_a_focused_unpressed_shade = appearance_copy(ob_a_focused_unpressed_max);
+ ob_a_focused_pressed_shade = appearance_copy(ob_a_focused_pressed_max);
+ ob_a_focused_pressed_set_shade = appearance_copy(ob_a_focused_pressed_max);
ob_a_unfocused_unpressed_iconify =
appearance_copy(ob_a_unfocused_unpressed_max);
ob_a_unfocused_pressed_iconify =
ob_a_unfocused_unpressed_desk->texture[0].type =
ob_a_unfocused_pressed_desk->texture[0].type =
ob_a_unfocused_pressed_set_desk->texture[0].type =
+ ob_a_focused_unpressed_shade->texture[0].type =
+ ob_a_focused_pressed_shade->texture[0].type =
+ ob_a_focused_pressed_set_shade->texture[0].type =
+ ob_a_unfocused_unpressed_shade->texture[0].type =
+ ob_a_unfocused_pressed_shade->texture[0].type =
+ ob_a_unfocused_pressed_set_shade->texture[0].type =
ob_a_focused_unpressed_iconify->texture[0].type =
ob_a_focused_pressed_iconify->texture[0].type =
ob_a_unfocused_unpressed_iconify->texture[0].type =
ob_a_focused_pressed_set_desk->texture[0].data.mask.mask =
ob_a_unfocused_pressed_set_desk->texture[0].data.mask.mask =
ob_s_desk_set_mask;
+ ob_a_focused_unpressed_shade->texture[0].data.mask.mask =
+ ob_a_unfocused_unpressed_shade->texture[0].data.mask.mask =
+ ob_a_focused_pressed_shade->texture[0].data.mask.mask =
+ ob_a_unfocused_pressed_shade->texture[0].data.mask.mask =
+ ob_s_shade_unset_mask;
+ ob_a_focused_pressed_set_shade->texture[0].data.mask.mask =
+ ob_a_unfocused_pressed_set_shade->texture[0].data.mask.mask =
+ ob_s_shade_set_mask;
ob_a_focused_unpressed_iconify->texture[0].data.mask.mask =
ob_a_unfocused_unpressed_iconify->texture[0].data.mask.mask =
ob_a_focused_pressed_iconify->texture[0].data.mask.mask =
ob_a_focused_unpressed_desk->texture[0].data.mask.color =
ob_a_focused_pressed_desk->texture[0].data.mask.color =
ob_a_focused_pressed_set_desk->texture[0].data.mask.color =
+ ob_a_focused_unpressed_shade->texture[0].data.mask.color =
+ ob_a_focused_pressed_shade->texture[0].data.mask.color =
+ ob_a_focused_pressed_set_shade->texture[0].data.mask.color =
ob_a_focused_unpressed_iconify->texture[0].data.mask.color =
ob_a_focused_pressed_iconify->texture[0].data.mask.color =
ob_s_titlebut_focused_color;
ob_a_unfocused_unpressed_desk->texture[0].data.mask.color =
ob_a_unfocused_pressed_desk->texture[0].data.mask.color =
ob_a_unfocused_pressed_set_desk->texture[0].data.mask.color =
+ ob_a_unfocused_unpressed_shade->texture[0].data.mask.color =
+ ob_a_unfocused_pressed_shade->texture[0].data.mask.color =
+ ob_a_unfocused_pressed_set_shade->texture[0].data.mask.color =
ob_a_unfocused_unpressed_iconify->texture[0].data.mask.color =
ob_a_unfocused_pressed_iconify->texture[0].data.mask.color =
ob_s_titlebut_unfocused_color;