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();
166 xineramamenu->reconfigure();
169 Basemenu::reconfigure();
173 Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) {
174 setLabel(i18n(ConfigmenuSet, ConfigmenuFocusModel, "Focus Model"));
177 insert(i18n(ConfigmenuSet, ConfigmenuClickToFocus, "Click To Focus"), 1);
178 insert(i18n(ConfigmenuSet, ConfigmenuSloppyFocus, "Sloppy Focus"), 2);
179 insert(i18n(ConfigmenuSet, ConfigmenuAutoRaise, "Auto Raise"), 3);
180 insert(i18n(ConfigmenuSet, ConfigmenuClickRaise, "Click Raise"), 4);
186 void Configmenu::Focusmenu::setValues(void) {
187 setItemSelected(0, ! getScreen()->isSloppyFocus());
188 setItemSelected(1, getScreen()->isSloppyFocus());
189 setItemEnabled(2, getScreen()->isSloppyFocus());
190 setItemSelected(2, getScreen()->doAutoRaise());
191 setItemEnabled(3, getScreen()->isSloppyFocus());
192 setItemSelected(3, getScreen()->doClickRaise());
196 void Configmenu::Focusmenu::reconfigure(void) {
198 Basemenu::reconfigure();
202 void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
206 BasemenuItem *item = find(index);
208 if (! item->function())
211 switch (item->function()) {
212 case 1: // click to focus
213 getScreen()->toggleFocusModel(BScreen::ClickToFocus);
216 case 2: // sloppy focus
217 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
220 case 3: // auto raise with sloppy focus
221 getScreen()->saveAutoRaise(! getScreen()->doAutoRaise());
224 case 4: // click raise with sloppy focus
225 getScreen()->saveClickRaise(! getScreen()->doClickRaise());
226 // make sure the appropriate mouse buttons are grabbed on the windows
227 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
234 Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
235 Basemenu(cm->getScreen()) {
236 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement"));
239 insert(i18n(ConfigmenuSet, ConfigmenuSmartRows, "Smart Placement (Rows)"),
240 BScreen::RowSmartPlacement);
241 insert(i18n(ConfigmenuSet, ConfigmenuSmartCols, "Smart Placement (Columns)"),
242 BScreen::ColSmartPlacement);
243 insert(i18n(ConfigmenuSet, ConfigmenuCascade, "Cascade Placement"),
244 BScreen::CascadePlacement);
245 insert(i18n(ConfigmenuSet, ConfigmenuUnderMouse, "Under Mouse Placement"),
246 BScreen::UnderMousePlacement);
247 insert(i18n(ConfigmenuSet, ConfigmenuClickMouse, "Click Mouse Placement"),
248 BScreen::ClickMousePlacement);
249 insert(i18n(ConfigmenuSet, ConfigmenuLeftRight, "Left to Right"),
251 insert(i18n(ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"),
253 insert(i18n(ConfigmenuSet, ConfigmenuTopBottom, "Top to Bottom"),
255 insert(i18n(ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"),
257 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreShaded, "Ignore Shaded Windows"),
258 BScreen::IgnoreShaded);
259 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreMax,
260 "Ignore Full-Maximized Windows"),
261 BScreen::IgnoreMaximized);
267 void Configmenu::Placementmenu::setValues(void) {
268 int placement = getScreen()->getPlacementPolicy();
270 setItemSelected(0, placement == BScreen::RowSmartPlacement);
271 setItemSelected(1, placement == BScreen::ColSmartPlacement);
272 setItemSelected(2, placement == BScreen::CascadePlacement);
273 setItemSelected(3, placement == BScreen::UnderMousePlacement);
274 setItemSelected(4, placement == BScreen::ClickMousePlacement);
276 bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight),
277 tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom),
278 e = placement != BScreen::UnderMousePlacement;
280 setItemSelected(5, rl);
281 setItemSelected(6, ! rl);
282 setItemEnabled(5, e);
283 setItemEnabled(6, e);
285 setItemSelected(7, tb);
286 setItemSelected(8, ! tb);
287 setItemEnabled(7, e);
288 setItemEnabled(8, e);
290 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
291 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
295 void Configmenu::Placementmenu::reconfigure(void) {
297 Basemenu::reconfigure();
301 void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) {
305 BasemenuItem *item = find(index);
307 if (! item->function())
310 switch (item->function()) {
311 case BScreen::RowSmartPlacement:
312 getScreen()->savePlacementPolicy(item->function());
314 setItemSelected(0, true);
315 setItemSelected(1, false);
316 setItemSelected(2, false);
317 setItemSelected(3, false);
318 setItemSelected(4, false);
319 setItemEnabled(5, true);
320 setItemEnabled(6, true);
321 setItemEnabled(7, true);
322 setItemEnabled(8, true);
326 case BScreen::ColSmartPlacement:
327 getScreen()->savePlacementPolicy(item->function());
329 setItemSelected(0, false);
330 setItemSelected(1, true);
331 setItemSelected(2, false);
332 setItemSelected(3, false);
333 setItemSelected(4, false);
334 setItemEnabled(5, true);
335 setItemEnabled(6, true);
336 setItemEnabled(7, true);
337 setItemEnabled(8, true);
341 case BScreen::CascadePlacement:
342 getScreen()->savePlacementPolicy(item->function());
344 setItemSelected(0, false);
345 setItemSelected(1, false);
346 setItemSelected(2, true);
347 setItemSelected(3, false);
348 setItemSelected(4, false);
349 setItemEnabled(5, true);
350 setItemEnabled(6, true);
351 setItemEnabled(7, true);
352 setItemEnabled(8, true);
356 case BScreen::UnderMousePlacement:
357 getScreen()->savePlacementPolicy(item->function());
359 setItemSelected(0, false);
360 setItemSelected(1, false);
361 setItemSelected(2, false);
362 setItemSelected(3, true);
363 setItemSelected(4, false);
364 setItemEnabled(5, false);
365 setItemEnabled(6, false);
366 setItemEnabled(7, false);
367 setItemEnabled(8, false);
371 case BScreen::ClickMousePlacement:
372 getScreen()->savePlacementPolicy(item->function());
374 setItemSelected(0, false);
375 setItemSelected(1, false);
376 setItemSelected(2, false);
377 setItemSelected(3, false);
378 setItemSelected(4, true);
379 setItemEnabled(5, false);
380 setItemEnabled(6, false);
381 setItemEnabled(7, false);
382 setItemEnabled(8, false);
386 case BScreen::LeftRight:
387 getScreen()->saveRowPlacementDirection(BScreen::LeftRight);
389 setItemSelected(5, true);
390 setItemSelected(6, false);
394 case BScreen::RightLeft:
395 getScreen()->saveRowPlacementDirection(BScreen::RightLeft);
397 setItemSelected(5, false);
398 setItemSelected(6, true);
402 case BScreen::TopBottom:
403 getScreen()->saveColPlacementDirection(BScreen::TopBottom);
405 setItemSelected(7, true);
406 setItemSelected(8, false);
410 case BScreen::BottomTop:
411 getScreen()->saveColPlacementDirection(BScreen::BottomTop);
413 setItemSelected(7, false);
414 setItemSelected(8, true);
418 case BScreen::IgnoreShaded:
419 getScreen()->savePlaceIgnoreShaded(! getScreen()->getPlaceIgnoreShaded());
421 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
425 case BScreen::IgnoreMaximized:
427 savePlaceIgnoreMaximized(! getScreen()->getPlaceIgnoreMaximized());
429 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
437 Configmenu::Xineramamenu::Xineramamenu(Configmenu *cm):
438 Basemenu(cm->getScreen()) {
439 setLabel(i18n(ConfigmenuSet, ConfigmenuXineramaSupport, "Xinerama Support"));
442 insert(i18n(ConfigmenuSet, ConfigmenuXineramaPlacement, "Window Placement"),
444 insert(i18n(ConfigmenuSet, ConfigmenuXineramaMaximizing, "Window Maximizing"),
446 insert(i18n(ConfigmenuSet, ConfigmenuXineramaSnapping, "Window Snapping"),
454 void Configmenu::Xineramamenu::setValues(void) {
455 setItemSelected(0, getScreen()->getBlackbox()->doXineramaPlacement());
456 setItemSelected(1, getScreen()->getBlackbox()->doXineramaMaximizing());
457 setItemSelected(2, getScreen()->getBlackbox()->doXineramaSnapping());
461 void Configmenu::Xineramamenu::reconfigure(void) {
463 Basemenu::reconfigure();
467 void Configmenu::Xineramamenu::itemSelected(int button, unsigned int index) {
471 BasemenuItem *item = find(index);
473 if (! item->function())
476 Blackbox *bb = getScreen()->getBlackbox();
478 switch (item->function()) {
479 case 1: // window placement
480 bb->saveXineramaPlacement(! bb->doXineramaPlacement());
481 setItemSelected(0, bb->doXineramaPlacement());
484 case 2: // window maximizing
485 bb->saveXineramaMaximizing(! bb->doXineramaMaximizing());
486 setItemSelected(1, bb->doXineramaMaximizing());
489 case 3: // window snapping
490 bb->saveXineramaSnapping(! bb->doXineramaSnapping());
491 setItemSelected(2, bb->doXineramaSnapping());