1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
2 // Configmenu.cc for Blackbox - An X11 Window Manager
3 // Copyright (c) 2001 - 2002 Sean 'Shaleh' Perry <shaleh@debian.org>
4 // Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
6 // Permission is hereby granted, free of charge, to any person obtaining a
7 // copy of this software and associated documentation files (the "Software"),
8 // to deal in the Software without restriction, including without limitation
9 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 // and/or sell copies of the Software, and to permit persons to whom the
11 // Software is furnished to do so, subject to the following conditions:
13 // The above copyright notice and this permission notice shall be included in
14 // all copies or substantial portions of the Software.
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 // DEALINGS IN THE SOFTWARE.
25 # include "../config.h"
26 #endif // HAVE_CONFIG_H
29 #include "Configmenu.hh"
35 Configmenu::Configmenu(BScreen *scr) : Basemenu(scr) {
36 setLabel(i18n(ConfigmenuSet, ConfigmenuConfigOptions, "Config options"));
39 focusmenu = new Focusmenu(this);
40 placementmenu = new Placementmenu(this);
42 insert(i18n(ConfigmenuSet, ConfigmenuFocusModel,
43 "Focus Model"), focusmenu);
44 insert(i18n(ConfigmenuSet, ConfigmenuWindowPlacement,
45 "Window Placement"), placementmenu);
46 insert(i18n(ConfigmenuSet, ConfigmenuImageDithering,
47 "Image Dithering"), 1);
48 insert(i18n(ConfigmenuSet, ConfigmenuOpaqueMove,
49 "Opaque Window Moving"), 2);
50 insert(i18n(ConfigmenuSet, ConfigmenuFullMax,
51 "Full Maximization"), 3);
52 insert(i18n(ConfigmenuSet, ConfigmenuFocusNew,
53 "Focus New Windows"), 4);
54 insert(i18n(ConfigmenuSet, ConfigmenuFocusLast,
55 "Focus Last Window on Workspace"), 5);
56 insert(i18n(ConfigmenuSet, ConfigmenuWindowToWindowSnap,
57 "Window-To-Window Snapping"), 6);
58 insert(i18n(ConfigmenuSet, ConfigmenuWindowCornerSnap,
59 "Window Corner Snapping"), 7);
60 insert(i18n(ConfigmenuSet, ConfigmenuHideToolbar,
67 void Configmenu::setValues(void) {
68 setItemSelected(2, getScreen()->doImageDither());
69 setItemSelected(3, getScreen()->doOpaqueMove());
70 setItemSelected(4, getScreen()->doFullMax());
71 setItemSelected(5, getScreen()->doFocusNew());
72 setItemSelected(6, getScreen()->doFocusLast());
73 setItemSelected(7, getScreen()->getWindowToWindowSnap());
75 setItemSelected(8, getScreen()->getWindowCornerSnap());
76 setItemEnabled(8, getScreen()->getWindowToWindowSnap());
78 setItemSelected(9, getScreen()->doHideToolbar());
82 Configmenu::~Configmenu(void) {
87 void Configmenu::itemSelected(int button, unsigned int index) {
91 BasemenuItem *item = find(index);
93 if (! item->function())
96 switch(item->function()) {
98 getScreen()->saveImageDither(! getScreen()->doImageDither());
99 setItemSelected(index, getScreen()->doImageDither());
102 case 2: // opaque move
103 getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove());
104 setItemSelected(index, getScreen()->doOpaqueMove());
107 case 3: // full maximization
108 getScreen()->saveFullMax(! getScreen()->doFullMax());
109 setItemSelected(index, getScreen()->doFullMax());
112 case 4: // focus new windows
113 getScreen()->saveFocusNew(! getScreen()->doFocusNew());
114 setItemSelected(index, getScreen()->doFocusNew());
117 case 5: // focus last window on workspace
118 getScreen()->saveFocusLast(! getScreen()->doFocusLast());
119 setItemSelected(index, getScreen()->doFocusLast());
122 case 6: // window-to-window snapping
123 getScreen()->saveWindowToWindowSnap(! getScreen()->getWindowToWindowSnap());
124 setItemSelected(index, getScreen()->getWindowToWindowSnap());
125 setItemEnabled(index + 1, getScreen()->getWindowToWindowSnap());
128 case 7: // window corner snapping
129 getScreen()->saveWindowCornerSnap(! getScreen()->getWindowCornerSnap());
130 setItemSelected(index, getScreen()->getWindowCornerSnap());
133 case 8: // hide toolbar
134 getScreen()->saveHideToolbar(! getScreen()->doHideToolbar());
135 setItemSelected(index, getScreen()->doHideToolbar());
141 void Configmenu::reconfigure(void) {
143 focusmenu->reconfigure();
144 placementmenu->reconfigure();
146 Basemenu::reconfigure();
150 Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) {
151 setLabel(i18n(ConfigmenuSet, ConfigmenuFocusModel, "Focus Model"));
154 insert(i18n(ConfigmenuSet, ConfigmenuClickToFocus, "Click To Focus"), 1);
155 insert(i18n(ConfigmenuSet, ConfigmenuSloppyFocus, "Sloppy Focus"), 2);
156 insert(i18n(ConfigmenuSet, ConfigmenuAutoRaise, "Auto Raise"), 3);
157 insert(i18n(ConfigmenuSet, ConfigmenuClickRaise, "Click Raise"), 4);
163 void Configmenu::Focusmenu::setValues(void) {
164 setItemSelected(0, ! getScreen()->isSloppyFocus());
165 setItemSelected(1, getScreen()->isSloppyFocus());
166 setItemEnabled(2, getScreen()->isSloppyFocus());
167 setItemSelected(2, getScreen()->doAutoRaise());
168 setItemEnabled(3, getScreen()->isSloppyFocus());
169 setItemSelected(3, getScreen()->doClickRaise());
173 void Configmenu::Focusmenu::reconfigure(void) {
175 Basemenu::reconfigure();
179 void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
183 BasemenuItem *item = find(index);
185 if (! item->function())
188 switch (item->function()) {
189 case 1: // click to focus
190 getScreen()->toggleFocusModel(BScreen::ClickToFocus);
193 case 2: // sloppy focus
194 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
197 case 3: // auto raise with sloppy focus
198 getScreen()->saveAutoRaise(! getScreen()->doAutoRaise());
201 case 4: // click raise with sloppy focus
202 getScreen()->saveClickRaise(! getScreen()->doClickRaise());
203 // make sure the appropriate mouse buttons are grabbed on the windows
204 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
211 Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
212 Basemenu(cm->getScreen()) {
213 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement"));
216 insert(i18n(ConfigmenuSet, ConfigmenuSmartRows, "Smart Placement (Rows)"),
217 BScreen::RowSmartPlacement);
218 insert(i18n(ConfigmenuSet, ConfigmenuSmartCols, "Smart Placement (Columns)"),
219 BScreen::ColSmartPlacement);
220 insert(i18n(ConfigmenuSet, ConfigmenuCascade, "Cascade Placement"),
221 BScreen::CascadePlacement);
222 insert(i18n(ConfigmenuSet, ConfigmenuUnderMouse, "Under Mouse Placement"),
223 BScreen::UnderMousePlacement);
224 insert(i18n(ConfigmenuSet, ConfigmenuLeftRight, "Left to Right"),
226 insert(i18n(ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"),
228 insert(i18n(ConfigmenuSet, ConfigmenuTopBottom, "Top to Bottom"),
230 insert(i18n(ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"),
232 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreShaded, "Ignore shaded windows"),
233 BScreen::IgnoreShaded);
234 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreMax,
235 "Ignore full-maximized windows"),
236 BScreen::IgnoreMaximized);
242 void Configmenu::Placementmenu::setValues(void) {
243 int placement = getScreen()->getPlacementPolicy();
245 setItemSelected(0, placement == BScreen::RowSmartPlacement);
246 setItemSelected(1, placement == BScreen::ColSmartPlacement);
247 setItemSelected(2, placement == BScreen::CascadePlacement);
248 setItemSelected(3, placement == BScreen::UnderMousePlacement);
250 bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight),
251 tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom),
252 e = placement != BScreen::UnderMousePlacement;
254 setItemSelected(4, rl);
255 setItemSelected(5, ! rl);
256 setItemEnabled(4, e);
257 setItemEnabled(5, e);
259 setItemSelected(6, tb);
260 setItemSelected(7, ! tb);
261 setItemEnabled(6, e);
262 setItemEnabled(7, e);
264 setItemSelected(8, getScreen()->getPlaceIgnoreShaded());
265 setItemSelected(9, getScreen()->getPlaceIgnoreMaximized());
269 void Configmenu::Placementmenu::reconfigure(void) {
271 Basemenu::reconfigure();
275 void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) {
279 BasemenuItem *item = find(index);
281 if (! item->function())
284 switch (item->function()) {
285 case BScreen::RowSmartPlacement:
286 getScreen()->savePlacementPolicy(item->function());
288 setItemSelected(0, true);
289 setItemSelected(1, false);
290 setItemSelected(2, false);
291 setItemSelected(3, false);
292 setItemEnabled(4, true);
293 setItemEnabled(5, true);
294 setItemEnabled(6, true);
295 setItemEnabled(7, true);
299 case BScreen::ColSmartPlacement:
300 getScreen()->savePlacementPolicy(item->function());
302 setItemSelected(0, false);
303 setItemSelected(1, true);
304 setItemSelected(2, false);
305 setItemSelected(3, false);
306 setItemEnabled(4, true);
307 setItemEnabled(5, true);
308 setItemEnabled(6, true);
309 setItemEnabled(7, true);
313 case BScreen::CascadePlacement:
314 getScreen()->savePlacementPolicy(item->function());
316 setItemSelected(0, false);
317 setItemSelected(1, false);
318 setItemSelected(2, true);
319 setItemSelected(3, false);
320 setItemEnabled(4, true);
321 setItemEnabled(5, true);
322 setItemEnabled(6, true);
323 setItemEnabled(7, true);
327 case BScreen::UnderMousePlacement:
328 getScreen()->savePlacementPolicy(item->function());
330 setItemSelected(0, false);
331 setItemSelected(1, false);
332 setItemSelected(2, false);
333 setItemSelected(3, true);
334 setItemEnabled(4, false);
335 setItemEnabled(5, false);
336 setItemEnabled(6, false);
337 setItemEnabled(7, false);
341 case BScreen::LeftRight:
342 getScreen()->saveRowPlacementDirection(BScreen::LeftRight);
344 setItemSelected(4, true);
345 setItemSelected(5, false);
349 case BScreen::RightLeft:
350 getScreen()->saveRowPlacementDirection(BScreen::RightLeft);
352 setItemSelected(4, false);
353 setItemSelected(5, true);
357 case BScreen::TopBottom:
358 getScreen()->saveColPlacementDirection(BScreen::TopBottom);
360 setItemSelected(6, true);
361 setItemSelected(7, false);
365 case BScreen::BottomTop:
366 getScreen()->saveColPlacementDirection(BScreen::BottomTop);
368 setItemSelected(6, false);
369 setItemSelected(7, true);
373 case BScreen::IgnoreShaded:
374 getScreen()->savePlaceIgnoreShaded(! getScreen()->getPlaceIgnoreShaded());
376 setItemSelected(8, getScreen()->getPlaceIgnoreShaded());
380 case BScreen::IgnoreMaximized:
382 savePlaceIgnoreMaximized(! getScreen()->getPlaceIgnoreMaximized());
384 setItemSelected(9, getScreen()->getPlaceIgnoreMaximized());