Added style resources for window.button.pressed.focus: and
authorScott Moynes <smoynes@nexus.carleton.ca>
Thu, 3 Oct 2002 03:58:07 +0000 (03:58 +0000)
committerScott Moynes <smoynes@nexus.carleton.ca>
Thu, 3 Oct 2002 03:58:07 +0000 (03:58 +0000)
window.button.pressed.unfocus:
Documentation to be added.

src/Screen.cc
src/Screen.hh
src/Texture.cc
src/Texture.hh
src/Window.cc
src/Window.hh

index 7e7ce5a..92f0453 100644 (file)
@@ -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;
 }
 
index c96c973..c604481 100644 (file)
@@ -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);
index 6092331..75283a9 100644 (file)
@@ -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;
index 24be5df..fa6c639 100644 (file)
@@ -33,6 +33,8 @@ class BImageControl;
 class BTexture {
 public:
   enum Type {
+    // No texture
+    NoTexture           = (0),    
     // bevel options
     Flat                = (1l<<0),
     Sunken              = (1l<<1),
index 178b91b..b8e2214 100644 (file)
@@ -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 :
index e2b5d9b..b923c4b 100644 (file)
@@ -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;