From 987cf7cc40d4ab9c5e895ea2b0c7a77f10a0510f Mon Sep 17 00:00:00 2001 From: Scott Moynes Date: Thu, 3 Oct 2002 03:58:07 +0000 Subject: [PATCH] Added style resources for window.button.pressed.focus: and window.button.pressed.unfocus: Documentation to be added. --- src/Screen.cc | 24 ++++-- src/Screen.hh | 6 +- src/Texture.cc | 1 + src/Texture.hh | 2 + src/Window.cc | 208 ++++++++++++++++++++++++------------------------- src/Window.hh | 13 +++- 6 files changed, 138 insertions(+), 116 deletions(-) diff --git a/src/Screen.cc b/src/Screen.cc index 7e7ce5a4..92f04532 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -1065,6 +1065,12 @@ void BScreen::LoadStyle(void) { resource.wstyle.b_pressed = readDatabaseTexture("window.button.pressed", "black", style); + //if neither of these can be found, we will use the previous resource + resource.wstyle.b_pressed_focus = + readDatabaseTexture("window.button.pressed.focus", "black", style, true); + resource.wstyle.b_pressed_unfocus = + readDatabaseTexture("window.button.pressed.unfocus", "black", style, true); + #ifdef BITMAPBUTTONS if (resource.wstyle.close_button.mask != None) XFreePixmap(blackbox->getXDisplay(), resource.wstyle.close_button.mask); @@ -2671,12 +2677,15 @@ void BScreen::readDatabaseMask(const string &rname, PixmapMask &pixmapMask, BTexture BScreen::readDatabaseTexture(const string &rname, const string &default_color, - const Configuration &style) { + const Configuration &style, + bool allowNoTexture) { BTexture texture; string s; if (style.getValue(rname, s)) texture = BTexture(s); + else if (allowNoTexture) //no default + texture.setTexture(BTexture::NoTexture); else texture.setTexture(BTexture::Solid | BTexture::Flat); @@ -2684,12 +2693,15 @@ BTexture BScreen::readDatabaseTexture(const string &rname, texture.setDisplay(getBaseDisplay(), getScreenNumber()); texture.setImageControl(image_control); - texture.setColor(readDatabaseColor(rname + ".color", default_color, style)); - texture.setColorTo(readDatabaseColor(rname + ".colorTo", default_color, + if (texture.texture() != BTexture::NoTexture) { + texture.setColor(readDatabaseColor(rname + ".color", default_color, style)); - texture.setBorderColor(readDatabaseColor(rname + ".borderColor", - default_color, style)); - + texture.setColorTo(readDatabaseColor(rname + ".colorTo", default_color, + style)); + texture.setBorderColor(readDatabaseColor(rname + ".borderColor", + default_color, style)); + } + return texture; } diff --git a/src/Screen.hh b/src/Screen.hh index c96c973e..c6044812 100644 --- a/src/Screen.hh +++ b/src/Screen.hh @@ -72,7 +72,8 @@ struct WindowStyle { BColor l_text_focus, l_text_unfocus, b_pic_focus, b_pic_unfocus; BTexture f_focus, f_unfocus, t_focus, t_unfocus, l_focus, l_unfocus, - h_focus, h_unfocus, b_focus, b_unfocus, b_pressed, g_focus, g_unfocus; + h_focus, h_unfocus, b_focus, b_unfocus, b_pressed, b_pressed_focus, + b_pressed_unfocus, g_focus, g_unfocus; #ifdef BITMAPBUTTONS PixmapMask close_button, max_button, icon_button, stick_button; @@ -206,7 +207,8 @@ private: BTexture readDatabaseTexture(const std::string &rname, const std::string &default_color, - const Configuration &style); + const Configuration &style, + bool allowNoTexture = false); BColor readDatabaseColor(const std::string &rname, const std::string &default_color, const Configuration &style); diff --git a/src/Texture.cc b/src/Texture.cc index 60923316..75283a91 100644 --- a/src/Texture.cc +++ b/src/Texture.cc @@ -184,6 +184,7 @@ BTexture& BTexture::operator=(const BTexture &tt) { Pixmap BTexture::render(const unsigned int width, const unsigned int height, const Pixmap old) { assert(display() != 0); + assert(texture() != BTexture::NoTexture); if (texture() == (BTexture::Flat | BTexture::Solid)) return None; diff --git a/src/Texture.hh b/src/Texture.hh index 24be5df1..fa6c6390 100644 --- a/src/Texture.hh +++ b/src/Texture.hh @@ -33,6 +33,8 @@ class BImageControl; class BTexture { public: enum Type { + // No texture + NoTexture = (0), // bevel options Flat = (1l<<0), Sunken = (1l<<1), diff --git a/src/Window.cc b/src/Window.cc index 178b91b5..b8e2214a 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -134,12 +134,11 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) { frame.ulabel_pixel = frame.flabel_pixel = frame.utitle_pixel = frame.ftitle_pixel = frame.uhandle_pixel = frame.fhandle_pixel = - frame.ubutton_pixel = frame.fbutton_pixel = frame.pbutton_pixel = - frame.uborder_pixel = frame.fborder_pixel = frame.ugrip_pixel = - frame.fgrip_pixel = 0; + frame.ubutton_pixel = frame.fbutton_pixel = frame.uborder_pixel = + frame.fborder_pixel = frame.ugrip_pixel = frame.fgrip_pixel = 0; frame.utitle = frame.ftitle = frame.uhandle = frame.fhandle = None; frame.ulabel = frame.flabel = frame.ubutton = frame.fbutton = None; - frame.pbutton = frame.ugrip = frame.fgrip = None; + frame.ugrip = frame.fgrip = None; functions = Func_Resize | Func_Move | Func_Iconify | Func_Maximize; mwm_decorations = Decor_Titlebar | Decor_Handle | Decor_Border | @@ -571,11 +570,54 @@ void BlackboxWindow::decorate(void) { if (! frame.ubutton) frame.ubutton_pixel = texture->color().pixel(); - texture = &(screen->getWindowStyle()->b_pressed); - frame.pbutton = texture->render(frame.button_w, frame.button_w, - frame.pbutton); - if (! frame.pbutton) - frame.pbutton_pixel = texture->color().pixel(); + unsigned char needsPressed = 0; + + texture = &(screen->getWindowStyle()->b_pressed_focus); + + if (texture->texture() != BTexture::NoTexture) { + frame.pfbutton = texture->render(frame.button_w, frame.button_w, + frame.pfbutton); + if (! frame.pfbutton) + frame.pfbutton_pixel = texture->color().pixel(); + } else { + needsPressed = 0x1; + } + + texture = &(screen->getWindowStyle()->b_pressed_unfocus); + + if (texture->texture() != BTexture::NoTexture) { + frame.pubutton = texture->render(frame.button_w, frame.button_w, + frame.pubutton); + if (! frame.pubutton) + frame.pubutton = texture->color().pixel(); + } else { + needsPressed |= 0x2; + } + + // if we either pressed unfocused, or pressed focused were undefined, + // make them inherit from the old resource. It's a hack for sure, but + // it allows for some backwards and forwards compatibility. + if (needsPressed) { + texture = &(screen->getWindowStyle()->b_pressed); + + Pixmap pbutton = texture->render(frame.button_w, frame.button_w, + pbutton); + unsigned long pixel; + + if (!pbutton) { + pixel = texture->color().pixel(); + if (needsPressed & 0x1) + frame.pfbutton_pixel = pixel; + if (needsPressed & 0x2) + frame.pubutton_pixel = pixel; + } else { + if (needsPressed & 0x1) + frame.pfbutton = pbutton; + if (needsPressed & 0x2) + frame.pubutton = pbutton; + } + + } if (decorations & Decor_Titlebar) { texture = &(screen->getWindowStyle()->t_focus); @@ -747,9 +789,6 @@ void BlackboxWindow::destroyTitlebar(void) { if (frame.ubutton) screen->getImageControl()->removeImage(frame.ubutton); - if (frame.pbutton) - screen->getImageControl()->removeImage(frame.pbutton); - blackbox->removeWindowSearch(frame.title); blackbox->removeWindowSearch(frame.label); @@ -2589,35 +2628,50 @@ void BlackboxWindow::redrawAllButtons(void) const { } -void BlackboxWindow::redrawIconifyButton(bool pressed) const { - if (! pressed) { +void BlackboxWindow::redrawButton(bool pressed, Window win, + Pixmap fppix, unsigned long fppixel, + Pixmap uppix, unsigned long uppixel, + Pixmap fpix, unsigned long fpixel, + Pixmap upix, unsigned long upixel) const { + Pixmap p; + unsigned long pix; + + if (pressed) { if (flags.focused) { - if (frame.fbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.iconify_button, frame.fbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), - frame.iconify_button, frame.fbutton_pixel); + p = fppix; + pix = fppixel; } else { - if (frame.ubutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.iconify_button, frame.ubutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.iconify_button, - frame.ubutton_pixel); + p = uppix; + pix = uppixel; } } else { - if (frame.pbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.iconify_button, frame.pbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), - frame.iconify_button, frame.pbutton_pixel); + if (flags.focused) { + p = fpix; + pix = fpixel; + } else { + p = upix; + pix = upixel; + } } + + if (p) + XSetWindowBackgroundPixmap(blackbox->getXDisplay(), win, p); + else + XSetWindowBackground(blackbox->getXDisplay(), win, pix); + +} + +void BlackboxWindow::redrawIconifyButton(bool pressed) const { + redrawButton(pressed, frame.iconify_button, + frame.pfbutton, frame.pfbutton_pixel, + frame.pubutton, frame.pubutton_pixel, + frame.fbutton, frame.fbutton_pixel, + frame.ubutton, frame.ubutton_pixel); XClearWindow(blackbox->getXDisplay(), frame.iconify_button); BPen pen((flags.focused) ? screen->getWindowStyle()->b_pic_focus : screen->getWindowStyle()->b_pic_unfocus); + #ifdef BITMAPBUTTONS PixmapMask pm = screen->getWindowStyle()->icon_button; @@ -2643,30 +2697,12 @@ void BlackboxWindow::redrawIconifyButton(bool pressed) const { void BlackboxWindow::redrawMaximizeButton(bool pressed) const { - if (! pressed) { - if (flags.focused) { - if (frame.fbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.maximize_button, frame.fbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.maximize_button, - frame.fbutton_pixel); - } else { - if (frame.ubutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.maximize_button, frame.ubutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.maximize_button, - frame.ubutton_pixel); - } - } else { - if (frame.pbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.maximize_button, frame.pbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.maximize_button, - frame.pbutton_pixel); - } + redrawButton(pressed, frame.maximize_button, + frame.pfbutton, frame.pfbutton_pixel, + frame.pubutton, frame.pubutton_pixel, + frame.fbutton, frame.fbutton_pixel, + frame.ubutton, frame.ubutton_pixel); + XClearWindow(blackbox->getXDisplay(), frame.maximize_button); BPen pen((flags.focused) ? screen->getWindowStyle()->b_pic_focus : @@ -2699,30 +2735,12 @@ void BlackboxWindow::redrawMaximizeButton(bool pressed) const { void BlackboxWindow::redrawCloseButton(bool pressed) const { - if (! pressed) { - if (flags.focused) { - if (frame.fbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.close_button, frame.fbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.close_button, - frame.fbutton_pixel); - } else { - if (frame.ubutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), frame.close_button, - frame.ubutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.close_button, - frame.ubutton_pixel); - } - } else { - if (frame.pbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.close_button, frame.pbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), - frame.close_button, frame.pbutton_pixel); - } + redrawButton(pressed, frame.close_button, + frame.pfbutton, frame.pfbutton_pixel, + frame.pubutton, frame.pubutton_pixel, + frame.fbutton, frame.fbutton_pixel, + frame.ubutton, frame.ubutton_pixel); + XClearWindow(blackbox->getXDisplay(), frame.close_button); BPen pen((flags.focused) ? screen->getWindowStyle()->b_pic_focus : @@ -2755,30 +2773,12 @@ void BlackboxWindow::redrawCloseButton(bool pressed) const { } void BlackboxWindow::redrawStickyButton(bool pressed) const { - if (! pressed) { - if (flags.focused) { - if (frame.fbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.stick_button, frame.fbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.stick_button, - frame.fbutton_pixel); - } else { - if (frame.ubutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.stick_button, frame.ubutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.stick_button, - frame.ubutton_pixel); - } - } else { - if (frame.pbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.stick_button, frame.pbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.stick_button, - frame.pbutton_pixel); - } + redrawButton(pressed, frame.stick_button, + frame.pfbutton, frame.pfbutton_pixel, + frame.pubutton, frame.pubutton_pixel, + frame.fbutton, frame.fbutton_pixel, + frame.ubutton, frame.ubutton_pixel); + XClearWindow(blackbox->getXDisplay(), frame.stick_button); BPen pen((flags.focused) ? screen->getWindowStyle()->b_pic_focus : diff --git a/src/Window.hh b/src/Window.hh index e2b5d9b0..b923c4bf 100644 --- a/src/Window.hh +++ b/src/Window.hh @@ -217,13 +217,13 @@ private: */ struct _frame { - // u -> unfocused, f -> has focus + // u -> unfocused, f -> has focus, p -> pressed unsigned long ulabel_pixel, flabel_pixel, utitle_pixel, ftitle_pixel, uhandle_pixel, fhandle_pixel, ubutton_pixel, - fbutton_pixel, pbutton_pixel, uborder_pixel, fborder_pixel, - ugrip_pixel, fgrip_pixel; + fbutton_pixel, pfbutton_pixel, pubutton_pixel, + uborder_pixel, fborder_pixel, ugrip_pixel, fgrip_pixel; Pixmap ulabel, flabel, utitle, ftitle, uhandle, fhandle, - ubutton, fbutton, pbutton, ugrip, fgrip; + ubutton, fbutton, pfbutton, pubutton, ugrip, fgrip; Window window, // the frame plate, // holds the client @@ -290,6 +290,11 @@ private: void redrawWindowFrame(void) const; void redrawLabel(void) const; void redrawAllButtons(void) const; + void BlackboxWindow::redrawButton(bool pressed, Window win, + Pixmap fppix, unsigned long fppixel, + Pixmap uppix, unsigned long uppixel, + Pixmap fpix, unsigned long fpixel, + Pixmap upix, unsigned long upixel) const; void redrawCloseButton(bool pressed) const; void redrawIconifyButton(bool pressed) const; void redrawMaximizeButton(bool pressed) const; -- 2.45.2