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 insert(i18n(ConfigmenuSet, ConfigmenuFocusModel,
43 "Focus Model"), focusmenu);
44 insert(i18n(ConfigmenuSet, ConfigmenuWindowPlacement,
45 "Window Placement"), placementmenu);
46 insert(i18n(ConfigmenuSet, ConfigmenuImageDithering,
47 "Image Dithering"), 1);
48 insert(i18n(ConfigmenuSet, ConfigmenuOpaqueMove,
49 "Opaque Window Moving"), 2);
50 insert(i18n(ConfigmenuSet, ConfigmenuFullMax,
51 "Full Maximization"), 3);
52 insert(i18n(ConfigmenuSet, ConfigmenuFocusNew,
53 "Focus New Windows"), 4);
54 insert(i18n(ConfigmenuSet, ConfigmenuFocusLast,
55 "Focus Last Window on Workspace"), 5);
56 insert(i18n(ConfigmenuSet, ConfigmenuWindowToWindowSnap,
57 "Window-To-Window Snapping"), 6);
58 insert(i18n(ConfigmenuSet, ConfigmenuWindowCornerSnap,
59 "Window Corner Snapping"), 7);
60 insert(i18n(ConfigmenuSet, ConfigmenuHideToolbar,
67 void Configmenu::setValues(void) {
68 setItemSelected(2, getScreen()->doImageDither());
69 setItemSelected(3, getScreen()->doOpaqueMove());
70 setItemSelected(4, getScreen()->doFullMax());
71 setItemSelected(5, getScreen()->doFocusNew());
72 setItemSelected(6, getScreen()->doFocusLast());
73 setItemSelected(7, getScreen()->getWindowToWindowSnap());
75 setItemSelected(8, getScreen()->getWindowCornerSnap());
76 setItemEnabled(8, getScreen()->getWindowToWindowSnap());
78 setItemSelected(9, getScreen()->doHideToolbar());
82 Configmenu::~Configmenu(void) {
87 void Configmenu::itemSelected(int button, unsigned int index) {
91 BasemenuItem *item = find(index);
93 if (! item->function())
96 switch(item->function()) {
98 getScreen()->saveImageDither(! getScreen()->doImageDither());
99 setItemSelected(index, getScreen()->doImageDither());
102 case 2: // opaque move
103 getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove());
104 setItemSelected(index, getScreen()->doOpaqueMove());
107 case 3: // full maximization
108 getScreen()->saveFullMax(! getScreen()->doFullMax());
109 setItemSelected(index, getScreen()->doFullMax());
112 case 4: // focus new windows
113 getScreen()->saveFocusNew(! getScreen()->doFocusNew());
114 setItemSelected(index, getScreen()->doFocusNew());
117 case 5: // focus last window on workspace
118 getScreen()->saveFocusLast(! getScreen()->doFocusLast());
119 setItemSelected(index, getScreen()->doFocusLast());
122 case 6: // window-to-window snapping
123 getScreen()->saveWindowToWindowSnap(! getScreen()->getWindowToWindowSnap());
124 setItemSelected(index, getScreen()->getWindowToWindowSnap());
125 setItemEnabled(index + 1, getScreen()->getWindowToWindowSnap());
128 case 7: // window corner snapping
129 getScreen()->saveWindowCornerSnap(! getScreen()->getWindowCornerSnap());
130 setItemSelected(index, getScreen()->getWindowCornerSnap());
133 case 8: // hide toolbar
134 getScreen()->saveHideToolbar(! getScreen()->doHideToolbar());
135 setItemSelected(index, getScreen()->doHideToolbar());
141 void Configmenu::reconfigure(void) {
143 focusmenu->reconfigure();
144 placementmenu->reconfigure();
146 Basemenu::reconfigure();
150 Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) {
151 setLabel(i18n(ConfigmenuSet, ConfigmenuFocusModel, "Focus Model"));
154 insert(i18n(ConfigmenuSet, ConfigmenuClickToFocus, "Click To Focus"), 1);
155 insert(i18n(ConfigmenuSet, ConfigmenuSloppyFocus, "Sloppy Focus"), 2);
156 insert(i18n(ConfigmenuSet, ConfigmenuAutoRaise, "Auto Raise"), 3);
157 insert(i18n(ConfigmenuSet, ConfigmenuClickRaise, "Click Raise"), 4);
163 void Configmenu::Focusmenu::setValues(void) {
164 setItemSelected(0, ! getScreen()->isSloppyFocus());
165 setItemSelected(1, getScreen()->isSloppyFocus());
166 setItemEnabled(2, getScreen()->isSloppyFocus());
167 setItemSelected(2, getScreen()->doAutoRaise());
168 setItemEnabled(3, getScreen()->isSloppyFocus());
169 setItemSelected(3, getScreen()->doClickRaise());
173 void Configmenu::Focusmenu::reconfigure(void) {
175 Basemenu::reconfigure();
179 void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
183 BasemenuItem *item = find(index);
185 if (! item->function())
188 switch (item->function()) {
189 case 1: // click to focus
190 getScreen()->toggleFocusModel(BScreen::ClickToFocus);
193 case 2: // sloppy focus
194 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
197 case 3: // auto raise with sloppy focus
198 getScreen()->saveAutoRaise(! getScreen()->doAutoRaise());
201 case 4: // click raise with sloppy focus
202 getScreen()->saveClickRaise(! getScreen()->doClickRaise());
203 // make sure the appropriate mouse buttons are grabbed on the windows
204 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
211 Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
212 Basemenu(cm->getScreen()) {
213 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement"));
216 insert(i18n(ConfigmenuSet, ConfigmenuSmartRows, "Smart Placement (Rows)"),
217 BScreen::RowSmartPlacement);
218 insert(i18n(ConfigmenuSet, ConfigmenuSmartCols, "Smart Placement (Columns)"),
219 BScreen::ColSmartPlacement);
220 insert(i18n(ConfigmenuSet, ConfigmenuCascade, "Cascade Placement"),
221 BScreen::CascadePlacement);
222 insert(i18n(ConfigmenuSet, ConfigmenuUnderMouse, "Under Mouse Placement"),
223 BScreen::UnderMousePlacement);
224 insert(i18n(ConfigmenuSet, ConfigmenuClickMouse, "Click Mouse Placement"),
225 BScreen::ClickMousePlacement);
226 insert(i18n(ConfigmenuSet, ConfigmenuLeftRight, "Left to Right"),
228 insert(i18n(ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"),
230 insert(i18n(ConfigmenuSet, ConfigmenuTopBottom, "Top to Bottom"),
232 insert(i18n(ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"),
234 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreShaded, "Ignore shaded windows"),
235 BScreen::IgnoreShaded);
236 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreMax,
237 "Ignore full-maximized windows"),
238 BScreen::IgnoreMaximized);
244 void Configmenu::Placementmenu::setValues(void) {
245 int placement = getScreen()->getPlacementPolicy();
247 setItemSelected(0, placement == BScreen::RowSmartPlacement);
248 setItemSelected(1, placement == BScreen::ColSmartPlacement);
249 setItemSelected(2, placement == BScreen::CascadePlacement);
250 setItemSelected(3, placement == BScreen::UnderMousePlacement);
251 setItemSelected(4, placement == BScreen::ClickMousePlacement);
253 bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight),
254 tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom),
255 e = placement != BScreen::UnderMousePlacement;
257 setItemSelected(5, rl);
258 setItemSelected(6, ! rl);
259 setItemEnabled(5, e);
260 setItemEnabled(6, e);
262 setItemSelected(7, tb);
263 setItemSelected(8, ! tb);
264 setItemEnabled(7, e);
265 setItemEnabled(8, e);
267 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
268 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
272 void Configmenu::Placementmenu::reconfigure(void) {
274 Basemenu::reconfigure();
278 void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) {
282 BasemenuItem *item = find(index);
284 if (! item->function())
287 switch (item->function()) {
288 case BScreen::RowSmartPlacement:
289 getScreen()->savePlacementPolicy(item->function());
291 setItemSelected(0, true);
292 setItemSelected(1, false);
293 setItemSelected(2, false);
294 setItemSelected(3, false);
295 setItemSelected(4, false);
296 setItemEnabled(5, true);
297 setItemEnabled(6, true);
298 setItemEnabled(7, true);
299 setItemEnabled(8, true);
303 case BScreen::ColSmartPlacement:
304 getScreen()->savePlacementPolicy(item->function());
306 setItemSelected(0, false);
307 setItemSelected(1, true);
308 setItemSelected(2, false);
309 setItemSelected(3, false);
310 setItemSelected(4, false);
311 setItemEnabled(5, true);
312 setItemEnabled(6, true);
313 setItemEnabled(7, true);
314 setItemEnabled(8, true);
318 case BScreen::CascadePlacement:
319 getScreen()->savePlacementPolicy(item->function());
321 setItemSelected(0, false);
322 setItemSelected(1, false);
323 setItemSelected(2, true);
324 setItemSelected(3, false);
325 setItemSelected(4, false);
326 setItemEnabled(5, true);
327 setItemEnabled(6, true);
328 setItemEnabled(7, true);
329 setItemEnabled(8, true);
333 case BScreen::UnderMousePlacement:
334 getScreen()->savePlacementPolicy(item->function());
336 setItemSelected(0, false);
337 setItemSelected(1, false);
338 setItemSelected(2, false);
339 setItemSelected(3, true);
340 setItemSelected(4, false);
341 setItemEnabled(5, false);
342 setItemEnabled(6, false);
343 setItemEnabled(7, false);
344 setItemEnabled(8, false);
348 case BScreen::ClickMousePlacement:
349 getScreen()->savePlacementPolicy(item->function());
351 setItemSelected(0, false);
352 setItemSelected(1, false);
353 setItemSelected(2, false);
354 setItemSelected(3, false);
355 setItemSelected(4, true);
356 setItemEnabled(5, false);
357 setItemEnabled(6, false);
358 setItemEnabled(7, false);
359 setItemEnabled(8, false);
363 case BScreen::LeftRight:
364 getScreen()->saveRowPlacementDirection(BScreen::LeftRight);
366 setItemSelected(5, true);
367 setItemSelected(6, false);
371 case BScreen::RightLeft:
372 getScreen()->saveRowPlacementDirection(BScreen::RightLeft);
374 setItemSelected(5, false);
375 setItemSelected(6, true);
379 case BScreen::TopBottom:
380 getScreen()->saveColPlacementDirection(BScreen::TopBottom);
382 setItemSelected(7, true);
383 setItemSelected(8, false);
387 case BScreen::BottomTop:
388 getScreen()->saveColPlacementDirection(BScreen::BottomTop);
390 setItemSelected(7, false);
391 setItemSelected(8, true);
395 case BScreen::IgnoreShaded:
396 getScreen()->savePlaceIgnoreShaded(! getScreen()->getPlaceIgnoreShaded());
398 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
402 case BScreen::IgnoreMaximized:
404 savePlaceIgnoreMaximized(! getScreen()->getPlaceIgnoreMaximized());
406 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());