From 4398c7c168fdcba1e31afc465d9783a57e7e674a Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 31 Mar 2003 22:58:54 +0000 Subject: [PATCH] add a shaded button --- engines/openbox/obengine.c | 76 +++++++++++++++++++++++++++++++++----- engines/openbox/obengine.h | 11 ++++++ engines/openbox/obrender.c | 25 ++++++++++++- engines/openbox/obtheme.c | 46 +++++++++++++++++++++++ openbox/client.c | 5 ++- openbox/client.h | 3 +- plugins/mouse/mouserc | 1 + 7 files changed, 155 insertions(+), 12 deletions(-) diff --git a/engines/openbox/obengine.c b/engines/openbox/obengine.c index b6a66db5..f3395669 100644 --- a/engines/openbox/obengine.c +++ b/engines/openbox/obengine.c @@ -42,6 +42,8 @@ pixmap_mask *ob_s_max_unset_mask; 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 */ @@ -61,6 +63,12 @@ Appearance *ob_a_focused_pressed_set_desk; 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; @@ -92,6 +100,7 @@ gboolean startup() 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"); @@ -109,6 +118,7 @@ gboolean startup() 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); @@ -127,6 +137,12 @@ gboolean startup() 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; @@ -154,6 +170,18 @@ gboolean startup() 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, @@ -214,6 +242,10 @@ void shutdown() 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) @@ -243,6 +275,14 @@ void shutdown() 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) @@ -297,6 +337,7 @@ Frame *frame_new() 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); @@ -323,6 +364,7 @@ Frame *frame_new() 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); @@ -336,7 +378,7 @@ Frame *frame_new() 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); @@ -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 */ self->icon_x = -1; self->desk_x = -1; + self->shade_x = -1; self->icon_x = -1; self->label_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_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, @@ -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->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); @@ -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->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); @@ -666,10 +706,10 @@ static void layout_title(ObFrame *self) { 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"; @@ -692,6 +732,12 @@ static void layout_title(ObFrame *self) 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 */ @@ -723,6 +769,7 @@ static void layout_title(ObFrame *self) 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); @@ -746,6 +793,13 @@ static void layout_title(ObFrame *self) 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; @@ -801,6 +855,9 @@ static void mouse_event(const ObEvent *e, ObFrame *self) } else if (win == self->desk) { self->desk_press = press; 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->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"); } diff --git a/engines/openbox/obengine.h b/engines/openbox/obengine.h index f84ed21f..4f9cb5b6 100644 --- a/engines/openbox/obengine.h +++ b/engines/openbox/obengine.h @@ -37,6 +37,8 @@ extern pixmap_mask *ob_s_max_unset_mask; extern pixmap_mask *ob_s_iconify_mask; extern pixmap_mask *ob_s_desk_set_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 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_pressed_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_pressed_iconify; extern Appearance *ob_a_unfocused_unpressed_iconify; @@ -77,6 +85,7 @@ typedef struct ObFrame { Window max; Window close; Window desk; + Window shade; Window icon; Window iconify; Window handle; @@ -101,6 +110,7 @@ typedef struct ObFrame { int label_x; /* x-position of the window title */ int iconify_x; /* x-position of the window iconify 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 close_x; /* x-position of the window close button */ int bwidth; /* border width */ @@ -109,6 +119,7 @@ typedef struct ObFrame { gboolean max_press; gboolean close_press; gboolean desk_press; + gboolean shade_press; gboolean iconify_press; } ObFrame; diff --git a/engines/openbox/obrender.c b/engines/openbox/obrender.c index f63d61f4..a609376f 100644 --- a/engines/openbox/obrender.c +++ b/engines/openbox/obrender.c @@ -7,6 +7,7 @@ static void obrender_max(ObFrame *self, Appearance *a); 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) @@ -20,7 +21,7 @@ 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); @@ -51,6 +52,15 @@ void obrender_frame(ObFrame *self) 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) : @@ -80,6 +90,10 @@ void obrender_frame(ObFrame *self) 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; @@ -89,6 +103,7 @@ void obrender_frame(ObFrame *self) obrender_icon(self, n); obrender_iconify(self, i); obrender_desk(self, d); + obrender_shade(self, s); obrender_close(self, c); } @@ -172,6 +187,14 @@ static void obrender_desk(ObFrame *self, Appearance *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) { if (self->close_x < 0) return; diff --git a/engines/openbox/obtheme.c b/engines/openbox/obtheme.c index 708dc14f..6362904d 100644 --- a/engines/openbox/obtheme.c +++ b/engines/openbox/obtheme.c @@ -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", &ob_s_close_mask)) { 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_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 = @@ -496,6 +522,12 @@ gboolean obtheme_load() 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 = @@ -521,6 +553,14 @@ gboolean obtheme_load() 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 = @@ -534,6 +574,9 @@ gboolean obtheme_load() 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; @@ -545,6 +588,9 @@ gboolean obtheme_load() 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; diff --git a/openbox/client.c b/openbox/client.c index 8f219193..361d57cd 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -747,7 +747,8 @@ void client_setup_decor_and_functions(Client *self) { /* start with everything (cept fullscreen) */ 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 | Func_Shade; if (self->delete_window) { @@ -842,6 +843,8 @@ void client_setup_decor_and_functions(Client *self) self->decorations &= ~Decor_Maximize; if (self->disabled_decorations & Decor_AllDesktops) self->decorations &= ~Decor_AllDesktops; + if (self->disabled_decorations & Decor_Shade) + self->decorations &= ~Decor_Shade; if (self->disabled_decorations & Decor_Close) self->decorations &= ~Decor_Close; diff --git a/openbox/client.h b/openbox/client.h index 1b9ee9bc..28385351 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -100,7 +100,8 @@ typedef enum { /*! Display a button to toggle the window's placement on all desktops */ 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; diff --git a/plugins/mouse/mouserc b/plugins/mouse/mouserc index fc20a416..eba1e189 100644 --- a/plugins/mouse/mouserc +++ b/plugins/mouse/mouserc @@ -150,6 +150,7 @@ Icon DoubleClick Left Close Close Click Left Close Close Click Middle Kill AllDesktops Click Left ToggleOmnipresent +Shade Click Left ToggleShade Root Click Up NextDesktopWrap Root Click Down PreviousDesktopWrap -- 2.45.2