merged with 2_1-merged-to-HEAD-2002-09-30
[mikachu/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, 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