]> icculus.org git repositories - mikachu/openbox.git/blob - src/Configmenu.cc
make work without --enable-xinerama
[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
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, ConfigmenuDisableBindings,
61               "Disable Mouse with Scroll Lock"), 8);
62   insert(i18n(ConfigmenuSet, ConfigmenuHideToolbar,
63               "Hide Toolbar"), 9);
64   update();
65   setValues();
66 }
67
68
69 void Configmenu::setValues(void) {
70   setItemSelected(2, getScreen()->doImageDither());
71   setItemSelected(3, getScreen()->doOpaqueMove());
72   setItemSelected(4, getScreen()->doFullMax());
73   setItemSelected(5, getScreen()->doFocusNew());
74   setItemSelected(6, getScreen()->doFocusLast());
75   setItemSelected(7, getScreen()->getWindowToWindowSnap());
76
77   setItemSelected(8, getScreen()->getWindowCornerSnap());
78   setItemEnabled(8, getScreen()->getWindowToWindowSnap());
79   
80   setItemSelected(9, getScreen()->allowScrollLock());
81   setItemSelected(10, getScreen()->doHideToolbar());
82 }
83
84
85 Configmenu::~Configmenu(void) {
86   delete focusmenu;
87   delete placementmenu;
88 }
89
90
91 void Configmenu::itemSelected(int button, unsigned int index) {
92   if (button != 1)
93     return;
94
95   BasemenuItem *item = find(index);
96
97   if (! item->function())
98     return;
99
100   switch(item->function()) {
101   case 1: // dither
102     getScreen()->saveImageDither(! getScreen()->doImageDither());
103     setItemSelected(index, getScreen()->doImageDither());
104     break;
105
106   case 2: // opaque move
107     getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove());
108     setItemSelected(index, getScreen()->doOpaqueMove());
109     break;
110
111   case 3: // full maximization
112     getScreen()->saveFullMax(! getScreen()->doFullMax());
113     setItemSelected(index, getScreen()->doFullMax());
114     break;
115
116   case 4: // focus new windows
117     getScreen()->saveFocusNew(! getScreen()->doFocusNew());
118     setItemSelected(index, getScreen()->doFocusNew());
119     break;
120
121   case 5: // focus last window on workspace
122     getScreen()->saveFocusLast(! getScreen()->doFocusLast());
123     setItemSelected(index, getScreen()->doFocusLast());
124     break;
125
126   case 6: // window-to-window snapping
127     getScreen()->saveWindowToWindowSnap(! getScreen()->getWindowToWindowSnap());
128     setItemSelected(index, getScreen()->getWindowToWindowSnap());
129     setItemEnabled(index + 1, getScreen()->getWindowToWindowSnap());
130     break;
131
132   case 7: // window corner snapping
133     getScreen()->saveWindowCornerSnap(! getScreen()->getWindowCornerSnap());
134     setItemSelected(index, getScreen()->getWindowCornerSnap());
135     break;
136
137   case 8: // disable mouse bindings with Scroll Lock
138     getScreen()->saveAllowScrollLock(! getScreen()->allowScrollLock());
139     setItemSelected(index, getScreen()->allowScrollLock());
140     getScreen()->reconfigure();
141     break;
142
143   case 9: // hide toolbar
144     getScreen()->saveHideToolbar(! getScreen()->doHideToolbar());
145     setItemSelected(index, getScreen()->doHideToolbar());
146     break;
147   }
148 }
149
150
151 void Configmenu::reconfigure(void) {
152   setValues();
153   focusmenu->reconfigure();
154   placementmenu->reconfigure();
155
156   Basemenu::reconfigure();
157 }
158
159
160 Configmenu::Focusmenu::Focusmenu(Configmenu *cm) : Basemenu(cm->getScreen()) {
161   setLabel(i18n(ConfigmenuSet, ConfigmenuFocusModel, "Focus Model"));
162   setInternalMenu();
163
164   insert(i18n(ConfigmenuSet, ConfigmenuClickToFocus, "Click To Focus"), 1);
165   insert(i18n(ConfigmenuSet, ConfigmenuSloppyFocus, "Sloppy Focus"), 2);
166   insert(i18n(ConfigmenuSet, ConfigmenuAutoRaise, "Auto Raise"), 3);
167   insert(i18n(ConfigmenuSet, ConfigmenuClickRaise, "Click Raise"), 4);
168   update();
169   setValues();
170 }
171
172
173 void Configmenu::Focusmenu::setValues(void) {
174   setItemSelected(0, ! getScreen()->isSloppyFocus());
175   setItemSelected(1, getScreen()->isSloppyFocus());
176   setItemEnabled(2, getScreen()->isSloppyFocus());
177   setItemSelected(2, getScreen()->doAutoRaise());
178   setItemEnabled(3, getScreen()->isSloppyFocus());
179   setItemSelected(3, getScreen()->doClickRaise());
180 }
181
182
183 void Configmenu::Focusmenu::reconfigure(void) {
184   setValues();
185   Basemenu::reconfigure();
186 }
187
188
189 void Configmenu::Focusmenu::itemSelected(int button, unsigned int index) {
190   if (button != 1)
191     return;
192
193   BasemenuItem *item = find(index);
194
195   if (! item->function())
196     return;
197
198   switch (item->function()) {
199   case 1: // click to focus
200     getScreen()->toggleFocusModel(BScreen::ClickToFocus);
201     break;
202
203   case 2: // sloppy focus
204     getScreen()->toggleFocusModel(BScreen::SloppyFocus);
205     break;
206
207   case 3: // auto raise with sloppy focus
208     getScreen()->saveAutoRaise(! getScreen()->doAutoRaise());
209     break;
210
211   case 4: // click raise with sloppy focus
212     getScreen()->saveClickRaise(! getScreen()->doClickRaise());
213     // make sure the appropriate mouse buttons are grabbed on the windows
214     getScreen()->toggleFocusModel(BScreen::SloppyFocus);
215     break;
216   }
217   setValues();
218 }
219
220
221 Configmenu::Placementmenu::Placementmenu(Configmenu *cm):
222   Basemenu(cm->getScreen()) {
223   setLabel(i18n(ConfigmenuSet, ConfigmenuWindowPlacement, "Window Placement"));
224   setInternalMenu();
225
226   insert(i18n(ConfigmenuSet, ConfigmenuSmartRows, "Smart Placement (Rows)"),
227          BScreen::RowSmartPlacement);
228   insert(i18n(ConfigmenuSet, ConfigmenuSmartCols, "Smart Placement (Columns)"),
229          BScreen::ColSmartPlacement);
230   insert(i18n(ConfigmenuSet, ConfigmenuCascade, "Cascade Placement"),
231          BScreen::CascadePlacement);
232   insert(i18n(ConfigmenuSet, ConfigmenuUnderMouse, "Under Mouse Placement"),
233          BScreen::UnderMousePlacement);
234   insert(i18n(ConfigmenuSet, ConfigmenuClickMouse, "Click Mouse Placement"),
235          BScreen::ClickMousePlacement);
236   insert(i18n(ConfigmenuSet, ConfigmenuLeftRight, "Left to Right"),
237          BScreen::LeftRight);
238   insert(i18n(ConfigmenuSet, ConfigmenuRightLeft, "Right to Left"),
239          BScreen::RightLeft);
240   insert(i18n(ConfigmenuSet, ConfigmenuTopBottom, "Top to Bottom"),
241          BScreen::TopBottom);
242   insert(i18n(ConfigmenuSet, ConfigmenuBottomTop, "Bottom to Top"),
243          BScreen::BottomTop);
244   insert(i18n(ConfigmenuSet, ConfigmenuIgnoreShaded, "Ignore Shaded Windows"),
245          BScreen::IgnoreShaded);
246   insert(i18n(ConfigmenuSet, ConfigmenuIgnoreMax,
247               "Ignore Full-Maximized Windows"),
248          BScreen::IgnoreMaximized);
249   update();
250   setValues();
251 }
252
253
254 void Configmenu::Placementmenu::setValues(void) {
255   int placement = getScreen()->getPlacementPolicy();
256   
257   setItemSelected(0, placement == BScreen::RowSmartPlacement);
258   setItemSelected(1, placement == BScreen::ColSmartPlacement);
259   setItemSelected(2, placement == BScreen::CascadePlacement);
260   setItemSelected(3, placement == BScreen::UnderMousePlacement);
261   setItemSelected(4, placement == BScreen::ClickMousePlacement);
262
263   bool rl = (getScreen()->getRowPlacementDirection() == BScreen::LeftRight),
264        tb = (getScreen()->getColPlacementDirection() == BScreen::TopBottom),
265        e = placement != BScreen::UnderMousePlacement;
266
267   setItemSelected(5, rl);
268   setItemSelected(6, ! rl);
269   setItemEnabled(5, e);
270   setItemEnabled(6, e);
271
272   setItemSelected(7, tb);
273   setItemSelected(8, ! tb);
274   setItemEnabled(7, e);
275   setItemEnabled(8, e);
276   
277   setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
278   setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
279 }
280
281
282 void Configmenu::Placementmenu::reconfigure(void) {
283   setValues();
284   Basemenu::reconfigure();
285 }
286
287
288 void Configmenu::Placementmenu::itemSelected(int button, unsigned int index) {
289   if (button != 1)
290     return;
291
292   BasemenuItem *item = find(index);
293
294   if (! item->function())
295     return;
296
297   switch (item->function()) {
298   case BScreen::RowSmartPlacement:
299     getScreen()->savePlacementPolicy(item->function());
300
301     setItemSelected(0, true);
302     setItemSelected(1, false);
303     setItemSelected(2, false);
304     setItemSelected(3, false);
305     setItemSelected(4, false);
306     setItemEnabled(5, true);
307     setItemEnabled(6, true);
308     setItemEnabled(7, true);
309     setItemEnabled(8, true);
310
311     break;
312
313   case BScreen::ColSmartPlacement:
314     getScreen()->savePlacementPolicy(item->function());
315
316     setItemSelected(0, false);
317     setItemSelected(1, true);
318     setItemSelected(2, false);
319     setItemSelected(3, false);
320     setItemSelected(4, false);
321     setItemEnabled(5, true);
322     setItemEnabled(6, true);
323     setItemEnabled(7, true);
324     setItemEnabled(8, true);
325
326     break;
327
328   case BScreen::CascadePlacement:
329     getScreen()->savePlacementPolicy(item->function());
330
331     setItemSelected(0, false);
332     setItemSelected(1, false);
333     setItemSelected(2, true);
334     setItemSelected(3, false);
335     setItemSelected(4, false);
336     setItemEnabled(5, true);
337     setItemEnabled(6, true);
338     setItemEnabled(7, true);
339     setItemEnabled(8, true);
340
341     break;
342
343   case BScreen::UnderMousePlacement:
344     getScreen()->savePlacementPolicy(item->function());
345
346     setItemSelected(0, false);
347     setItemSelected(1, false);
348     setItemSelected(2, false);
349     setItemSelected(3, true);
350     setItemSelected(4, false);
351     setItemEnabled(5, false);
352     setItemEnabled(6, false);
353     setItemEnabled(7, false);
354     setItemEnabled(8, false);
355
356     break;
357
358   case BScreen::ClickMousePlacement:
359     getScreen()->savePlacementPolicy(item->function());
360
361     setItemSelected(0, false);
362     setItemSelected(1, false);
363     setItemSelected(2, false);
364     setItemSelected(3, false);
365     setItemSelected(4, true);
366     setItemEnabled(5, false);
367     setItemEnabled(6, false);
368     setItemEnabled(7, false);
369     setItemEnabled(8, false);
370
371     break;
372
373   case BScreen::LeftRight:
374     getScreen()->saveRowPlacementDirection(BScreen::LeftRight);
375
376     setItemSelected(5, true);
377     setItemSelected(6, false);
378
379     break;
380
381   case BScreen::RightLeft:
382     getScreen()->saveRowPlacementDirection(BScreen::RightLeft);
383
384     setItemSelected(5, false);
385     setItemSelected(6, true);
386
387     break;
388
389   case BScreen::TopBottom:
390     getScreen()->saveColPlacementDirection(BScreen::TopBottom);
391
392     setItemSelected(7, true);
393     setItemSelected(8, false);
394
395     break;
396
397   case BScreen::BottomTop:
398     getScreen()->saveColPlacementDirection(BScreen::BottomTop);
399
400     setItemSelected(7, false);
401     setItemSelected(8, true);
402
403     break;
404   
405   case BScreen::IgnoreShaded:
406     getScreen()->savePlaceIgnoreShaded(! getScreen()->getPlaceIgnoreShaded());
407
408     setItemSelected(9, getScreen()->getPlaceIgnoreShaded());
409
410     break;
411
412   case BScreen::IgnoreMaximized:
413     getScreen()->
414       savePlaceIgnoreMaximized(! getScreen()->getPlaceIgnoreMaximized());
415
416     setItemSelected(10, getScreen()->getPlaceIgnoreMaximized());
417
418     break;
419   }
420 }