]> icculus.org git repositories - dana/openbox.git/blob - src/Configmenu.cc
some fixes for the new "Raise on Move/Resize" option
[dana/openbox.git] / 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, ConfigmenuModMove,
71               "Raise Window on Move/Resize"), 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,
83               "Hide Toolbar"), 9);
84   update();
85   setValues();
86 }
87
88
89 void Configmenu::setValues(void) {
90   int index = 4;
91 #ifdef    XINERAMA
92   ++index;
93 #endif // XINERAMA
94 #ifdef    XFT
95   ++index;
96 #endif // XFT
97   setItemSelected(index++, getScreen()->doImageDither());
98   setItemSelected(index++, getScreen()->doOpaqueMove());
99   setItemSelected(index++, getScreen()->doRaiseOnMoveResize());
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());
106 }
107
108
109 Configmenu::~Configmenu(void) {
110   delete focusmenu;
111   delete placementmenu;
112   delete windowsnapmenu;
113   delete edgesnapmenu;
114 #ifdef    XINERAMA
115   delete xineramamenu;
116 #endif // XINERAMA
117 #ifdef    XFT
118   delete xftmenu;
119 #endif // XFT
120 }
121
122
123 void Configmenu::itemSelected(int button, unsigned int index) {
124   if (button != 1)
125     return;
126
127   BasemenuItem *item = find(index);
128
129   if (! item->function())
130     return;
131
132   switch(item->function()) {
133   case 1: // dither
134     getScreen()->saveImageDither(! getScreen()->doImageDither());
135     setItemSelected(index, getScreen()->doImageDither());
136     break;
137
138   case 2: // opaque move
139     getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove());
140     setItemSelected(index, getScreen()->doOpaqueMove());
141     break;
142
143   case 3: // raise on alt-move
144     getScreen()->saveRaiseOnMoveResize(! getScreen()->doRaiseOnMoveResize());
145     setItemSelected(index, getScreen()->doRaiseOnMoveResize());
146
147   case 4: // workspace wrapping
148     getScreen()->saveWorkspaceWarping(! getScreen()->doWorkspaceWarping());
149     setItemSelected(index, getScreen()->doWorkspaceWarping());
150     break;
151
152   case 5: // full maximization
153     getScreen()->saveFullMax(! getScreen()->doFullMax());
154     setItemSelected(index, getScreen()->doFullMax());
155     break;
156
157   case 6: // focus new windows
158     getScreen()->saveFocusNew(! getScreen()->doFocusNew());
159     setItemSelected(index, getScreen()->doFocusNew());
160     break;
161
162   case 7: // focus last window on workspace
163     getScreen()->saveFocusLast(! getScreen()->doFocusLast());
164     setItemSelected(index, getScreen()->doFocusLast());
165     break;
166
167   case 8: // disable mouse bindings with Scroll Lock
168     getScreen()->saveAllowScrollLock(! getScreen()->allowScrollLock());
169     setItemSelected(index, getScreen()->allowScrollLock());
170     getScreen()->reconfigure();
171     break;
172
173   case 9: // hide toolbar
174     getScreen()->saveHideToolbar(! getScreen()->doHideToolbar());
175     setItemSelected(index, getScreen()->doHideToolbar());
176     break;
177   }
178 }
179
180
181 void Configmenu::reconfigure(void) {
182   setValues();
183   focusmenu->reconfigure();
184   placementmenu->reconfigure();
185   windowsnapmenu->reconfigure();
186   edgesnapmenu->reconfigure();
187 #ifdef    XINERAMA
188   xineramamenu->reconfigure();
189 #endif // XINERAMA
190 #ifdef    XFT
191   xftmenu->reconfigure();
192 #endif // XFT
193
194   Basemenu::reconfigure();
195 }
196
197
198 Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) {
199   setLabel(i18n(ConfigmenuSet, ConfigmenuFocusModel, "Focus Model"));
200   setInternalMenu();
201
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);
206   update();
207   setValues();
208 }
209
210
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());
218 }
219
220
221 void Configmenu::Focusmenu::reconfigure(void) {
222   setValues();
223   Basemenu::reconfigure();
224 }
225
226
227 void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
228   if (button != 1)
229     return;
230
231   BasemenuItem *item = find(index);
232
233   if (! item->function())
234     return;
235
236   switch (item->function()) {
237   case 1: // click to focus
238     getScreen()->toggleFocusModel(BScreen::ClickToFocus);
239     break;
240
241   case 2: // sloppy focus
242     getScreen()->toggleFocusModel(BScreen::SloppyFocus);
243     break;
244
245   case 3: // auto raise with sloppy focus
246     getScreen()->saveAutoRaise(! getScreen()->doAutoRaise());
247     break;
248
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);
253     break;
254   }
255   setValues();
256 }
257
258
259 Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
260   Basemenu(cm->getScreen()) {
261   setLabel(i18n(ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement"));
262   setInternalMenu();
263
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"),
275          BScreen::LeftRight);
276   insert(i18n(ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"),
277          BScreen::RightLeft);
278   insert(i18n(ConfigmenuSet, ConfigmenuTopBottom, "Top to Bottom"),
279          BScreen::TopBottom);
280   insert(i18n(ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"),
281          BScreen::BottomTop);
282   insert(i18n(ConfigmenuSet, ConfigmenuIgnoreShaded, "Ignore Shaded Windows"),
283          BScreen::IgnoreShaded);
284   insert(i18n(ConfigmenuSet, ConfigmenuIgnoreMax,
285               "Ignore Full-Maximized Windows"),
286          BScreen::IgnoreMaximized);
287   update();
288   setValues();
289 }
290
291
292 void Configmenu::Placementmenu::setValues(void) {
293   int placement = getScreen()->getPlacementPolicy();
294   
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);
300
301   bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight),
302        tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom),
303        e = (placement == BScreen::RowSmartPlacement ||
304             placement == BScreen::ColSmartPlacement);
305
306   setItemSelected(5, rl);
307   setItemSelected(6, ! rl);
308   setItemEnabled(5, e);
309   setItemEnabled(6, e);
310
311   setItemSelected(7, tb);
312   setItemSelected(8, ! tb);
313   setItemEnabled(7, e);
314   setItemEnabled(8, e);
315   
316   setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
317   setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
318   setItemEnabled(9, e);
319   setItemEnabled(10, e);
320 }
321
322
323 void Configmenu::Placementmenu::reconfigure(void) {
324   setValues();
325   Basemenu::reconfigure();
326 }
327
328
329 void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) {
330   if (button != 1)
331     return;
332
333   BasemenuItem *item = find(index);
334
335   if (! item->function())
336     return;
337
338   switch (item->function()) {
339   case BScreen::RowSmartPlacement:
340     getScreen()->savePlacementPolicy(item->function());
341     break;
342
343   case BScreen::ColSmartPlacement:
344     getScreen()->savePlacementPolicy(item->function());
345     break;
346
347   case BScreen::CascadePlacement:
348     getScreen()->savePlacementPolicy(item->function());
349     break;
350
351   case BScreen::UnderMousePlacement:
352     getScreen()->savePlacementPolicy(item->function());
353     break;
354
355   case BScreen::ClickMousePlacement:
356     getScreen()->savePlacementPolicy(item->function());
357     break;
358
359   case BScreen::LeftRight:
360     getScreen()->saveRowPlacementDirection(BScreen::LeftRight);
361     break;
362
363   case BScreen::RightLeft:
364     getScreen()->saveRowPlacementDirection(BScreen::RightLeft);
365     break;
366
367   case BScreen::TopBottom:
368     getScreen()->saveColPlacementDirection(BScreen::TopBottom);
369     break;
370
371   case BScreen::BottomTop:
372     getScreen()->saveColPlacementDirection(BScreen::BottomTop);
373     break;
374   
375   case BScreen::IgnoreShaded:
376     getScreen()->savePlaceIgnoreShaded(! getScreen()->getPlaceIgnoreShaded());
377     break;
378
379   case BScreen::IgnoreMaximized:
380     getScreen()->
381       savePlaceIgnoreMaximized(! getScreen()->getPlaceIgnoreMaximized());
382     break;
383   }
384   setValues();
385 }
386
387
388 Configmenu::WindowToWindowSnapmenu::WindowToWindowSnapmenu(Configmenu *cm) :
389     Basemenu(cm->getScreen()) {
390   setLabel(i18n(ConfigmenuSet, ConfigmenuWindowToWindowSnap,
391                 "Window-To-Window Snapping"));
392   setInternalMenu();
393
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);
400   update();
401   setValues();
402 }
403
404
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));
412
413   setItemEnabled(3, getScreen()->getWindowToWindowSnap());
414   setItemSelected(3, getScreen()->getWindowCornerSnap());
415 }
416
417
418 void Configmenu::WindowToWindowSnapmenu::reconfigure(void) {
419   setValues();
420   Basemenu::reconfigure();
421 }
422
423
424 void Configmenu::WindowToWindowSnapmenu::itemSelected(int button, unsigned int index) {
425   if (button != 1)
426     return;
427
428   BasemenuItem *item = find(index);
429
430   if (! item->function())
431     return;
432
433   switch (item->function()) {
434   case 1: // none
435     getScreen()->saveWindowToWindowSnap(BScreen::WindowNoSnap);
436     break;
437
438   case 2: // edge snapping
439     getScreen()->saveWindowToWindowSnap(BScreen::WindowSnap);
440     break;
441
442   case 3: // edge resistance
443     getScreen()->saveWindowToWindowSnap(BScreen::WindowResistance);
444     break;
445
446   case 4: // window corner snapping
447     getScreen()->saveWindowCornerSnap(! getScreen()->getWindowCornerSnap());
448     break;
449
450   }
451   setValues();
452 }
453
454
455 Configmenu::WindowToEdgeSnapmenu::WindowToEdgeSnapmenu(Configmenu *cm) :
456     Basemenu(cm->getScreen()) {
457   setLabel(i18n(ConfigmenuSet, ConfigmenuWindowToEdgeSnap,
458                 "Window-To-Edge Snapping"));
459   setInternalMenu();
460
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);
465   update();
466   setValues();
467 }
468
469
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));
477 }
478
479
480 void Configmenu::WindowToEdgeSnapmenu::reconfigure(void) {
481   setValues();
482   Basemenu::reconfigure();
483 }
484
485
486 void Configmenu::WindowToEdgeSnapmenu::itemSelected(int button, unsigned int index) {
487   if (button != 1)
488     return;
489
490   BasemenuItem *item = find(index);
491
492   if (! item->function())
493     return;
494
495   switch (item->function()) {
496   case 1: // none
497     getScreen()->saveWindowToEdgeSnap(BScreen::WindowNoSnap);
498     break;
499
500   case 2: // edge snapping
501     getScreen()->saveWindowToEdgeSnap(BScreen::WindowSnap);
502     break;
503
504   case 3: // edge resistance
505     getScreen()->saveWindowToEdgeSnap(BScreen::WindowResistance);
506     break;
507   }
508   setValues();
509 }
510
511
512 #ifdef    XINERAMA
513 Configmenu::Xineramamenu::Xineramamenu(Configmenu *cm):
514   Basemenu(cm->getScreen()) {
515   setLabel(i18n(ConfigmenuSet, ConfigmenuXineramaSupport, "Xinerama Support"));
516   setInternalMenu();
517
518   insert(i18n(ConfigmenuSet, ConfigmenuXineramaPlacement, "Window Placement"),
519          1);
520   insert(i18n(ConfigmenuSet, ConfigmenuXineramaMaximizing, "Window Maximizing"),
521          2);
522   insert(i18n(ConfigmenuSet, ConfigmenuXineramaSnapping, "Window Snapping"),
523          3);
524
525   update();
526   setValues();
527 }
528
529
530 void Configmenu::Xineramamenu::setValues(void) {
531   setItemSelected(0, getScreen()->getBlackbox()->doXineramaPlacement());
532   setItemSelected(1, getScreen()->getBlackbox()->doXineramaMaximizing());
533   setItemSelected(2, getScreen()->getBlackbox()->doXineramaSnapping());
534 }
535
536
537 void Configmenu::Xineramamenu::reconfigure(void) {
538   setValues();
539   Basemenu::reconfigure();
540 }
541
542
543 void Configmenu::Xineramamenu::itemSelected(int button, unsigned int index) {
544   if (button != 1)
545     return;
546
547   BasemenuItem *item = find(index);
548
549   if (! item->function())
550     return;
551
552   Blackbox *bb = getScreen()->getBlackbox();
553
554   switch (item->function()) {
555   case 1: // window placement
556     bb->saveXineramaPlacement(! bb->doXineramaPlacement());
557     setItemSelected(0, bb->doXineramaPlacement());
558     break;
559
560   case 2: // window maximizing
561     bb->saveXineramaMaximizing(! bb->doXineramaMaximizing());
562     setItemSelected(1, bb->doXineramaMaximizing());
563     break;
564
565   case 3: // window snapping
566     bb->saveXineramaSnapping(! bb->doXineramaSnapping());
567     setItemSelected(2, bb->doXineramaSnapping());
568     break;
569   }
570 }
571 #endif // XINERAMA
572
573 #ifdef    XFT
574 Configmenu::Xftmenu::Xftmenu(Configmenu *cm):
575   Basemenu(cm->getScreen()) {
576   setLabel(i18n(ConfigmenuSet, ConfigmenuXftOptions, "Xft Font Options"));
577   setInternalMenu();
578
579   insert(i18n(ConfigmenuSet, ConfigmenuXftAA, "Anti-Alias Text"), 1);
580   insert(i18n(ConfigmenuSet, ConfigmenuXftShadow, "Drop Shadows Under Text"),
581          2);
582
583   update();
584   setValues();
585 }
586
587
588 void Configmenu::Xftmenu::setValues(void) {
589   setItemSelected(0, getScreen()->doAAFonts());
590   setItemEnabled(1, getScreen()->doAAFonts());
591   setItemSelected(1, getScreen()->doShadowFonts());
592 }
593
594
595 void Configmenu::Xftmenu::reconfigure(void) {
596   setValues();
597   Basemenu::reconfigure();
598 }
599
600
601 void Configmenu::Xftmenu::itemSelected(int button, unsigned int index) {
602   if (button != 1)
603     return;
604
605   BasemenuItem *item = find(index);
606
607   if (! item->function())
608     return;
609
610   switch (item->function()) {
611   case 1: // anti-alias text
612     getScreen()->saveAAFonts(! getScreen()->doAAFonts());
613     break;
614
615   case 2: // drop shadows
616     getScreen()->saveShadowFonts(! getScreen()->doShadowFonts());
617     break;
618   }
619
620   setValues();
621 }
622 #endif // XFT