From fbc305ca80e352240b32b833e8388fb9aa99fa72 Mon Sep 17 00:00:00 2001
From: Mark Tiefenbruck <mark@fluxbox.org>
Date: Sun, 23 Dec 2007 13:33:10 -0800
Subject: added focused/unfocused borders to styles

---
 ChangeLog              |  3 +++
 src/Ewmh.cc            |  4 ++--
 src/FbWinFrame.cc      | 18 ++++++++++++------
 src/FbWinFrameTheme.cc | 14 +++++++++-----
 src/FbWinFrameTheme.hh |  4 ++--
 src/FocusControl.cc    |  2 +-
 src/Screen.cc          |  8 ++++----
 src/Window.cc          |  4 ++--
 8 files changed, 35 insertions(+), 22 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3f39d79..b3bf7f9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
  (Format: Year/Month/Day)
 Changes for 1.0.1:
+*07/12/23:
+   * Added new style items window.(un)focus.border{Width,Color} (Mark)
+     FbWinFrameTheme.cc/hh FbWinFrame.cc
 *07/12/21:
    * Added new key command :StartTabbing (Mark)
      Window.cc/hh CurrentWindowCmd.cc/hh
diff --git a/src/Ewmh.cc b/src/Ewmh.cc
index 6f0d829..0091981 100644
--- a/src/Ewmh.cc
+++ b/src/Ewmh.cc
@@ -811,8 +811,8 @@ bool Ewmh::checkClientMessage(const XClientMessageEvent &ce,
         FbWinFrameTheme &theme = screen->winFrameTheme();
         long title_h = theme.titleHeight() ||
             theme.font().height() + 2*theme.bevelWidth() + 2;
-        title_h += theme.border().width();
-        long handle_h = theme.handleWidth() + theme.border().width();
+        title_h += theme.border(true).width();
+        long handle_h = theme.handleWidth() + theme.border(true).width();
         long extents[4];
         // our frames currently don't protrude from left/right
         extents[0] = 0;
diff --git a/src/FbWinFrame.cc b/src/FbWinFrame.cc
index 266ddea..e96b72f 100644
--- a/src/FbWinFrame.cc
+++ b/src/FbWinFrame.cc
@@ -127,7 +127,7 @@ bool FbWinFrame::setTabMode(TabMode tabmode) {
     if (tabmode == EXTERNAL) {
         m_label.show();
         m_tab_container.setBorderWidth(m_window.borderWidth());
-        m_tab_container.setBorderColor(theme().border().color());
+        m_tab_container.setBorderColor(theme().border(m_focused).color());
         m_tab_container.setEventMask(
                ButtonPressMask | ButtonReleaseMask |
                ButtonMotionMask | ExposureMask |
@@ -498,6 +498,12 @@ void FbWinFrame::setFocus(bool newvalue) {
         }
     }
 
+    if (m_decoration_mask & DECORM_BORDER &&
+        (theme().border(true).width() != theme().border(false).width() ||
+         theme().border(true).color().pixel() !=
+         theme().border(false).color().pixel()))
+        setBorderWidth(theme().border(newvalue).width());
+
     applyAll();
     clearAll();
 }
@@ -1487,21 +1493,21 @@ void FbWinFrame::setBorderWidth(unsigned int border_width) {
         bw_changes += static_cast<signed>(border_width - handle().borderWidth());
 
     window().setBorderWidth(border_width);
-    window().setBorderColor(theme().border().color());
+    window().setBorderColor(theme().border(m_focused).color());
 
     setTabMode(NOTSET);
 
     titlebar().setBorderWidth(border_width);
-    titlebar().setBorderColor(theme().border().color());
+    titlebar().setBorderColor(theme().border(m_focused).color());
 
     handle().setBorderWidth(border_width);
-    handle().setBorderColor(theme().border().color());
+    handle().setBorderColor(theme().border(m_focused).color());
 
     gripLeft().setBorderWidth(border_width);
-    gripLeft().setBorderColor(theme().border().color());
+    gripLeft().setBorderColor(theme().border(m_focused).color());
 
     gripRight().setBorderWidth(border_width);
-    gripRight().setBorderColor(theme().border().color());
+    gripRight().setBorderColor(theme().border(m_focused).color());
 
     if (bw_changes != 0)
         resize(width(), height() + bw_changes);
diff --git a/src/FbWinFrameTheme.cc b/src/FbWinFrameTheme.cc
index 1175297..624c242 100644
--- a/src/FbWinFrameTheme.cc
+++ b/src/FbWinFrameTheme.cc
@@ -51,7 +51,8 @@ FbWinFrameTheme::FbWinFrameTheme(int screen_num):
     m_title_height(*this, "window.title.height", "Window.Title.Height"),
     m_bevel_width(*this, "window.bevelWidth", "Window.BevelWidth"),
     m_handle_width(*this, "window.handleWidth", "Window.handleWidth"),
-    m_border(*this, "window", "Window"), // for window.border*
+    m_border_focus(*this, "window.focus", "Window.Focus"),
+    m_border_unfocus(*this, "window.unfocus", "Window.Unfocus"),
     m_button_pic_focus_gc(RootWindow(FbTk::App::instance()->display(), screen_num)),
     m_button_pic_unfocus_gc(RootWindow(FbTk::App::instance()->display(), screen_num)),
     m_focused_alpha(255),
@@ -83,10 +84,13 @@ FbWinFrameTheme::~FbWinFrameTheme() {
 }
 
 bool FbWinFrameTheme::fallback(FbTk::ThemeItem_base &item) {
-    if (item.name() == "window.borderWidth")
-        return FbTk::ThemeManager::instance().loadItem(item, "borderWidth", "BorderWidth");
-    else if (item.name() == "window.borderColor")
-        return FbTk::ThemeManager::instance().loadItem(item, "borderColor", "BorderColor");
+    if (item.name() == "window.focus.borderWidth" ||
+        item.name() == "window.unfocus.borderWidth")
+        return FbTk::ThemeManager::instance().loadItem(item, "window.borderWidth", "Window.BorderWidth") ||
+               FbTk::ThemeManager::instance().loadItem(item, "borderWidth", "BorderWidth");
+    else if (item.name() == "window.focus.borderColor" || item.name() == "window.unfocus.borderColor")
+        return FbTk::ThemeManager::instance().loadItem(item, "window.borderColor", "Window.BorderColor") ||
+               FbTk::ThemeManager::instance().loadItem(item, "borderColor", "BorderColor");
     else if (item.name() == "window.bevelWidth")
         return FbTk::ThemeManager::instance().loadItem(item, "bevelWidth", "bevelWidth");
     else if (item.name() == "window.handleWidth")
diff --git a/src/FbWinFrameTheme.hh b/src/FbWinFrameTheme.hh
index a48f8b6..c68c418 100644
--- a/src/FbWinFrameTheme.hh
+++ b/src/FbWinFrameTheme.hh
@@ -84,7 +84,7 @@ public:
     inline Cursor bottomSideCursor() const { return m_cursor_bottom_side; }
 
     inline Shape::ShapePlace shapePlace() const { return *m_shape_place; }
-    inline const BorderTheme &border() const { return m_border; }
+    inline const BorderTheme &border(bool focus) const { return (focus ? m_border_focus : m_border_unfocus); }
 
     unsigned int titleHeight() const { return *m_title_height; }
     unsigned int bevelWidth() const { return *m_bevel_width; }
@@ -109,7 +109,7 @@ private:
     FbTk::ThemeItem<Shape::ShapePlace> m_shape_place;
 
     FbTk::ThemeItem<int> m_title_height, m_bevel_width, m_handle_width;
-    BorderTheme m_border;
+    BorderTheme m_border_focus, m_border_unfocus;
 
     FbTk::GContext m_button_pic_focus_gc, m_button_pic_unfocus_gc;
 
diff --git a/src/FocusControl.cc b/src/FocusControl.cc
index ae5b5e3..426c026 100644
--- a/src/FocusControl.cc
+++ b/src/FocusControl.cc
@@ -306,7 +306,7 @@ void FocusControl::dirFocus(FluxboxWindow &win, FocusDir dir) {
     
     FluxboxWindow *foundwin = 0;
     int weight = 999999, exposure = 0; // extreme values
-    int borderW = m_screen.winFrameTheme().border().width(),
+    int borderW = win.frame().window().borderWidth(),
         top = win.y() + borderW, 
         bottom = win.y() + win.height() + borderW,
         left = win.x() + borderW,
diff --git a/src/Screen.cc b/src/Screen.cc
index eab425b..4f42539 100644
--- a/src/Screen.cc
+++ b/src/Screen.cc
@@ -1943,8 +1943,8 @@ void BScreen::renderGeomWindow() {
     int geom_w = winFrameTheme().font().textWidth(label, strlen(label)) + winFrameTheme().bevelWidth()*2;
     m_geom_window.resize(geom_w, geom_h);
 
-    m_geom_window.setBorderWidth(winFrameTheme().border().width());
-    m_geom_window.setBorderColor(winFrameTheme().border().color());
+    m_geom_window.setBorderWidth(winFrameTheme().border(true).width());
+    m_geom_window.setBorderColor(winFrameTheme().border(true).color());
 
 
     Pixmap tmp = geom_pixmap;
@@ -1981,8 +1981,8 @@ void BScreen::renderPosWindow() {
     int pos_w = winFrameTheme().font().textWidth("0:00000 x 0:00000", 17) + winFrameTheme().bevelWidth()*2;
     m_pos_window.resize(pos_w, pos_h);
 
-    m_pos_window.setBorderWidth(winFrameTheme().border().width());
-    m_pos_window.setBorderColor(winFrameTheme().border().color());
+    m_pos_window.setBorderWidth(winFrameTheme().border(true).width());
+    m_pos_window.setBorderColor(winFrameTheme().border(true).color());
 
 
     Pixmap tmp = pos_pixmap;
diff --git a/src/Window.cc b/src/Window.cc
index 54f6915..9b3c3ce 100644
--- a/src/Window.cc
+++ b/src/Window.cc
@@ -2981,7 +2981,7 @@ void FluxboxWindow::applyDecorations(bool initial) {
 
     unsigned int border_width = 0;
     if (decorations.border)
-        border_width = frame().theme().border().width();
+        border_width = frame().theme().border(m_focused).width();
 
     bool client_move = false;
 
@@ -4032,7 +4032,7 @@ void FluxboxWindow::updateButtons() {
 void FluxboxWindow::reconfigTheme() {
 
     m_frame.setBorderWidth(decorations.border ?
-                           frame().theme().border().width() : 0);
+                           frame().theme().border(m_focused).width() : 0);
     if (decorations.handle && frame().theme().handleWidth() != 0)
         frame().showHandle();
     else
-- 
cgit v0.11.2