1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
2 // Toolbarmenu.cc for Blackbox - an X11 Window manager
3 // Copyright (c) 2001 - 2005 Sean 'Shaleh' Perry <shaleh@debian.org>
4 // Copyright (c) 1997 - 2000, 2002 - 2005
5 //         Bradley T Hughes <bhughes at trolltech.com>
6 //
7 // Permission is hereby granted, free of charge, to any person obtaining a
8 // copy of this software and associated documentation files (the "Software"),
9 // to deal in the Software without restriction, including without limitation
10 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 // and/or sell copies of the Software, and to permit persons to whom the
12 // Software is furnished to do so, subject to the following conditions:
13 //
14 // The above copyright notice and this permission notice shall be included in
15 // all copies or substantial portions of the Software.
16 //
17 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23 // DEALINGS IN THE SOFTWARE.
24 
25 #include "Toolbarmenu.hh"
26 #include "Toolbar.hh"
27 
28 #include <Unicode.hh>
29 
30 
31 class ToolbarPlacementmenu : public bt::Menu {
32 public:
33   ToolbarPlacementmenu(bt::Application &app, unsigned int screen,
34                        BScreen *bscreen);
35 
36   void refresh(void);
37 
38 protected:
39   void itemClicked(unsigned int id, unsigned int button);
40 
41 private:
42   BScreen *_bscreen;
43 };
44 
45 
46 enum {
47   EnableToolbar,
48   Placement,
49   AlwaysOnTop,
50   AutoHide
51 };
52 
53 
Toolbarmenu(bt::Application & app,unsigned int screen,BScreen * bscreen)54 Toolbarmenu::Toolbarmenu(bt::Application &app, unsigned int screen,
55                          BScreen *bscreen)
56   : bt::Menu(app, screen), _bscreen(bscreen)
57 {
58   setTitle(bt::toUnicode("Toolbar Options"));
59   showTitle();
60 
61   ToolbarPlacementmenu *menu = new ToolbarPlacementmenu(app, screen, bscreen);
62   insertItem(bt::toUnicode("Enable Toolbar"), EnableToolbar);
63   insertSeparator();
64   insertItem(bt::toUnicode("Placement"), menu, Placement);
65   insertItem(bt::toUnicode("Always on top"), AlwaysOnTop);
66   insertItem(bt::toUnicode("Auto Hide"), AutoHide);
67 }
68 
69 
refresh(void)70 void Toolbarmenu::refresh(void) {
71   const ToolbarOptions &options = _bscreen->resource().toolbarOptions();
72   setItemChecked(EnableToolbar, options.enabled);
73   setItemChecked(AlwaysOnTop, options.always_on_top);
74   setItemChecked(AutoHide, options.auto_hide);
75 }
76 
77 
itemClicked(unsigned int id,unsigned int button)78 void Toolbarmenu::itemClicked(unsigned int id, unsigned int button) {
79   if (button != 1)
80     return;
81 
82   Toolbar *toolbar = _bscreen->toolbar();
83   ToolbarOptions &options =
84     const_cast<ToolbarOptions &>(_bscreen->resource().toolbarOptions());
85 
86   switch (id) {
87   case EnableToolbar:
88     options.enabled = (toolbar == 0);
89     _bscreen->saveResource();
90     if (toolbar != 0)
91       _bscreen->destroyToolbar();
92     else
93       _bscreen->createToolbar();
94     break;
95 
96   case AlwaysOnTop:
97     options.always_on_top = !options.always_on_top;
98     _bscreen->saveResource();
99     if (toolbar) {
100       StackingList::Layer new_layer = (options.always_on_top
101                                        ? StackingList::LayerAbove
102                                        : StackingList::LayerNormal);
103       _bscreen->stackingList().changeLayer(toolbar, new_layer);
104       _bscreen->restackWindows();
105     }
106     break;
107 
108   case AutoHide:
109     options.auto_hide = !options.auto_hide;
110     _bscreen->saveResource();
111     if (toolbar)
112       toolbar->toggleAutoHide();
113     break;
114 
115   default:
116     break;
117   } // switch
118 }
119 
120 
ToolbarPlacementmenu(bt::Application & app,unsigned int screen,BScreen * bscreen)121 ToolbarPlacementmenu::ToolbarPlacementmenu(bt::Application &app,
122                                            unsigned int screen,
123                                            BScreen *bscreen)
124   : bt::Menu(app, screen), _bscreen(bscreen)
125 {
126   setTitle(bt::toUnicode("Toolbar Placement"));
127   showTitle();
128 
129   insertItem(bt::toUnicode("Top Left"),      Toolbar::TopLeft);
130   insertItem(bt::toUnicode("Top Center"),    Toolbar::TopCenter);
131   insertItem(bt::toUnicode("Top Right"),     Toolbar::TopRight);
132   insertSeparator();
133   insertItem(bt::toUnicode("Bottom Left"),   Toolbar::BottomLeft);
134   insertItem(bt::toUnicode("Bottom Center"), Toolbar::BottomCenter);
135   insertItem(bt::toUnicode("Bottom Right"),  Toolbar::BottomRight);
136 }
137 
138 
refresh(void)139 void ToolbarPlacementmenu::refresh(void) {
140   const ToolbarOptions &options = _bscreen->resource().toolbarOptions();
141   setItemChecked(Toolbar::TopLeft,
142                  options.placement == Toolbar::TopLeft);
143   setItemChecked(Toolbar::TopCenter,
144                  options.placement == Toolbar::TopCenter);
145   setItemChecked(Toolbar::TopRight,
146                  options.placement == Toolbar::TopRight);
147   setItemChecked(Toolbar::BottomLeft,
148                  options.placement == Toolbar::BottomLeft);
149   setItemChecked(Toolbar::BottomCenter,
150                  options.placement == Toolbar::BottomCenter);
151   setItemChecked(Toolbar::BottomRight,
152                  options.placement == Toolbar::BottomRight);
153 }
154 
155 
itemClicked(unsigned int id,unsigned int button)156 void ToolbarPlacementmenu::itemClicked(unsigned int id, unsigned int button) {
157   if (button != 1)
158     return;
159 
160   Toolbar *toolbar = _bscreen->toolbar();
161   ToolbarOptions &options =
162     const_cast<ToolbarOptions &>(_bscreen->resource().toolbarOptions());
163 
164   options.placement = id;
165   if (toolbar)
166     toolbar->setPlacement((Toolbar::Placement) id);
167   _bscreen->saveResource();
168 }
169