]> Dogcows Code - chaz/openbox/blob - src/Configmenu.cc
merged with 2_1-merged-to-HEAD-2002-09-30
[chaz/openbox] / src / Configmenu.cc
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)
5 //
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:
12 //
13 // The above copyright notice and this permission notice shall be included in
14 // all copies or substantial portions of the Software.
15 //
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.
23
24 #ifdef HAVE_CONFIG_H
25 # include "../config.h"
26 #endif // HAVE_CONFIG_H
27
28 #include "i18n.hh"
29 #include "Configmenu.hh"
30 #include "Image.hh"
31 #include "Toolbar.hh"
32 #include "Window.hh"
33 #include "Screen.hh"
34
35 Configmenu::Configmenu(BScreen *scr) : Basemenu(scr) {
36 setLabel(i18n(ConfigmenuSet, ConfigmenuConfigOptions, "Config Options"));
37 setInternalMenu();
38
39 focusmenu = new Focusmenu(this);
40 placementmenu = new Placementmenu(this);
41 windowsnapmenu = new WindowToWindowSnapmenu(this);
42 edgesnapmenu = new WindowToEdgeSnapmenu(this);
43 #ifdef XINERAMA
44 xineramamenu = new Xineramamenu(this);
45 #endif // XINERAMA
46 #ifdef XFT
47 xftmenu = new Xftmenu(this);
48 #endif // XFT
49
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);
58 #ifdef XINERAMA
59 insert(i18n(ConfigmenuSet, ConfigmenuXineramaSupport,
60 "XineramaSupport"), xineramamenu);
61 #endif // XINERAMA
62 #ifdef XFT
63 insert(i18n(ConfigmenuSet, ConfigmenuXftOptions,
64 "Xft Font Options"), xftmenu);
65 #endif // XINERAMA
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,
81 "Hide Toolbar"), 8);
82 update();
83 setValues();
84 }
85
86
87 void Configmenu::setValues(void) {
88 int index = 4;
89 #ifdef XINERAMA
90 ++index;
91 #endif // XINERAMA
92 #ifdef XFT
93 ++index;
94 #endif // XFT
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());
103 }
104
105
106 Configmenu::~Configmenu(void) {
107 delete focusmenu;
108 delete placementmenu;
109 delete windowsnapmenu;
110 delete edgesnapmenu;
111 #ifdef XINERAMA
112 delete xineramamenu;
113 #endif // XINERAMA
114 #ifdef XFT
115 delete xftmenu;
116 #endif // XFT
117 }
118
119
120 void Configmenu::itemSelected(int button, unsigned int index) {
121 if (button != 1)
122 return;
123
124 BasemenuItem *item = find(index);
125
126 if (! item->function())
127 return;
128
129 switch(item->function()) {
130 case 1: // dither
131 getScreen()->saveImageDither(! getScreen()->doImageDither());
132 setItemSelected(index, getScreen()->doImageDither());
133 break;
134
135 case 2: // opaque move
136 getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove());
137 setItemSelected(index, getScreen()->doOpaqueMove());
138 break;
139
140 case 3: // workspace wrapping
141 getScreen()->saveWorkspaceWarping(! getScreen()->doWorkspaceWarping());
142 setItemSelected(index, getScreen()->doWorkspaceWarping());
143 break;
144
145 case 4: // full maximization
146 getScreen()->saveFullMax(! getScreen()->doFullMax());
147 setItemSelected(index, getScreen()->doFullMax());
148 break;
149
150 case 5: // focus new windows
151 getScreen()->saveFocusNew(! getScreen()->doFocusNew());
152 setItemSelected(index, getScreen()->doFocusNew());
153 break;
154
155 case 6: // focus last window on workspace
156 getScreen()->saveFocusLast(! getScreen()->doFocusLast());
157 setItemSelected(index, getScreen()->doFocusLast());
158 break;
159
160 case 7: // disable mouse bindings with Scroll Lock
161 getScreen()->saveAllowScrollLock(! getScreen()->allowScrollLock());
162 setItemSelected(index, getScreen()->allowScrollLock());
163 getScreen()->reconfigure();
164 break;
165
166 case 8: // hide toolbar
167 getScreen()->saveHideToolbar(! getScreen()->doHideToolbar());
168 setItemSelected(index, getScreen()->doHideToolbar());
169 break;
170 }
171 }
172
173
174 void Configmenu::reconfigure(void) {
175 setValues();
176 focusmenu->reconfigure();
177 placementmenu->reconfigure();
178 windowsnapmenu->reconfigure();
179 edgesnapmenu->reconfigure();
180 #ifdef XINERAMA
181 xineramamenu->reconfigure();
182 #endif // XINERAMA
183 #ifdef XFT
184 xftmenu->reconfigure();
185 #endif // XFT
186
187 Basemenu::reconfigure();
188 }
189
190
191 Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) {
192 setLabel(i18n(ConfigmenuSet, ConfigmenuFocusModel, "Focus Model"));
193 setInternalMenu();
194
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);
199 update();
200 setValues();
201 }
202
203
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());
211 }
212
213
214 void Configmenu::Focusmenu::reconfigure(void) {
215 setValues();
216 Basemenu::reconfigure();
217 }
218
219
220 void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
221 if (button != 1)
222 return;
223
224 BasemenuItem *item = find(index);
225
226 if (! item->function())
227 return;
228
229 switch (item->function()) {
230 case 1: // click to focus
231 getScreen()->toggleFocusModel(BScreen::ClickToFocus);
232 break;
233
234 case 2: // sloppy focus
235 getScreen()->toggleFocusModel(BScreen::SloppyFocus);
236 break;
237
238 case 3: // auto raise with sloppy focus
239 getScreen()->saveAutoRaise(! getScreen()->doAutoRaise());
240 break;
241
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);
246 break;
247 }
248 setValues();
249 }
250
251
252 Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
253 Basemenu(cm->getScreen()) {
254 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement"));
255 setInternalMenu();
256
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"),
268 BScreen::LeftRight);
269 insert(i18n(ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"),
270 BScreen::RightLeft);
271 insert(i18n(ConfigmenuSet, ConfigmenuTopBottom, "Top to Bottom"),
272 BScreen::TopBottom);
273 insert(i18n(ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"),
274 BScreen::BottomTop);
275 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreShaded, "Ignore Shaded Windows"),
276 BScreen::IgnoreShaded);
277 insert(i18n(ConfigmenuSet, ConfigmenuIgnoreMax,
278 "Ignore Full-Maximized Windows"),
279 BScreen::IgnoreMaximized);
280 update();
281 setValues();
282 }
283
284
285 void Configmenu::Placementmenu::setValues(void) {
286 int placement = getScreen()->getPlacementPolicy();
287
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);
293
294 bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight),
295 tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom),
296 e = (placement == BScreen::RowSmartPlacement ||
297 placement == BScreen::ColSmartPlacement);
298
299 setItemSelected(5, rl);
300 setItemSelected(6, ! rl);
301 setItemEnabled(5, e);
302 setItemEnabled(6, e);
303
304 setItemSelected(7, tb);
305 setItemSelected(8, ! tb);
306 setItemEnabled(7, e);
307 setItemEnabled(8, e);
308
309 setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
310 setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
311 setItemEnabled(9, e);
312 setItemEnabled(10, e);
313 }
314
315
316 void Configmenu::Placementmenu::reconfigure(void) {
317 setValues();
318 Basemenu::reconfigure();
319 }
320
321
322 void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) {
323 if (button != 1)
324 return;
325
326 BasemenuItem *item = find(index);
327
328 if (! item->function())
329 return;
330
331 switch (item->function()) {
332 case BScreen::RowSmartPlacement:
333 getScreen()->savePlacementPolicy(item->function());
334 break;
335
336 case BScreen::ColSmartPlacement:
337 getScreen()->savePlacementPolicy(item->function());
338 break;
339
340 case BScreen::CascadePlacement:
341 getScreen()->savePlacementPolicy(item->function());
342 break;
343
344 case BScreen::UnderMousePlacement:
345 getScreen()->savePlacementPolicy(item->function());
346 break;
347
348 case BScreen::ClickMousePlacement:
349 getScreen()->savePlacementPolicy(item->function());
350 break;
351
352 case BScreen::LeftRight:
353 getScreen()->saveRowPlacementDirection(BScreen::LeftRight);
354 break;
355
356 case BScreen::RightLeft:
357 getScreen()->saveRowPlacementDirection(BScreen::RightLeft);
358 break;
359
360 case BScreen::TopBottom:
361 getScreen()->saveColPlacementDirection(BScreen::TopBottom);
362 break;
363
364 case BScreen::BottomTop:
365 getScreen()->saveColPlacementDirection(BScreen::BottomTop);
366 break;
367
368 case BScreen::IgnoreShaded:
369 getScreen()->savePlaceIgnoreShaded(! getScreen()->getPlaceIgnoreShaded());
370 break;
371
372 case BScreen::IgnoreMaximized:
373 getScreen()->
374 savePlaceIgnoreMaximized(! getScreen()->getPlaceIgnoreMaximized());
375 break;
376 }
377 setValues();
378 }
379
380
381 Configmenu::WindowToWindowSnapmenu::WindowToWindowSnapmenu(Configmenu *cm) :
382 Basemenu(cm->getScreen()) {
383 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowToWindowSnap,
384 "Window-To-Window Snapping"));
385 setInternalMenu();
386
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);
393 update();
394 setValues();
395 }
396
397
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));
405
406 setItemEnabled(3, getScreen()->getWindowToWindowSnap());
407 setItemSelected(3, getScreen()->getWindowCornerSnap());
408 }
409
410
411 void Configmenu::WindowToWindowSnapmenu::reconfigure(void) {
412 setValues();
413 Basemenu::reconfigure();
414 }
415
416
417 void Configmenu::WindowToWindowSnapmenu::itemSelected(int button, unsigned int index) {
418 if (button != 1)
419 return;
420
421 BasemenuItem *item = find(index);
422
423 if (! item->function())
424 return;
425
426 switch (item->function()) {
427 case 1: // none
428 getScreen()->saveWindowToWindowSnap(BScreen::WindowNoSnap);
429 break;
430
431 case 2: // edge snapping
432 getScreen()->saveWindowToWindowSnap(BScreen::WindowSnap);
433 break;
434
435 case 3: // edge resistance
436 getScreen()->saveWindowToWindowSnap(BScreen::WindowResistance);
437 break;
438
439 case 4: // window corner snapping
440 getScreen()->saveWindowCornerSnap(! getScreen()->getWindowCornerSnap());
441 break;
442
443 }
444 setValues();
445 }
446
447
448 Configmenu::WindowToEdgeSnapmenu::WindowToEdgeSnapmenu(Configmenu *cm) :
449 Basemenu(cm->getScreen()) {
450 setLabel(i18n(ConfigmenuSet, ConfigmenuWindowToEdgeSnap,
451 "Window-To-Edge Snapping"));
452 setInternalMenu();
453
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);
458 update();
459 setValues();
460 }
461
462
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));
470 }
471
472
473 void Configmenu::WindowToEdgeSnapmenu::reconfigure(void) {
474 setValues();
475 Basemenu::reconfigure();
476 }
477
478
479 void Configmenu::WindowToEdgeSnapmenu::itemSelected(int button, unsigned int index) {
480 if (button != 1)
481 return;
482
483 BasemenuItem *item = find(index);
484
485 if (! item->function())
486 return;
487
488 switch (item->function()) {
489 case 1: // none
490 getScreen()->saveWindowToEdgeSnap(BScreen::WindowNoSnap);
491 break;
492
493 case 2: // edge snapping
494 getScreen()->saveWindowToEdgeSnap(BScreen::WindowSnap);
495 break;
496
497 case 3: // edge resistance
498 getScreen()->saveWindowToEdgeSnap(BScreen::WindowResistance);
499 break;
500 }
501 setValues();
502 }
503
504
505 #ifdef XINERAMA
506 Configmenu::Xineramamenu::Xineramamenu(Configmenu *cm):
507 Basemenu(cm->getScreen()) {
508 setLabel(i18n(ConfigmenuSet, ConfigmenuXineramaSupport, "Xinerama Support"));
509 setInternalMenu();
510
511 insert(i18n(ConfigmenuSet, ConfigmenuXineramaPlacement, "Window Placement"),
512 1);
513 insert(i18n(ConfigmenuSet, ConfigmenuXineramaMaximizing, "Window Maximizing"),
514 2);
515 insert(i18n(ConfigmenuSet, ConfigmenuXineramaSnapping, "Window Snapping"),
516 3);
517
518 update();
519 setValues();
520 }
521
522
523 void Configmenu::Xineramamenu::setValues(void) {
524 setItemSelected(0, getScreen()->getBlackbox()->doXineramaPlacement());
525 setItemSelected(1, getScreen()->getBlackbox()->doXineramaMaximizing());
526 setItemSelected(2, getScreen()->getBlackbox()->doXineramaSnapping());
527 }
528
529
530 void Configmenu::Xineramamenu::reconfigure(void) {
531 setValues();
532 Basemenu::reconfigure();
533 }
534
535
536 void Configmenu::Xineramamenu::itemSelected(int button, unsigned int index) {
537 if (button != 1)
538 return;
539
540 BasemenuItem *item = find(index);
541
542 if (! item->function())
543 return;
544
545 Blackbox *bb = getScreen()->getBlackbox();
546
547 switch (item->function()) {
548 case 1: // window placement
549 bb->saveXineramaPlacement(! bb->doXineramaPlacement());
550 setItemSelected(0, bb->doXineramaPlacement());
551 break;
552
553 case 2: // window maximizing
554 bb->saveXineramaMaximizing(! bb->doXineramaMaximizing());
555 setItemSelected(1, bb->doXineramaMaximizing());
556 break;
557
558 case 3: // window snapping
559 bb->saveXineramaSnapping(! bb->doXineramaSnapping());
560 setItemSelected(2, bb->doXineramaSnapping());
561 break;
562 }
563 }
564 #endif // XINERAMA
565
566 #ifdef XFT
567 Configmenu::Xftmenu::Xftmenu(Configmenu *cm):
568 Basemenu(cm->getScreen()) {
569 setLabel(i18n(ConfigmenuSet, ConfigmenuXftOptions, "Xft Font Options"));
570 setInternalMenu();
571
572 insert(i18n(ConfigmenuSet, ConfigmenuXftAA, "Anti-Alias Text"), 1);
573 insert(i18n(ConfigmenuSet, ConfigmenuXftShadow, "Drop Shadows Under Text"),
574 2);
575
576 update();
577 setValues();
578 }
579
580
581 void Configmenu::Xftmenu::setValues(void) {
582 setItemSelected(0, getScreen()->doAAFonts());
583 setItemEnabled(1, getScreen()->doAAFonts());
584 setItemSelected(1, getScreen()->doShadowFonts());
585 }
586
587
588 void Configmenu::Xftmenu::reconfigure(void) {
589 setValues();
590 Basemenu::reconfigure();
591 }
592
593
594 void Configmenu::Xftmenu::itemSelected(int button, unsigned int index) {
595 if (button != 1)
596 return;
597
598 BasemenuItem *item = find(index);
599
600 if (! item->function())
601 return;
602
603 switch (item->function()) {
604 case 1: // anti-alias text
605 getScreen()->saveAAFonts(! getScreen()->doAAFonts());
606 break;
607
608 case 2: // drop shadows
609 getScreen()->saveShadowFonts(! getScreen()->doShadowFonts());
610 break;
611 }
612
613 setValues();
614 }
615 #endif // XFT
This page took 0.061646 seconds and 4 git commands to generate.