summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Moynes <smoynes@nexus.carleton.ca>2002-10-03 03:58:07 +0000
committerScott Moynes <smoynes@nexus.carleton.ca>2002-10-03 03:58:07 +0000
commit987cf7cc40d4ab9c5e895ea2b0c7a77f10a0510f (patch)
treea62d2ea4cc1c813f87ca4e257fb5641891ed81a1
parentefd6c59c90aeff5bfd2fb76b3085e837aacb0596 (diff)
Added style resources for window.button.pressed.focus: and
window.button.pressed.unfocus: Documentation to be added.
-rw-r--r--src/Screen.cc24
-rw-r--r--src/Screen.hh6
-rw-r--r--src/Texture.cc1
-rw-r--r--src/Texture.hh2
-rw-r--r--src/Window.cc208
-rw-r--r--src/Window.hh13
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;