diff options
author | rathnor <rathnor> | 2003-10-31 10:37:09 (GMT) |
---|---|---|
committer | rathnor <rathnor> | 2003-10-31 10:37:09 (GMT) |
commit | b88f9b2a9e6a08cfb663b7177a9c037250d48fea (patch) | |
tree | 6c790fef10cbfdd1eab211572932d7bdf2425d13 /src | |
parent | d617c5288fe37972b474f86b653e5541553f93de (diff) | |
download | fluxbox-b88f9b2a9e6a08cfb663b7177a9c037250d48fea.zip fluxbox-b88f9b2a9e6a08cfb663b7177a9c037250d48fea.tar.bz2 |
fix a number of positioning and sizing issues
Diffstat (limited to 'src')
-rw-r--r-- | src/Container.cc | 36 | ||||
-rw-r--r-- | src/FbWinFrame.cc | 20 | ||||
-rw-r--r-- | src/IconButton.cc | 18 | ||||
-rw-r--r-- | src/Screen.cc | 12 | ||||
-rw-r--r-- | src/SystemTray.hh | 4 | ||||
-rw-r--r-- | src/Toolbar.cc | 42 | ||||
-rw-r--r-- | src/ToolbarItem.hh | 4 |
7 files changed, 91 insertions, 45 deletions
diff --git a/src/Container.cc b/src/Container.cc index 3eda052..242a7f1 100644 --- a/src/Container.cc +++ b/src/Container.cc | |||
@@ -20,7 +20,7 @@ | |||
20 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 20 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
21 | // DEALINGS IN THE SOFTWARE. | 21 | // DEALINGS IN THE SOFTWARE. |
22 | 22 | ||
23 | // $Id: Container.cc,v 1.6 2003/10/26 21:05:03 fluxgen Exp $ | 23 | // $Id: Container.cc,v 1.7 2003/10/31 10:37:09 rathnor Exp $ |
24 | 24 | ||
25 | #include "Container.hh" | 25 | #include "Container.hh" |
26 | 26 | ||
@@ -30,7 +30,6 @@ | |||
30 | Container::Container(const FbTk::FbWindow &parent): | 30 | Container::Container(const FbTk::FbWindow &parent): |
31 | FbTk::FbWindow(parent, 0, 0, 1, 1, ExposureMask), m_selected(0), | 31 | FbTk::FbWindow(parent, 0, 0, 1, 1, ExposureMask), m_selected(0), |
32 | m_update_lock(false) { | 32 | m_update_lock(false) { |
33 | |||
34 | FbTk::EventManager::instance()->add(*this, *this); | 33 | FbTk::EventManager::instance()->add(*this, *this); |
35 | } | 34 | } |
36 | 35 | ||
@@ -177,18 +176,37 @@ void Container::repositionItems() { | |||
177 | 176 | ||
178 | ItemList::iterator it = m_item_list.begin(); | 177 | ItemList::iterator it = m_item_list.begin(); |
179 | const ItemList::iterator it_end = m_item_list.end(); | 178 | const ItemList::iterator it_end = m_item_list.end(); |
180 | int next_x = 0; | 179 | int borderW = m_item_list.front()->borderWidth(); |
181 | for (; it != it_end; ++it, next_x += max_width_per_client) { | 180 | |
181 | int rounding_error = width() - ((maxWidthPerClient() + borderW)* m_item_list.size() - borderW); | ||
182 | |||
183 | int next_x = -borderW; // zero so the border of the first shows | ||
184 | int extra = 0; | ||
185 | for (; it != it_end; ++it, next_x += max_width_per_client + borderW + extra) { | ||
186 | if (rounding_error != 0) { | ||
187 | --rounding_error; | ||
188 | extra = 1; | ||
189 | } else { | ||
190 | extra = 0; | ||
191 | } | ||
182 | // resize each clients including border in size | 192 | // resize each clients including border in size |
183 | (*it)->moveResize(next_x - (*it)->borderWidth(), | 193 | (*it)->moveResize(next_x, |
184 | -(*it)->borderWidth(), | 194 | -borderW, |
185 | max_width_per_client - (*it)->borderWidth(), | 195 | max_width_per_client + extra, |
186 | height() + (*it)->borderWidth()); | 196 | height()); |
187 | (*it)->clear(); | 197 | (*it)->clear(); |
188 | } | 198 | } |
189 | } | 199 | } |
190 | 200 | ||
191 | 201 | ||
192 | unsigned int Container::maxWidthPerClient() const { | 202 | unsigned int Container::maxWidthPerClient() const { |
193 | return (size() == 0 ? width() : (width() + size()*m_item_list.front()->borderWidth())/size()); | 203 | int count = size(); |
204 | if (count == 0) | ||
205 | return width(); | ||
206 | else { | ||
207 | int borderW = m_item_list.front()->borderWidth(); | ||
208 | // there're count-1 borders to fit in with the windows | ||
209 | // -> 1 per window plus end | ||
210 | return (width() - (count - 1) * borderW) / count; | ||
211 | } | ||
194 | } | 212 | } |
diff --git a/src/FbWinFrame.cc b/src/FbWinFrame.cc index 862ec29..1e3cb97 100644 --- a/src/FbWinFrame.cc +++ b/src/FbWinFrame.cc | |||
@@ -19,7 +19,7 @@ | |||
19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
20 | // DEALINGS IN THE SOFTWARE. | 20 | // DEALINGS IN THE SOFTWARE. |
21 | 21 | ||
22 | // $Id: FbWinFrame.cc,v 1.61 2003/10/30 20:27:51 rathnor Exp $ | 22 | // $Id: FbWinFrame.cc,v 1.62 2003/10/31 10:37:09 rathnor Exp $ |
23 | 23 | ||
24 | #include "FbWinFrame.hh" | 24 | #include "FbWinFrame.hh" |
25 | 25 | ||
@@ -229,6 +229,8 @@ void FbWinFrame::setFocus(bool newvalue) { | |||
229 | if (m_focused == newvalue) | 229 | if (m_focused == newvalue) |
230 | return; | 230 | return; |
231 | 231 | ||
232 | m_focused = newvalue; | ||
233 | |||
232 | if (currentLabel()) { | 234 | if (currentLabel()) { |
233 | if (newvalue) // focused | 235 | if (newvalue) // focused |
234 | renderButtonFocus(*m_current_label); | 236 | renderButtonFocus(*m_current_label); |
@@ -236,10 +238,8 @@ void FbWinFrame::setFocus(bool newvalue) { | |||
236 | renderButtonUnfocus(*m_current_label); | 238 | renderButtonUnfocus(*m_current_label); |
237 | } | 239 | } |
238 | 240 | ||
239 | m_focused = newvalue; | ||
240 | |||
241 | renderButtons(); | ||
242 | renderTitlebar(); | 241 | renderTitlebar(); |
242 | renderButtons(); // parent relative buttons -> need render after titlebar | ||
243 | renderHandles(); | 243 | renderHandles(); |
244 | } | 244 | } |
245 | 245 | ||
@@ -713,6 +713,7 @@ void FbWinFrame::redrawTitle() { | |||
713 | return; | 713 | return; |
714 | 714 | ||
715 | int button_width = label().width()/m_labelbuttons.size(); | 715 | int button_width = label().width()/m_labelbuttons.size(); |
716 | int rounding_error = label().width() - m_labelbuttons.size()*button_width; | ||
716 | //!! TODO: bevel | 717 | //!! TODO: bevel |
717 | //int border_width = m_labelbuttons.front()->window().borderWidth(); | 718 | //int border_width = m_labelbuttons.front()->window().borderWidth(); |
718 | int border_width = m_labelbuttons.size() != 0 ? | 719 | int border_width = m_labelbuttons.size() != 0 ? |
@@ -720,13 +721,20 @@ void FbWinFrame::redrawTitle() { | |||
720 | 721 | ||
721 | LabelList::iterator btn_it = m_labelbuttons.begin(); | 722 | LabelList::iterator btn_it = m_labelbuttons.begin(); |
722 | LabelList::iterator btn_it_end = m_labelbuttons.end(); | 723 | LabelList::iterator btn_it_end = m_labelbuttons.end(); |
724 | int extra = 0; | ||
723 | for (unsigned int last_x = 0; | 725 | for (unsigned int last_x = 0; |
724 | btn_it != btn_it_end; | 726 | btn_it != btn_it_end; |
725 | ++btn_it, last_x += button_width + border_width) { | 727 | ++btn_it, last_x += button_width + border_width + extra) { |
726 | // since we add border width pixel we should remove | 728 | // since we add border width pixel we should remove |
727 | // the same size for inside width so we can fit all buttons into label | 729 | // the same size for inside width so we can fit all buttons into label |
730 | if (rounding_error != 0) { | ||
731 | extra = 1; | ||
732 | --rounding_error; | ||
733 | } else | ||
734 | extra = 0; | ||
735 | |||
728 | (*btn_it)->moveResize(last_x - border_width, - border_width, | 736 | (*btn_it)->moveResize(last_x - border_width, - border_width, |
729 | button_width, | 737 | button_width + extra, |
730 | label().height() + border_width); | 738 | label().height() + border_width); |
731 | if (isVisible()) | 739 | if (isVisible()) |
732 | (*btn_it)->clear(); | 740 | (*btn_it)->clear(); |
diff --git a/src/IconButton.cc b/src/IconButton.cc index c6b876e..2f68ecf 100644 --- a/src/IconButton.cc +++ b/src/IconButton.cc | |||
@@ -20,7 +20,7 @@ | |||
20 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 20 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
21 | // DEALINGS IN THE SOFTWARE. | 21 | // DEALINGS IN THE SOFTWARE. |
22 | 22 | ||
23 | // $Id: IconButton.cc,v 1.8 2003/09/10 21:41:18 fluxgen Exp $ | 23 | // $Id: IconButton.cc,v 1.9 2003/10/31 10:37:09 rathnor Exp $ |
24 | 24 | ||
25 | #include "IconButton.hh" | 25 | #include "IconButton.hh" |
26 | 26 | ||
@@ -118,7 +118,6 @@ void IconButton::resize(unsigned int width, unsigned int height) { | |||
118 | } | 118 | } |
119 | 119 | ||
120 | void IconButton::clear() { | 120 | void IconButton::clear() { |
121 | FbTk::TextButton::clear(); | ||
122 | setupWindow(); | 121 | setupWindow(); |
123 | } | 122 | } |
124 | 123 | ||
@@ -152,7 +151,7 @@ void IconButton::update(FbTk::Subject *subj) { | |||
152 | m_icon_pixmap.copy(hints->icon_pixmap); | 151 | m_icon_pixmap.copy(hints->icon_pixmap); |
153 | m_icon_pixmap.scale(m_icon_window.height(), m_icon_window.height()); | 152 | m_icon_pixmap.scale(m_icon_window.height(), m_icon_window.height()); |
154 | 153 | ||
155 | m_icon_window.setBackgroundPixmap(m_icon_pixmap.drawable()); | 154 | setBackgroundPixmap(m_icon_pixmap.drawable()); |
156 | } else { | 155 | } else { |
157 | // no icon pixmap | 156 | // no icon pixmap |
158 | m_icon_window.move(0, 0); | 157 | m_icon_window.move(0, 0); |
@@ -186,15 +185,12 @@ void IconButton::update(FbTk::Subject *subj) { | |||
186 | } | 185 | } |
187 | 186 | ||
188 | void IconButton::setupWindow() { | 187 | void IconButton::setupWindow() { |
189 | |||
190 | m_icon_window.clear(); | ||
191 | 188 | ||
192 | if (m_win.clientList().size() == 0) | 189 | if (!m_win.clientList().empty()) { |
193 | return; | 190 | setText(m_win.winClient().title()); |
194 | 191 | // draw with x offset and y offset | |
195 | setText(m_win.winClient().title()); | 192 | } |
196 | // draw with x offset and y offset | 193 | FbTk::TextButton::clear(); |
197 | drawText(); | ||
198 | } | 194 | } |
199 | 195 | ||
200 | void IconButton::drawText(int x, int y) { | 196 | void IconButton::drawText(int x, int y) { |
diff --git a/src/Screen.cc b/src/Screen.cc index 34173a3..1aa2e73 100644 --- a/src/Screen.cc +++ b/src/Screen.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: Screen.cc,v 1.239 2003/10/28 17:39:59 rathnor Exp $ | 25 | // $Id: Screen.cc,v 1.240 2003/10/31 10:37:09 rathnor Exp $ |
26 | 26 | ||
27 | 27 | ||
28 | #include "Screen.hh" | 28 | #include "Screen.hh" |
@@ -328,17 +328,17 @@ BScreen::BScreen(FbTk::ResourceManager &rm, | |||
328 | rootWindow().setCursor(XCreateFontCursor(disp, XC_left_ptr)); | 328 | rootWindow().setCursor(XCreateFontCursor(disp, XC_left_ptr)); |
329 | 329 | ||
330 | Fluxbox *fluxbox = Fluxbox::instance(); | 330 | Fluxbox *fluxbox = Fluxbox::instance(); |
331 | // load this screens resources | ||
332 | fluxbox->load_rc(*this); | ||
333 | |||
334 | FbTk::ThemeManager::instance().load(Fluxbox::instance()->getStyleFilename()); | ||
335 | |||
331 | // setup image cache engine | 336 | // setup image cache engine |
332 | m_image_control.reset(new FbTk::ImageControl(scrn, true, fluxbox->colorsPerChannel(), | 337 | m_image_control.reset(new FbTk::ImageControl(scrn, true, fluxbox->colorsPerChannel(), |
333 | fluxbox->getCacheLife(), fluxbox->getCacheMax())); | 338 | fluxbox->getCacheLife(), fluxbox->getCacheMax())); |
334 | imageControl().installRootColormap(); | 339 | imageControl().installRootColormap(); |
335 | root_colormap_installed = true; | 340 | root_colormap_installed = true; |
336 | 341 | ||
337 | // load this screens resources | ||
338 | fluxbox->load_rc(*this); | ||
339 | |||
340 | FbTk::ThemeManager::instance().load(Fluxbox::instance()->getStyleFilename()); | ||
341 | |||
342 | #ifdef SLIT | 342 | #ifdef SLIT |
343 | if (slit()) // this will load theme and reconfigure slit | 343 | if (slit()) // this will load theme and reconfigure slit |
344 | FbTk::ThemeManager::instance().loadTheme(slit()->theme()); | 344 | FbTk::ThemeManager::instance().loadTheme(slit()->theme()); |
diff --git a/src/SystemTray.hh b/src/SystemTray.hh index 82d163c..84d78fa 100644 --- a/src/SystemTray.hh +++ b/src/SystemTray.hh | |||
@@ -19,7 +19,7 @@ | |||
19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
20 | // DEALINGS IN THE SOFTWARE. | 20 | // DEALINGS IN THE SOFTWARE. |
21 | 21 | ||
22 | // $Id: SystemTray.hh,v 1.2 2003/08/16 12:12:21 fluxgen Exp $ | 22 | // $Id: SystemTray.hh,v 1.3 2003/10/31 10:37:09 rathnor Exp $ |
23 | 23 | ||
24 | #ifndef SYSTEMTRAY_HH | 24 | #ifndef SYSTEMTRAY_HH |
25 | #define SYSTEMTRAY_HH | 25 | #define SYSTEMTRAY_HH |
@@ -49,6 +49,8 @@ public: | |||
49 | void show(); | 49 | void show(); |
50 | void hide(); | 50 | void hide(); |
51 | 51 | ||
52 | bool active() { return !m_clients.empty(); } | ||
53 | |||
52 | bool clientMessage(const XClientMessageEvent &event); | 54 | bool clientMessage(const XClientMessageEvent &event); |
53 | void exposeEvent(XExposeEvent &event); | 55 | void exposeEvent(XExposeEvent &event); |
54 | void handleEvent(XEvent &event); | 56 | void handleEvent(XEvent &event); |
diff --git a/src/Toolbar.cc b/src/Toolbar.cc index ded81e2..9b76ed6 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.125 2003/10/14 00:21:52 fluxgen Exp $ | 25 | // $Id: Toolbar.cc,v 1.126 2003/10/31 10:37:09 rathnor Exp $ |
26 | 26 | ||
27 | #include "Toolbar.hh" | 27 | #include "Toolbar.hh" |
28 | 28 | ||
@@ -832,7 +832,7 @@ void Toolbar::saveOnHead(int head) { | |||
832 | 832 | ||
833 | void Toolbar::rearrangeItems() { | 833 | void Toolbar::rearrangeItems() { |
834 | if (m_resize_lock || screen().isShuttingdown() || | 834 | if (m_resize_lock || screen().isShuttingdown() || |
835 | m_item_list.size() == 0) | 835 | m_item_list.empty()) |
836 | return; | 836 | return; |
837 | // lock this | 837 | // lock this |
838 | m_resize_lock = true; | 838 | m_resize_lock = true; |
@@ -841,37 +841,57 @@ void Toolbar::rearrangeItems() { | |||
841 | ItemList::iterator item_it_end = m_item_list.end(); | 841 | ItemList::iterator item_it_end = m_item_list.end(); |
842 | int fixed_width = 0; // combined size of all fixed items | 842 | int fixed_width = 0; // combined size of all fixed items |
843 | int fixed_items = 0; // number of fixed items | 843 | int fixed_items = 0; // number of fixed items |
844 | int relative_items = 0; | ||
844 | for (; item_it != item_it_end; ++item_it) { | 845 | for (; item_it != item_it_end; ++item_it) { |
845 | if ((*item_it)->type() == ToolbarItem::FIXED) { | 846 | if ((*item_it)->type() == ToolbarItem::FIXED && (*item_it)->active()) { |
846 | fixed_width += (*item_it)->width() + (*item_it)->borderWidth()*2; | 847 | fixed_width += (*item_it)->width() + (*item_it)->borderWidth()*2; |
847 | fixed_items++; | 848 | fixed_items++; |
849 | } else if ((*item_it)->type() == ToolbarItem::RELATIVE && (*item_it)->active()) { | ||
850 | relative_items++; | ||
848 | } | 851 | } |
849 | } | 852 | } |
850 | // calculate what's going to be left over to the relative sized items | 853 | |
854 | // calculate what's going to be le ft over to the relative sized items | ||
851 | int relative_width = 0; | 855 | int relative_width = 0; |
856 | int rounding_error = 0; | ||
852 | if (fixed_items == 0) // no fixed items, then the rest is the entire width | 857 | if (fixed_items == 0) // no fixed items, then the rest is the entire width |
853 | relative_width = width(); | 858 | relative_width = width(); |
854 | else { | 859 | else { |
855 | const int relative_items = m_item_list.size() - fixed_items; | ||
856 | if (relative_items == 0) | 860 | if (relative_items == 0) |
857 | relative_width = 0; | 861 | relative_width = 0; |
858 | else // size left after fixed items / number of relative items | 862 | else { // size left after fixed items / number of relative items |
859 | relative_width = (width() - fixed_width)/relative_items; | 863 | relative_width = (width() - fixed_width)/relative_items; |
864 | rounding_error = width() - fixed_width - relative_items*relative_width; | ||
865 | } | ||
860 | } | 866 | } |
861 | |||
862 | // now move and resize the items | 867 | // now move and resize the items |
863 | int next_x = m_item_list.front()->borderWidth(); | 868 | int next_x = 0; |
864 | for (item_it = m_item_list.begin(); item_it != item_it_end; ++item_it) { | 869 | for (item_it = m_item_list.begin(); item_it != item_it_end; ++item_it) { |
870 | if (!(*item_it)->active()) { | ||
871 | (*item_it)->hide(); | ||
872 | continue; | ||
873 | } | ||
874 | |||
875 | int borderW = (*item_it)->borderWidth(); | ||
876 | (*item_it)->show(); | ||
865 | if ((*item_it)->type() == ToolbarItem::RELATIVE) { | 877 | if ((*item_it)->type() == ToolbarItem::RELATIVE) { |
866 | (*item_it)->moveResize(next_x, 0, relative_width, height()); | 878 | int extra = 0; |
879 | if (rounding_error != 0) { // distribute rounding error over all relatives | ||
880 | extra = 1; | ||
881 | --rounding_error; | ||
882 | } | ||
883 | |||
884 | (*item_it)->moveResize(next_x, -borderW, extra + relative_width-2*borderW, height()); | ||
867 | } else { // fixed size | 885 | } else { // fixed size |
868 | (*item_it)->moveResize(next_x, 0, | 886 | (*item_it)->moveResize(next_x, -borderW, |
869 | (*item_it)->width(), height()); | 887 | (*item_it)->width(), height()); |
870 | } | 888 | } |
871 | next_x += (*item_it)->width() + (*item_it)->borderWidth()*2; | 889 | next_x += (*item_it)->width() + borderW*2; |
872 | } | 890 | } |
873 | // unlock | 891 | // unlock |
874 | m_resize_lock = false; | 892 | m_resize_lock = false; |
893 | frame.window.clear(); | ||
894 | |||
875 | } | 895 | } |
876 | 896 | ||
877 | void Toolbar::deleteItems() { | 897 | void Toolbar::deleteItems() { |
diff --git a/src/ToolbarItem.hh b/src/ToolbarItem.hh index dc60264..57088e0 100644 --- a/src/ToolbarItem.hh +++ b/src/ToolbarItem.hh | |||
@@ -20,7 +20,7 @@ | |||
20 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 20 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
21 | // DEALINGS IN THE SOFTWARE. | 21 | // DEALINGS IN THE SOFTWARE. |
22 | 22 | ||
23 | // $Id: ToolbarItem.hh,v 1.2 2003/08/13 09:36:12 fluxgen Exp $ | 23 | // $Id: ToolbarItem.hh,v 1.3 2003/10/31 10:37:09 rathnor Exp $ |
24 | 24 | ||
25 | #ifndef TOOLBARITEM_HH | 25 | #ifndef TOOLBARITEM_HH |
26 | #define TOOLBARITEM_HH | 26 | #define TOOLBARITEM_HH |
@@ -47,6 +47,8 @@ public: | |||
47 | virtual unsigned int width() const = 0; | 47 | virtual unsigned int width() const = 0; |
48 | virtual unsigned int height() const = 0; | 48 | virtual unsigned int height() const = 0; |
49 | virtual unsigned int borderWidth() const = 0; | 49 | virtual unsigned int borderWidth() const = 0; |
50 | // some items might be there, but effectively empty, so shouldn't appear | ||
51 | virtual bool active() { return true; } | ||
50 | 52 | ||
51 | void setType(Type type) { m_type = type; } | 53 | void setType(Type type) { m_type = type; } |
52 | Type type() const { return m_type; } | 54 | Type type() const { return m_type; } |