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, ConfigmenuDisableBindings,
68 "Disable Mouse with Scroll Lock"), 8);
69 insert(i18n(ConfigmenuSet, ConfigmenuHideToolbar,
76 void Configmenu::setValues(void) {
77 setItemSelected(3, getScreen()->doImageDither());
78 setItemSelected(4, getScreen()->doOpaqueMove());
79 setItemSelected(5, getScreen()->doFullMax());
80 setItemSelected(6, getScreen()->doFocusNew());
81 setItemSelected(7, getScreen()->doFocusLast());
82 setItemSelected(8, getScreen()->getWindowToWindowSnap());
84 setItemSelected(9, getScreen()->getWindowCornerSnap());
85 setItemEnabled(9, getScreen()->getWindowToWindowSnap());
87 setItemSelected(10, getScreen()->allowScrollLock());
88 setItemSelected(11, getScreen()->doHideToolbar());
92 Configmenu::~Configmenu(void) {
101 void Configmenu::itemSelected(int button, unsigned int index) {
105 BasemenuItem *item = find(index);
107 if (! item->function())
110 switch(item->function()) {
112 getScreen()->saveImageDither(! getScreen()->doImageDither());
113 setItemSelected(index, getScreen()->doImageDither());
116 case 2: // opaque move
117 getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove());
118 setItemSelected(index, getScreen()->doOpaqueMove());
121 case 3: // full maximization
122 getScreen()->saveFullMax(! getScreen()->doFullMax());
123 setItemSelected(index, getScreen()->doFullMax());
126 case 4: // focus new windows
127 getScreen()->saveFocusNew(! getScreen()->doFocusNew());
128 setItemSelected(index, getScreen()->doFocusNew());
131 case 5: // focus last window on workspace
132 getScreen()->saveFocusLast(! getScreen()->doFocusLast());
133 setItemSelected(index, getScreen()->doFocusLast());
136 case 6: // window-to-window snapping
137 getScreen()->saveWindowToWindowSnap(! getScreen()->getWindowToWindowSnap());
138 setItemSelected(index, getScreen()->getWindowToWindowSnap());
139 setItemEnabled(index + 1, getScreen()->getWindowToWindowSnap());
142 case 7: // window corner snapping
143 getScreen()->saveWindowCornerSnap(! getScreen()->getWindowCornerSnap());
144 setItemSelected(index, getScreen()->getWindowCornerSnap());
147 case 8: // disable mouse bindings with Scroll Lock
148 getScreen()->saveAllowScrollLock(! getScreen()->allowScrollLock());
149 setItemSelected(index, getScreen()->allowScrollLock());
150 getScreen()->reconfigure();
153 case 9: // hide toolbar
154 getScreen()->saveHideToolbar(! getScreen()->doHideToolbar());
155 setItemSelected(index, getScreen()->doHideToolbar());
161 void Configmenu::reconfigure(void) {
163 focusmenu->reconfigure();
164 placementmenu->reconfigure();
165 xineramamenu->reconfigure();
167 Basemenu::reconfigure();
171 Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) {
172 setLabel(i18n(ConfigmenuSet, ConfigmenuFocusModel, "Focus Model"));
175 insert(i18n(ConfigmenuSet, ConfigmenuClickToFocus, "Click To Focus"), 1);
176 insert(i18n(ConfigmenuSet, ConfigmenuSloppyFocus, "Sloppy Focus"), 2);
177 insert(i18n(ConfigmenuSet, ConfigmenuAutoRaise, "Auto Raise"), 3);
178 insert(i18n(ConfigmenuSet, ConfigmenuClickRaise, "Click Raise"), 4);
184 void Configmenu::Focusmenu::setValues(void) {
185 setItemSelected(0, ! getScreen()->isSloppyFocus());
186 setItemSelected(1, getScreen()->isSloppyFocus());
187 setItemEnabled(2, getScreen()->isSloppyFocus());
188 setItemSelected(2, getScreen()->doAutoRaise());
189 setItemEnabled(3, getScreen()->isSloppyFocus());
190 setItemSelected(3, getScreen()->doClickRaise());
194 void Configmenu::Focusmenu::reconfigure(void) {
196 Basemenu::reconfigure();
200 void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
204 BasemenuItem *item = find(index);
206 if (! item->function())
209 switch (item->function()) {
210 case 1: // click to focus
211 getScreen()->toggleFocusModel(BScreen::ClickToFocus);
214 case 2: // sloppy focus
215 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
218 case 3: // auto raise with sloppy focus
219 getScreen()->saveAutoRaise(! getScreen()->doAutoRaise());
222 case 4: // click raise with sloppy focus
223 getScreen()->saveClickRaise(! getScreen()->doClickRaise());
224 // make sure the appropriate mouse buttons are grabbed on the windows
225 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
232 Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
233 Basemenu(cm->getScreen()) {
234 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement"));
237 insert(i18n(ConfigmenuSet, ConfigmenuSmartRows, "Smart Placement (Rows)"),
238 BScreen::RowSmartPlacement);
239 insert(i18n(ConfigmenuSet, ConfigmenuSmartCols, "Smart Placement (Columns)"),
240 BScreen::ColSmartPlacement);
241 insert(i18n(ConfigmenuSet, ConfigmenuCascade, "Cascade Placement"),
242 BScreen::CascadePlacement);
243 insert(i18n(ConfigmenuSet, ConfigmenuUnderMouse, "Under Mouse Placement"),
244 BScreen::UnderMousePlacement);
245 insert(i18n(ConfigmenuSet, ConfigmenuClickMouse, "Click Mouse Placement"),
246 BScreen::ClickMousePlacement);
247 insert(i18n(ConfigmenuSet, ConfigmenuLeftRight, "Left to Right"),
249 insert(i18n(ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"),
251 insert(i18n(ConfigmenuSet, ConfigmenuTopBottom, "Top to Bottom"),
253 insert(i18n(ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"),
255 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreShaded, "Ignore Shaded Windows"),
256 BScreen::IgnoreShaded);
257 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreMax,
258 "Ignore Full-Maximized Windows"),
259 BScreen::IgnoreMaximized);
265 void Configmenu::Placementmenu::setValues(void) {
266 int placement = getScreen()->getPlacementPolicy();
268 setItemSelected(0, placement == BScreen::RowSmartPlacement);
269 setItemSelected(1, placement == BScreen::ColSmartPlacement);
270 setItemSelected(2, placement == BScreen::CascadePlacement);
271 setItemSelected(3, placement == BScreen::UnderMousePlacement);
272 setItemSelected(4, placement == BScreen::ClickMousePlacement);
274 bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight),
275 tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom),
276 e = placement != BScreen::UnderMousePlacement;
278 setItemSelected(5, rl);
279 setItemSelected(6, ! rl);
280 setItemEnabled(5, e);
281 setItemEnabled(6, e);
283 setItemSelected(7, tb);
284 setItemSelected(8, ! tb);
285 setItemEnabled(7, e);
286 setItemEnabled(8, e);
288 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
289 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
293 void Configmenu::Placementmenu::reconfigure(void) {
295 Basemenu::reconfigure();
299 void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) {
303 BasemenuItem *item = find(index);
305 if (! item->function())
308 switch (item->function()) {
309 case BScreen::RowSmartPlacement:
310 getScreen()->savePlacementPolicy(item->function());
312 setItemSelected(0, true);
313 setItemSelected(1, false);
314 setItemSelected(2, false);
315 setItemSelected(3, false);
316 setItemSelected(4, false);
317 setItemEnabled(5, true);
318 setItemEnabled(6, true);
319 setItemEnabled(7, true);
320 setItemEnabled(8, true);
324 case BScreen::ColSmartPlacement:
325 getScreen()->savePlacementPolicy(item->function());
327 setItemSelected(0, false);
328 setItemSelected(1, true);
329 setItemSelected(2, false);
330 setItemSelected(3, false);
331 setItemSelected(4, false);
332 setItemEnabled(5, true);
333 setItemEnabled(6, true);
334 setItemEnabled(7, true);
335 setItemEnabled(8, true);
339 case BScreen::CascadePlacement:
340 getScreen()->savePlacementPolicy(item->function());
342 setItemSelected(0, false);
343 setItemSelected(1, false);
344 setItemSelected(2, true);
345 setItemSelected(3, false);
346 setItemSelected(4, false);
347 setItemEnabled(5, true);
348 setItemEnabled(6, true);
349 setItemEnabled(7, true);
350 setItemEnabled(8, true);
354 case BScreen::UnderMousePlacement:
355 getScreen()->savePlacementPolicy(item->function());
357 setItemSelected(0, false);
358 setItemSelected(1, false);
359 setItemSelected(2, false);
360 setItemSelected(3, true);
361 setItemSelected(4, false);
362 setItemEnabled(5, false);
363 setItemEnabled(6, false);
364 setItemEnabled(7, false);
365 setItemEnabled(8, false);
369 case BScreen::ClickMousePlacement:
370 getScreen()->savePlacementPolicy(item->function());
372 setItemSelected(0, false);
373 setItemSelected(1, false);
374 setItemSelected(2, false);
375 setItemSelected(3, false);
376 setItemSelected(4, true);
377 setItemEnabled(5, false);
378 setItemEnabled(6, false);
379 setItemEnabled(7, false);
380 setItemEnabled(8, false);
384 case BScreen::LeftRight:
385 getScreen()->saveRowPlacementDirection(BScreen::LeftRight);
387 setItemSelected(5, true);
388 setItemSelected(6, false);
392 case BScreen::RightLeft:
393 getScreen()->saveRowPlacementDirection(BScreen::RightLeft);
395 setItemSelected(5, false);
396 setItemSelected(6, true);
400 case BScreen::TopBottom:
401 getScreen()->saveColPlacementDirection(BScreen::TopBottom);
403 setItemSelected(7, true);
404 setItemSelected(8, false);
408 case BScreen::BottomTop:
409 getScreen()->saveColPlacementDirection(BScreen::BottomTop);
411 setItemSelected(7, false);
412 setItemSelected(8, true);
416 case BScreen::IgnoreShaded:
417 getScreen()->savePlaceIgnoreShaded(! getScreen()->getPlaceIgnoreShaded());
419 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
423 case BScreen::IgnoreMaximized:
425 savePlaceIgnoreMaximized(! getScreen()->getPlaceIgnoreMaximized());
427 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
435 Configmenu::Xineramamenu::Xineramamenu(Configmenu *cm):
436 Basemenu(cm->getScreen()) {
437 setLabel(i18n(ConfigmenuSet, ConfigmenuXineramaSupport, "Xinerama Support"));
440 insert(i18n(ConfigmenuSet, ConfigmenuXineramaPlacement, "Window Placement"),
442 insert(i18n(ConfigmenuSet, ConfigmenuXineramaMaximizing, "Window Maximizing"),
444 insert(i18n(ConfigmenuSet, ConfigmenuXineramaSnapping, "Window Snapping"),
452 void Configmenu::Xineramamenu::setValues(void) {
453 setItemSelected(0, getScreen()->getBlackbox()->doXineramaPlacement());
454 setItemSelected(1, getScreen()->getBlackbox()->doXineramaMaximizing());
455 setItemSelected(2, getScreen()->getBlackbox()->doXineramaSnapping());
459 void Configmenu::Xineramamenu::reconfigure(void) {
461 Basemenu::reconfigure();
465 void Configmenu::Xineramamenu::itemSelected(int button, unsigned int index) {
469 BasemenuItem *item = find(index);
471 if (! item->function())
474 Blackbox *bb = getScreen()->getBlackbox();
476 switch (item->function()) {
477 case 1: // window placement
478 bb->saveXineramaPlacement(! bb->doXineramaPlacement());
479 setItemSelected(0, bb->doXineramaPlacement());
482 case 2: // window maximizing
483 bb->saveXineramaMaximizing(! bb->doXineramaMaximizing());
484 setItemSelected(1, bb->doXineramaMaximizing());
487 case 3: // window snapping
488 bb->saveXineramaSnapping(! bb->doXineramaSnapping());
489 setItemSelected(2, bb->doXineramaSnapping());