diff options
author | Mathias Gumz <akira at fluxbox dot org> | 2013-02-06 12:47:11 (GMT) |
---|---|---|
committer | Mathias Gumz <akira at fluxbox dot org> | 2013-02-06 12:47:17 (GMT) |
commit | 34343bb20bdb3dc94fe426f69e5db16315353d57 (patch) | |
tree | cbf01e0b2af4ca14c093ada589f82558ec7d3a66 | |
parent | 94fddc09c064555721dc521e3e94ed6f610653b9 (diff) | |
download | fluxbox-34343bb20bdb3dc94fe426f69e5db16315353d57.zip fluxbox-34343bb20bdb3dc94fe426f69e5db16315353d57.tar.bz2 |
Feature #3602124: 'LHalf' and 'RHalf' buttons to the titlebar
First draft of feature request of #3602124: Having 2 buttons in the titlebar
which allow quick positioning of a Window into the left or right half of the
current monitor.
-rw-r--r-- | src/Resources.cc | 10 | ||||
-rw-r--r-- | src/WinButton.cc | 35 | ||||
-rw-r--r-- | src/WinButton.hh | 14 | ||||
-rw-r--r-- | src/WinButtonTheme.cc | 6 | ||||
-rw-r--r-- | src/WinButtonTheme.hh | 12 | ||||
-rw-r--r-- | src/Window.cc | 27 |
6 files changed, 85 insertions, 19 deletions
diff --git a/src/Resources.cc b/src/Resources.cc index 2e07725..128eedd 100644 --- a/src/Resources.cc +++ b/src/Resources.cc | |||
@@ -108,6 +108,12 @@ getString() const { | |||
108 | case WinButton::MENUICON: | 108 | case WinButton::MENUICON: |
109 | retval.append("MenuIcon"); | 109 | retval.append("MenuIcon"); |
110 | break; | 110 | break; |
111 | case WinButton::LEFT_HALF: | ||
112 | retval.append("LHalf"); | ||
113 | break; | ||
114 | case WinButton::RIGHT_HALF: | ||
115 | retval.append("RHalf"); | ||
116 | break; | ||
111 | default: | 117 | default: |
112 | break; | 118 | break; |
113 | } | 119 | } |
@@ -142,6 +148,10 @@ setFromString(char const *strval) { | |||
142 | m_value.push_back(WinButton::MENUICON); | 148 | m_value.push_back(WinButton::MENUICON); |
143 | else if (v == "close") | 149 | else if (v == "close") |
144 | m_value.push_back(WinButton::CLOSE); | 150 | m_value.push_back(WinButton::CLOSE); |
151 | else if (v == "lhalf") | ||
152 | m_value.push_back(WinButton::LEFT_HALF); | ||
153 | else if (v == "rhalf") | ||
154 | m_value.push_back(WinButton::RIGHT_HALF); | ||
145 | } | 155 | } |
146 | } | 156 | } |
147 | 157 | ||
diff --git a/src/WinButton.cc b/src/WinButton.cc index e1b79a2..bb841fb 100644 --- a/src/WinButton.cc +++ b/src/WinButton.cc | |||
@@ -137,6 +137,10 @@ Pixmap WinButton::getPixmap(const FbTk::ThemeProxy<WinButtonTheme> &theme) const | |||
137 | return theme->titlePixmap().pixmap().drawable(); | 137 | return theme->titlePixmap().pixmap().drawable(); |
138 | else | 138 | else |
139 | return theme->menuiconPixmap().pixmap().drawable(); | 139 | return theme->menuiconPixmap().pixmap().drawable(); |
140 | case LEFT_HALF: | ||
141 | return theme->leftHalfPixmap().pixmap().drawable(); | ||
142 | case RIGHT_HALF: | ||
143 | return theme->rightHalfPixmap().pixmap().drawable(); | ||
140 | default: | 144 | default: |
141 | return None; | 145 | return None; |
142 | } | 146 | } |
@@ -160,18 +164,14 @@ void WinButton::drawType() { | |||
160 | // otherwise draw old style imagery | 164 | // otherwise draw old style imagery |
161 | switch (m_type) { | 165 | switch (m_type) { |
162 | case MAXIMIZE: | 166 | case MAXIMIZE: |
163 | // if no pixmap was used, use old style | 167 | drawRectangle(gc(), 2, 2, width() - 5, height() - 5); |
164 | if (gc() == 0) // must have valid graphic context | 168 | drawLine(gc(), 2, 3, width() - 3, 3); |
165 | return; | ||
166 | |||
167 | drawRectangle(gc(), | ||
168 | 2, 2, width() - 5, height() - 5); | ||
169 | drawLine(gc(), | ||
170 | 2, 3, width() - 3, 3); | ||
171 | break; | 169 | break; |
170 | |||
172 | case MINIMIZE: | 171 | case MINIMIZE: |
173 | drawRectangle(gc(), 2, height() - 5, width() - 5, 2); | 172 | drawRectangle(gc(), 2, height() - 5, width() - 5, 2); |
174 | break; | 173 | break; |
174 | |||
175 | case STICK: | 175 | case STICK: |
176 | // width/4 != width/2, so we use /4*2 so that it's properly centred | 176 | // width/4 != width/2, so we use /4*2 so that it's properly centred |
177 | if (m_listen_to.isStuck()) { | 177 | if (m_listen_to.isStuck()) { |
@@ -184,6 +184,7 @@ void WinButton::drawType() { | |||
184 | width()/10*2 + oddW, height()/10*2 + oddH); | 184 | width()/10*2 + oddW, height()/10*2 + oddH); |
185 | } | 185 | } |
186 | break; | 186 | break; |
187 | |||
187 | case CLOSE: | 188 | case CLOSE: |
188 | drawLine(gc(), | 189 | drawLine(gc(), |
189 | 2, 2, | 190 | 2, 2, |
@@ -199,15 +200,12 @@ void WinButton::drawType() { | |||
199 | // XFree86 Version 4.3.0.1 (Debian 4.3.0.dfsg.1-1 20040428170728) | 200 | // XFree86 Version 4.3.0.1 (Debian 4.3.0.dfsg.1-1 20040428170728) |
200 | // (X Protocol Version 11, Revision 0, Release 6.6) | 201 | // (X Protocol Version 11, Revision 0, Release 6.6) |
201 | 202 | ||
202 | drawLine(gc(), | 203 | drawLine(gc(), 2, height() - 3, width() - 3, 2); |
203 | 2, height() - 3, | ||
204 | width() - 3, 2); | ||
205 | break; | 204 | break; |
206 | case SHADE: | ||
207 | 205 | ||
206 | case SHADE: | ||
208 | { | 207 | { |
209 | int size = width() - 5 - oddW; | 208 | int size = width() - 5 - oddW; |
210 | |||
211 | drawRectangle(gc(), 2, 2, size, 2); | 209 | drawRectangle(gc(), 2, 2, size, 2); |
212 | 210 | ||
213 | // draw a one-quarter triangle below the rectangle | 211 | // draw a one-quarter triangle below the rectangle |
@@ -220,6 +218,7 @@ void WinButton::drawType() { | |||
220 | 218 | ||
221 | break; | 219 | break; |
222 | } | 220 | } |
221 | |||
223 | case MENUICON: | 222 | case MENUICON: |
224 | if (m_icon_pixmap.drawable()) { | 223 | if (m_icon_pixmap.drawable()) { |
225 | 224 | ||
@@ -242,10 +241,16 @@ void WinButton::drawType() { | |||
242 | for (unsigned int y = height()/3; y <= height() - height()/3; y+=3) { | 241 | for (unsigned int y = height()/3; y <= height() - height()/3; y+=3) { |
243 | drawLine(gc(), width()/4, y, width() - width()/4 - oddW - 1, y); | 242 | drawLine(gc(), width()/4, y, width() - width()/4 - oddW - 1, y); |
244 | } | 243 | } |
245 | drawRectangle(gc(), | 244 | drawRectangle(gc(), 2, 2, width() - 5, height() - 5); |
246 | 2, 2, width() - 5, height() - 5); | ||
247 | } | 245 | } |
248 | break; | 246 | break; |
247 | |||
248 | case LEFT_HALF: | ||
249 | fillRectangle(gc(), 2, 2, (width() / 2) - oddW, height() - 4); | ||
250 | break; | ||
251 | case RIGHT_HALF: | ||
252 | fillRectangle(gc(), width() / 2, 2, (width() / 2) - 2 + oddW, height() - 4); | ||
253 | break; | ||
249 | } | 254 | } |
250 | } | 255 | } |
251 | 256 | ||
diff --git a/src/WinButton.hh b/src/WinButton.hh index 3912a1a..f64342e 100644 --- a/src/WinButton.hh +++ b/src/WinButton.hh | |||
@@ -38,7 +38,17 @@ template <class T> class ThemeProxy; | |||
38 | class WinButton:public FbTk::Button, public FbTk::SignalTracker { | 38 | class WinButton:public FbTk::Button, public FbTk::SignalTracker { |
39 | public: | 39 | public: |
40 | /// draw type for the button | 40 | /// draw type for the button |
41 | enum Type {MAXIMIZE, MINIMIZE, SHADE, STICK, CLOSE, MENUICON}; | 41 | enum Type { |
42 | MAXIMIZE, | ||
43 | MINIMIZE, | ||
44 | SHADE, | ||
45 | STICK, | ||
46 | CLOSE, | ||
47 | MENUICON, | ||
48 | LEFT_HALF, | ||
49 | RIGHT_HALF | ||
50 | }; | ||
51 | |||
42 | WinButton(FluxboxWindow &listen_to, | 52 | WinButton(FluxboxWindow &listen_to, |
43 | FbTk::ThemeProxy<WinButtonTheme> &theme, | 53 | FbTk::ThemeProxy<WinButtonTheme> &theme, |
44 | FbTk::ThemeProxy<WinButtonTheme> &pressed, | 54 | FbTk::ThemeProxy<WinButtonTheme> &pressed, |
@@ -66,7 +76,7 @@ private: | |||
66 | 76 | ||
67 | FbTk::FbPixmap m_icon_pixmap; | 77 | FbTk::FbPixmap m_icon_pixmap; |
68 | FbTk::FbPixmap m_icon_mask; | 78 | FbTk::FbPixmap m_icon_mask; |
69 | 79 | ||
70 | bool overrode_bg, overrode_pressed; | 80 | bool overrode_bg, overrode_pressed; |
71 | }; | 81 | }; |
72 | 82 | ||
diff --git a/src/WinButtonTheme.cc b/src/WinButtonTheme.cc index c6e6ddf..aa043b1 100644 --- a/src/WinButtonTheme.cc +++ b/src/WinButtonTheme.cc | |||
@@ -52,6 +52,10 @@ WinButtonTheme::WinButtonTheme(int screen_num, | |||
52 | "Window.Stick" + altextra + ".Pixmap"), | 52 | "Window.Stick" + altextra + ".Pixmap"), |
53 | m_stuck_pm(*this, "window.stuck" + extra + ".pixmap", | 53 | m_stuck_pm(*this, "window.stuck" + extra + ".pixmap", |
54 | "Window.Stuck" + altextra + ".Pixmap"), | 54 | "Window.Stuck" + altextra + ".Pixmap"), |
55 | m_lefthalf_pm(*this, "window.lhalf" + extra + ".pixmap", | ||
56 | "Window.LHalf" + altextra + ".Pixmap"), | ||
57 | m_righthalf_pm(*this, "window.rhalf" + extra + ".pixmap", | ||
58 | "Window.RHalf" + altextra + ".Pixmap"), | ||
55 | m_frame_theme(frame_theme) { | 59 | m_frame_theme(frame_theme) { |
56 | 60 | ||
57 | FbTk::ThemeManager::instance().loadTheme(*this); | 61 | FbTk::ThemeManager::instance().loadTheme(*this); |
@@ -82,5 +86,7 @@ void WinButtonTheme::reconfigTheme() { | |||
82 | m_title_pm->scale(size, size); | 86 | m_title_pm->scale(size, size); |
83 | m_stick_pm->scale(size, size); | 87 | m_stick_pm->scale(size, size); |
84 | m_stuck_pm->scale(size, size); | 88 | m_stuck_pm->scale(size, size); |
89 | m_lefthalf_pm->scale(size, size); | ||
90 | m_righthalf_pm->scale(size, size); | ||
85 | } | 91 | } |
86 | 92 | ||
diff --git a/src/WinButtonTheme.hh b/src/WinButtonTheme.hh index 224fc6c..9e3c5ed 100644 --- a/src/WinButtonTheme.hh +++ b/src/WinButtonTheme.hh | |||
@@ -62,10 +62,18 @@ public: | |||
62 | 62 | ||
63 | const FbTk::PixmapWithMask &menuiconPixmap() const { return *m_menuicon_pm; } | 63 | const FbTk::PixmapWithMask &menuiconPixmap() const { return *m_menuicon_pm; } |
64 | FbTk::PixmapWithMask &menuiconPixmap() { return *m_menuicon_pm; } | 64 | FbTk::PixmapWithMask &menuiconPixmap() { return *m_menuicon_pm; } |
65 | 65 | ||
66 | FbTk::PixmapWithMask &titlePixmap() { return *m_title_pm; } | 66 | FbTk::PixmapWithMask &titlePixmap() { return *m_title_pm; } |
67 | const FbTk::PixmapWithMask &titlePixmap() const { return *m_title_pm; } | 67 | const FbTk::PixmapWithMask &titlePixmap() const { return *m_title_pm; } |
68 | 68 | ||
69 | |||
70 | FbTk::PixmapWithMask &leftHalfPixmap() { return *m_lefthalf_pm; } | ||
71 | const FbTk::PixmapWithMask &leftHalfPixmap() const { return *m_lefthalf_pm; } | ||
72 | |||
73 | FbTk::PixmapWithMask &rightHalfPixmap() { return *m_righthalf_pm; } | ||
74 | const FbTk::PixmapWithMask &rightHalfPixmap() const { return *m_righthalf_pm; } | ||
75 | |||
76 | |||
69 | virtual FbTk::Signal<> &reconfigSig() { return FbTk::Theme::reconfigSig(); } | 77 | virtual FbTk::Signal<> &reconfigSig() { return FbTk::Theme::reconfigSig(); } |
70 | 78 | ||
71 | virtual WinButtonTheme &operator *() { return *this; } | 79 | virtual WinButtonTheme &operator *() { return *this; } |
@@ -75,7 +83,7 @@ private: | |||
75 | 83 | ||
76 | FbTk::ThemeItem<FbTk::PixmapWithMask> m_close_pm, m_maximize_pm, | 84 | FbTk::ThemeItem<FbTk::PixmapWithMask> m_close_pm, m_maximize_pm, |
77 | m_iconify_pm, m_shade_pm, m_unshade_pm, m_menuicon_pm, m_title_pm, | 85 | m_iconify_pm, m_shade_pm, m_unshade_pm, m_menuicon_pm, m_title_pm, |
78 | m_stick_pm, m_stuck_pm; | 86 | m_stick_pm, m_stuck_pm, m_lefthalf_pm, m_righthalf_pm; |
79 | 87 | ||
80 | FbTk::ThemeProxy<FbWinFrameTheme> &m_frame_theme; | 88 | FbTk::ThemeProxy<FbWinFrameTheme> &m_frame_theme; |
81 | }; | 89 | }; |
diff --git a/src/Window.cc b/src/Window.cc index 1ee8853..98486be 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -48,6 +48,7 @@ | |||
48 | 48 | ||
49 | #include "FbTk/StringUtil.hh" | 49 | #include "FbTk/StringUtil.hh" |
50 | #include "FbTk/Compose.hh" | 50 | #include "FbTk/Compose.hh" |
51 | #include "FbTk/CommandParser.hh" | ||
51 | #include "FbTk/EventManager.hh" | 52 | #include "FbTk/EventManager.hh" |
52 | #include "FbTk/KeyUtil.hh" | 53 | #include "FbTk/KeyUtil.hh" |
53 | #include "FbTk/SimpleCommand.hh" | 54 | #include "FbTk/SimpleCommand.hh" |
@@ -3600,6 +3601,32 @@ void FluxboxWindow::updateButtons() { | |||
3600 | winbtn->setOnClick(show_menu_cmd); | 3601 | winbtn->setOnClick(show_menu_cmd); |
3601 | } | 3602 | } |
3602 | break; | 3603 | break; |
3604 | |||
3605 | case WinButton::LEFT_HALF: | ||
3606 | { | ||
3607 | winbtn = new WinButton(*this, m_button_theme, | ||
3608 | screen().pressedWinButtonTheme(), | ||
3609 | dir[i], | ||
3610 | frame().titlebar(), | ||
3611 | 0, 0, 10, 10); | ||
3612 | |||
3613 | CommandRef lhalf_cmd(FbTk::CommandParser<void>::instance().parse("MacroCmd {MoveTo 0 0} {ResizeTo 50% 100%}")); | ||
3614 | winbtn->setOnClick(lhalf_cmd); | ||
3615 | } | ||
3616 | break; | ||
3617 | |||
3618 | case WinButton::RIGHT_HALF: | ||
3619 | { | ||
3620 | winbtn = new WinButton(*this, m_button_theme, | ||
3621 | screen().pressedWinButtonTheme(), | ||
3622 | dir[i], | ||
3623 | frame().titlebar(), | ||
3624 | 0, 0, 10, 10); | ||
3625 | CommandRef rhalf_cmd(FbTk::CommandParser<void>::instance().parse("MacroCmd {MoveTo 50% 0} {ResizeTo 50% 100%}")); | ||
3626 | winbtn->setOnClick(rhalf_cmd); | ||
3627 | } | ||
3628 | break; | ||
3629 | |||
3603 | } | 3630 | } |
3604 | 3631 | ||
3605 | 3632 | ||