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 xineramamenu = new Xineramamenu(this);
45 insert(i18n(ConfigmenuSet, ConfigmenuFocusModel,
46 "Focus Model"), focusmenu);
47 insert(i18n(ConfigmenuSet, ConfigmenuWindowPlacement,
48 "Window Placement"), placementmenu);
50 insert(i18n(ConfigmenuSet, ConfigmenuXineramaSupport,
51 "XineramaSupport"), xineramamenu);
53 insert(i18n(ConfigmenuSet, ConfigmenuImageDithering,
54 "Image Dithering"), 1);
55 insert(i18n(ConfigmenuSet, ConfigmenuOpaqueMove,
56 "Opaque Window Moving"), 2);
57 insert(i18n(ConfigmenuSet, ConfigmenuFullMax,
58 "Full Maximization"), 3);
59 insert(i18n(ConfigmenuSet, ConfigmenuFocusNew,
60 "Focus New Windows"), 4);
61 insert(i18n(ConfigmenuSet, ConfigmenuFocusLast,
62 "Focus Last Window on Workspace"), 5);
63 insert(i18n(ConfigmenuSet, ConfigmenuWindowToWindowSnap,
64 "Window-To-Window Snapping"), 6);
65 insert(i18n(ConfigmenuSet, ConfigmenuWindowCornerSnap,
66 "Window Corner Snapping"), 7);
67 insert(i18n(ConfigmenuSet, ConfigmenuWorkspaceWarping,
68 "Workspace Warping"), 8);
69 insert(i18n(ConfigmenuSet, ConfigmenuDisableBindings,
70 "Disable Mouse with Scroll Lock"), 9);
71 insert(i18n(ConfigmenuSet, ConfigmenuHideToolbar,
78 void Configmenu::setValues(void) {
83 setItemSelected(index++, getScreen()->doImageDither());
84 setItemSelected(index++, getScreen()->doOpaqueMove());
85 setItemSelected(index++, getScreen()->doFullMax());
86 setItemSelected(index++, getScreen()->doFocusNew());
87 setItemSelected(index++, getScreen()->doFocusLast());
88 setItemSelected(index++, getScreen()->getWindowToWindowSnap());
90 setItemSelected(index, getScreen()->getWindowCornerSnap());
91 setItemEnabled(index++, getScreen()->getWindowToWindowSnap());
93 setItemSelected(index++, getScreen()->doWorkspaceWarping());
94 setItemSelected(index++, getScreen()->allowScrollLock());
95 setItemSelected(index++, getScreen()->doHideToolbar());
99 Configmenu::~Configmenu(void) {
101 delete placementmenu;
108 void Configmenu::itemSelected(int button, unsigned int index) {
112 BasemenuItem *item = find(index);
114 if (! item->function())
117 switch(item->function()) {
119 getScreen()->saveImageDither(! getScreen()->doImageDither());
120 setItemSelected(index, getScreen()->doImageDither());
123 case 2: // opaque move
124 getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove());
125 setItemSelected(index, getScreen()->doOpaqueMove());
128 case 3: // full maximization
129 getScreen()->saveFullMax(! getScreen()->doFullMax());
130 setItemSelected(index, getScreen()->doFullMax());
133 case 4: // focus new windows
134 getScreen()->saveFocusNew(! getScreen()->doFocusNew());
135 setItemSelected(index, getScreen()->doFocusNew());
138 case 5: // focus last window on workspace
139 getScreen()->saveFocusLast(! getScreen()->doFocusLast());
140 setItemSelected(index, getScreen()->doFocusLast());
143 case 6: // window-to-window snapping
144 getScreen()->saveWindowToWindowSnap(! getScreen()->getWindowToWindowSnap());
145 setItemSelected(index, getScreen()->getWindowToWindowSnap());
146 setItemEnabled(index + 1, getScreen()->getWindowToWindowSnap());
149 case 7: // window corner snapping
150 getScreen()->saveWindowCornerSnap(! getScreen()->getWindowCornerSnap());
151 setItemSelected(index, getScreen()->getWindowCornerSnap());
154 case 8: // workspace wrapping
155 getScreen()->saveWorkspaceWarping(! getScreen()->doWorkspaceWarping());
156 setItemSelected(index, getScreen()->doWorkspaceWarping());
159 case 9: // disable mouse bindings with Scroll Lock
160 getScreen()->saveAllowScrollLock(! getScreen()->allowScrollLock());
161 setItemSelected(index, getScreen()->allowScrollLock());
162 getScreen()->reconfigure();
165 case 10: // hide toolbar
166 getScreen()->saveHideToolbar(! getScreen()->doHideToolbar());
167 setItemSelected(index, getScreen()->doHideToolbar());
173 void Configmenu::reconfigure(void) {
175 focusmenu->reconfigure();
176 placementmenu->reconfigure();
178 xineramamenu->reconfigure();
181 Basemenu::reconfigure();
185 Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) {
186 setLabel(i18n(ConfigmenuSet, ConfigmenuFocusModel, "Focus Model"));
189 insert(i18n(ConfigmenuSet, ConfigmenuClickToFocus, "Click To Focus"), 1);
190 insert(i18n(ConfigmenuSet, ConfigmenuSloppyFocus, "Sloppy Focus"), 2);
191 insert(i18n(ConfigmenuSet, ConfigmenuAutoRaise, "Auto Raise"), 3);
192 insert(i18n(ConfigmenuSet, ConfigmenuClickRaise, "Click Raise"), 4);
198 void Configmenu::Focusmenu::setValues(void) {
199 setItemSelected(0, ! getScreen()->isSloppyFocus());
200 setItemSelected(1, getScreen()->isSloppyFocus());
201 setItemEnabled(2, getScreen()->isSloppyFocus());
202 setItemSelected(2, getScreen()->doAutoRaise());
203 setItemEnabled(3, getScreen()->isSloppyFocus());
204 setItemSelected(3, getScreen()->doClickRaise());
208 void Configmenu::Focusmenu::reconfigure(void) {
210 Basemenu::reconfigure();
214 void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
218 BasemenuItem *item = find(index);
220 if (! item->function())
223 switch (item->function()) {
224 case 1: // click to focus
225 getScreen()->toggleFocusModel(BScreen::ClickToFocus);
228 case 2: // sloppy focus
229 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
232 case 3: // auto raise with sloppy focus
233 getScreen()->saveAutoRaise(! getScreen()->doAutoRaise());
236 case 4: // click raise with sloppy focus
237 getScreen()->saveClickRaise(! getScreen()->doClickRaise());
238 // make sure the appropriate mouse buttons are grabbed on the windows
239 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
246 Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
247 Basemenu(cm->getScreen()) {
248 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement"));
251 insert(i18n(ConfigmenuSet, ConfigmenuSmartRows, "Smart Placement (Rows)"),
252 BScreen::RowSmartPlacement);
253 insert(i18n(ConfigmenuSet, ConfigmenuSmartCols, "Smart Placement (Columns)"),
254 BScreen::ColSmartPlacement);
255 insert(i18n(ConfigmenuSet, ConfigmenuCascade, "Cascade Placement"),
256 BScreen::CascadePlacement);
257 insert(i18n(ConfigmenuSet, ConfigmenuUnderMouse, "Under Mouse Placement"),
258 BScreen::UnderMousePlacement);
259 insert(i18n(ConfigmenuSet, ConfigmenuClickMouse, "Click Mouse Placement"),
260 BScreen::ClickMousePlacement);
261 insert(i18n(ConfigmenuSet, ConfigmenuLeftRight, "Left to Right"),
263 insert(i18n(ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"),
265 insert(i18n(ConfigmenuSet, ConfigmenuTopBottom, "Top to Bottom"),
267 insert(i18n(ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"),
269 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreShaded, "Ignore Shaded Windows"),
270 BScreen::IgnoreShaded);
271 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreMax,
272 "Ignore Full-Maximized Windows"),
273 BScreen::IgnoreMaximized);
279 void Configmenu::Placementmenu::setValues(void) {
280 int placement = getScreen()->getPlacementPolicy();
282 setItemSelected(0, placement == BScreen::RowSmartPlacement);
283 setItemSelected(1, placement == BScreen::ColSmartPlacement);
284 setItemSelected(2, placement == BScreen::CascadePlacement);
285 setItemSelected(3, placement == BScreen::UnderMousePlacement);
286 setItemSelected(4, placement == BScreen::ClickMousePlacement);
288 bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight),
289 tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom),
290 e = placement != BScreen::UnderMousePlacement;
292 setItemSelected(5, rl);
293 setItemSelected(6, ! rl);
294 setItemEnabled(5, e);
295 setItemEnabled(6, e);
297 setItemSelected(7, tb);
298 setItemSelected(8, ! tb);
299 setItemEnabled(7, e);
300 setItemEnabled(8, e);
302 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
303 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
307 void Configmenu::Placementmenu::reconfigure(void) {
309 Basemenu::reconfigure();
313 void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) {
317 BasemenuItem *item = find(index);
319 if (! item->function())
322 switch (item->function()) {
323 case BScreen::RowSmartPlacement:
324 getScreen()->savePlacementPolicy(item->function());
326 setItemSelected(0, true);
327 setItemSelected(1, false);
328 setItemSelected(2, false);
329 setItemSelected(3, false);
330 setItemSelected(4, false);
331 setItemEnabled(5, true);
332 setItemEnabled(6, true);
333 setItemEnabled(7, true);
334 setItemEnabled(8, true);
338 case BScreen::ColSmartPlacement:
339 getScreen()->savePlacementPolicy(item->function());
341 setItemSelected(0, false);
342 setItemSelected(1, true);
343 setItemSelected(2, false);
344 setItemSelected(3, false);
345 setItemSelected(4, false);
346 setItemEnabled(5, true);
347 setItemEnabled(6, true);
348 setItemEnabled(7, true);
349 setItemEnabled(8, true);
353 case BScreen::CascadePlacement:
354 getScreen()->savePlacementPolicy(item->function());
356 setItemSelected(0, false);
357 setItemSelected(1, false);
358 setItemSelected(2, true);
359 setItemSelected(3, false);
360 setItemSelected(4, false);
361 setItemEnabled(5, true);
362 setItemEnabled(6, true);
363 setItemEnabled(7, true);
364 setItemEnabled(8, true);
368 case BScreen::UnderMousePlacement:
369 getScreen()->savePlacementPolicy(item->function());
371 setItemSelected(0, false);
372 setItemSelected(1, false);
373 setItemSelected(2, false);
374 setItemSelected(3, true);
375 setItemSelected(4, false);
376 setItemEnabled(5, false);
377 setItemEnabled(6, false);
378 setItemEnabled(7, false);
379 setItemEnabled(8, false);
383 case BScreen::ClickMousePlacement:
384 getScreen()->savePlacementPolicy(item->function());
386 setItemSelected(0, false);
387 setItemSelected(1, false);
388 setItemSelected(2, false);
389 setItemSelected(3, false);
390 setItemSelected(4, true);
391 setItemEnabled(5, false);
392 setItemEnabled(6, false);
393 setItemEnabled(7, false);
394 setItemEnabled(8, false);
398 case BScreen::LeftRight:
399 getScreen()->saveRowPlacementDirection(BScreen::LeftRight);
401 setItemSelected(5, true);
402 setItemSelected(6, false);
406 case BScreen::RightLeft:
407 getScreen()->saveRowPlacementDirection(BScreen::RightLeft);
409 setItemSelected(5, false);
410 setItemSelected(6, true);
414 case BScreen::TopBottom:
415 getScreen()->saveColPlacementDirection(BScreen::TopBottom);
417 setItemSelected(7, true);
418 setItemSelected(8, false);
422 case BScreen::BottomTop:
423 getScreen()->saveColPlacementDirection(BScreen::BottomTop);
425 setItemSelected(7, false);
426 setItemSelected(8, true);
430 case BScreen::IgnoreShaded:
431 getScreen()->savePlaceIgnoreShaded(! getScreen()->getPlaceIgnoreShaded());
433 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
437 case BScreen::IgnoreMaximized:
439 savePlaceIgnoreMaximized(! getScreen()->getPlaceIgnoreMaximized());
441 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
449 Configmenu::Xineramamenu::Xineramamenu(Configmenu *cm):
450 Basemenu(cm->getScreen()) {
451 setLabel(i18n(ConfigmenuSet, ConfigmenuXineramaSupport, "Xinerama Support"));
454 insert(i18n(ConfigmenuSet, ConfigmenuXineramaPlacement, "Window Placement"),
456 insert(i18n(ConfigmenuSet, ConfigmenuXineramaMaximizing, "Window Maximizing"),
458 insert(i18n(ConfigmenuSet, ConfigmenuXineramaSnapping, "Window Snapping"),
466 void Configmenu::Xineramamenu::setValues(void) {
467 setItemSelected(0, getScreen()->getBlackbox()->doXineramaPlacement());
468 setItemSelected(1, getScreen()->getBlackbox()->doXineramaMaximizing());
469 setItemSelected(2, getScreen()->getBlackbox()->doXineramaSnapping());
473 void Configmenu::Xineramamenu::reconfigure(void) {
475 Basemenu::reconfigure();
479 void Configmenu::Xineramamenu::itemSelected(int button, unsigned int index) {
483 BasemenuItem *item = find(index);
485 if (! item->function())
488 Blackbox *bb = getScreen()->getBlackbox();
490 switch (item->function()) {
491 case 1: // window placement
492 bb->saveXineramaPlacement(! bb->doXineramaPlacement());
493 setItemSelected(0, bb->doXineramaPlacement());
496 case 2: // window maximizing
497 bb->saveXineramaMaximizing(! bb->doXineramaMaximizing());
498 setItemSelected(1, bb->doXineramaMaximizing());
501 case 3: // window snapping
502 bb->saveXineramaSnapping(! bb->doXineramaSnapping());
503 setItemSelected(2, bb->doXineramaSnapping());