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);
56 insert(i18n(ConfigmenuSet, ConfigmenuXineramaSupport,
57 "XineramaSupport"), xineramamenu);
59 insert(i18n(ConfigmenuSet, ConfigmenuImageDithering,
60 "Image Dithering"), 1);
61 insert(i18n(ConfigmenuSet, ConfigmenuOpaqueMove,
62 "Opaque Window Moving"), 2);
63 insert(i18n(ConfigmenuSet, ConfigmenuWorkspaceWarping,
64 "Workspace Warping"), 3);
65 insert(i18n(ConfigmenuSet, ConfigmenuFullMax,
66 "Full Maximization"), 4);
67 insert(i18n(ConfigmenuSet, ConfigmenuFocusNew,
68 "Focus New Windows"), 5);
69 insert(i18n(ConfigmenuSet, ConfigmenuFocusLast,
70 "Focus Last Window on Workspace"), 6);
71 insert(i18n(ConfigmenuSet, ConfigmenuDisableBindings,
72 "Disable Mouse with Scroll Lock"), 7);
73 insert(i18n(ConfigmenuSet, ConfigmenuHideToolbar,
80 void Configmenu::setValues(void) {
85 setItemSelected(index++, getScreen()->doImageDither());
86 setItemSelected(index++, getScreen()->doOpaqueMove());
87 setItemSelected(index++, getScreen()->doWorkspaceWarping());
88 setItemSelected(index++, getScreen()->doFullMax());
89 setItemSelected(index++, getScreen()->doFocusNew());
90 setItemSelected(index++, getScreen()->doFocusLast());
91 setItemSelected(index++, getScreen()->allowScrollLock());
92 setItemSelected(index++, getScreen()->doHideToolbar());
96 Configmenu::~Configmenu(void) {
99 delete windowsnapmenu;
107 void Configmenu::itemSelected(int button, unsigned int index) {
111 BasemenuItem *item = find(index);
113 if (! item->function())
116 switch(item->function()) {
118 getScreen()->saveImageDither(! getScreen()->doImageDither());
119 setItemSelected(index, getScreen()->doImageDither());
122 case 2: // opaque move
123 getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove());
124 setItemSelected(index, getScreen()->doOpaqueMove());
127 case 3: // workspace wrapping
128 getScreen()->saveWorkspaceWarping(! getScreen()->doWorkspaceWarping());
129 setItemSelected(index, getScreen()->doWorkspaceWarping());
132 case 4: // full maximization
133 getScreen()->saveFullMax(! getScreen()->doFullMax());
134 setItemSelected(index, getScreen()->doFullMax());
137 case 5: // focus new windows
138 getScreen()->saveFocusNew(! getScreen()->doFocusNew());
139 setItemSelected(index, getScreen()->doFocusNew());
142 case 6: // focus last window on workspace
143 getScreen()->saveFocusLast(! getScreen()->doFocusLast());
144 setItemSelected(index, getScreen()->doFocusLast());
147 case 7: // disable mouse bindings with Scroll Lock
148 getScreen()->saveAllowScrollLock(! getScreen()->allowScrollLock());
149 setItemSelected(index, getScreen()->allowScrollLock());
150 getScreen()->reconfigure();
153 case 8: // hide toolbar
154 getScreen()->saveHideToolbar(! getScreen()->doHideToolbar());
155 setItemSelected(index, getScreen()->doHideToolbar());
161 void Configmenu::reconfigure(void) {
163 focusmenu->reconfigure();
164 placementmenu->reconfigure();
165 windowsnapmenu->reconfigure();
166 edgesnapmenu->reconfigure();
168 xineramamenu->reconfigure();
171 Basemenu::reconfigure();
175 Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) {
176 setLabel(i18n(ConfigmenuSet, ConfigmenuFocusModel, "Focus Model"));
179 insert(i18n(ConfigmenuSet, ConfigmenuClickToFocus, "Click To Focus"), 1);
180 insert(i18n(ConfigmenuSet, ConfigmenuSloppyFocus, "Sloppy Focus"), 2);
181 insert(i18n(ConfigmenuSet, ConfigmenuAutoRaise, "Auto Raise"), 3);
182 insert(i18n(ConfigmenuSet, ConfigmenuClickRaise, "Click Raise"), 4);
188 void Configmenu::Focusmenu::setValues(void) {
189 setItemSelected(0, ! getScreen()->isSloppyFocus());
190 setItemSelected(1, getScreen()->isSloppyFocus());
191 setItemEnabled(2, getScreen()->isSloppyFocus());
192 setItemSelected(2, getScreen()->doAutoRaise());
193 setItemEnabled(3, getScreen()->isSloppyFocus());
194 setItemSelected(3, getScreen()->doClickRaise());
198 void Configmenu::Focusmenu::reconfigure(void) {
200 Basemenu::reconfigure();
204 void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
208 BasemenuItem *item = find(index);
210 if (! item->function())
213 switch (item->function()) {
214 case 1: // click to focus
215 getScreen()->toggleFocusModel(BScreen::ClickToFocus);
218 case 2: // sloppy focus
219 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
222 case 3: // auto raise with sloppy focus
223 getScreen()->saveAutoRaise(! getScreen()->doAutoRaise());
226 case 4: // click raise with sloppy focus
227 getScreen()->saveClickRaise(! getScreen()->doClickRaise());
228 // make sure the appropriate mouse buttons are grabbed on the windows
229 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
236 Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
237 Basemenu(cm->getScreen()) {
238 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement"));
241 insert(i18n(ConfigmenuSet, ConfigmenuSmartRows, "Smart Placement (Rows)"),
242 BScreen::RowSmartPlacement);
243 insert(i18n(ConfigmenuSet, ConfigmenuSmartCols, "Smart Placement (Columns)"),
244 BScreen::ColSmartPlacement);
245 insert(i18n(ConfigmenuSet, ConfigmenuCascade, "Cascade Placement"),
246 BScreen::CascadePlacement);
247 insert(i18n(ConfigmenuSet, ConfigmenuUnderMouse, "Under Mouse Placement"),
248 BScreen::UnderMousePlacement);
249 insert(i18n(ConfigmenuSet, ConfigmenuClickMouse, "Click Mouse Placement"),
250 BScreen::ClickMousePlacement);
251 insert(i18n(ConfigmenuSet, ConfigmenuLeftRight, "Left to Right"),
253 insert(i18n(ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"),
255 insert(i18n(ConfigmenuSet, ConfigmenuTopBottom, "Top to Bottom"),
257 insert(i18n(ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"),
259 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreShaded, "Ignore Shaded Windows"),
260 BScreen::IgnoreShaded);
261 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreMax,
262 "Ignore Full-Maximized Windows"),
263 BScreen::IgnoreMaximized);
269 void Configmenu::Placementmenu::setValues(void) {
270 int placement = getScreen()->getPlacementPolicy();
272 setItemSelected(0, placement == BScreen::RowSmartPlacement);
273 setItemSelected(1, placement == BScreen::ColSmartPlacement);
274 setItemSelected(2, placement == BScreen::CascadePlacement);
275 setItemSelected(3, placement == BScreen::UnderMousePlacement);
276 setItemSelected(4, placement == BScreen::ClickMousePlacement);
278 bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight),
279 tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom),
280 e = placement != BScreen::UnderMousePlacement;
282 setItemSelected(5, rl);
283 setItemSelected(6, ! rl);
284 setItemEnabled(5, e);
285 setItemEnabled(6, e);
287 setItemSelected(7, tb);
288 setItemSelected(8, ! tb);
289 setItemEnabled(7, e);
290 setItemEnabled(8, e);
292 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
293 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
297 void Configmenu::Placementmenu::reconfigure(void) {
299 Basemenu::reconfigure();
303 void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) {
307 BasemenuItem *item = find(index);
309 if (! item->function())
312 switch (item->function()) {
313 case BScreen::RowSmartPlacement:
314 getScreen()->savePlacementPolicy(item->function());
316 setItemSelected(0, true);
317 setItemSelected(1, false);
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::ColSmartPlacement:
329 getScreen()->savePlacementPolicy(item->function());
331 setItemSelected(0, false);
332 setItemSelected(1, true);
333 setItemSelected(2, false);
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::CascadePlacement:
344 getScreen()->savePlacementPolicy(item->function());
346 setItemSelected(0, false);
347 setItemSelected(1, false);
348 setItemSelected(2, true);
349 setItemSelected(3, false);
350 setItemSelected(4, false);
351 setItemEnabled(5, true);
352 setItemEnabled(6, true);
353 setItemEnabled(7, true);
354 setItemEnabled(8, true);
358 case BScreen::UnderMousePlacement:
359 getScreen()->savePlacementPolicy(item->function());
361 setItemSelected(0, false);
362 setItemSelected(1, false);
363 setItemSelected(2, false);
364 setItemSelected(3, true);
365 setItemSelected(4, false);
366 setItemEnabled(5, false);
367 setItemEnabled(6, false);
368 setItemEnabled(7, false);
369 setItemEnabled(8, false);
373 case BScreen::ClickMousePlacement:
374 getScreen()->savePlacementPolicy(item->function());
376 setItemSelected(0, false);
377 setItemSelected(1, false);
378 setItemSelected(2, false);
379 setItemSelected(3, false);
380 setItemSelected(4, true);
381 setItemEnabled(5, false);
382 setItemEnabled(6, false);
383 setItemEnabled(7, false);
384 setItemEnabled(8, false);
388 case BScreen::LeftRight:
389 getScreen()->saveRowPlacementDirection(BScreen::LeftRight);
391 setItemSelected(5, true);
392 setItemSelected(6, false);
396 case BScreen::RightLeft:
397 getScreen()->saveRowPlacementDirection(BScreen::RightLeft);
399 setItemSelected(5, false);
400 setItemSelected(6, true);
404 case BScreen::TopBottom:
405 getScreen()->saveColPlacementDirection(BScreen::TopBottom);
407 setItemSelected(7, true);
408 setItemSelected(8, false);
412 case BScreen::BottomTop:
413 getScreen()->saveColPlacementDirection(BScreen::BottomTop);
415 setItemSelected(7, false);
416 setItemSelected(8, true);
420 case BScreen::IgnoreShaded:
421 getScreen()->savePlaceIgnoreShaded(! getScreen()->getPlaceIgnoreShaded());
423 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
427 case BScreen::IgnoreMaximized:
429 savePlaceIgnoreMaximized(! getScreen()->getPlaceIgnoreMaximized());
431 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
438 Configmenu::WindowToWindowSnapmenu::WindowToWindowSnapmenu(Configmenu *cm) :
439 Basemenu(cm->getScreen()) {
440 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowToWindowSnap,
441 "Window-To-Window Snapping"));
444 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnapNo, "No Snapping"), 1);
445 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnap, "Edge Snapping"), 2);
446 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoResistance,
447 "Edge Resistance"), 3);
448 insert(i18n(ConfigmenuSet, ConfigmenuWindowCornerSnap,
449 "Window Corner Snapping"), 4);
455 void Configmenu::WindowToWindowSnapmenu::setValues(void) {
456 setItemSelected(0, (getScreen()->getWindowToWindowSnap() ==
457 BScreen::WindowNoSnap));
458 setItemSelected(1, (getScreen()->getWindowToWindowSnap() ==
459 BScreen::WindowSnap));
460 setItemSelected(2, (getScreen()->getWindowToWindowSnap() ==
461 BScreen::WindowResistance));
463 setItemEnabled(3, getScreen()->getWindowToWindowSnap());
464 setItemSelected(3, getScreen()->getWindowCornerSnap());
468 void Configmenu::WindowToWindowSnapmenu::reconfigure(void) {
470 Basemenu::reconfigure();
474 void Configmenu::WindowToWindowSnapmenu::itemSelected(int button, unsigned int index) {
478 BasemenuItem *item = find(index);
480 if (! item->function())
483 switch (item->function()) {
485 getScreen()->saveWindowToWindowSnap(BScreen::WindowNoSnap);
488 case 2: // edge snapping
489 getScreen()->saveWindowToWindowSnap(BScreen::WindowSnap);
492 case 3: // edge resistance
493 getScreen()->saveWindowToWindowSnap(BScreen::WindowResistance);
496 case 4: // window corner snapping
497 getScreen()->saveWindowCornerSnap(! getScreen()->getWindowCornerSnap());
505 Configmenu::WindowToEdgeSnapmenu::WindowToEdgeSnapmenu(Configmenu *cm) :
506 Basemenu(cm->getScreen()) {
507 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowToEdgeSnap,
508 "Window-To-Edge Snapping"));
511 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnapNo, "No Snapping"), 1);
512 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnap, "Edge Snapping"), 2);
513 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoResistance,
514 "Edge Resistance"), 3);
520 void Configmenu::WindowToEdgeSnapmenu::setValues(void) {
521 setItemSelected(0, (getScreen()->getWindowToEdgeSnap() ==
522 BScreen::WindowNoSnap));
523 setItemSelected(1, (getScreen()->getWindowToEdgeSnap() ==
524 BScreen::WindowSnap));
525 setItemSelected(2, (getScreen()->getWindowToEdgeSnap() ==
526 BScreen::WindowResistance));
530 void Configmenu::WindowToEdgeSnapmenu::reconfigure(void) {
532 Basemenu::reconfigure();
536 void Configmenu::WindowToEdgeSnapmenu::itemSelected(int button, unsigned int index) {
540 BasemenuItem *item = find(index);
542 if (! item->function())
545 switch (item->function()) {
547 getScreen()->saveWindowToEdgeSnap(BScreen::WindowNoSnap);
550 case 2: // edge snapping
551 getScreen()->saveWindowToEdgeSnap(BScreen::WindowSnap);
554 case 3: // edge resistance
555 getScreen()->saveWindowToEdgeSnap(BScreen::WindowResistance);
563 Configmenu::Xineramamenu::Xineramamenu(Configmenu *cm):
564 Basemenu(cm->getScreen()) {
565 setLabel(i18n(ConfigmenuSet, ConfigmenuXineramaSupport, "Xinerama Support"));
568 insert(i18n(ConfigmenuSet, ConfigmenuXineramaPlacement, "Window Placement"),
570 insert(i18n(ConfigmenuSet, ConfigmenuXineramaMaximizing, "Window Maximizing"),
572 insert(i18n(ConfigmenuSet, ConfigmenuXineramaSnapping, "Window Snapping"),
580 void Configmenu::Xineramamenu::setValues(void) {
581 setItemSelected(0, getScreen()->getBlackbox()->doXineramaPlacement());
582 setItemSelected(1, getScreen()->getBlackbox()->doXineramaMaximizing());
583 setItemSelected(2, getScreen()->getBlackbox()->doXineramaSnapping());
587 void Configmenu::Xineramamenu::reconfigure(void) {
589 Basemenu::reconfigure();
593 void Configmenu::Xineramamenu::itemSelected(int button, unsigned int index) {
597 BasemenuItem *item = find(index);
599 if (! item->function())
602 Blackbox *bb = getScreen()->getBlackbox();
604 switch (item->function()) {
605 case 1: // window placement
606 bb->saveXineramaPlacement(! bb->doXineramaPlacement());
607 setItemSelected(0, bb->doXineramaPlacement());
610 case 2: // window maximizing
611 bb->saveXineramaMaximizing(! bb->doXineramaMaximizing());
612 setItemSelected(1, bb->doXineramaMaximizing());
615 case 3: // window snapping
616 bb->saveXineramaSnapping(! bb->doXineramaSnapping());
617 setItemSelected(2, bb->doXineramaSnapping());