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, ConfigmenuDisableBindings,
61 "Disable Mouse with Scroll Lock"), 8);
62 insert(i18n(ConfigmenuSet, ConfigmenuHideToolbar,
69 void Configmenu::setValues(void) {
70 setItemSelected(2, getScreen()->doImageDither());
71 setItemSelected(3, getScreen()->doOpaqueMove());
72 setItemSelected(4, getScreen()->doFullMax());
73 setItemSelected(5, getScreen()->doFocusNew());
74 setItemSelected(6, getScreen()->doFocusLast());
75 setItemSelected(7, getScreen()->getWindowToWindowSnap());
77 setItemSelected(8, getScreen()->getWindowCornerSnap());
78 setItemEnabled(8, getScreen()->getWindowToWindowSnap());
80 setItemSelected(9, getScreen()->allowScrollLock());
81 setItemSelected(10, getScreen()->doHideToolbar());
85 Configmenu::~Configmenu(void) {
91 void Configmenu::itemSelected(int button, unsigned int index) {
95 BasemenuItem *item = find(index);
97 if (! item->function())
100 switch(item->function()) {
102 getScreen()->saveImageDither(! getScreen()->doImageDither());
103 setItemSelected(index, getScreen()->doImageDither());
106 case 2: // opaque move
107 getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove());
108 setItemSelected(index, getScreen()->doOpaqueMove());
111 case 3: // full maximization
112 getScreen()->saveFullMax(! getScreen()->doFullMax());
113 setItemSelected(index, getScreen()->doFullMax());
116 case 4: // focus new windows
117 getScreen()->saveFocusNew(! getScreen()->doFocusNew());
118 setItemSelected(index, getScreen()->doFocusNew());
121 case 5: // focus last window on workspace
122 getScreen()->saveFocusLast(! getScreen()->doFocusLast());
123 setItemSelected(index, getScreen()->doFocusLast());
126 case 6: // window-to-window snapping
127 getScreen()->saveWindowToWindowSnap(! getScreen()->getWindowToWindowSnap());
128 setItemSelected(index, getScreen()->getWindowToWindowSnap());
129 setItemEnabled(index + 1, getScreen()->getWindowToWindowSnap());
132 case 7: // window corner snapping
133 getScreen()->saveWindowCornerSnap(! getScreen()->getWindowCornerSnap());
134 setItemSelected(index, getScreen()->getWindowCornerSnap());
137 case 8: // disable mouse bindings with Scroll Lock
138 getScreen()->saveAllowScrollLock(! getScreen()->allowScrollLock());
139 setItemSelected(index, getScreen()->allowScrollLock());
140 getScreen()->reconfigure();
143 case 9: // hide toolbar
144 getScreen()->saveHideToolbar(! getScreen()->doHideToolbar());
145 setItemSelected(index, getScreen()->doHideToolbar());
151 void Configmenu::reconfigure(void) {
153 focusmenu->reconfigure();
154 placementmenu->reconfigure();
156 Basemenu::reconfigure();
160 Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) {
161 setLabel(i18n(ConfigmenuSet, ConfigmenuFocusModel, "Focus Model"));
164 insert(i18n(ConfigmenuSet, ConfigmenuClickToFocus, "Click To Focus"), 1);
165 insert(i18n(ConfigmenuSet, ConfigmenuSloppyFocus, "Sloppy Focus"), 2);
166 insert(i18n(ConfigmenuSet, ConfigmenuAutoRaise, "Auto Raise"), 3);
167 insert(i18n(ConfigmenuSet, ConfigmenuClickRaise, "Click Raise"), 4);
173 void Configmenu::Focusmenu::setValues(void) {
174 setItemSelected(0, ! getScreen()->isSloppyFocus());
175 setItemSelected(1, getScreen()->isSloppyFocus());
176 setItemEnabled(2, getScreen()->isSloppyFocus());
177 setItemSelected(2, getScreen()->doAutoRaise());
178 setItemEnabled(3, getScreen()->isSloppyFocus());
179 setItemSelected(3, getScreen()->doClickRaise());
183 void Configmenu::Focusmenu::reconfigure(void) {
185 Basemenu::reconfigure();
189 void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
193 BasemenuItem *item = find(index);
195 if (! item->function())
198 switch (item->function()) {
199 case 1: // click to focus
200 getScreen()->toggleFocusModel(BScreen::ClickToFocus);
203 case 2: // sloppy focus
204 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
207 case 3: // auto raise with sloppy focus
208 getScreen()->saveAutoRaise(! getScreen()->doAutoRaise());
211 case 4: // click raise with sloppy focus
212 getScreen()->saveClickRaise(! getScreen()->doClickRaise());
213 // make sure the appropriate mouse buttons are grabbed on the windows
214 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
221 Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
222 Basemenu(cm->getScreen()) {
223 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement"));
226 insert(i18n(ConfigmenuSet, ConfigmenuSmartRows, "Smart Placement (Rows)"),
227 BScreen::RowSmartPlacement);
228 insert(i18n(ConfigmenuSet, ConfigmenuSmartCols, "Smart Placement (Columns)"),
229 BScreen::ColSmartPlacement);
230 insert(i18n(ConfigmenuSet, ConfigmenuCascade, "Cascade Placement"),
231 BScreen::CascadePlacement);
232 insert(i18n(ConfigmenuSet, ConfigmenuUnderMouse, "Under Mouse Placement"),
233 BScreen::UnderMousePlacement);
234 insert(i18n(ConfigmenuSet, ConfigmenuClickMouse, "Click Mouse Placement"),
235 BScreen::ClickMousePlacement);
236 insert(i18n(ConfigmenuSet, ConfigmenuLeftRight, "Left to Right"),
238 insert(i18n(ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"),
240 insert(i18n(ConfigmenuSet, ConfigmenuTopBottom, "Top to Bottom"),
242 insert(i18n(ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"),
244 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreShaded, "Ignore Shaded Windows"),
245 BScreen::IgnoreShaded);
246 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreMax,
247 "Ignore Full-Maximized Windows"),
248 BScreen::IgnoreMaximized);
254 void Configmenu::Placementmenu::setValues(void) {
255 int placement = getScreen()->getPlacementPolicy();
257 setItemSelected(0, placement == BScreen::RowSmartPlacement);
258 setItemSelected(1, placement == BScreen::ColSmartPlacement);
259 setItemSelected(2, placement == BScreen::CascadePlacement);
260 setItemSelected(3, placement == BScreen::UnderMousePlacement);
261 setItemSelected(4, placement == BScreen::ClickMousePlacement);
263 bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight),
264 tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom),
265 e = placement != BScreen::UnderMousePlacement;
267 setItemSelected(5, rl);
268 setItemSelected(6, ! rl);
269 setItemEnabled(5, e);
270 setItemEnabled(6, e);
272 setItemSelected(7, tb);
273 setItemSelected(8, ! tb);
274 setItemEnabled(7, e);
275 setItemEnabled(8, e);
277 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
278 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
282 void Configmenu::Placementmenu::reconfigure(void) {
284 Basemenu::reconfigure();
288 void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) {
292 BasemenuItem *item = find(index);
294 if (! item->function())
297 switch (item->function()) {
298 case BScreen::RowSmartPlacement:
299 getScreen()->savePlacementPolicy(item->function());
301 setItemSelected(0, true);
302 setItemSelected(1, false);
303 setItemSelected(2, false);
304 setItemSelected(3, false);
305 setItemSelected(4, false);
306 setItemEnabled(5, true);
307 setItemEnabled(6, true);
308 setItemEnabled(7, true);
309 setItemEnabled(8, true);
313 case BScreen::ColSmartPlacement:
314 getScreen()->savePlacementPolicy(item->function());
316 setItemSelected(0, false);
317 setItemSelected(1, true);
318 setItemSelected(2, false);
319 setItemSelected(3, false);
320 setItemSelected(4, false);
321 setItemEnabled(5, true);
322 setItemEnabled(6, true);
323 setItemEnabled(7, true);
324 setItemEnabled(8, true);
328 case BScreen::CascadePlacement:
329 getScreen()->savePlacementPolicy(item->function());
331 setItemSelected(0, false);
332 setItemSelected(1, false);
333 setItemSelected(2, true);
334 setItemSelected(3, false);
335 setItemSelected(4, false);
336 setItemEnabled(5, true);
337 setItemEnabled(6, true);
338 setItemEnabled(7, true);
339 setItemEnabled(8, true);
343 case BScreen::UnderMousePlacement:
344 getScreen()->savePlacementPolicy(item->function());
346 setItemSelected(0, false);
347 setItemSelected(1, false);
348 setItemSelected(2, false);
349 setItemSelected(3, true);
350 setItemSelected(4, false);
351 setItemEnabled(5, false);
352 setItemEnabled(6, false);
353 setItemEnabled(7, false);
354 setItemEnabled(8, false);
358 case BScreen::ClickMousePlacement:
359 getScreen()->savePlacementPolicy(item->function());
361 setItemSelected(0, false);
362 setItemSelected(1, false);
363 setItemSelected(2, false);
364 setItemSelected(3, false);
365 setItemSelected(4, true);
366 setItemEnabled(5, false);
367 setItemEnabled(6, false);
368 setItemEnabled(7, false);
369 setItemEnabled(8, false);
373 case BScreen::LeftRight:
374 getScreen()->saveRowPlacementDirection(BScreen::LeftRight);
376 setItemSelected(5, true);
377 setItemSelected(6, false);
381 case BScreen::RightLeft:
382 getScreen()->saveRowPlacementDirection(BScreen::RightLeft);
384 setItemSelected(5, false);
385 setItemSelected(6, true);
389 case BScreen::TopBottom:
390 getScreen()->saveColPlacementDirection(BScreen::TopBottom);
392 setItemSelected(7, true);
393 setItemSelected(8, false);
397 case BScreen::BottomTop:
398 getScreen()->saveColPlacementDirection(BScreen::BottomTop);
400 setItemSelected(7, false);
401 setItemSelected(8, true);
405 case BScreen::IgnoreShaded:
406 getScreen()->savePlaceIgnoreShaded(! getScreen()->getPlaceIgnoreShaded());
408 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
412 case BScreen::IgnoreMaximized:
414 savePlaceIgnoreMaximized(! getScreen()->getPlaceIgnoreMaximized());
416 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());