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, ConfigmenuModMove,
71 "Raise Window on Alt-Click Move"), 3);
72 insert(i18n(ConfigmenuSet, ConfigmenuWorkspaceWarping,
73 "Workspace Warping"), 4);
74 insert(i18n(ConfigmenuSet, ConfigmenuFullMax,
75 "Full Maximization"), 5);
76 insert(i18n(ConfigmenuSet, ConfigmenuFocusNew,
77 "Focus New Windows"), 6);
78 insert(i18n(ConfigmenuSet, ConfigmenuFocusLast,
79 "Focus Last Window on Workspace"), 7);
80 insert(i18n(ConfigmenuSet, ConfigmenuDisableBindings,
81 "Disable Mouse with Scroll Lock"), 8);
82 insert(i18n(ConfigmenuSet, ConfigmenuHideToolbar,
89 void Configmenu::setValues(void) {
97 setItemSelected(index++, getScreen()->doImageDither());
98 setItemSelected(index++, getScreen()->doOpaqueMove());
99 setItemSelected(index++, getScreen()->doRaiseOnMove());
100 setItemSelected(index++, getScreen()->doWorkspaceWarping());
101 setItemSelected(index++, getScreen()->doFullMax());
102 setItemSelected(index++, getScreen()->doFocusNew());
103 setItemSelected(index++, getScreen()->doFocusLast());
104 setItemSelected(index++, getScreen()->allowScrollLock());
105 setItemSelected(index++, getScreen()->doHideToolbar());
109 Configmenu::~Configmenu(void) {
111 delete placementmenu;
112 delete windowsnapmenu;
123 void Configmenu::itemSelected(int button, unsigned int index) {
127 BasemenuItem *item = find(index);
129 if (! item->function())
132 switch(item->function()) {
134 getScreen()->saveImageDither(! getScreen()->doImageDither());
135 setItemSelected(index, getScreen()->doImageDither());
138 case 2: // opaque move
139 getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove());
140 setItemSelected(index, getScreen()->doOpaqueMove());
143 case 3: // raise on alt-move
144 getScreen()->saveRaiseOnMove(! getScreen()->doRaiseOnMove());
145 setItemSelected(index, getScreen()->doRaiseOnMove());
147 case 4: // workspace wrapping
148 getScreen()->saveWorkspaceWarping(! getScreen()->doWorkspaceWarping());
149 setItemSelected(index, getScreen()->doWorkspaceWarping());
152 case 5: // full maximization
153 getScreen()->saveFullMax(! getScreen()->doFullMax());
154 setItemSelected(index, getScreen()->doFullMax());
157 case 6: // focus new windows
158 getScreen()->saveFocusNew(! getScreen()->doFocusNew());
159 setItemSelected(index, getScreen()->doFocusNew());
162 case 7: // focus last window on workspace
163 getScreen()->saveFocusLast(! getScreen()->doFocusLast());
164 setItemSelected(index, getScreen()->doFocusLast());
167 case 8: // disable mouse bindings with Scroll Lock
168 getScreen()->saveAllowScrollLock(! getScreen()->allowScrollLock());
169 setItemSelected(index, getScreen()->allowScrollLock());
170 getScreen()->reconfigure();
173 case 9: // hide toolbar
174 getScreen()->saveHideToolbar(! getScreen()->doHideToolbar());
175 setItemSelected(index, getScreen()->doHideToolbar());
181 void Configmenu::reconfigure(void) {
183 focusmenu->reconfigure();
184 placementmenu->reconfigure();
185 windowsnapmenu->reconfigure();
186 edgesnapmenu->reconfigure();
188 xineramamenu->reconfigure();
191 xftmenu->reconfigure();
194 Basemenu::reconfigure();
198 Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) {
199 setLabel(i18n(ConfigmenuSet, ConfigmenuFocusModel, "Focus Model"));
202 insert(i18n(ConfigmenuSet, ConfigmenuClickToFocus, "Click To Focus"), 1);
203 insert(i18n(ConfigmenuSet, ConfigmenuSloppyFocus, "Sloppy Focus"), 2);
204 insert(i18n(ConfigmenuSet, ConfigmenuAutoRaise, "Auto Raise"), 3);
205 insert(i18n(ConfigmenuSet, ConfigmenuClickRaise, "Click Raise"), 4);
211 void Configmenu::Focusmenu::setValues(void) {
212 setItemSelected(0, ! getScreen()->isSloppyFocus());
213 setItemSelected(1, getScreen()->isSloppyFocus());
214 setItemEnabled(2, getScreen()->isSloppyFocus());
215 setItemSelected(2, getScreen()->doAutoRaise());
216 setItemEnabled(3, getScreen()->isSloppyFocus());
217 setItemSelected(3, getScreen()->doClickRaise());
221 void Configmenu::Focusmenu::reconfigure(void) {
223 Basemenu::reconfigure();
227 void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
231 BasemenuItem *item = find(index);
233 if (! item->function())
236 switch (item->function()) {
237 case 1: // click to focus
238 getScreen()->toggleFocusModel(BScreen::ClickToFocus);
241 case 2: // sloppy focus
242 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
245 case 3: // auto raise with sloppy focus
246 getScreen()->saveAutoRaise(! getScreen()->doAutoRaise());
249 case 4: // click raise with sloppy focus
250 getScreen()->saveClickRaise(! getScreen()->doClickRaise());
251 // make sure the appropriate mouse buttons are grabbed on the windows
252 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
259 Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
260 Basemenu(cm->getScreen()) {
261 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement"));
264 insert(i18n(ConfigmenuSet, ConfigmenuSmartRows, "Smart Placement (Rows)"),
265 BScreen::RowSmartPlacement);
266 insert(i18n(ConfigmenuSet, ConfigmenuSmartCols, "Smart Placement (Columns)"),
267 BScreen::ColSmartPlacement);
268 insert(i18n(ConfigmenuSet, ConfigmenuCascade, "Cascade Placement"),
269 BScreen::CascadePlacement);
270 insert(i18n(ConfigmenuSet, ConfigmenuUnderMouse, "Under Mouse Placement"),
271 BScreen::UnderMousePlacement);
272 insert(i18n(ConfigmenuSet, ConfigmenuClickMouse, "Click Mouse Placement"),
273 BScreen::ClickMousePlacement);
274 insert(i18n(ConfigmenuSet, ConfigmenuLeftRight, "Left to Right"),
276 insert(i18n(ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"),
278 insert(i18n(ConfigmenuSet, ConfigmenuTopBottom, "Top to Bottom"),
280 insert(i18n(ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"),
282 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreShaded, "Ignore Shaded Windows"),
283 BScreen::IgnoreShaded);
284 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreMax,
285 "Ignore Full-Maximized Windows"),
286 BScreen::IgnoreMaximized);
292 void Configmenu::Placementmenu::setValues(void) {
293 int placement = getScreen()->getPlacementPolicy();
295 setItemSelected(0, placement == BScreen::RowSmartPlacement);
296 setItemSelected(1, placement == BScreen::ColSmartPlacement);
297 setItemSelected(2, placement == BScreen::CascadePlacement);
298 setItemSelected(3, placement == BScreen::UnderMousePlacement);
299 setItemSelected(4, placement == BScreen::ClickMousePlacement);
301 bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight),
302 tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom),
303 e = (placement == BScreen::RowSmartPlacement ||
304 placement == BScreen::ColSmartPlacement);
306 setItemSelected(5, rl);
307 setItemSelected(6, ! rl);
308 setItemEnabled(5, e);
309 setItemEnabled(6, e);
311 setItemSelected(7, tb);
312 setItemSelected(8, ! tb);
313 setItemEnabled(7, e);
314 setItemEnabled(8, e);
316 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
317 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
318 setItemEnabled(9, e);
319 setItemEnabled(10, e);
323 void Configmenu::Placementmenu::reconfigure(void) {
325 Basemenu::reconfigure();
329 void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) {
333 BasemenuItem *item = find(index);
335 if (! item->function())
338 switch (item->function()) {
339 case BScreen::RowSmartPlacement:
340 getScreen()->savePlacementPolicy(item->function());
343 case BScreen::ColSmartPlacement:
344 getScreen()->savePlacementPolicy(item->function());
347 case BScreen::CascadePlacement:
348 getScreen()->savePlacementPolicy(item->function());
351 case BScreen::UnderMousePlacement:
352 getScreen()->savePlacementPolicy(item->function());
355 case BScreen::ClickMousePlacement:
356 getScreen()->savePlacementPolicy(item->function());
359 case BScreen::LeftRight:
360 getScreen()->saveRowPlacementDirection(BScreen::LeftRight);
363 case BScreen::RightLeft:
364 getScreen()->saveRowPlacementDirection(BScreen::RightLeft);
367 case BScreen::TopBottom:
368 getScreen()->saveColPlacementDirection(BScreen::TopBottom);
371 case BScreen::BottomTop:
372 getScreen()->saveColPlacementDirection(BScreen::BottomTop);
375 case BScreen::IgnoreShaded:
376 getScreen()->savePlaceIgnoreShaded(! getScreen()->getPlaceIgnoreShaded());
379 case BScreen::IgnoreMaximized:
381 savePlaceIgnoreMaximized(! getScreen()->getPlaceIgnoreMaximized());
388 Configmenu::WindowToWindowSnapmenu::WindowToWindowSnapmenu(Configmenu *cm) :
389 Basemenu(cm->getScreen()) {
390 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowToWindowSnap,
391 "Window-To-Window Snapping"));
394 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnapNo, "No Snapping"), 1);
395 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnap, "Edge Snapping"), 2);
396 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoResistance,
397 "Edge Resistance"), 3);
398 insert(i18n(ConfigmenuSet, ConfigmenuWindowCornerSnap,
399 "Window Corner Snapping"), 4);
405 void Configmenu::WindowToWindowSnapmenu::setValues(void) {
406 setItemSelected(0, (getScreen()->getWindowToWindowSnap() ==
407 BScreen::WindowNoSnap));
408 setItemSelected(1, (getScreen()->getWindowToWindowSnap() ==
409 BScreen::WindowSnap));
410 setItemSelected(2, (getScreen()->getWindowToWindowSnap() ==
411 BScreen::WindowResistance));
413 setItemEnabled(3, getScreen()->getWindowToWindowSnap());
414 setItemSelected(3, getScreen()->getWindowCornerSnap());
418 void Configmenu::WindowToWindowSnapmenu::reconfigure(void) {
420 Basemenu::reconfigure();
424 void Configmenu::WindowToWindowSnapmenu::itemSelected(int button, unsigned int index) {
428 BasemenuItem *item = find(index);
430 if (! item->function())
433 switch (item->function()) {
435 getScreen()->saveWindowToWindowSnap(BScreen::WindowNoSnap);
438 case 2: // edge snapping
439 getScreen()->saveWindowToWindowSnap(BScreen::WindowSnap);
442 case 3: // edge resistance
443 getScreen()->saveWindowToWindowSnap(BScreen::WindowResistance);
446 case 4: // window corner snapping
447 getScreen()->saveWindowCornerSnap(! getScreen()->getWindowCornerSnap());
455 Configmenu::WindowToEdgeSnapmenu::WindowToEdgeSnapmenu(Configmenu *cm) :
456 Basemenu(cm->getScreen()) {
457 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowToEdgeSnap,
458 "Window-To-Edge Snapping"));
461 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnapNo, "No Snapping"), 1);
462 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoSnap, "Edge Snapping"), 2);
463 insert(i18n(ConfigmenuSet, ConfigmenuWindowDoResistance,
464 "Edge Resistance"), 3);
470 void Configmenu::WindowToEdgeSnapmenu::setValues(void) {
471 setItemSelected(0, (getScreen()->getWindowToEdgeSnap() ==
472 BScreen::WindowNoSnap));
473 setItemSelected(1, (getScreen()->getWindowToEdgeSnap() ==
474 BScreen::WindowSnap));
475 setItemSelected(2, (getScreen()->getWindowToEdgeSnap() ==
476 BScreen::WindowResistance));
480 void Configmenu::WindowToEdgeSnapmenu::reconfigure(void) {
482 Basemenu::reconfigure();
486 void Configmenu::WindowToEdgeSnapmenu::itemSelected(int button, unsigned int index) {
490 BasemenuItem *item = find(index);
492 if (! item->function())
495 switch (item->function()) {
497 getScreen()->saveWindowToEdgeSnap(BScreen::WindowNoSnap);
500 case 2: // edge snapping
501 getScreen()->saveWindowToEdgeSnap(BScreen::WindowSnap);
504 case 3: // edge resistance
505 getScreen()->saveWindowToEdgeSnap(BScreen::WindowResistance);
513 Configmenu::Xineramamenu::Xineramamenu(Configmenu *cm):
514 Basemenu(cm->getScreen()) {
515 setLabel(i18n(ConfigmenuSet, ConfigmenuXineramaSupport, "Xinerama Support"));
518 insert(i18n(ConfigmenuSet, ConfigmenuXineramaPlacement, "Window Placement"),
520 insert(i18n(ConfigmenuSet, ConfigmenuXineramaMaximizing, "Window Maximizing"),
522 insert(i18n(ConfigmenuSet, ConfigmenuXineramaSnapping, "Window Snapping"),
530 void Configmenu::Xineramamenu::setValues(void) {
531 setItemSelected(0, getScreen()->getBlackbox()->doXineramaPlacement());
532 setItemSelected(1, getScreen()->getBlackbox()->doXineramaMaximizing());
533 setItemSelected(2, getScreen()->getBlackbox()->doXineramaSnapping());
537 void Configmenu::Xineramamenu::reconfigure(void) {
539 Basemenu::reconfigure();
543 void Configmenu::Xineramamenu::itemSelected(int button, unsigned int index) {
547 BasemenuItem *item = find(index);
549 if (! item->function())
552 Blackbox *bb = getScreen()->getBlackbox();
554 switch (item->function()) {
555 case 1: // window placement
556 bb->saveXineramaPlacement(! bb->doXineramaPlacement());
557 setItemSelected(0, bb->doXineramaPlacement());
560 case 2: // window maximizing
561 bb->saveXineramaMaximizing(! bb->doXineramaMaximizing());
562 setItemSelected(1, bb->doXineramaMaximizing());
565 case 3: // window snapping
566 bb->saveXineramaSnapping(! bb->doXineramaSnapping());
567 setItemSelected(2, bb->doXineramaSnapping());
574 Configmenu::Xftmenu::Xftmenu(Configmenu *cm):
575 Basemenu(cm->getScreen()) {
576 setLabel(i18n(ConfigmenuSet, ConfigmenuXftOptions, "Xft Font Options"));
579 insert(i18n(ConfigmenuSet, ConfigmenuXftAA, "Anti-Alias Text"), 1);
580 insert(i18n(ConfigmenuSet, ConfigmenuXftShadow, "Drop Shadows Under Text"),
588 void Configmenu::Xftmenu::setValues(void) {
589 setItemSelected(0, getScreen()->doAAFonts());
590 setItemEnabled(1, getScreen()->doAAFonts());
591 setItemSelected(1, getScreen()->doShadowFonts());
595 void Configmenu::Xftmenu::reconfigure(void) {
597 Basemenu::reconfigure();
601 void Configmenu::Xftmenu::itemSelected(int button, unsigned int index) {
605 BasemenuItem *item = find(index);
607 if (! item->function())
610 switch (item->function()) {
611 case 1: // anti-alias text
612 getScreen()->saveAAFonts(! getScreen()->doAAFonts());
615 case 2: // drop shadows
616 getScreen()->saveShadowFonts(! getScreen()->doShadowFonts());