diff options
author | fluxgen <fluxgen> | 2003-06-18 13:55:17 (GMT) |
---|---|---|
committer | fluxgen <fluxgen> | 2003-06-18 13:55:17 (GMT) |
commit | e3ab62fed1e63be3e7f6b81c316b15097638faf6 (patch) | |
tree | 563a2d45e6e33de08f2b899bbe775f9b2a5a755b | |
parent | 501168b557f4c21ca10dfdaad7776c125968363a (diff) | |
download | fluxbox-e3ab62fed1e63be3e7f6b81c316b15097638faf6.zip fluxbox-e3ab62fed1e63be3e7f6b81c316b15097638faf6.tar.bz2 |
added strut support
-rw-r--r-- | src/Slit.cc | 61 | ||||
-rw-r--r-- | src/Slit.hh | 6 | ||||
-rw-r--r-- | src/Toolbar.cc | 53 | ||||
-rw-r--r-- | src/Toolbar.hh | 8 | ||||
-rw-r--r-- | src/Window.cc | 21 | ||||
-rw-r--r-- | src/Window.hh | 10 |
6 files changed, 147 insertions, 12 deletions
diff --git a/src/Slit.cc b/src/Slit.cc index 83d2928..d6629b5 100644 --- a/src/Slit.cc +++ b/src/Slit.cc | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: Slit.cc,v 1.60 2003/06/13 05:03:43 fluxgen Exp $ | 25 | // $Id: Slit.cc,v 1.61 2003/06/18 13:49:43 fluxgen Exp $ |
26 | 26 | ||
27 | #include "Slit.hh" | 27 | #include "Slit.hh" |
28 | 28 | ||
@@ -291,7 +291,8 @@ Slit::Slit(BScreen &scr, FbTk::XLayer &layer, const char *filename) | |||
291 | "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", False)), //KDE v2.x | 291 | "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", False)), //KDE v2.x |
292 | 292 | ||
293 | m_layeritem(0), | 293 | m_layeritem(0), |
294 | m_slit_theme(new SlitTheme(*this)) { | 294 | m_slit_theme(new SlitTheme(*this)), |
295 | m_strut(0) { | ||
295 | 296 | ||
296 | // default placement and direction | 297 | // default placement and direction |
297 | m_direction = screen().getSlitDirection(); | 298 | m_direction = screen().getSlitDirection(); |
@@ -339,10 +340,65 @@ Slit::Slit(BScreen &scr, FbTk::XLayer &layer, const char *filename) | |||
339 | 340 | ||
340 | 341 | ||
341 | Slit::~Slit() { | 342 | Slit::~Slit() { |
343 | clearStrut(); | ||
342 | if (frame.pixmap != 0) | 344 | if (frame.pixmap != 0) |
343 | screen().imageControl().removeImage(frame.pixmap); | 345 | screen().imageControl().removeImage(frame.pixmap); |
344 | } | 346 | } |
345 | 347 | ||
348 | void Slit::clearStrut() { | ||
349 | if (m_strut != 0) { | ||
350 | screen().clearStrut(m_strut); | ||
351 | m_strut = 0; | ||
352 | } | ||
353 | } | ||
354 | |||
355 | void Slit::updateStrut() { | ||
356 | clearStrut(); | ||
357 | // no need for area if we're autohiding | ||
358 | if (doAutoHide()) | ||
359 | return; | ||
360 | |||
361 | int left = 0, right = 0, top = 0, bottom = 0; | ||
362 | switch (placement()) { | ||
363 | case TOPLEFT: | ||
364 | top = height(); | ||
365 | left = width(); | ||
366 | break; | ||
367 | case TOPCENTER: | ||
368 | top = height(); | ||
369 | break; | ||
370 | case TOPRIGHT: | ||
371 | right = width(); | ||
372 | top = height(); | ||
373 | break; | ||
374 | case BOTTOMLEFT: | ||
375 | bottom = height(); | ||
376 | left = width(); | ||
377 | break; | ||
378 | case BOTTOMCENTER: | ||
379 | // would be strange to have it request size on vertical direction | ||
380 | // each time we add a client | ||
381 | if (direction() == HORIZONTAL) | ||
382 | bottom = height(); | ||
383 | break; | ||
384 | case BOTTOMRIGHT: | ||
385 | if (direction() == HORIZONTAL) | ||
386 | bottom = height(); | ||
387 | else | ||
388 | right = width(); | ||
389 | break; | ||
390 | case CENTERLEFT: | ||
391 | if (direction() == VERTICAL) | ||
392 | left = width(); | ||
393 | break; | ||
394 | case CENTERRIGHT: | ||
395 | if (direction() == VERTICAL) | ||
396 | right = width(); | ||
397 | break; | ||
398 | } | ||
399 | m_strut = screen().requestStrut(left, right, top, bottom); | ||
400 | screen().updateAvailableWorkspaceArea(); | ||
401 | } | ||
346 | 402 | ||
347 | void Slit::addClient(Window w) { | 403 | void Slit::addClient(Window w) { |
348 | #ifdef DEBUG | 404 | #ifdef DEBUG |
@@ -777,6 +833,7 @@ void Slit::reconfigure() { | |||
777 | 833 | ||
778 | m_slitmenu.reconfigure(); | 834 | m_slitmenu.reconfigure(); |
779 | updateClientmenu(); | 835 | updateClientmenu(); |
836 | updateStrut(); | ||
780 | } | 837 | } |
781 | 838 | ||
782 | 839 | ||
diff --git a/src/Slit.hh b/src/Slit.hh index 10b141a..7626665 100644 --- a/src/Slit.hh +++ b/src/Slit.hh | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | /// $Id: Slit.hh,v 1.30 2003/05/17 11:00:50 fluxgen Exp $ | 25 | /// $Id: Slit.hh,v 1.31 2003/06/18 13:49:43 fluxgen Exp $ |
26 | 26 | ||
27 | #ifndef SLIT_HH | 27 | #ifndef SLIT_HH |
28 | #define SLIT_HH | 28 | #define SLIT_HH |
@@ -44,6 +44,7 @@ class SlitTheme; | |||
44 | class SlitClient; | 44 | class SlitClient; |
45 | class BScreen; | 45 | class BScreen; |
46 | class FbMenu; | 46 | class FbMenu; |
47 | class Strut; | ||
47 | 48 | ||
48 | /// Handles dock apps | 49 | /// Handles dock apps |
49 | class Slit : public FbTk::TimeoutHandler, public FbTk::EventHandler { | 50 | class Slit : public FbTk::TimeoutHandler, public FbTk::EventHandler { |
@@ -117,6 +118,8 @@ private: | |||
117 | void removeClient(SlitClient *client, bool remap, bool destroy); | 118 | void removeClient(SlitClient *client, bool remap, bool destroy); |
118 | void loadClientList(const char *filename); | 119 | void loadClientList(const char *filename); |
119 | void updateClientmenu(); | 120 | void updateClientmenu(); |
121 | void clearStrut(); | ||
122 | void updateStrut(); | ||
120 | 123 | ||
121 | bool m_hidden, m_do_auto_hide; | 124 | bool m_hidden, m_do_auto_hide; |
122 | Direction m_direction; | 125 | Direction m_direction; |
@@ -147,6 +150,7 @@ private: | |||
147 | std::auto_ptr<SlitTheme> m_slit_theme; | 150 | std::auto_ptr<SlitTheme> m_slit_theme; |
148 | std::auto_ptr<FbTk::Transparent> m_transp; | 151 | std::auto_ptr<FbTk::Transparent> m_transp; |
149 | static unsigned int s_eventmask; | 152 | static unsigned int s_eventmask; |
153 | Strut *m_strut; | ||
150 | }; | 154 | }; |
151 | 155 | ||
152 | 156 | ||
diff --git a/src/Toolbar.cc b/src/Toolbar.cc index 544a1e3..c87e1ca 100644 --- a/src/Toolbar.cc +++ b/src/Toolbar.cc | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: Toolbar.cc,v 1.90 2003/06/13 05:04:14 fluxgen Exp $ | 25 | // $Id: Toolbar.cc,v 1.91 2003/06/18 13:50:40 fluxgen Exp $ |
26 | 26 | ||
27 | #include "Toolbar.hh" | 27 | #include "Toolbar.hh" |
28 | 28 | ||
@@ -43,6 +43,7 @@ | |||
43 | #include "BoolMenuItem.hh" | 43 | #include "BoolMenuItem.hh" |
44 | #include "FbWinFrameTheme.hh" | 44 | #include "FbWinFrameTheme.hh" |
45 | #include "Xinerama.hh" | 45 | #include "Xinerama.hh" |
46 | #include "Strut.hh" | ||
46 | 47 | ||
47 | // use GNU extensions | 48 | // use GNU extensions |
48 | #ifndef _GNU_SOURCE | 49 | #ifndef _GNU_SOURCE |
@@ -279,7 +280,8 @@ Toolbar::Toolbar(BScreen &scrn, FbTk::XLayer &layer, FbTk::Menu &menu, size_t wi | |||
279 | m_theme(scrn.screenNumber()), | 280 | m_theme(scrn.screenNumber()), |
280 | m_place(scrn.toolbarPlacement()), | 281 | m_place(scrn.toolbarPlacement()), |
281 | m_themelistener(*this), | 282 | m_themelistener(*this), |
282 | m_layeritem(frame.window, layer) { | 283 | m_layeritem(frame.window, layer), |
284 | m_strut(0) { | ||
283 | 285 | ||
284 | // we need to get notified when the theme is reloaded | 286 | // we need to get notified when the theme is reloaded |
285 | m_theme.addListener(m_themelistener); | 287 | m_theme.addListener(m_themelistener); |
@@ -339,6 +341,7 @@ Toolbar::Toolbar(BScreen &scrn, FbTk::XLayer &layer, FbTk::Menu &menu, size_t wi | |||
339 | 341 | ||
340 | 342 | ||
341 | Toolbar::~Toolbar() { | 343 | Toolbar::~Toolbar() { |
344 | clearStrut(); | ||
342 | FbTk::ImageControl &image_ctrl = screen().imageControl(); | 345 | FbTk::ImageControl &image_ctrl = screen().imageControl(); |
343 | if (frame.base) image_ctrl.removeImage(frame.base); | 346 | if (frame.base) image_ctrl.removeImage(frame.base); |
344 | if (frame.label) image_ctrl.removeImage(frame.label); | 347 | if (frame.label) image_ctrl.removeImage(frame.label); |
@@ -349,6 +352,48 @@ Toolbar::~Toolbar() { | |||
349 | 352 | ||
350 | } | 353 | } |
351 | 354 | ||
355 | void Toolbar::clearStrut() { | ||
356 | if (m_strut) { | ||
357 | screen().clearStrut(m_strut); | ||
358 | m_strut = 0; | ||
359 | } | ||
360 | } | ||
361 | |||
362 | void Toolbar::updateStrut() { | ||
363 | clearStrut(); | ||
364 | // we should request space if we're in autohide mode or | ||
365 | // if the user dont want to request space for toolbar. | ||
366 | if (doAutoHide()) | ||
367 | return; | ||
368 | |||
369 | // request area on screen | ||
370 | int top = 0, bottom = 0, left = 0, right = 0; | ||
371 | switch (m_place) { | ||
372 | case TOPLEFT: | ||
373 | case TOPCENTER: | ||
374 | case TOPRIGHT: | ||
375 | top = height(); | ||
376 | break; | ||
377 | case BOTTOMLEFT: | ||
378 | case BOTTOMCENTER: | ||
379 | case BOTTOMRIGHT: | ||
380 | bottom = height(); | ||
381 | break; | ||
382 | case RIGHTTOP: | ||
383 | case RIGHTCENTER: | ||
384 | case RIGHTBOTTOM: | ||
385 | right = width(); | ||
386 | break; | ||
387 | case LEFTTOP: | ||
388 | case LEFTCENTER: | ||
389 | case LEFTBOTTOM: | ||
390 | left = width(); | ||
391 | break; | ||
392 | }; | ||
393 | m_strut = screen().requestStrut(left, right, top, bottom); | ||
394 | screen().updateAvailableWorkspaceArea(); | ||
395 | } | ||
396 | |||
352 | bool Toolbar::isVertical() const { | 397 | bool Toolbar::isVertical() const { |
353 | return (m_place == RIGHTCENTER || | 398 | return (m_place == RIGHTCENTER || |
354 | m_place == RIGHTTOP || | 399 | m_place == RIGHTTOP || |
@@ -702,7 +747,9 @@ void Toolbar::reconfigure() { | |||
702 | checkClock(true); | 747 | checkClock(true); |
703 | 748 | ||
704 | m_toolbarmenu.reconfigure(); | 749 | m_toolbarmenu.reconfigure(); |
705 | 750 | // we're done with all resizing and stuff now we can request a new | |
751 | // area to be reserv on screen | ||
752 | updateStrut(); | ||
706 | } | 753 | } |
707 | 754 | ||
708 | 755 | ||
diff --git a/src/Toolbar.hh b/src/Toolbar.hh index a1c5c50..f8d3fe4 100644 --- a/src/Toolbar.hh +++ b/src/Toolbar.hh | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: Toolbar.hh,v 1.32 2003/06/11 14:50:57 fluxgen Exp $ | 25 | // $Id: Toolbar.hh,v 1.33 2003/06/18 13:50:40 fluxgen Exp $ |
26 | 26 | ||
27 | #ifndef TOOLBAR_HH | 27 | #ifndef TOOLBAR_HH |
28 | #define TOOLBAR_HH | 28 | #define TOOLBAR_HH |
@@ -42,6 +42,8 @@ | |||
42 | #include <memory> | 42 | #include <memory> |
43 | 43 | ||
44 | class BScreen; | 44 | class BScreen; |
45 | class Strut; | ||
46 | |||
45 | namespace FbTk { | 47 | namespace FbTk { |
46 | class ImageControl; | 48 | class ImageControl; |
47 | }; | 49 | }; |
@@ -133,6 +135,8 @@ public: | |||
133 | 135 | ||
134 | 136 | ||
135 | private: | 137 | private: |
138 | void clearStrut(); | ||
139 | void updateStrut(); | ||
136 | 140 | ||
137 | bool editing; ///< edit workspace label mode | 141 | bool editing; ///< edit workspace label mode |
138 | bool hidden; ///< hidden state | 142 | bool hidden; ///< hidden state |
@@ -189,6 +193,8 @@ private: | |||
189 | ThemeListener m_themelistener; | 193 | ThemeListener m_themelistener; |
190 | 194 | ||
191 | FbTk::XLayerItem m_layeritem; | 195 | FbTk::XLayerItem m_layeritem; |
196 | |||
197 | Strut *m_strut; ///< created and destroyed by BScreen | ||
192 | }; | 198 | }; |
193 | 199 | ||
194 | 200 | ||
diff --git a/src/Window.cc b/src/Window.cc index 0e4e8b0..9eabc0c 100644 --- a/src/Window.cc +++ b/src/Window.cc | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: Window.cc,v 1.192 2003/06/15 18:35:32 fluxgen Exp $ | 25 | // $Id: Window.cc,v 1.193 2003/06/18 13:55:17 fluxgen Exp $ |
26 | 26 | ||
27 | #include "Window.hh" | 27 | #include "Window.hh" |
28 | 28 | ||
@@ -246,6 +246,7 @@ FluxboxWindow::FluxboxWindow(WinClient &client, BScreen &scr, FbWinFrameTheme &t | |||
246 | m_old_decoration(DECOR_NORMAL), | 246 | m_old_decoration(DECOR_NORMAL), |
247 | m_client(&client), | 247 | m_client(&client), |
248 | m_frame(new FbWinFrame(tm, scr.imageControl(), scr.screenNumber(), 0, 0, 100, 100)), | 248 | m_frame(new FbWinFrame(tm, scr.imageControl(), scr.screenNumber(), 0, 0, 100, 100)), |
249 | m_strut(0), | ||
249 | m_layeritem(m_frame->window(), layer), | 250 | m_layeritem(m_frame->window(), layer), |
250 | m_layernum(layer.getLayerNum()), | 251 | m_layernum(layer.getLayerNum()), |
251 | m_parent(scr.rootWindow()) { | 252 | m_parent(scr.rootWindow()) { |
@@ -279,6 +280,7 @@ FluxboxWindow::FluxboxWindow(Window w, BScreen &scr, FbWinFrameTheme &tm, | |||
279 | m_old_decoration(DECOR_NORMAL), | 280 | m_old_decoration(DECOR_NORMAL), |
280 | m_client(new WinClient(w, *this)), | 281 | m_client(new WinClient(w, *this)), |
281 | m_frame(new FbWinFrame(tm, scr.imageControl(), scr.screenNumber(), 0, 0, 100, 100)), | 282 | m_frame(new FbWinFrame(tm, scr.imageControl(), scr.screenNumber(), 0, 0, 100, 100)), |
283 | m_strut(0), | ||
282 | m_layeritem(m_frame->window(), layer), | 284 | m_layeritem(m_frame->window(), layer), |
283 | m_layernum(layer.getLayerNum()), | 285 | m_layernum(layer.getLayerNum()), |
284 | m_parent(scr.rootWindow()) { | 286 | m_parent(scr.rootWindow()) { |
@@ -296,6 +298,9 @@ FluxboxWindow::~FluxboxWindow() { | |||
296 | cerr<<__FILE__<<"("<<__LINE__<<"): curr client = "<<m_client<<endl; | 298 | cerr<<__FILE__<<"("<<__LINE__<<"): curr client = "<<m_client<<endl; |
297 | cerr<<__FILE__<<"("<<__LINE__<<"): m_labelbuttons.size = "<<m_labelbuttons.size()<<endl; | 299 | cerr<<__FILE__<<"("<<__LINE__<<"): m_labelbuttons.size = "<<m_labelbuttons.size()<<endl; |
298 | #endif // DEBUG | 300 | #endif // DEBUG |
301 | |||
302 | clearStrut(); | ||
303 | |||
299 | if (moving || resizing || m_attaching_tab) { | 304 | if (moving || resizing || m_attaching_tab) { |
300 | screen().hideGeometry(); | 305 | screen().hideGeometry(); |
301 | XUngrabPointer(display, CurrentTime); | 306 | XUngrabPointer(display, CurrentTime); |
@@ -1989,8 +1994,6 @@ void FluxboxWindow::handleEvent(XEvent &event) { | |||
1989 | } | 1994 | } |
1990 | break; | 1995 | break; |
1991 | 1996 | ||
1992 | |||
1993 | |||
1994 | default: | 1997 | default: |
1995 | #ifdef SHAPE | 1998 | #ifdef SHAPE |
1996 | if (Fluxbox::instance()->haveShape() && | 1999 | if (Fluxbox::instance()->haveShape() && |
@@ -2714,6 +2717,18 @@ void FluxboxWindow::toggleDecoration() { | |||
2714 | } | 2717 | } |
2715 | } | 2718 | } |
2716 | 2719 | ||
2720 | void FluxboxWindow::setStrut(Strut *strut) { | ||
2721 | clearStrut(); | ||
2722 | m_strut = strut; | ||
2723 | } | ||
2724 | |||
2725 | void FluxboxWindow::clearStrut() { | ||
2726 | if (m_strut != 0) { | ||
2727 | screen().clearStrut(m_strut); | ||
2728 | m_strut = 0; | ||
2729 | } | ||
2730 | } | ||
2731 | |||
2717 | unsigned int FluxboxWindow::decorationMask() const { | 2732 | unsigned int FluxboxWindow::decorationMask() const { |
2718 | unsigned int ret = 0; | 2733 | unsigned int ret = 0; |
2719 | if (decorations.titlebar) | 2734 | if (decorations.titlebar) |
diff --git a/src/Window.hh b/src/Window.hh index b5b86fa..59a9084 100644 --- a/src/Window.hh +++ b/src/Window.hh | |||
@@ -22,7 +22,7 @@ | |||
22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 22 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
23 | // DEALINGS IN THE SOFTWARE. | 23 | // DEALINGS IN THE SOFTWARE. |
24 | 24 | ||
25 | // $Id: Window.hh,v 1.78 2003/06/15 18:34:48 fluxgen Exp $ | 25 | // $Id: Window.hh,v 1.79 2003/06/18 13:55:16 fluxgen Exp $ |
26 | 26 | ||
27 | #ifndef WINDOW_HH | 27 | #ifndef WINDOW_HH |
28 | #define WINDOW_HH | 28 | #define WINDOW_HH |
@@ -44,9 +44,10 @@ | |||
44 | class WinClient; | 44 | class WinClient; |
45 | class FbWinFrameTheme; | 45 | class FbWinFrameTheme; |
46 | class BScreen; | 46 | class BScreen; |
47 | class Strut; | ||
48 | |||
47 | class TextButton; | 49 | class TextButton; |
48 | class FbWinFrame; | 50 | class FbWinFrame; |
49 | |||
50 | namespace FbTk { | 51 | namespace FbTk { |
51 | class MenuTheme; | 52 | class MenuTheme; |
52 | class ImageControl; | 53 | class ImageControl; |
@@ -242,6 +243,9 @@ public: | |||
242 | DECORM_LAST = (1<<11) // useful for getting "All" | 243 | DECORM_LAST = (1<<11) // useful for getting "All" |
243 | }; | 244 | }; |
244 | 245 | ||
246 | void setStrut(Strut *strut); | ||
247 | void clearStrut(); | ||
248 | |||
245 | unsigned int decorationMask() const; | 249 | unsigned int decorationMask() const; |
246 | void setDecorationMask(unsigned int mask); | 250 | void setDecorationMask(unsigned int mask); |
247 | 251 | ||
@@ -441,6 +445,8 @@ private: | |||
441 | m_last_button_y; ///< last known y position of the mouse button | 445 | m_last_button_y; ///< last known y position of the mouse button |
442 | std::auto_ptr<FbWinFrame> m_frame; | 446 | std::auto_ptr<FbWinFrame> m_frame; |
443 | 447 | ||
448 | Strut *m_strut; | ||
449 | |||
444 | FbTk::XLayerItem m_layeritem; | 450 | FbTk::XLayerItem m_layeritem; |
445 | int m_layernum; | 451 | int m_layernum; |
446 | 452 | ||