summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/FbWinFrame.cc67
-rw-r--r--src/FbWinFrame.hh12
-rw-r--r--src/Keys.cc2
-rw-r--r--src/WinClient.cc57
-rw-r--r--src/WinClient.hh6
5 files changed, 71 insertions, 73 deletions
diff --git a/src/FbWinFrame.cc b/src/FbWinFrame.cc
index 36d2942..c7eaef3 100644
--- a/src/FbWinFrame.cc
+++ b/src/FbWinFrame.cc
@@ -85,7 +85,6 @@ FbWinFrame::FbWinFrame(BScreen &screen,
85 m_visible(false), 85 m_visible(false),
86 m_button_pm(0), 86 m_button_pm(0),
87 m_tabmode(screen.getDefaultInternalTabs()?INTERNAL:EXTERNAL), 87 m_tabmode(screen.getDefaultInternalTabs()?INTERNAL:EXTERNAL),
88 m_active_gravity(0),
89 m_active_orig_client_bw(0), 88 m_active_orig_client_bw(0),
90 m_need_render(true), 89 m_need_render(true),
91 m_button_size(1), 90 m_button_size(1),
@@ -846,7 +845,7 @@ void FbWinFrame::reconfigure() {
846 845
847 int grav_x=0, grav_y=0; 846 int grav_x=0, grav_y=0;
848 // negate gravity 847 // negate gravity
849 gravityTranslate(grav_x, grav_y, -m_active_gravity, m_active_orig_client_bw, false); 848 gravityTranslate(grav_x, grav_y, -sizeHints().win_gravity, m_active_orig_client_bw, false);
850 849
851 m_bevel = theme()->bevelWidth(); 850 m_bevel = theme()->bevelWidth();
852 setBorderWidth(); 851 setBorderWidth();
@@ -941,7 +940,7 @@ void FbWinFrame::reconfigure() {
941 m_window.width(), client_height); 940 m_window.width(), client_height);
942 } 941 }
943 942
944 gravityTranslate(grav_x, grav_y, m_active_gravity, m_active_orig_client_bw, false); 943 gravityTranslate(grav_x, grav_y, sizeHints().win_gravity, m_active_orig_client_bw, false);
945 // if the location changes, shift it 944 // if the location changes, shift it
946 if (grav_x != 0 || grav_y != 0) 945 if (grav_x != 0 || grav_y != 0)
947 move(grav_x + x(), grav_y + y()); 946 move(grav_x + x(), grav_y + y());
@@ -1456,7 +1455,7 @@ bool FbWinFrame::useHandle() const {
1456void FbWinFrame::applyDecorations() { 1455void FbWinFrame::applyDecorations() {
1457 int grav_x=0, grav_y=0; 1456 int grav_x=0, grav_y=0;
1458 // negate gravity 1457 // negate gravity
1459 gravityTranslate(grav_x, grav_y, -m_active_gravity, m_active_orig_client_bw, 1458 gravityTranslate(grav_x, grav_y, -sizeHints().win_gravity, m_active_orig_client_bw,
1460 false); 1459 false);
1461 1460
1462 bool client_move = setBorderWidth(false); 1461 bool client_move = setBorderWidth(false);
@@ -1488,7 +1487,7 @@ void FbWinFrame::applyDecorations() {
1488 client_move |= hideHandle(); 1487 client_move |= hideHandle();
1489 1488
1490 // apply gravity once more 1489 // apply gravity once more
1491 gravityTranslate(grav_x, grav_y, m_active_gravity, m_active_orig_client_bw, 1490 gravityTranslate(grav_x, grav_y, sizeHints().win_gravity, m_active_orig_client_bw,
1492 false); 1491 false);
1493 1492
1494 // if the location changes, shift it 1493 // if the location changes, shift it
@@ -1523,7 +1522,7 @@ bool FbWinFrame::setBorderWidth(bool do_move) {
1523 int grav_x=0, grav_y=0; 1522 int grav_x=0, grav_y=0;
1524 // negate gravity 1523 // negate gravity
1525 if (do_move) 1524 if (do_move)
1526 gravityTranslate(grav_x, grav_y, -m_active_gravity, 1525 gravityTranslate(grav_x, grav_y, -sizeHints().win_gravity,
1527 m_active_orig_client_bw, false); 1526 m_active_orig_client_bw, false);
1528 1527
1529 int bw_changes = 0; 1528 int bw_changes = 0;
@@ -1551,7 +1550,7 @@ bool FbWinFrame::setBorderWidth(bool do_move) {
1551 1550
1552 if (do_move) { 1551 if (do_move) {
1553 frameExtentSig().notify(); 1552 frameExtentSig().notify();
1554 gravityTranslate(grav_x, grav_y, m_active_gravity, 1553 gravityTranslate(grav_x, grav_y, sizeHints().win_gravity,
1555 m_active_orig_client_bw, false); 1554 m_active_orig_client_bw, false);
1556 // if the location changes, shift it 1555 // if the location changes, shift it
1557 if (grav_x != 0 || grav_y != 0) 1556 if (grav_x != 0 || grav_y != 0)
@@ -1725,6 +1724,60 @@ void FbWinFrame::displaySize(unsigned int width, unsigned int height) const {
1725 m_screen.showGeometry(i, j); 1724 m_screen.showGeometry(i, j);
1726} 1725}
1727 1726
1727void FbWinFrame::SizeHints::reset(const XSizeHints &sizehint) {
1728 if (sizehint.flags & PMinSize) {
1729 min_width = sizehint.min_width;
1730 min_height = sizehint.min_height;
1731 } else
1732 min_width = min_height = 1;
1733
1734 if (sizehint.flags & PBaseSize) {
1735 base_width = sizehint.base_width;
1736 base_height = sizehint.base_height;
1737 if (!(sizehint.flags & PMinSize)) {
1738 min_width = base_width;
1739 min_height = base_height;
1740 }
1741 } else
1742 base_width = base_height = 0;
1743
1744 if (sizehint.flags & PMaxSize) {
1745 max_width = sizehint.max_width;
1746 max_height = sizehint.max_height;
1747 } else
1748 max_width = max_height = 0; // unbounded
1749
1750 if (sizehint.flags & PResizeInc) {
1751 width_inc = sizehint.width_inc;
1752 height_inc = sizehint.height_inc;
1753 } else
1754 width_inc = height_inc = 1;
1755
1756 if (sizehint.flags & PAspect) {
1757 min_aspect_x = sizehint.min_aspect.x;
1758 min_aspect_y = sizehint.min_aspect.y;
1759 max_aspect_x = sizehint.max_aspect.x;
1760 max_aspect_y = sizehint.max_aspect.y;
1761 } else
1762 min_aspect_x = min_aspect_y = max_aspect_x = max_aspect_y = 0;
1763
1764 if (sizehint.flags & PWinGravity)
1765 win_gravity = sizehint.win_gravity;
1766 else
1767 win_gravity = NorthWestGravity;
1768
1769 // some sanity checks
1770 if (width_inc == 0)
1771 width_inc = 1;
1772 if (height_inc == 0)
1773 height_inc = 1;
1774
1775 if (base_width > min_width)
1776 min_width = base_width;
1777 if (base_height > min_height)
1778 min_height = base_height;
1779}
1780
1728/* For aspect ratios 1781/* For aspect ratios
1729 Note that its slightly simplified in that only the 1782 Note that its slightly simplified in that only the
1730 line gradient is given - this is because for aspect 1783 line gradient is given - this is because for aspect
diff --git a/src/FbWinFrame.hh b/src/FbWinFrame.hh
index 5c93727..85f0c21 100644
--- a/src/FbWinFrame.hh
+++ b/src/FbWinFrame.hh
@@ -33,6 +33,8 @@
33#include "FbTk/Container.hh" 33#include "FbTk/Container.hh"
34#include "FbTk/Shape.hh" 34#include "FbTk/Shape.hh"
35 35
36#include <X11/Xutil.h>
37
36#include <vector> 38#include <vector>
37#include <memory> 39#include <memory>
38 40
@@ -101,7 +103,10 @@ public:
101 min_width(1), max_width(0), min_height(1), max_height(0), 103 min_width(1), max_width(0), min_height(1), max_height(0),
102 width_inc(1), height_inc(1), base_width(0), base_height(0), 104 width_inc(1), height_inc(1), base_width(0), base_height(0),
103 min_aspect_x(0), max_aspect_x(0), 105 min_aspect_x(0), max_aspect_x(0),
104 min_aspect_y(0), max_aspect_y(0) { } 106 min_aspect_y(0), max_aspect_y(0),
107 win_gravity(0) { }
108
109 void reset(const XSizeHints &sizehint);
105 110
106 void apply(unsigned int &w, unsigned int &h, 111 void apply(unsigned int &w, unsigned int &h,
107 bool maximizing = false) const; 112 bool maximizing = false) const;
@@ -112,6 +117,7 @@ public:
112 unsigned int min_width, max_width, min_height, max_height, 117 unsigned int min_width, max_width, min_height, max_height,
113 width_inc, height_inc, base_width, base_height, 118 width_inc, height_inc, base_width, base_height,
114 min_aspect_x, max_aspect_x, min_aspect_y, max_aspect_y; 119 min_aspect_x, max_aspect_x, min_aspect_y, max_aspect_y;
120 int win_gravity;
115 }; 121 };
116 122
117 class State { 123 class State {
@@ -241,7 +247,7 @@ public:
241 // this function translates its arguments according to win_gravity 247 // this function translates its arguments according to win_gravity
242 // if win_gravity is negative, it does an inverse translation 248 // if win_gravity is negative, it does an inverse translation
243 void gravityTranslate(int &x, int &y, int win_gravity, unsigned int client_bw, bool move_frame = false); 249 void gravityTranslate(int &x, int &y, int win_gravity, unsigned int client_bw, bool move_frame = false);
244 void setActiveGravity(int gravity, unsigned int orig_client_bw) { m_active_gravity = gravity; m_active_orig_client_bw = orig_client_bw; } 250 void setActiveGravity(int gravity, unsigned int orig_client_bw) { m_state.size_hints.win_gravity = gravity; m_active_orig_client_bw = orig_client_bw; }
245 251
246 /** 252 /**
247 @name Event handlers 253 @name Event handlers
@@ -437,8 +443,6 @@ private:
437 443
438 TabMode m_tabmode; 444 TabMode m_tabmode;
439 445
440 // last gravity that this window was *actively* placed with
441 int m_active_gravity;
442 unsigned int m_active_orig_client_bw; 446 unsigned int m_active_orig_client_bw;
443 State m_state; 447 State m_state;
444 448
diff --git a/src/Keys.cc b/src/Keys.cc
index 3b0c206..f201e64 100644
--- a/src/Keys.cc
+++ b/src/Keys.cc
@@ -170,7 +170,7 @@ Keys::t_key::~t_key() {
170 170
171 171
172 172
173Keys::Keys(): next_key(0), m_reloader(new FbTk::AutoReloadHelper()) { 173Keys::Keys(): m_reloader(new FbTk::AutoReloadHelper()), next_key(0) {
174 m_reloader->setReloadCmd(FbTk::RefCount<FbTk::Command<void> >(new FbTk::SimpleCommand<Keys>(*this, &Keys::reload))); 174 m_reloader->setReloadCmd(FbTk::RefCount<FbTk::Command<void> >(new FbTk::SimpleCommand<Keys>(*this, &Keys::reload)));
175} 175}
176 176
diff --git a/src/WinClient.cc b/src/WinClient.cc
index 2c9cdc6..14414b0 100644
--- a/src/WinClient.cc
+++ b/src/WinClient.cc
@@ -75,7 +75,6 @@ WinClient::WinClient(Window win, BScreen &screen, FluxboxWindow *fbwin):
75 accepts_input(false), 75 accepts_input(false),
76 send_focus_message(false), 76 send_focus_message(false),
77 send_close_message(false), 77 send_close_message(false),
78 m_win_gravity(0),
79 m_title_override(false), 78 m_title_override(false),
80 m_icon_override(false), 79 m_icon_override(false),
81 m_window_type(Focusable::TYPE_NORMAL), 80 m_window_type(Focusable::TYPE_NORMAL),
@@ -467,61 +466,7 @@ void WinClient::updateWMNormalHints() {
467 sizehint.flags = 0; 466 sizehint.flags = 0;
468 467
469 normal_hint_flags = sizehint.flags; 468 normal_hint_flags = sizehint.flags;
470 469 m_size_hints.reset(sizehint);
471 if (sizehint.flags & PMinSize) {
472 m_size_hints.min_width = sizehint.min_width;
473 m_size_hints.min_height = sizehint.min_height;
474 } else
475 m_size_hints.min_width = m_size_hints.min_height = 1;
476
477 if (sizehint.flags & PBaseSize) {
478 m_size_hints.base_width = sizehint.base_width;
479 m_size_hints.base_height = sizehint.base_height;
480 if (!(sizehint.flags & PMinSize)) {
481 m_size_hints.min_width = m_size_hints.base_width;
482 m_size_hints.min_height = m_size_hints.base_height;
483 }
484 } else
485 m_size_hints.base_width = m_size_hints.base_height = 0;
486
487 if (sizehint.flags & PMaxSize) {
488 m_size_hints.max_width = sizehint.max_width;
489 m_size_hints.max_height = sizehint.max_height;
490 } else {
491 m_size_hints.max_width = 0; // unbounded
492 m_size_hints.max_height = 0;
493 }
494
495 if (sizehint.flags & PResizeInc) {
496 m_size_hints.width_inc = sizehint.width_inc;
497 m_size_hints.height_inc = sizehint.height_inc;
498 } else
499 m_size_hints.width_inc = m_size_hints.height_inc = 1;
500
501 if (sizehint.flags & PAspect) {
502 m_size_hints.min_aspect_x = sizehint.min_aspect.x;
503 m_size_hints.min_aspect_y = sizehint.min_aspect.y;
504 m_size_hints.max_aspect_x = sizehint.max_aspect.x;
505 m_size_hints.max_aspect_y = sizehint.max_aspect.y;
506 } else
507 m_size_hints.min_aspect_x = m_size_hints.min_aspect_y =
508 m_size_hints.max_aspect_x = m_size_hints.max_aspect_y = 0;
509
510 if (sizehint.flags & PWinGravity)
511 m_win_gravity = sizehint.win_gravity;
512 else
513 m_win_gravity = NorthWestGravity;
514
515 // some sanity checks
516 if (m_size_hints.width_inc == 0)
517 m_size_hints.width_inc = 1;
518 if (m_size_hints.height_inc == 0)
519 m_size_hints.height_inc = 1;
520
521 if (m_size_hints.base_width > m_size_hints.min_width)
522 m_size_hints.min_width = m_size_hints.base_width;
523 if (m_size_hints.base_height > m_size_hints.min_height)
524 m_size_hints.min_height = m_size_hints.base_height;
525} 470}
526 471
527Window WinClient::getGroupLeftWindow() const { 472Window WinClient::getGroupLeftWindow() const {
diff --git a/src/WinClient.hh b/src/WinClient.hh
index 54c431d..a119f7d 100644
--- a/src/WinClient.hh
+++ b/src/WinClient.hh
@@ -27,8 +27,6 @@
27#include "FbTk/FbWindow.hh" 27#include "FbTk/FbWindow.hh"
28#include "FbTk/FbString.hh" 28#include "FbTk/FbString.hh"
29 29
30#include <X11/Xutil.h>
31
32class BScreen; 30class BScreen;
33class Strut; 31class Strut;
34 32
@@ -110,7 +108,7 @@ public:
110 bool isStateModal() const { return m_modal; } 108 bool isStateModal() const { return m_modal; }
111 void setStateModal(bool state); 109 void setStateModal(bool state);
112 110
113 int gravity() const { return m_win_gravity; } 111 int gravity() const { return m_size_hints.win_gravity; }
114 112
115 bool hasGroupLeftWindow() const; 113 bool hasGroupLeftWindow() const;
116 // grouping is tracked by remembering the window to the left in the group 114 // grouping is tracked by remembering the window to the left in the group
@@ -155,8 +153,6 @@ private:
155 bool m_modal; 153 bool m_modal;
156 bool accepts_input, send_focus_message, send_close_message; 154 bool accepts_input, send_focus_message, send_close_message;
157 155
158 int m_win_gravity;
159
160 bool m_title_override; 156 bool m_title_override;
161 bool m_icon_override; 157 bool m_icon_override;
162 158