aboutsummaryrefslogtreecommitdiff
path: root/src/Slit.cc
diff options
context:
space:
mode:
authorMark Tiefenbruck <mark@fluxbox.org>2008-08-06 00:11:55 (GMT)
committerMark Tiefenbruck <mark@fluxbox.org>2008-08-06 00:11:55 (GMT)
commit2df84f6687dfd16aec55206cc672ac0715c7cd68 (patch)
tree4bda9f9a393f4a3e609b6ce8ad7d5a3571c64aff /src/Slit.cc
parent22aa93c56de131b80dfb161615650c4fb6cf6832 (diff)
downloadfluxbox-2df84f6687dfd16aec55206cc672ac0715c7cd68.zip
fluxbox-2df84f6687dfd16aec55206cc672ac0715c7cd68.tar.bz2
use the same options in Slit and Toolbar placement menus
Diffstat (limited to 'src/Slit.cc')
-rw-r--r--src/Slit.cc263
1 files changed, 102 insertions, 161 deletions
diff --git a/src/Slit.cc b/src/Slit.cc
index 20b86d6..80dca0d 100644
--- a/src/Slit.cc
+++ b/src/Slit.cc
@@ -93,8 +93,7 @@ template<>
93void FbTk::Resource<Slit::Placement>::setFromString(const char *strval) { 93void FbTk::Resource<Slit::Placement>::setFromString(const char *strval) {
94 if (strcasecmp(strval, "TopLeft")==0) 94 if (strcasecmp(strval, "TopLeft")==0)
95 m_value = Slit::TOPLEFT; 95 m_value = Slit::TOPLEFT;
96 else if (strcasecmp(strval, "LeftCenter")==0 96 else if (strcasecmp(strval, "LeftCenter")==0)
97 || strcasecmp(strval, "CenterLeft")==0)
98 m_value = Slit::LEFTCENTER; 97 m_value = Slit::LEFTCENTER;
99 else if (strcasecmp(strval, "BottomLeft")==0) 98 else if (strcasecmp(strval, "BottomLeft")==0)
100 m_value = Slit::BOTTOMLEFT; 99 m_value = Slit::BOTTOMLEFT;
@@ -104,21 +103,18 @@ void FbTk::Resource<Slit::Placement>::setFromString(const char *strval) {
104 m_value = Slit::BOTTOMCENTER; 103 m_value = Slit::BOTTOMCENTER;
105 else if (strcasecmp(strval, "TopRight")==0) 104 else if (strcasecmp(strval, "TopRight")==0)
106 m_value = Slit::TOPRIGHT; 105 m_value = Slit::TOPRIGHT;
107 else if (strcasecmp(strval, "RightCenter")==0 106 else if (strcasecmp(strval, "RightCenter")==0)
108 || strcasecmp(strval, "CenterRight")==0)
109 m_value = Slit::RIGHTCENTER; 107 m_value = Slit::RIGHTCENTER;
110 else if (strcasecmp(strval, "BottomRight")==0) 108 else if (strcasecmp(strval, "BottomRight")==0)
111 m_value = Slit::BOTTOMRIGHT; 109 m_value = Slit::BOTTOMRIGHT;
112 else 110 else if (strcasecmp(strval, "LeftTop")==0)
113 setDefaultValue(); 111 m_value = Slit::LEFTTOP;
114} 112 else if (strcasecmp(strval, "LeftBottom")==0)
115 113 m_value = Slit::LEFTBOTTOM;
116template<> 114 else if (strcasecmp(strval, "RightTop")==0)
117void FbTk::Resource<Slit::Direction>::setFromString(const char *strval) { 115 m_value = Slit::RIGHTTOP;
118 if (strcasecmp(strval, "Vertical") == 0) 116 else if (strcasecmp(strval, "RightBottom")==0)
119 m_value = Slit::VERTICAL; 117 m_value = Slit::RIGHTBOTTOM;
120 else if (strcasecmp(strval, "Horizontal") == 0)
121 m_value = Slit::HORIZONTAL;
122 else 118 else
123 setDefaultValue(); 119 setDefaultValue();
124} 120}
@@ -150,24 +146,23 @@ string FbTk::Resource<Slit::Placement>::getString() const {
150 case Slit::BOTTOMRIGHT: 146 case Slit::BOTTOMRIGHT:
151 return string("BottomRight"); 147 return string("BottomRight");
152 break; 148 break;
153 } 149 case Slit::LEFTTOP:
154 //default string 150 return string("LeftTop");
155 return string("BottomRight");
156}
157
158template<>
159string FbTk::Resource<Slit::Direction>::getString() const {
160 switch (m_value) {
161 case Slit::VERTICAL:
162 return string("Vertical");
163 break; 151 break;
164 case Slit::HORIZONTAL: 152 case Slit::RIGHTTOP:
165 return string("Horizontal"); 153 return string("RightTop");
154 break;
155 case Slit::LEFTBOTTOM:
156 return string("LeftBottom");
157 break;
158 case Slit::RIGHTBOTTOM:
159 return string("RightBottom");
166 break; 160 break;
167 } 161 }
168 // default string 162 //default string
169 return string("Vertical"); 163 return string("RightBottom");
170} 164}
165
171} // end namespace FbTk 166} // end namespace FbTk
172namespace { 167namespace {
173 168
@@ -202,41 +197,6 @@ private:
202 SlitClient &m_client; 197 SlitClient &m_client;
203}; 198};
204 199
205class SlitDirMenuItem: public FbTk::MenuItem {
206public:
207 SlitDirMenuItem(const FbTk::FbString &label, Slit &slit, FbTk::RefCount<FbTk::Command<void> > &cmd)
208 :FbTk::MenuItem(label,cmd),
209 m_slit(slit),
210 m_label(label) {
211 setLabel(m_label); // update label
212 setCloseOnClick(false);
213 }
214
215 void click(int button, int time, unsigned int mods) {
216 // toggle direction
217 if (m_slit.direction() == Slit::HORIZONTAL)
218 m_slit.setDirection(Slit::VERTICAL);
219 else
220 m_slit.setDirection(Slit::HORIZONTAL);
221 setLabel(m_label);
222 FbTk::MenuItem::click(button, time, mods);
223 }
224
225 void setLabel(const FbTk::FbString &label) {
226 _FB_USES_NLS;
227 m_label = (label);
228 string reallabel = m_label + " " +
229 ( m_slit.direction() == Slit::HORIZONTAL ?
230
231 _FB_XTEXT(Align, Horizontal, "Horizontal", "Horizontal"):
232 _FB_XTEXT(Align, Vertical, "Vertical", "Vertical"));
233 FbTk::MenuItem::setLabel(reallabel);
234 }
235private:
236 Slit &m_slit;
237 string m_label;
238};
239
240class PlaceSlitMenuItem: public FbTk::RadioMenuItem { 200class PlaceSlitMenuItem: public FbTk::RadioMenuItem {
241public: 201public:
242 PlaceSlitMenuItem(const FbTk::FbString &label, Slit &slit, Slit::Placement place, FbTk::RefCount<FbTk::Command<void> > &cmd): 202 PlaceSlitMenuItem(const FbTk::FbString &label, Slit &slit, Slit::Placement place, FbTk::RefCount<FbTk::Command<void> > &cmd):
@@ -290,10 +250,8 @@ Slit::Slit(BScreen &scr, FbTk::XLayer &layer, const char *filename)
290 // TODO: this resource name must change 250 // TODO: this resource name must change
291 m_rc_maximize_over(scr.resourceManager(), false, 251 m_rc_maximize_over(scr.resourceManager(), false,
292 scr.name() + ".slit.maxOver", scr.altName() + ".Slit.MaxOver"), 252 scr.name() + ".slit.maxOver", scr.altName() + ".Slit.MaxOver"),
293 m_rc_placement(scr.resourceManager(), BOTTOMRIGHT, 253 m_rc_placement(scr.resourceManager(), RIGHTBOTTOM,
294 scr.name() + ".slit.placement", scr.altName() + ".Slit.Placement"), 254 scr.name() + ".slit.placement", scr.altName() + ".Slit.Placement"),
295 m_rc_direction(scr.resourceManager(), VERTICAL,
296 scr.name() + ".slit.direction", scr.altName() + ".Slit.Direction"),
297 m_rc_alpha(scr.resourceManager(), 255, 255 m_rc_alpha(scr.resourceManager(), 255,
298 scr.name() + ".slit.alpha", scr.altName() + ".Slit.Alpha"), 256 scr.name() + ".slit.alpha", scr.altName() + ".Slit.Alpha"),
299 m_rc_on_head(scr.resourceManager(), 0, 257 m_rc_on_head(scr.resourceManager(), 0,
@@ -386,46 +344,40 @@ void Slit::updateStrut() {
386 int left = 0, right = 0, top = 0, bottom = 0; 344 int left = 0, right = 0, top = 0, bottom = 0;
387 switch (placement()) { 345 switch (placement()) {
388 case TOPLEFT: 346 case TOPLEFT:
389 if (direction() == HORIZONTAL) 347 top = height() + 2 * bw;
390 top = height() + 2 * bw; 348 break;
391 else 349 case LEFTTOP:
392 left = width() + 2 * bw; 350 left = width() + 2 * bw;
393 break; 351 break;
394 case TOPCENTER: 352 case TOPCENTER:
395 if (direction() == HORIZONTAL) 353 top = height() + 2 * bw;
396 top = height() + 2 * bw;
397 break; 354 break;
398 case TOPRIGHT: 355 case TOPRIGHT:
399 if (direction() == HORIZONTAL) 356 top = height() + 2 * bw;
400 top = height() + 2 * bw; 357 break;
401 else 358 case RIGHTTOP:
402 right = width() + 2 * bw; 359 right = width() + 2 * bw;
403 break; 360 break;
404 case BOTTOMLEFT: 361 case BOTTOMLEFT:
405 if (direction() == HORIZONTAL) 362 bottom = height() + 2 * bw;
406 bottom = height() + 2 * bw; 363 break;
407 else 364 case LEFTBOTTOM:
408 left = width() + 2 * bw; 365 left = width() + 2 * bw;
409 break; 366 break;
410 case BOTTOMCENTER: 367 case BOTTOMCENTER:
411 // would be strange to have it request size on vertical direction 368 bottom = height() + 2 * bw;
412 // each time we add a client
413 if (direction() == HORIZONTAL)
414 bottom = height() + 2 * bw;
415 break; 369 break;
416 case BOTTOMRIGHT: 370 case BOTTOMRIGHT:
417 if (direction() == HORIZONTAL) 371 bottom = height() + 2 * bw;
418 bottom = height() + 2 * bw; 372 break;
419 else 373 case RIGHTBOTTOM:
420 right = width() + 2 * bw; 374 right = width() + 2 * bw;
421 break; 375 break;
422 case LEFTCENTER: 376 case LEFTCENTER:
423 if (direction() == VERTICAL) 377 left = width() + 2 * bw;
424 left = width() + 2 * bw;
425 break; 378 break;
426 case RIGHTCENTER: 379 case RIGHTCENTER:
427 if (direction() == VERTICAL) 380 right = width() + 2 * bw;
428 right = width() + 2 * bw;
429 break; 381 break;
430 } 382 }
431 383
@@ -551,11 +503,6 @@ void Slit::addClient(Window w) {
551 503
552} 504}
553 505
554void Slit::setDirection(Direction dir) {
555 *m_rc_direction = dir;
556 reconfigure();
557}
558
559void Slit::setPlacement(Placement place) { 506void Slit::setPlacement(Placement place) {
560 *m_rc_placement = place; 507 *m_rc_placement = place;
561 reconfigure(); 508 reconfigure();
@@ -636,11 +583,15 @@ void Slit::reconfigure() {
636 const int bevel_width = theme()->bevelWidth(); 583 const int bevel_width = theme()->bevelWidth();
637 // determine width or height increase 584 // determine width or height increase
638 bool height_inc = false; 585 bool height_inc = false;
639 switch (direction()) { 586 switch (placement()) {
640 case VERTICAL: 587 case LEFTTOP:
588 case RIGHTTOP:
589 case LEFTCENTER:
590 case RIGHTCENTER:
591 case LEFTBOTTOM:
592 case RIGHTBOTTOM:
641 height_inc = true; 593 height_inc = true;
642 break; 594 default:
643 case HORIZONTAL: // already false
644 break; 595 break;
645 } 596 }
646 597
@@ -724,19 +675,10 @@ void Slit::reconfigure() {
724 show(); 675 show();
725 676
726 int x = 0, y = 0; 677 int x = 0, y = 0;
727 height_inc = false; 678 if (height_inc)
728 switch (direction()) {
729 case VERTICAL:
730 x = 0;
731 y = bevel_width; 679 y = bevel_width;
732 height_inc = true; 680 else
733 break;
734
735 case HORIZONTAL:
736 x = bevel_width; 681 x = bevel_width;
737 y = 0;
738 break;
739 }
740 682
741 client_it = m_client_list.begin(); 683 client_it = m_client_list.begin();
742 for (; client_it != client_it_end; ++client_it) { 684 for (; client_it != client_it_end; ++client_it) {
@@ -826,90 +768,86 @@ void Slit::reposition() {
826 case TOPLEFT: 768 case TOPLEFT:
827 frame.x = head_x; 769 frame.x = head_x;
828 frame.y = head_y; 770 frame.y = head_y;
829 if (direction() == VERTICAL) { 771 frame.x_hidden = head_x;
830 frame.x_hidden = bevel_width - 772 frame.y_hidden = bevel_width - border_width - frame.height;
831 border_width - frame.width; 773 break;
832 frame.y_hidden = head_y; 774
833 } else { 775 case LEFTTOP:
834 frame.x_hidden = head_x; 776 frame.x = head_x;
835 frame.y_hidden = bevel_width - 777 frame.y = head_y;
836 border_width - frame.height; 778 frame.x_hidden = bevel_width - border_width - frame.width;
837 } 779 frame.y_hidden = head_y;
838 break; 780 break;
839 781
840 case LEFTCENTER: 782 case LEFTCENTER:
841 frame.x = head_x; 783 frame.x = head_x;
842 frame.y = head_y + (head_h - frame.height) / 2; 784 frame.y = head_y + (head_h - frame.height) / 2;
843 frame.x_hidden = head_x + bevel_width - 785 frame.x_hidden = head_x + bevel_width - border_width - frame.width;
844 border_width - frame.width;
845 frame.y_hidden = frame.y; 786 frame.y_hidden = frame.y;
846 break; 787 break;
847 788
848 case BOTTOMLEFT: 789 case BOTTOMLEFT:
849 frame.x = head_x; 790 frame.x = head_x;
850 frame.y = head_y + head_h - frame.height - border_width*2; 791 frame.y = head_y + head_h - frame.height - border_width*2;
851 if (direction() == VERTICAL) { 792 frame.x_hidden = head_x;
852 frame.x_hidden = head_x + bevel_width - 793 frame.y_hidden = head_y + head_h - bevel_width - border_width;
853 border_width - frame.width; 794 break;
854 frame.y_hidden = frame.y; 795
855 } else { 796 case LEFTBOTTOM:
856 frame.x_hidden = head_x; 797 frame.x = head_x;
857 frame.y_hidden = head_y + head_h - 798 frame.y = head_y + head_h - frame.height - border_width*2;
858 bevel_width - border_width; 799 frame.x_hidden = head_x + bevel_width - border_width - frame.width;
859 } 800 frame.y_hidden = frame.y;
860 break; 801 break;
861 802
862 case TOPCENTER: 803 case TOPCENTER:
863 frame.x = head_x + ((head_w - frame.width) / 2); 804 frame.x = head_x + ((head_w - frame.width) / 2);
864 frame.y = head_y; 805 frame.y = head_y;
865 frame.x_hidden = frame.x; 806 frame.x_hidden = frame.x;
866 frame.y_hidden = head_y + bevel_width - 807 frame.y_hidden = head_y + bevel_width - border_width - frame.height;
867 border_width - frame.height;
868 break; 808 break;
869 809
870 case BOTTOMCENTER: 810 case BOTTOMCENTER:
871 frame.x = head_x + ((head_w - frame.width) / 2); 811 frame.x = head_x + ((head_w - frame.width) / 2);
872 frame.y = head_y + head_h - frame.height - border_width*2; 812 frame.y = head_y + head_h - frame.height - border_width*2;
873 frame.x_hidden = frame.x; 813 frame.x_hidden = frame.x;
874 frame.y_hidden = head_y + head_h - 814 frame.y_hidden = head_y + head_h - bevel_width - border_width;
875 bevel_width - border_width;
876 break; 815 break;
877 816
878 case TOPRIGHT: 817 case TOPRIGHT:
879 frame.x = head_x + head_w - frame.width - border_width*2; 818 frame.x = head_x + head_w - frame.width - border_width*2;
880 frame.y = head_y; 819 frame.y = head_y;
881 if (direction() == VERTICAL) { 820 frame.x_hidden = frame.x;
882 frame.x_hidden = head_x + head_w - 821 frame.y_hidden = head_y + bevel_width - border_width - frame.height;
883 bevel_width - border_width; 822 break;
884 frame.y_hidden = head_y; 823
885 } else { 824 case RIGHTTOP:
886 frame.x_hidden = frame.x; 825 frame.x = head_x + head_w - frame.width - border_width*2;
887 frame.y_hidden = head_y + bevel_width - 826 frame.y = head_y;
888 border_width - frame.height; 827 frame.x_hidden = head_x + head_w - bevel_width - border_width;
889 } 828 frame.y_hidden = head_y;
890 break; 829 break;
891 830
892 case RIGHTCENTER: 831 case RIGHTCENTER:
893 default:
894 frame.x = head_x + head_w - frame.width - border_width*2; 832 frame.x = head_x + head_w - frame.width - border_width*2;
895 frame.y = head_y + ((head_h - frame.height) / 2); 833 frame.y = head_y + ((head_h - frame.height) / 2);
896 frame.x_hidden = head_x + head_w - 834 frame.x_hidden = head_x + head_w - bevel_width - border_width;
897 bevel_width - border_width;
898 frame.y_hidden = frame.y; 835 frame.y_hidden = frame.y;
899 break; 836 break;
900 837
901 case BOTTOMRIGHT: 838 case BOTTOMRIGHT:
902 frame.x = head_x + head_w - frame.width - border_width*2; 839 frame.x = head_x + head_w - frame.width - border_width*2;
903 frame.y = head_y + head_h - frame.height - border_width*2; 840 frame.y = head_y + head_h - frame.height - border_width*2;
904 if (direction() == VERTICAL) { 841 frame.x_hidden = frame.x;
905 frame.x_hidden = head_x + head_w - 842 frame.y_hidden = head_y + head_h - bevel_width - border_width;
906 bevel_width - border_width; 843 break;
907 frame.y_hidden = frame.y; 844
908 } else { 845 case RIGHTBOTTOM:
909 frame.x_hidden = frame.x; 846 default:
910 frame.y_hidden = head_y + head_h - 847 frame.x = head_x + head_w - frame.width - border_width*2;
911 bevel_width - border_width; 848 frame.y = head_y + head_h - frame.height - border_width*2;
912 } 849 frame.x_hidden = head_x + head_w - bevel_width - border_width;
850 frame.y_hidden = frame.y;
913 break; 851 break;
914 } 852 }
915 853
@@ -1292,9 +1230,6 @@ void Slit::setupMenu() {
1292 1230
1293 m_slitmenu.insert(alpha_menuitem); 1231 m_slitmenu.insert(alpha_menuitem);
1294 1232
1295 m_slitmenu.insert(new SlitDirMenuItem(_FB_XTEXT(Slit, Direction, "Slit Direction:", "Orientation of slit"),
1296 *this,
1297 save_and_reconfigure));
1298 m_slitmenu.insert(_FB_XTEXT(Slit, ClientsMenu, "Clients", "Slit client menu"), &m_clientlist_menu); 1233 m_slitmenu.insert(_FB_XTEXT(Slit, ClientsMenu, "Clients", "Slit client menu"), &m_clientlist_menu);
1299 m_slitmenu.updateMenu(); 1234 m_slitmenu.updateMenu();
1300 1235
@@ -1311,18 +1246,24 @@ void Slit::setupMenu() {
1311 1246
1312 // menu is 3 wide, 5 down 1247 // menu is 3 wide, 5 down
1313 place_menu.push_back(PlacementP(_FB_XTEXT(Align, TopLeft, "Top Left", "Top Left"), Slit::TOPLEFT)); 1248 place_menu.push_back(PlacementP(_FB_XTEXT(Align, TopLeft, "Top Left", "Top Left"), Slit::TOPLEFT));
1249 place_menu.push_back(PlacementP(_FB_XTEXT(Align, LeftTop, "Left Top", "Left Top"), Slit::LEFTTOP));
1314 place_menu.push_back(PlacementP(_FB_XTEXT(Align, LeftCenter, "Left Center", "Left Center"), Slit::LEFTCENTER)); 1250 place_menu.push_back(PlacementP(_FB_XTEXT(Align, LeftCenter, "Left Center", "Left Center"), Slit::LEFTCENTER));
1251 place_menu.push_back(PlacementP(_FB_XTEXT(Align, LeftBottom, "Left Bottom", "Left Bottom"), Slit::LEFTBOTTOM));
1315 place_menu.push_back(PlacementP(_FB_XTEXT(Align, BottomLeft, "Bottom Left", "Bottom Left"), Slit::BOTTOMLEFT)); 1252 place_menu.push_back(PlacementP(_FB_XTEXT(Align, BottomLeft, "Bottom Left", "Bottom Left"), Slit::BOTTOMLEFT));
1316 place_menu.push_back(PlacementP(_FB_XTEXT(Align, TopCenter, "Top Center", "Top Center"), Slit::TOPCENTER)); 1253 place_menu.push_back(PlacementP(_FB_XTEXT(Align, TopCenter, "Top Center", "Top Center"), Slit::TOPCENTER));
1317 place_menu.push_back(PlacementP("", Slit::TOPLEFT)); 1254 place_menu.push_back(PlacementP("", Slit::TOPLEFT));
1255 place_menu.push_back(PlacementP("", Slit::TOPLEFT));
1256 place_menu.push_back(PlacementP("", Slit::TOPLEFT));
1318 place_menu.push_back(PlacementP(_FB_XTEXT(Align, BottomCenter, "Bottom Center", "Bottom Center"), Slit::BOTTOMCENTER)); 1257 place_menu.push_back(PlacementP(_FB_XTEXT(Align, BottomCenter, "Bottom Center", "Bottom Center"), Slit::BOTTOMCENTER));
1319 place_menu.push_back(PlacementP(_FB_XTEXT(Align, TopRight, "Top Right", "Top Right"), Slit::TOPRIGHT)); 1258 place_menu.push_back(PlacementP(_FB_XTEXT(Align, TopRight, "Top Right", "Top Right"), Slit::TOPRIGHT));
1259 place_menu.push_back(PlacementP(_FB_XTEXT(Align, RightTop, "Right Top", "Right Top"), Slit::RIGHTTOP));
1320 place_menu.push_back(PlacementP(_FB_XTEXT(Align, RightCenter, "Right Center", "Right Center"), Slit::RIGHTCENTER)); 1260 place_menu.push_back(PlacementP(_FB_XTEXT(Align, RightCenter, "Right Center", "Right Center"), Slit::RIGHTCENTER));
1261 place_menu.push_back(PlacementP(_FB_XTEXT(Align, RightBottom, "Right Bottom", "Right Bottom"), Slit::RIGHTBOTTOM));
1321 place_menu.push_back(PlacementP(_FB_XTEXT(Align, BottomRight, "Bottom Right", "Bottom Right"), Slit::BOTTOMRIGHT)); 1262 place_menu.push_back(PlacementP(_FB_XTEXT(Align, BottomRight, "Bottom Right", "Bottom Right"), Slit::BOTTOMRIGHT));
1322 1263
1323 1264
1324 // create items in sub menu 1265 // create items in sub menu
1325 for (size_t i=0; i<9; ++i) { 1266 for (size_t i=0; i<15; ++i) {
1326 const FbTk::FbString &str = place_menu.front().first; 1267 const FbTk::FbString &str = place_menu.front().first;
1327 Slit::Placement placement = place_menu.front().second; 1268 Slit::Placement placement = place_menu.front().second;
1328 1269