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);
41 windowsnapmenu = new WindowToWindowSnapmenu(this);
42 edgesnapmenu = new WindowToEdgeSnapmenu(this);
44 xineramamenu = new Xineramamenu(this);
47 insert(i18n(ConfigmenuSet, ConfigmenuFocusModel,
48 "Focus Model"), focusmenu);
49 insert(i18n(ConfigmenuSet, ConfigmenuWindowPlacement,
50 "Window Placement"), placementmenu);
51 insert(i18n(ConfigmenuSet, ConfigmenuWindowToWindowSnap,
52 "Window-To-Window Snapping"), windowsnapmenu);
53 insert(i18n(ConfigmenuSet, ConfigmenuWindowToEdgeSnap,
54 "Window-To-Edge Snapping"), edgesnapmenu);
55 insert(i18n(ConfigmenuSet, ConfigmenuWindowPlacement,
56 "Window Placement"), placementmenu);
58 insert(i18n(ConfigmenuSet, ConfigmenuXineramaSupport,
59 "XineramaSupport"), xineramamenu);
61 insert(i18n(ConfigmenuSet, ConfigmenuImageDithering,
62 "Image Dithering"), 1);
63 insert(i18n(ConfigmenuSet, ConfigmenuOpaqueMove,
64 "Opaque Window Moving"), 2);
65 insert(i18n(ConfigmenuSet, ConfigmenuWorkspaceWarping,
66 "Workspace Warping"), 3);
67 insert(i18n(ConfigmenuSet, ConfigmenuFullMax,
68 "Full Maximization"), 4);
69 insert(i18n(ConfigmenuSet, ConfigmenuFocusNew,
70 "Focus New Windows"), 5);
71 insert(i18n(ConfigmenuSet, ConfigmenuFocusLast,
72 "Focus Last Window on Workspace"), 6);
73 insert(i18n(ConfigmenuSet, ConfigmenuDisableBindings,
74 "Disable Mouse with Scroll Lock"), 7);
75 insert(i18n(ConfigmenuSet, ConfigmenuHideToolbar,
82 void Configmenu::setValues(void) {
87 setItemSelected(index++, getScreen()->doImageDither());
88 setItemSelected(index++, getScreen()->doOpaqueMove());
89 setItemSelected(index++, getScreen()->doWorkspaceWarping());
90 setItemSelected(index++, getScreen()->doFullMax());
91 setItemSelected(index++, getScreen()->doFocusNew());
92 setItemSelected(index++, getScreen()->doFocusLast());
93 setItemSelected(index++, getScreen()->allowScrollLock());
94 setItemSelected(index++, getScreen()->doHideToolbar());
98 Configmenu::~Configmenu(void) {
100 delete placementmenu;
101 delete windowsnapmenu;
109 void Configmenu::itemSelected(int button, unsigned int index) {
113 BasemenuItem *item = find(index);
115 if (! item->function())
118 switch(item->function()) {
120 getScreen()->saveImageDither(! getScreen()->doImageDither());
121 setItemSelected(index, getScreen()->doImageDither());
124 case 2: // opaque move
125 getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove());
126 setItemSelected(index, getScreen()->doOpaqueMove());
129 case 3: // workspace wrapping
130 getScreen()->saveWorkspaceWarping(! getScreen()->doWorkspaceWarping());
131 setItemSelected(index, getScreen()->doWorkspaceWarping());
134 case 4: // full maximization
135 getScreen()->saveFullMax(! getScreen()->doFullMax());
136 setItemSelected(index, getScreen()->doFullMax());
139 case 5: // focus new windows
140 getScreen()->saveFocusNew(! getScreen()->doFocusNew());
141 setItemSelected(index, getScreen()->doFocusNew());
144 case 6: // focus last window on workspace
145 getScreen()->saveFocusLast(! getScreen()->doFocusLast());
146 setItemSelected(index, getScreen()->doFocusLast());
149 case 7: // disable mouse bindings with Scroll Lock
150 getScreen()->saveAllowScrollLock(! getScreen()->allowScrollLock());
151 setItemSelected(index, getScreen()->allowScrollLock());
152 getScreen()->reconfigure();
155 case 8: // hide toolbar
156 getScreen()->saveHideToolbar(! getScreen()->doHideToolbar());
157 setItemSelected(index, getScreen()->doHideToolbar());
163 void Configmenu::reconfigure(void) {
165 focusmenu->reconfigure();
166 placementmenu->reconfigure();
167 windowsnapmenu->reconfigure();
168 edgesnapmenu->reconfigure();
170 xineramamenu->reconfigure();
173 Basemenu::reconfigure();
177 Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) {
178 setLabel(i18n(ConfigmenuSet, ConfigmenuFocusModel, "Focus Model"));
181 insert(i18n(ConfigmenuSet, ConfigmenuClickToFocus, "Click To Focus"), 1);
182 insert(i18n(ConfigmenuSet, ConfigmenuSloppyFocus, "Sloppy Focus"), 2);
183 insert(i18n(ConfigmenuSet, ConfigmenuAutoRaise, "Auto Raise"), 3);
184 insert(i18n(ConfigmenuSet, ConfigmenuClickRaise, "Click Raise"), 4);
190 void Configmenu::Focusmenu::setValues(void) {
191 setItemSelected(0, ! getScreen()->isSloppyFocus());
192 setItemSelected(1, getScreen()->isSloppyFocus());
193 setItemEnabled(2, getScreen()->isSloppyFocus());
194 setItemSelected(2, getScreen()->doAutoRaise());
195 setItemEnabled(3, getScreen()->isSloppyFocus());
196 setItemSelected(3, getScreen()->doClickRaise());
200 void Configmenu::Focusmenu::reconfigure(void) {
202 Basemenu::reconfigure();
206 void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
210 BasemenuItem *item = find(index);
212 if (! item->function())
215 switch (item->function()) {
216 case 1: // click to focus
217 getScreen()->toggleFocusModel(BScreen::ClickToFocus);
220 case 2: // sloppy focus
221 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
224 case 3: // auto raise with sloppy focus
225 getScreen()->saveAutoRaise(! getScreen()->doAutoRaise());
228 case 4: // click raise with sloppy focus
229 getScreen()->saveClickRaise(! getScreen()->doClickRaise());
230 // make sure the appropriate mouse buttons are grabbed on the windows
231 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
238 Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
239 Basemenu(cm->getScreen()) {
240 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement"));
243 insert(i18n(ConfigmenuSet, ConfigmenuSmartRows, "Smart Placement (Rows)"),
244 BScreen::RowSmartPlacement);
245 insert(i18n(ConfigmenuSet, ConfigmenuSmartCols, "Smart Placement (Columns)"),
246 BScreen::ColSmartPlacement);
247 insert(i18n(ConfigmenuSet, ConfigmenuCascade, "Cascade Placement"),
248 BScreen::CascadePlacement);
249 insert(i18n(ConfigmenuSet, ConfigmenuUnderMouse, "Under Mouse Placement"),
250 BScreen::UnderMousePlacement);
251 insert(i18n(ConfigmenuSet, ConfigmenuClickMouse, "Click Mouse Placement"),
252 BScreen::ClickMousePlacement);
253 insert(i18n(ConfigmenuSet, ConfigmenuLeftRight, "Left to Right"),
255 insert(i18n(ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"),
257 insert(i18n(ConfigmenuSet, ConfigmenuTopBottom, "Top to Bottom"),
259 insert(i18n(ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"),
261 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreShaded, "Ignore Shaded Windows"),
262 BScreen::IgnoreShaded);
263 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreMax,
264 "Ignore Full-Maximized Windows"),
265 BScreen::IgnoreMaximized);
271 void Configmenu::Placementmenu::setValues(void) {
272 int placement = getScreen()->getPlacementPolicy();
274 setItemSelected(0, placement == BScreen::RowSmartPlacement);
275 setItemSelected(1, placement == BScreen::ColSmartPlacement);
276 setItemSelected(2, placement == BScreen::CascadePlacement);
277 setItemSelected(3, placement == BScreen::UnderMousePlacement);
278 setItemSelected(4, placement == BScreen::ClickMousePlacement);
280 bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight),
281 tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom),
282 e = placement != BScreen::UnderMousePlacement;
284 setItemSelected(5, rl);
285 setItemSelected(6, ! rl);
286 setItemEnabled(5, e);
287 setItemEnabled(6, e);
289 setItemSelected(7, tb);
290 setItemSelected(8, ! tb);
291 setItemEnabled(7, e);
292 setItemEnabled(8, e);
294 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
295 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
299 void Configmenu::Placementmenu::reconfigure(void) {
301 Basemenu::reconfigure();
305 void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) {
309 BasemenuItem *item = find(index);
311 if (! item->function())
314 switch (item->function()) {
315 case BScreen::RowSmartPlacement:
316 getScreen()->savePlacementPolicy(item->function());
318 setItemSelected(0, true);
319 setItemSelected(1, false);
320 setItemSelected(2, false);
321 setItemSelected(3, false);
322 setItemSelected(4, false);
323 setItemEnabled(5, true);
324 setItemEnabled(6, true);
325 setItemEnabled(7, true);
326 setItemEnabled(8, true);
330 case BScreen::ColSmartPlacement:
331 getScreen()->savePlacementPolicy(item->function());
333 setItemSelected(0, false);
334 setItemSelected(1, true);
335 setItemSelected(2, false);
336 setItemSelected(3, false);
337 setItemSelected(4, false);
338 setItemEnabled(5, true);
339 setItemEnabled(6, true);
340 setItemEnabled(7, true);
341 setItemEnabled(8, true);
345 case BScreen::CascadePlacement:
346 getScreen()->savePlacementPolicy(item->function());
348 setItemSelected(0, false);
349 setItemSelected(1, false);
350 setItemSelected(2, true);
351 setItemSelected(3, false);
352 setItemSelected(4, false);
353 setItemEnabled(5, true);
354 setItemEnabled(6, true);
355 setItemEnabled(7, true);
356 setItemEnabled(8, true);
360 case BScreen::UnderMousePlacement:
361 getScreen()->savePlacementPolicy(item->function());
363 setItemSelected(0, false);
364 setItemSelected(1, false);
365 setItemSelected(2, false);
366 setItemSelected(3, true);
367 setItemSelected(4, false);
368 setItemEnabled(5, false);
369 setItemEnabled(6, false);
370 setItemEnabled(7, false);
371 setItemEnabled(8, false);
375 case BScreen::ClickMousePlacement:
376 getScreen()->savePlacementPolicy(item->function());
378 setItemSelected(0, false);
379 setItemSelected(1, false);
380 setItemSelected(2, false);
381 setItemSelected(3, false);
382 setItemSelected(4, true);
383 setItemEnabled(5, false);
384 setItemEnabled(6, false);
385 setItemEnabled(7, false);
386 setItemEnabled(8, false);
390 case BScreen::LeftRight:
391 getScreen()->saveRowPlacementDirection(BScreen::LeftRight);
393 setItemSelected(5, true);
394 setItemSelected(6, false);
398 case BScreen::RightLeft:
399 getScreen()->saveRowPlacementDirection(BScreen::RightLeft);
401 setItemSelected(5, false);
402 setItemSelected(6, true);
406 case BScreen::TopBottom:
407 getScreen()->saveColPlacementDirection(BScreen::TopBottom);
409 setItemSelected(7, true);
410 setItemSelected(8, false);
414 case BScreen::BottomTop:
415 getScreen()->saveColPlacementDirection(BScreen::BottomTop);
417 setItemSelected(7, false);
418 setItemSelected(8, true);
422 case BScreen::IgnoreShaded:
423 getScreen()->savePlaceIgnoreShaded(! getScreen()->getPlaceIgnoreShaded());
425 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
429 case BScreen::IgnoreMaximized:
431 savePlaceIgnoreMaximized(! getScreen()->getPlaceIgnoreMaximized());
433 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
440 Configmenu::WindowToWindowSnapmenu::WindowToWindowSnapmenu(Configmenu *cm) :
441 Basemenu(cm->getScreen()) {
442 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowToWindowSnap,
443 "Window-To-Window Snapping"));
446 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnapNo, "No Snapping"), 1);
447 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnap, "Edge Snapping"), 2);
448 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoResistance,
449 "Edge Resistance"), 3);
450 insert(i18n(ConfigmenuSet, ConfigmenuWindowCornerSnap,
451 "Window Corner Snapping"), 4);
457 void Configmenu::WindowToWindowSnapmenu::setValues(void) {
458 setItemSelected(0, (getScreen()->getWindowToWindowSnap() ==
459 BScreen::WindowNoSnap));
460 setItemSelected(1, (getScreen()->getWindowToWindowSnap() ==
461 BScreen::WindowSnap));
462 setItemSelected(2, (getScreen()->getWindowToWindowSnap() ==
463 BScreen::WindowResistance));
465 setItemEnabled(3, (getScreen()->getWindowToWindowSnap() ==
466 BScreen::WindowSnap));
467 setItemSelected(3, getScreen()->getWindowCornerSnap());
471 void Configmenu::WindowToWindowSnapmenu::reconfigure(void) {
473 Basemenu::reconfigure();
477 void Configmenu::WindowToWindowSnapmenu::itemSelected(int button, unsigned int index) {
481 BasemenuItem *item = find(index);
483 if (! item->function())
486 switch (item->function()) {
488 getScreen()->saveWindowToWindowSnap(BScreen::WindowNoSnap);
491 case 2: // edge snapping
492 getScreen()->saveWindowToWindowSnap(BScreen::WindowSnap);
495 case 3: // edge resistance
496 getScreen()->saveWindowToWindowSnap(BScreen::WindowResistance);
499 case 4: // window corner snapping
500 getScreen()->saveWindowCornerSnap(! getScreen()->getWindowCornerSnap());
508 Configmenu::WindowToEdgeSnapmenu::WindowToEdgeSnapmenu(Configmenu *cm) :
509 Basemenu(cm->getScreen()) {
510 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowToEdgeSnap,
511 "Window-To-Edge Snapping"));
514 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnapNo, "No Snapping"), 1);
515 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnap, "Edge Snapping"), 2);
516 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoResistance,
517 "Edge Resistance"), 3);
523 void Configmenu::WindowToEdgeSnapmenu::setValues(void) {
524 setItemSelected(0, (getScreen()->getWindowToEdgeSnap() ==
525 BScreen::WindowNoSnap));
526 setItemSelected(1, (getScreen()->getWindowToEdgeSnap() ==
527 BScreen::WindowSnap));
528 setItemSelected(2, (getScreen()->getWindowToEdgeSnap() ==
529 BScreen::WindowResistance));
533 void Configmenu::WindowToEdgeSnapmenu::reconfigure(void) {
535 Basemenu::reconfigure();
539 void Configmenu::WindowToEdgeSnapmenu::itemSelected(int button, unsigned int index) {
543 BasemenuItem *item = find(index);
545 if (! item->function())
548 switch (item->function()) {
550 getScreen()->saveWindowToEdgeSnap(BScreen::WindowNoSnap);
553 case 2: // edge snapping
554 getScreen()->saveWindowToEdgeSnap(BScreen::WindowSnap);
557 case 3: // edge resistance
558 getScreen()->saveWindowToEdgeSnap(BScreen::WindowResistance);
566 Configmenu::Xineramamenu::Xineramamenu(Configmenu *cm):
567 Basemenu(cm->getScreen()) {
568 setLabel(i18n(ConfigmenuSet, ConfigmenuXineramaSupport, "Xinerama Support"));
571 insert(i18n(ConfigmenuSet, ConfigmenuXineramaPlacement, "Window Placement"),
573 insert(i18n(ConfigmenuSet, ConfigmenuXineramaMaximizing, "Window Maximizing"),
575 insert(i18n(ConfigmenuSet, ConfigmenuXineramaSnapping, "Window Snapping"),
583 void Configmenu::Xineramamenu::setValues(void) {
584 setItemSelected(0, getScreen()->getBlackbox()->doXineramaPlacement());
585 setItemSelected(1, getScreen()->getBlackbox()->doXineramaMaximizing());
586 setItemSelected(2, getScreen()->getBlackbox()->doXineramaSnapping());
590 void Configmenu::Xineramamenu::reconfigure(void) {
592 Basemenu::reconfigure();
596 void Configmenu::Xineramamenu::itemSelected(int button, unsigned int index) {
600 BasemenuItem *item = find(index);
602 if (! item->function())
605 Blackbox *bb = getScreen()->getBlackbox();
607 switch (item->function()) {
608 case 1: // window placement
609 bb->saveXineramaPlacement(! bb->doXineramaPlacement());
610 setItemSelected(0, bb->doXineramaPlacement());
613 case 2: // window maximizing
614 bb->saveXineramaMaximizing(! bb->doXineramaMaximizing());
615 setItemSelected(1, bb->doXineramaMaximizing());
618 case 3: // window snapping
619 bb->saveXineramaSnapping(! bb->doXineramaSnapping());
620 setItemSelected(2, bb->doXineramaSnapping());