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 xftmenu = new Xftmenu(this);
50 insert(i18n(ConfigmenuSet, ConfigmenuFocusModel,
51 "Focus Model"), focusmenu);
52 insert(i18n(ConfigmenuSet, ConfigmenuWindowPlacement,
53 "Window Placement"), placementmenu);
54 insert(i18n(ConfigmenuSet, ConfigmenuWindowToWindowSnap,
55 "Window-To-Window Snapping"), windowsnapmenu);
56 insert(i18n(ConfigmenuSet, ConfigmenuWindowToEdgeSnap,
57 "Window-To-Edge Snapping"), edgesnapmenu);
59 insert(i18n(ConfigmenuSet, ConfigmenuXineramaSupport,
60 "XineramaSupport"), xineramamenu);
63 insert(i18n(ConfigmenuSet, ConfigmenuXftOptions,
64 "Xft Font Options"), xftmenu);
66 insert(i18n(ConfigmenuSet, ConfigmenuImageDithering,
67 "Image Dithering"), 1);
68 insert(i18n(ConfigmenuSet, ConfigmenuOpaqueMove,
69 "Opaque Window Moving"), 2);
70 insert(i18n(ConfigmenuSet, ConfigmenuWorkspaceWarping,
71 "Workspace Warping"), 3);
72 insert(i18n(ConfigmenuSet, ConfigmenuFullMax,
73 "Full Maximization"), 4);
74 insert(i18n(ConfigmenuSet, ConfigmenuFocusNew,
75 "Focus New Windows"), 5);
76 insert(i18n(ConfigmenuSet, ConfigmenuFocusLast,
77 "Focus Last Window on Workspace"), 6);
78 insert(i18n(ConfigmenuSet, ConfigmenuDisableBindings,
79 "Disable Mouse with Scroll Lock"), 7);
80 insert(i18n(ConfigmenuSet, ConfigmenuHideToolbar,
87 void Configmenu::setValues(void) {
95 setItemSelected(index++, getScreen()->doImageDither());
96 setItemSelected(index++, getScreen()->doOpaqueMove());
97 setItemSelected(index++, getScreen()->doWorkspaceWarping());
98 setItemSelected(index++, getScreen()->doFullMax());
99 setItemSelected(index++, getScreen()->doFocusNew());
100 setItemSelected(index++, getScreen()->doFocusLast());
101 setItemSelected(index++, getScreen()->allowScrollLock());
102 setItemSelected(index++, getScreen()->doHideToolbar());
106 Configmenu::~Configmenu(void) {
108 delete placementmenu;
109 delete windowsnapmenu;
120 void Configmenu::itemSelected(int button, unsigned int index) {
124 BasemenuItem *item = find(index);
126 if (! item->function())
129 switch(item->function()) {
131 getScreen()->saveImageDither(! getScreen()->doImageDither());
132 setItemSelected(index, getScreen()->doImageDither());
135 case 2: // opaque move
136 getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove());
137 setItemSelected(index, getScreen()->doOpaqueMove());
140 case 3: // workspace wrapping
141 getScreen()->saveWorkspaceWarping(! getScreen()->doWorkspaceWarping());
142 setItemSelected(index, getScreen()->doWorkspaceWarping());
145 case 4: // full maximization
146 getScreen()->saveFullMax(! getScreen()->doFullMax());
147 setItemSelected(index, getScreen()->doFullMax());
150 case 5: // focus new windows
151 getScreen()->saveFocusNew(! getScreen()->doFocusNew());
152 setItemSelected(index, getScreen()->doFocusNew());
155 case 6: // focus last window on workspace
156 getScreen()->saveFocusLast(! getScreen()->doFocusLast());
157 setItemSelected(index, getScreen()->doFocusLast());
160 case 7: // disable mouse bindings with Scroll Lock
161 getScreen()->saveAllowScrollLock(! getScreen()->allowScrollLock());
162 setItemSelected(index, getScreen()->allowScrollLock());
163 getScreen()->reconfigure();
166 case 8: // hide toolbar
167 getScreen()->saveHideToolbar(! getScreen()->doHideToolbar());
168 setItemSelected(index, getScreen()->doHideToolbar());
174 void Configmenu::reconfigure(void) {
176 focusmenu->reconfigure();
177 placementmenu->reconfigure();
178 windowsnapmenu->reconfigure();
179 edgesnapmenu->reconfigure();
181 xineramamenu->reconfigure();
184 xftmenu->reconfigure();
187 Basemenu::reconfigure();
191 Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) {
192 setLabel(i18n(ConfigmenuSet, ConfigmenuFocusModel, "Focus Model"));
195 insert(i18n(ConfigmenuSet, ConfigmenuClickToFocus, "Click To Focus"), 1);
196 insert(i18n(ConfigmenuSet, ConfigmenuSloppyFocus, "Sloppy Focus"), 2);
197 insert(i18n(ConfigmenuSet, ConfigmenuAutoRaise, "Auto Raise"), 3);
198 insert(i18n(ConfigmenuSet, ConfigmenuClickRaise, "Click Raise"), 4);
204 void Configmenu::Focusmenu::setValues(void) {
205 setItemSelected(0, ! getScreen()->isSloppyFocus());
206 setItemSelected(1, getScreen()->isSloppyFocus());
207 setItemEnabled(2, getScreen()->isSloppyFocus());
208 setItemSelected(2, getScreen()->doAutoRaise());
209 setItemEnabled(3, getScreen()->isSloppyFocus());
210 setItemSelected(3, getScreen()->doClickRaise());
214 void Configmenu::Focusmenu::reconfigure(void) {
216 Basemenu::reconfigure();
220 void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
224 BasemenuItem *item = find(index);
226 if (! item->function())
229 switch (item->function()) {
230 case 1: // click to focus
231 getScreen()->toggleFocusModel(BScreen::ClickToFocus);
234 case 2: // sloppy focus
235 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
238 case 3: // auto raise with sloppy focus
239 getScreen()->saveAutoRaise(! getScreen()->doAutoRaise());
242 case 4: // click raise with sloppy focus
243 getScreen()->saveClickRaise(! getScreen()->doClickRaise());
244 // make sure the appropriate mouse buttons are grabbed on the windows
245 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
252 Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
253 Basemenu(cm->getScreen()) {
254 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement"));
257 insert(i18n(ConfigmenuSet, ConfigmenuSmartRows, "Smart Placement (Rows)"),
258 BScreen::RowSmartPlacement);
259 insert(i18n(ConfigmenuSet, ConfigmenuSmartCols, "Smart Placement (Columns)"),
260 BScreen::ColSmartPlacement);
261 insert(i18n(ConfigmenuSet, ConfigmenuCascade, "Cascade Placement"),
262 BScreen::CascadePlacement);
263 insert(i18n(ConfigmenuSet, ConfigmenuUnderMouse, "Under Mouse Placement"),
264 BScreen::UnderMousePlacement);
265 insert(i18n(ConfigmenuSet, ConfigmenuClickMouse, "Click Mouse Placement"),
266 BScreen::ClickMousePlacement);
267 insert(i18n(ConfigmenuSet, ConfigmenuLeftRight, "Left to Right"),
269 insert(i18n(ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"),
271 insert(i18n(ConfigmenuSet, ConfigmenuTopBottom, "Top to Bottom"),
273 insert(i18n(ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"),
275 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreShaded, "Ignore Shaded Windows"),
276 BScreen::IgnoreShaded);
277 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreMax,
278 "Ignore Full-Maximized Windows"),
279 BScreen::IgnoreMaximized);
285 void Configmenu::Placementmenu::setValues(void) {
286 int placement = getScreen()->getPlacementPolicy();
288 setItemSelected(0, placement == BScreen::RowSmartPlacement);
289 setItemSelected(1, placement == BScreen::ColSmartPlacement);
290 setItemSelected(2, placement == BScreen::CascadePlacement);
291 setItemSelected(3, placement == BScreen::UnderMousePlacement);
292 setItemSelected(4, placement == BScreen::ClickMousePlacement);
294 bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight),
295 tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom),
296 e = (placement == BScreen::RowSmartPlacement ||
297 placement == BScreen::ColSmartPlacement);
299 setItemSelected(5, rl);
300 setItemSelected(6, ! rl);
301 setItemEnabled(5, e);
302 setItemEnabled(6, e);
304 setItemSelected(7, tb);
305 setItemSelected(8, ! tb);
306 setItemEnabled(7, e);
307 setItemEnabled(8, e);
309 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
310 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
311 setItemEnabled(9, e);
312 setItemEnabled(10, e);
316 void Configmenu::Placementmenu::reconfigure(void) {
318 Basemenu::reconfigure();
322 void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) {
326 BasemenuItem *item = find(index);
328 if (! item->function())
331 switch (item->function()) {
332 case BScreen::RowSmartPlacement:
333 getScreen()->savePlacementPolicy(item->function());
336 case BScreen::ColSmartPlacement:
337 getScreen()->savePlacementPolicy(item->function());
340 case BScreen::CascadePlacement:
341 getScreen()->savePlacementPolicy(item->function());
344 case BScreen::UnderMousePlacement:
345 getScreen()->savePlacementPolicy(item->function());
348 case BScreen::ClickMousePlacement:
349 getScreen()->savePlacementPolicy(item->function());
352 case BScreen::LeftRight:
353 getScreen()->saveRowPlacementDirection(BScreen::LeftRight);
356 case BScreen::RightLeft:
357 getScreen()->saveRowPlacementDirection(BScreen::RightLeft);
360 case BScreen::TopBottom:
361 getScreen()->saveColPlacementDirection(BScreen::TopBottom);
364 case BScreen::BottomTop:
365 getScreen()->saveColPlacementDirection(BScreen::BottomTop);
368 case BScreen::IgnoreShaded:
369 getScreen()->savePlaceIgnoreShaded(! getScreen()->getPlaceIgnoreShaded());
372 case BScreen::IgnoreMaximized:
374 savePlaceIgnoreMaximized(! getScreen()->getPlaceIgnoreMaximized());
381 Configmenu::WindowToWindowSnapmenu::WindowToWindowSnapmenu(Configmenu *cm) :
382 Basemenu(cm->getScreen()) {
383 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowToWindowSnap,
384 "Window-To-Window Snapping"));
387 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnapNo, "No Snapping"), 1);
388 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnap, "Edge Snapping"), 2);
389 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoResistance,
390 "Edge Resistance"), 3);
391 insert(i18n(ConfigmenuSet, ConfigmenuWindowCornerSnap,
392 "Window Corner Snapping"), 4);
398 void Configmenu::WindowToWindowSnapmenu::setValues(void) {
399 setItemSelected(0, (getScreen()->getWindowToWindowSnap() ==
400 BScreen::WindowNoSnap));
401 setItemSelected(1, (getScreen()->getWindowToWindowSnap() ==
402 BScreen::WindowSnap));
403 setItemSelected(2, (getScreen()->getWindowToWindowSnap() ==
404 BScreen::WindowResistance));
406 setItemEnabled(3, getScreen()->getWindowToWindowSnap());
407 setItemSelected(3, getScreen()->getWindowCornerSnap());
411 void Configmenu::WindowToWindowSnapmenu::reconfigure(void) {
413 Basemenu::reconfigure();
417 void Configmenu::WindowToWindowSnapmenu::itemSelected(int button, unsigned int index) {
421 BasemenuItem *item = find(index);
423 if (! item->function())
426 switch (item->function()) {
428 getScreen()->saveWindowToWindowSnap(BScreen::WindowNoSnap);
431 case 2: // edge snapping
432 getScreen()->saveWindowToWindowSnap(BScreen::WindowSnap);
435 case 3: // edge resistance
436 getScreen()->saveWindowToWindowSnap(BScreen::WindowResistance);
439 case 4: // window corner snapping
440 getScreen()->saveWindowCornerSnap(! getScreen()->getWindowCornerSnap());
448 Configmenu::WindowToEdgeSnapmenu::WindowToEdgeSnapmenu(Configmenu *cm) :
449 Basemenu(cm->getScreen()) {
450 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowToEdgeSnap,
451 "Window-To-Edge Snapping"));
454 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnapNo, "No Snapping"), 1);
455 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnap, "Edge Snapping"), 2);
456 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoResistance,
457 "Edge Resistance"), 3);
463 void Configmenu::WindowToEdgeSnapmenu::setValues(void) {
464 setItemSelected(0, (getScreen()->getWindowToEdgeSnap() ==
465 BScreen::WindowNoSnap));
466 setItemSelected(1, (getScreen()->getWindowToEdgeSnap() ==
467 BScreen::WindowSnap));
468 setItemSelected(2, (getScreen()->getWindowToEdgeSnap() ==
469 BScreen::WindowResistance));
473 void Configmenu::WindowToEdgeSnapmenu::reconfigure(void) {
475 Basemenu::reconfigure();
479 void Configmenu::WindowToEdgeSnapmenu::itemSelected(int button, unsigned int index) {
483 BasemenuItem *item = find(index);
485 if (! item->function())
488 switch (item->function()) {
490 getScreen()->saveWindowToEdgeSnap(BScreen::WindowNoSnap);
493 case 2: // edge snapping
494 getScreen()->saveWindowToEdgeSnap(BScreen::WindowSnap);
497 case 3: // edge resistance
498 getScreen()->saveWindowToEdgeSnap(BScreen::WindowResistance);
506 Configmenu::Xineramamenu::Xineramamenu(Configmenu *cm):
507 Basemenu(cm->getScreen()) {
508 setLabel(i18n(ConfigmenuSet, ConfigmenuXineramaSupport, "Xinerama Support"));
511 insert(i18n(ConfigmenuSet, ConfigmenuXineramaPlacement, "Window Placement"),
513 insert(i18n(ConfigmenuSet, ConfigmenuXineramaMaximizing, "Window Maximizing"),
515 insert(i18n(ConfigmenuSet, ConfigmenuXineramaSnapping, "Window Snapping"),
523 void Configmenu::Xineramamenu::setValues(void) {
524 setItemSelected(0, getScreen()->getBlackbox()->doXineramaPlacement());
525 setItemSelected(1, getScreen()->getBlackbox()->doXineramaMaximizing());
526 setItemSelected(2, getScreen()->getBlackbox()->doXineramaSnapping());
530 void Configmenu::Xineramamenu::reconfigure(void) {
532 Basemenu::reconfigure();
536 void Configmenu::Xineramamenu::itemSelected(int button, unsigned int index) {
540 BasemenuItem *item = find(index);
542 if (! item->function())
545 Blackbox *bb = getScreen()->getBlackbox();
547 switch (item->function()) {
548 case 1: // window placement
549 bb->saveXineramaPlacement(! bb->doXineramaPlacement());
550 setItemSelected(0, bb->doXineramaPlacement());
553 case 2: // window maximizing
554 bb->saveXineramaMaximizing(! bb->doXineramaMaximizing());
555 setItemSelected(1, bb->doXineramaMaximizing());
558 case 3: // window snapping
559 bb->saveXineramaSnapping(! bb->doXineramaSnapping());
560 setItemSelected(2, bb->doXineramaSnapping());
567 Configmenu::Xftmenu::Xftmenu(Configmenu *cm):
568 Basemenu(cm->getScreen()) {
569 setLabel(i18n(ConfigmenuSet, ConfigmenuXftOptions, "Xft Font Options"));
572 insert(i18n(ConfigmenuSet, ConfigmenuXftAA, "Anti-Alias Text"), 1);
573 insert(i18n(ConfigmenuSet, ConfigmenuXftShadow, "Drop Shadows Under Text"),
581 void Configmenu::Xftmenu::setValues(void) {
582 setItemSelected(0, getScreen()->doAAFonts());
583 setItemEnabled(1, getScreen()->doAAFonts());
584 setItemSelected(1, getScreen()->doShadowFonts());
588 void Configmenu::Xftmenu::reconfigure(void) {
590 Basemenu::reconfigure();
594 void Configmenu::Xftmenu::itemSelected(int button, unsigned int index) {
598 BasemenuItem *item = find(index);
600 if (! item->function())
603 switch (item->function()) {
604 case 1: // anti-alias text
605 getScreen()->saveAAFonts(! getScreen()->doAAFonts());
608 case 2: // drop shadows
609 getScreen()->saveShadowFonts(! getScreen()->doShadowFonts());