add a shaded button

This commit is contained in:
Dana Jansens 2003-03-31 22:58:54 +00:00
parent 6e4c57b3c2
commit 4398c7c168
7 changed files with 155 additions and 12 deletions

View file

@ -42,6 +42,8 @@ pixmap_mask *ob_s_max_unset_mask;
pixmap_mask *ob_s_iconify_mask; pixmap_mask *ob_s_iconify_mask;
pixmap_mask *ob_s_desk_set_mask; pixmap_mask *ob_s_desk_set_mask;
pixmap_mask *ob_s_desk_unset_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; pixmap_mask *ob_s_close_mask;
/* global appearances */ /* global appearances */
@ -61,6 +63,12 @@ Appearance *ob_a_focused_pressed_set_desk;
Appearance *ob_a_unfocused_unpressed_desk; Appearance *ob_a_unfocused_unpressed_desk;
Appearance *ob_a_unfocused_pressed_desk; Appearance *ob_a_unfocused_pressed_desk;
Appearance *ob_a_unfocused_pressed_set_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_unpressed_iconify;
Appearance *ob_a_focused_pressed_iconify; Appearance *ob_a_focused_pressed_iconify;
Appearance *ob_a_unfocused_unpressed_iconify; Appearance *ob_a_unfocused_unpressed_iconify;
@ -92,6 +100,7 @@ gboolean startup()
g_quark_from_string("brcorner"); g_quark_from_string("brcorner");
g_quark_from_string("maximize"); g_quark_from_string("maximize");
g_quark_from_string("alldesktops"); g_quark_from_string("alldesktops");
g_quark_from_string("shade");
g_quark_from_string("iconify"); g_quark_from_string("iconify");
g_quark_from_string("icon"); g_quark_from_string("icon");
g_quark_from_string("close"); g_quark_from_string("close");
@ -109,6 +118,7 @@ gboolean startup()
ob_s_winfont = NULL; ob_s_winfont = NULL;
ob_s_max_set_mask = ob_s_max_unset_mask = 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_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_s_iconify_mask = ob_s_close_mask = NULL;
ob_a_focused_unpressed_max = appearance_new(Surface_Planar, 1); ob_a_focused_unpressed_max = appearance_new(Surface_Planar, 1);
@ -127,6 +137,12 @@ gboolean startup()
ob_a_unfocused_unpressed_desk = NULL; ob_a_unfocused_unpressed_desk = NULL;
ob_a_unfocused_pressed_desk = NULL; ob_a_unfocused_pressed_desk = NULL;
ob_a_unfocused_pressed_set_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_unpressed_iconify = NULL;
ob_a_focused_pressed_iconify = NULL; ob_a_focused_pressed_iconify = NULL;
ob_a_unfocused_unpressed_iconify = NULL; ob_a_unfocused_unpressed_iconify = NULL;
@ -154,6 +170,18 @@ gboolean startup()
BUTTON_SIZE, BUTTON_SIZE); BUTTON_SIZE, BUTTON_SIZE);
RECT_SET(ob_a_unfocused_unpressed_desk->area, 0, 0, RECT_SET(ob_a_unfocused_unpressed_desk->area, 0, 0,
BUTTON_SIZE, BUTTON_SIZE); 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, RECT_SET(ob_a_focused_pressed_iconify->area, 0, 0,
BUTTON_SIZE, BUTTON_SIZE); BUTTON_SIZE, BUTTON_SIZE);
RECT_SET(ob_a_focused_unpressed_iconify->area, 0, 0, RECT_SET(ob_a_focused_unpressed_iconify->area, 0, 0,
@ -214,6 +242,10 @@ void shutdown()
pixmap_mask_free(ob_s_desk_set_mask); pixmap_mask_free(ob_s_desk_set_mask);
if (ob_s_desk_unset_mask != NULL) if (ob_s_desk_unset_mask != NULL)
pixmap_mask_free(ob_s_desk_unset_mask); 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) if (ob_s_iconify_mask != NULL)
pixmap_mask_free(ob_s_iconify_mask); pixmap_mask_free(ob_s_iconify_mask);
if (ob_s_close_mask != NULL) if (ob_s_close_mask != NULL)
@ -243,6 +275,14 @@ void shutdown()
appearance_free(ob_a_unfocused_unpressed_desk); appearance_free(ob_a_unfocused_unpressed_desk);
if (ob_a_unfocused_pressed_desk != NULL) if (ob_a_unfocused_pressed_desk != NULL)
appearance_free(ob_a_unfocused_pressed_desk); 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) if (ob_a_focused_unpressed_iconify != NULL)
appearance_free(ob_a_focused_unpressed_iconify); appearance_free(ob_a_focused_unpressed_iconify);
if (ob_a_focused_pressed_iconify != NULL) if (ob_a_focused_pressed_iconify != NULL)
@ -297,6 +337,7 @@ Frame *frame_new()
self->max = createWindow(self->title, mask, &attrib); self->max = createWindow(self->title, mask, &attrib);
self->close = createWindow(self->title, mask, &attrib); self->close = createWindow(self->title, mask, &attrib);
self->desk = 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->icon = createWindow(self->title, mask, &attrib);
self->iconify = createWindow(self->title, mask, &attrib); self->iconify = createWindow(self->title, mask, &attrib);
self->handle = createWindow(self->frame.window, mask, &attrib); self->handle = createWindow(self->frame.window, mask, &attrib);
@ -323,6 +364,7 @@ Frame *frame_new()
XResizeWindow(ob_display, self->icon, BUTTON_SIZE, BUTTON_SIZE); XResizeWindow(ob_display, self->icon, BUTTON_SIZE, BUTTON_SIZE);
XResizeWindow(ob_display, self->close, 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->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->lgrip, GRIP_WIDTH, ob_s_handle_height);
XResizeWindow(ob_display, self->rgrip, GRIP_WIDTH, ob_s_handle_height); XResizeWindow(ob_display, self->rgrip, GRIP_WIDTH, ob_s_handle_height);
@ -336,7 +378,7 @@ Frame *frame_new()
self->a_icon = appearance_copy(ob_a_icon); self->a_icon = appearance_copy(ob_a_icon);
self->max_press = self->close_press = self->desk_press = 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, dispatch_register(Event_X_ButtonPress | Event_X_ButtonRelease,
(EventHandler)mouse_event, self); (EventHandler)mouse_event, self);
@ -451,6 +493,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
/* they all default off, they're turned on in layout_title */ /* they all default off, they're turned on in layout_title */
self->icon_x = -1; self->icon_x = -1;
self->desk_x = -1; self->desk_x = -1;
self->shade_x = -1;
self->icon_x = -1; self->icon_x = -1;
self->label_x = -1; self->label_x = -1;
self->max_x = -1; self->max_x = -1;
@ -470,13 +513,8 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
/* layout the title bar elements */ /* layout the title bar elements */
layout_title(self); layout_title(self);
} else { } else
XUnmapWindow(ob_display, self->title); 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) { if (self->frame.client->decorations & Decor_Handle) {
XMoveResizeWindow(ob_display, self->handle, XMoveResizeWindow(ob_display, self->handle,
@ -618,6 +656,7 @@ void frame_grab_client(ObFrame *self, Client *client)
g_hash_table_insert(client_map, &self->max, client); 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->close, client);
g_hash_table_insert(client_map, &self->desk, 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->icon, client);
g_hash_table_insert(client_map, &self->iconify, client); g_hash_table_insert(client_map, &self->iconify, client);
g_hash_table_insert(client_map, &self->handle, client); g_hash_table_insert(client_map, &self->handle, client);
@ -653,6 +692,7 @@ void frame_release_client(ObFrame *self, Client *client)
g_hash_table_remove(client_map, &self->max); g_hash_table_remove(client_map, &self->max);
g_hash_table_remove(client_map, &self->close); g_hash_table_remove(client_map, &self->close);
g_hash_table_remove(client_map, &self->desk); 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->icon);
g_hash_table_remove(client_map, &self->iconify); g_hash_table_remove(client_map, &self->iconify);
g_hash_table_remove(client_map, &self->handle); g_hash_table_remove(client_map, &self->handle);
@ -666,10 +706,10 @@ static void layout_title(ObFrame *self)
{ {
char *lc; char *lc;
int x; int x;
gboolean n, d, i, l, m ,c; gboolean n, d, i, l, m, c, s;
ConfigValue layout; 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)) { if (!config_get("titlebar.layout", Config_String, &layout)) {
layout.string = "NDLIMC"; layout.string = "NDLIMC";
@ -692,6 +732,12 @@ static void layout_title(ObFrame *self)
d = TRUE; d = TRUE;
self->label_width -= BUTTON_SIZE + ob_s_bevel + 1; self->label_width -= BUTTON_SIZE + ob_s_bevel + 1;
break; 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': case 'I':
if (!(self->frame.client->decorations & Decor_Iconify)) break; if (!(self->frame.client->decorations & Decor_Iconify)) break;
if (i) { *lc = ' '; break; } /* rm duplicates */ if (i) { *lc = ' '; break; } /* rm duplicates */
@ -723,6 +769,7 @@ static void layout_title(ObFrame *self)
if (!n) XUnmapWindow(ob_display, self->icon); if (!n) XUnmapWindow(ob_display, self->icon);
if (!d) XUnmapWindow(ob_display, self->desk); if (!d) XUnmapWindow(ob_display, self->desk);
if (!s) XUnmapWindow(ob_display, self->shade);
if (!i) XUnmapWindow(ob_display, self->iconify); if (!i) XUnmapWindow(ob_display, self->iconify);
if (!l) XUnmapWindow(ob_display, self->label); if (!l) XUnmapWindow(ob_display, self->label);
if (!m) XUnmapWindow(ob_display, self->max); if (!m) XUnmapWindow(ob_display, self->max);
@ -746,6 +793,13 @@ static void layout_title(ObFrame *self)
XMoveWindow(ob_display, self->desk, x, ob_s_bevel + 1); XMoveWindow(ob_display, self->desk, x, ob_s_bevel + 1);
x += BUTTON_SIZE + ob_s_bevel + 1; x += BUTTON_SIZE + ob_s_bevel + 1;
break; 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': case 'I':
if (!i) break; if (!i) break;
self->iconify_x = x; self->iconify_x = x;
@ -801,6 +855,9 @@ static void mouse_event(const ObEvent *e, ObFrame *self)
} else if (win == self->desk) { } else if (win == self->desk) {
self->desk_press = press; self->desk_press = press;
obrender_frame(self); obrender_frame(self);
} else if (win == self->shade) {
self->shade_press = press;
obrender_frame(self);
} }
} }
@ -825,6 +882,7 @@ GQuark get_context(Client *client, Window win)
if (win == self->close) return g_quark_try_string("close"); if (win == self->close) return g_quark_try_string("close");
if (win == self->icon) return g_quark_try_string("icon"); if (win == self->icon) return g_quark_try_string("icon");
if (win == self->desk) return g_quark_try_string("alldesktops"); 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"); return g_quark_try_string("none");
} }

View file

@ -37,6 +37,8 @@ extern pixmap_mask *ob_s_max_unset_mask;
extern pixmap_mask *ob_s_iconify_mask; extern pixmap_mask *ob_s_iconify_mask;
extern pixmap_mask *ob_s_desk_set_mask; extern pixmap_mask *ob_s_desk_set_mask;
extern pixmap_mask *ob_s_desk_unset_mask; extern pixmap_mask *ob_s_desk_unset_mask;
extern pixmap_mask *ob_s_shade_set_mask;
extern pixmap_mask *ob_s_shade_unset_mask;
extern pixmap_mask *ob_s_close_mask; extern pixmap_mask *ob_s_close_mask;
extern Appearance *ob_a_focused_unpressed_max; extern Appearance *ob_a_focused_unpressed_max;
@ -55,6 +57,12 @@ extern Appearance *ob_a_focused_pressed_set_desk;
extern Appearance *ob_a_unfocused_unpressed_desk; extern Appearance *ob_a_unfocused_unpressed_desk;
extern Appearance *ob_a_unfocused_pressed_desk; extern Appearance *ob_a_unfocused_pressed_desk;
extern Appearance *ob_a_unfocused_pressed_set_desk; extern Appearance *ob_a_unfocused_pressed_set_desk;
extern Appearance *ob_a_focused_unpressed_shade;
extern Appearance *ob_a_focused_pressed_shade;
extern Appearance *ob_a_focused_pressed_set_shade;
extern Appearance *ob_a_unfocused_unpressed_shade;
extern Appearance *ob_a_unfocused_pressed_shade;
extern Appearance *ob_a_unfocused_pressed_set_shade;
extern Appearance *ob_a_focused_unpressed_iconify; extern Appearance *ob_a_focused_unpressed_iconify;
extern Appearance *ob_a_focused_pressed_iconify; extern Appearance *ob_a_focused_pressed_iconify;
extern Appearance *ob_a_unfocused_unpressed_iconify; extern Appearance *ob_a_unfocused_unpressed_iconify;
@ -77,6 +85,7 @@ typedef struct ObFrame {
Window max; Window max;
Window close; Window close;
Window desk; Window desk;
Window shade;
Window icon; Window icon;
Window iconify; Window iconify;
Window handle; Window handle;
@ -101,6 +110,7 @@ typedef struct ObFrame {
int label_x; /* x-position of the window title */ int label_x; /* x-position of the window title */
int iconify_x; /* x-position of the window iconify button */ int iconify_x; /* x-position of the window iconify button */
int desk_x; /* x-position of the window all-desktops button */ int desk_x; /* x-position of the window all-desktops button */
int shade_x; /* x-position of the window shade button */
int max_x; /* x-position of the window maximize button */ int max_x; /* x-position of the window maximize button */
int close_x; /* x-position of the window close button */ int close_x; /* x-position of the window close button */
int bwidth; /* border width */ int bwidth; /* border width */
@ -109,6 +119,7 @@ typedef struct ObFrame {
gboolean max_press; gboolean max_press;
gboolean close_press; gboolean close_press;
gboolean desk_press; gboolean desk_press;
gboolean shade_press;
gboolean iconify_press; gboolean iconify_press;
} ObFrame; } ObFrame;

View file

@ -7,6 +7,7 @@ static void obrender_max(ObFrame *self, Appearance *a);
static void obrender_icon(ObFrame *self, Appearance *a); static void obrender_icon(ObFrame *self, Appearance *a);
static void obrender_iconify(ObFrame *self, Appearance *a); static void obrender_iconify(ObFrame *self, Appearance *a);
static void obrender_desk(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); static void obrender_close(ObFrame *self, Appearance *a);
void obrender_frame(ObFrame *self) void obrender_frame(ObFrame *self)
@ -20,7 +21,7 @@ void obrender_frame(ObFrame *self)
} }
if (self->frame.client->decorations & Decor_Titlebar) { 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) ? t = (client_focused(self->frame.client) ?
self->a_focused_title : self->a_unfocused_title); self->a_focused_title : self->a_unfocused_title);
@ -51,6 +52,15 @@ void obrender_frame(ObFrame *self)
ob_a_unfocused_pressed_set_desk : ob_a_unfocused_pressed_set_desk :
(self->desk_press ? (self->desk_press ?
ob_a_unfocused_pressed_desk : ob_a_unfocused_unpressed_desk))); 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) ? c = (client_focused(self->frame.client) ?
(self->close_press ? (self->close_press ?
ob_a_focused_pressed_close : ob_a_focused_unpressed_close) : ob_a_focused_pressed_close : ob_a_focused_unpressed_close) :
@ -80,6 +90,10 @@ void obrender_frame(ObFrame *self)
d->surface.data.planar.parentx = self->desk_x; d->surface.data.planar.parentx = self->desk_x;
d->surface.data.planar.parenty = ob_s_bevel + 1; 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.parent = t;
c->surface.data.planar.parentx = self->close_x; c->surface.data.planar.parentx = self->close_x;
c->surface.data.planar.parenty = ob_s_bevel + 1; c->surface.data.planar.parenty = ob_s_bevel + 1;
@ -89,6 +103,7 @@ void obrender_frame(ObFrame *self)
obrender_icon(self, n); obrender_icon(self, n);
obrender_iconify(self, i); obrender_iconify(self, i);
obrender_desk(self, d); obrender_desk(self, d);
obrender_shade(self, s);
obrender_close(self, c); obrender_close(self, c);
} }
@ -172,6 +187,14 @@ static void obrender_desk(ObFrame *self, Appearance *a)
paint(self->desk, a); 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) static void obrender_close(ObFrame *self, Appearance *a)
{ {
if (self->close_x < 0) return; if (self->close_x < 0) return;

View file

@ -396,6 +396,24 @@ gboolean obtheme_load()
} }
} }
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", if (!read_mask(db, "window.button.close.mask",
&ob_s_close_mask)) { &ob_s_close_mask)) {
char data[] = { 0x63, 0x77, 0x3e, 0x1c, 0x3e, 0x77, 0x63 }; char data[] = { 0x63, 0x77, 0x3e, 0x1c, 0x3e, 0x77, 0x63 };
@ -449,6 +467,14 @@ gboolean obtheme_load()
ob_a_focused_unpressed_desk = appearance_copy(ob_a_focused_unpressed_max); 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_desk = appearance_copy(ob_a_focused_pressed_max);
ob_a_focused_pressed_set_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 = ob_a_unfocused_unpressed_iconify =
appearance_copy(ob_a_unfocused_unpressed_max); appearance_copy(ob_a_unfocused_unpressed_max);
ob_a_unfocused_pressed_iconify = ob_a_unfocused_pressed_iconify =
@ -496,6 +522,12 @@ gboolean obtheme_load()
ob_a_unfocused_unpressed_desk->texture[0].type = ob_a_unfocused_unpressed_desk->texture[0].type =
ob_a_unfocused_pressed_desk->texture[0].type = ob_a_unfocused_pressed_desk->texture[0].type =
ob_a_unfocused_pressed_set_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_unpressed_iconify->texture[0].type =
ob_a_focused_pressed_iconify->texture[0].type = ob_a_focused_pressed_iconify->texture[0].type =
ob_a_unfocused_unpressed_iconify->texture[0].type = ob_a_unfocused_unpressed_iconify->texture[0].type =
@ -521,6 +553,14 @@ gboolean obtheme_load()
ob_a_focused_pressed_set_desk->texture[0].data.mask.mask = ob_a_focused_pressed_set_desk->texture[0].data.mask.mask =
ob_a_unfocused_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_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_focused_unpressed_iconify->texture[0].data.mask.mask =
ob_a_unfocused_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_pressed_iconify->texture[0].data.mask.mask =
@ -534,6 +574,9 @@ gboolean obtheme_load()
ob_a_focused_unpressed_desk->texture[0].data.mask.color = ob_a_focused_unpressed_desk->texture[0].data.mask.color =
ob_a_focused_pressed_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_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_unpressed_iconify->texture[0].data.mask.color =
ob_a_focused_pressed_iconify->texture[0].data.mask.color = ob_a_focused_pressed_iconify->texture[0].data.mask.color =
ob_s_titlebut_focused_color; ob_s_titlebut_focused_color;
@ -545,6 +588,9 @@ gboolean obtheme_load()
ob_a_unfocused_unpressed_desk->texture[0].data.mask.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_desk->texture[0].data.mask.color =
ob_a_unfocused_pressed_set_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_unpressed_iconify->texture[0].data.mask.color =
ob_a_unfocused_pressed_iconify->texture[0].data.mask.color = ob_a_unfocused_pressed_iconify->texture[0].data.mask.color =
ob_s_titlebut_unfocused_color; ob_s_titlebut_unfocused_color;

View file

@ -747,7 +747,8 @@ void client_setup_decor_and_functions(Client *self)
{ {
/* start with everything (cept fullscreen) */ /* start with everything (cept fullscreen) */
self->decorations = Decor_Titlebar | Decor_Handle | Decor_Border | self->decorations = Decor_Titlebar | Decor_Handle | Decor_Border |
Decor_Icon | Decor_AllDesktops | Decor_Iconify | Decor_Maximize; Decor_Icon | Decor_AllDesktops | Decor_Iconify | Decor_Maximize |
Decor_Shade;
self->functions = Func_Resize | Func_Move | Func_Iconify | Func_Maximize | self->functions = Func_Resize | Func_Move | Func_Iconify | Func_Maximize |
Func_Shade; Func_Shade;
if (self->delete_window) { if (self->delete_window) {
@ -842,6 +843,8 @@ void client_setup_decor_and_functions(Client *self)
self->decorations &= ~Decor_Maximize; self->decorations &= ~Decor_Maximize;
if (self->disabled_decorations & Decor_AllDesktops) if (self->disabled_decorations & Decor_AllDesktops)
self->decorations &= ~Decor_AllDesktops; self->decorations &= ~Decor_AllDesktops;
if (self->disabled_decorations & Decor_Shade)
self->decorations &= ~Decor_Shade;
if (self->disabled_decorations & Decor_Close) if (self->disabled_decorations & Decor_Close)
self->decorations &= ~Decor_Close; self->decorations &= ~Decor_Close;

View file

@ -100,7 +100,8 @@ typedef enum {
/*! Display a button to toggle the window's placement on /*! Display a button to toggle the window's placement on
all desktops */ all desktops */
Decor_AllDesktops = 1 << 6, Decor_AllDesktops = 1 << 6,
Decor_Close = 1 << 7 /*!< Display a close button */ Decor_Shade = 1 << 7, /*!< Displays a shade button */
Decor_Close = 1 << 8 /*!< Display a close button */
} Decoration; } Decoration;

View file

@ -150,6 +150,7 @@ Icon DoubleClick Left Close
Close Click Left Close Close Click Left Close
Close Click Middle Kill Close Click Middle Kill
AllDesktops Click Left ToggleOmnipresent AllDesktops Click Left ToggleOmnipresent
Shade Click Left ToggleShade
Root Click Up NextDesktopWrap Root Click Up NextDesktopWrap
Root Click Down PreviousDesktopWrap Root Click Down PreviousDesktopWrap