2 // Copyright (c) 2001 Sean 'Shaleh' Perry <shaleh@debian.org>
3 // Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
5 // Permission is hereby granted, free of charge, to any person obtaining a
6 // copy of this software and associated documentation files (the "Software"),
7 // to deal in the Software without restriction, including without limitation
8 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 // and/or sell copies of the Software, and to permit persons to whom the
10 // Software is furnished to do so, subject to the following conditions:
12 // The above copyright notice and this permission notice shall be included in
13 // all copies or substantial portions of the Software.
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21 // DEALINGS IN THE SOFTWARE.
23 // stupid macros needed to access some functions in version 2 of the GNU C
30 # include "../config.h"
31 #endif // HAVE_CONFIG_H
35 #include <X11/keysym.h>
47 Slit::Slit(BScreen
&scr
, Resource
&conf
) : screen(scr
),
48 openbox(scr
.getOpenbox()), config(conf
)
51 m_placement
= CenterRight
;
52 m_direction
= Vertical
;
54 m_hidden
= m_autohide
= false;
56 display
= screen
.getBaseDisplay().getXDisplay();
57 frame
.window
= frame
.pixmap
= None
;
59 timer
= new BTimer(openbox
, *this);
60 timer
->setTimeout(openbox
.getAutoRaiseDelay());
61 timer
->fireOnce(True
);
63 clientList
= new LinkedList
<SlitClient
>;
65 slitmenu
= new Slitmenu(*this);
67 XSetWindowAttributes attrib
;
68 unsigned long create_mask
= CWBackPixmap
| CWBackPixel
| CWBorderPixel
|
69 CWColormap
| CWOverrideRedirect
| CWEventMask
;
70 attrib
.background_pixmap
= None
;
71 attrib
.background_pixel
= attrib
.border_pixel
=
72 screen
.getBorderColor()->getPixel();
73 attrib
.colormap
= screen
.getColormap();
74 attrib
.override_redirect
= True
;
75 attrib
.event_mask
= SubstructureRedirectMask
| ButtonPressMask
|
76 EnterWindowMask
| LeaveWindowMask
;
78 frame
.area
= Rect(0, 0, 1, 1);
81 XCreateWindow(display
, screen
.getRootWindow(),
82 frame
.area
.x(), frame
.area
.y(),
83 frame
.area
.w(), frame
.area
.h(), screen
.getBorderWidth(),
84 screen
.getDepth(), InputOutput
, screen
.getVisual(),
85 create_mask
, &attrib
);
86 openbox
.saveSlitSearch(frame
.window
, this);
95 if (timer
->isTiming()) timer
->stop();
101 screen
.getImageControl()->removeImage(frame
.pixmap
);
103 openbox
.removeSlitSearch(frame
.window
);
105 XDestroyWindow(display
, frame
.window
);
111 void Slit::addClient(Window w
) {
114 if (openbox
.validateWindow(w
)) {
115 SlitClient
*client
= new SlitClient
;
116 client
->client_window
= w
;
118 XWMHints
*wmhints
= XGetWMHints(display
, w
);
121 if ((wmhints
->flags
& IconWindowHint
) &&
122 (wmhints
->icon_window
!= None
)) {
123 XMoveWindow(display
, client
->client_window
, screen
.size().w() + 10,
124 screen
.size().h() + 10);
125 XMapWindow(display
, client
->client_window
);
127 client
->icon_window
= wmhints
->icon_window
;
128 client
->window
= client
->icon_window
;
130 client
->icon_window
= None
;
131 client
->window
= client
->client_window
;
136 client
->icon_window
= None
;
137 client
->window
= client
->client_window
;
140 XWindowAttributes attrib
;
141 if (XGetWindowAttributes(display
, client
->window
, &attrib
)) {
142 client
->width
= attrib
.width
;
143 client
->height
= attrib
.height
;
145 client
->width
= client
->height
= 64;
148 XSetWindowBorderWidth(display
, client
->window
, 0);
150 XSelectInput(display
, frame
.window
, NoEventMask
);
151 XSelectInput(display
, client
->window
, NoEventMask
);
153 XReparentWindow(display
, client
->window
, frame
.window
, 0, 0);
154 XMapRaised(display
, client
->window
);
155 XChangeSaveSet(display
, client
->window
, SetModeInsert
);
157 XSelectInput(display
, frame
.window
, SubstructureRedirectMask
|
158 ButtonPressMask
| EnterWindowMask
| LeaveWindowMask
);
159 XSelectInput(display
, client
->window
, StructureNotifyMask
|
160 SubstructureNotifyMask
| EnterWindowMask
);
163 clientList
->insert(client
);
165 openbox
.saveSlitSearch(client
->client_window
, this);
166 openbox
.saveSlitSearch(client
->icon_window
, this);
174 void Slit::removeClient(SlitClient
*client
, Bool remap
) {
175 openbox
.removeSlitSearch(client
->client_window
);
176 openbox
.removeSlitSearch(client
->icon_window
);
177 clientList
->remove(client
);
179 screen
.removeNetizen(client
->window
);
181 if (remap
&& openbox
.validateWindow(client
->window
)) {
182 XSelectInput(display
, frame
.window
, NoEventMask
);
183 XSelectInput(display
, client
->window
, NoEventMask
);
184 XReparentWindow(display
, client
->window
, screen
.getRootWindow(),
185 client
->x
, client
->y
);
186 XChangeSaveSet(display
, client
->window
, SetModeDelete
);
187 XSelectInput(display
, frame
.window
, SubstructureRedirectMask
|
188 ButtonPressMask
| EnterWindowMask
| LeaveWindowMask
);
193 client
= (SlitClient
*) 0;
197 void Slit::removeClient(Window w
, Bool remap
) {
202 LinkedListIterator
<SlitClient
> it(clientList
);
203 for (SlitClient
*tmp
= it
.current(); tmp
; it
++, tmp
= it
.current()) {
204 if (tmp
->window
== w
) {
205 removeClient(tmp
, remap
);
212 if (reconf
) reconfigure();
217 void Slit::setOnTop(bool b
) {
220 s
<< "session.screen" << screen
.getScreenNumber() << ".slit.onTop" << ends
;
221 config
.setValue(s
.str(), m_ontop
? "True" : "False");
224 void Slit::setAutoHide(bool b
) {
227 s
<< "session.screen" << screen
.getScreenNumber() << ".slit.autoHide" << ends
;
228 config
.setValue(s
.str(), m_autohide
? "True" : "False");
231 void Slit::setPlacement(int p
) {
233 cout
<< "setting " << p
<< " " << m_placement
<< endl
;
235 s
<< "session.screen" << screen
.getScreenNumber() << ".slit.placement" <<
237 const char *placement
;
238 switch (m_placement
) {
239 case TopLeft
: placement
= "TopLeft"; break;
240 case CenterLeft
: placement
= "CenterLeft"; break;
241 case BottomLeft
: placement
= "BottomLeft"; break;
242 case TopCenter
: placement
= "TopCenter"; break;
243 case BottomCenter
: placement
= "BottomCenter"; break;
244 case TopRight
: placement
= "TopRight"; break;
245 case BottomRight
: placement
= "BottomRight"; break;
246 case CenterRight
: default: placement
= "CenterRight"; break;
248 config
.setValue(s
.str(), placement
);
251 void Slit::setDirection(int d
) {
254 s
<< "session.screen" << screen
.getScreenNumber() << ".slit.direction" <<
256 config
.setValue(s
.str(),
257 m_direction
== Horizontal
? "Horizontal" : "Vertical");
261 std::ostrstream rscreen
, rname
, rclass
;
264 rscreen
<< "session.screen" << screen
.getScreenNumber() << '.' << ends
;
266 rname
<< rscreen
.str() << "slit.placement" << ends
;
267 rclass
<< rscreen
.str() << "Slit.Placement" << ends
;
268 if (config
.getValue(rname
.str(), rclass
.str(), s
)) {
269 cout
<< "getting " << s
.c_str() << endl
;
270 if (0 == strncasecmp(s
.c_str(), "TopLeft", s
.length()))
271 m_placement
= TopLeft
;
272 else if (0 == strncasecmp(s
.c_str(), "CenterLeft", s
.length()))
273 m_placement
= CenterLeft
;
274 else if (0 == strncasecmp(s
.c_str(), "BottomLeft", s
.length()))
275 m_placement
= BottomLeft
;
276 else if (0 == strncasecmp(s
.c_str(), "TopCenter", s
.length()))
277 m_placement
= TopCenter
;
278 else if (0 == strncasecmp(s
.c_str(), "BottomCenter", s
.length()))
279 m_placement
= BottomCenter
;
280 else if (0 == strncasecmp(s
.c_str(), "TopRight", s
.length()))
281 m_placement
= TopRight
;
282 else if (0 == strncasecmp(s
.c_str(), "BottomRight", s
.length()))
283 m_placement
= BottomRight
;
284 else if (0 == strncasecmp(s
.c_str(), "CenterRight", s
.length()))
285 m_placement
= CenterRight
;
288 rname
.seekp(0); rclass
.seekp(0);
289 rname
<< rscreen
.str() << "slit.direction" << ends
;
290 rclass
<< rscreen
.str() << "Slit.Direction" << ends
;
291 if (config
.getValue(rname
.str(), rclass
.str(), s
)) {
292 if (0 == strncasecmp(s
.c_str(), "Horizontal", s
.length()))
293 m_direction
= Horizontal
;
294 else if (0 == strncasecmp(s
.c_str(), "Vertical", s
.length()))
295 m_direction
= Vertical
;
298 rname
.seekp(0); rclass
.seekp(0);
299 rname
<< rscreen
.str() << "slit.onTop" << ends
;
300 rclass
<< rscreen
.str() << "Slit.OnTop" << ends
;
301 if (config
.getValue(rname
.str(), rclass
.str(), b
))
304 rname
.seekp(0); rclass
.seekp(0);
305 rname
<< rscreen
.str() << "slit.autoHide" << ends
;
306 rclass
<< rscreen
.str() << "Slit.AutoHide" << ends
;
307 if (config
.getValue(rname
.str(), rclass
.str(), b
))
308 m_hidden
= m_autohide
= b
;
311 void Slit::reconfigure(void) {
314 frame
.area
.setSize(0, 0);
315 LinkedListIterator
<SlitClient
> it(clientList
);
318 switch (m_direction
) {
320 for (client
= it
.current(); client
; it
++, client
= it
.current()) {
321 frame
.area
.setH(frame
.area
.h() + client
->height
+ screen
.getBevelWidth());
323 if (frame
.area
.w() < client
->width
)
324 frame
.area
.setW(client
->width
);
327 if (frame
.area
.w() < 1)
330 frame
.area
.setW(frame
.area
.w() + (screen
.getBevelWidth() * 2));
332 if (frame
.area
.h() < 1)
335 frame
.area
.setH(frame
.area
.h() + screen
.getBevelWidth());
340 for (client
= it
.current(); client
; it
++, client
= it
.current()) {
341 frame
.area
.setW(frame
.area
.w() + client
->width
+ screen
.getBevelWidth());
343 if (frame
.area
.h() < client
->height
)
344 frame
.area
.setH(client
->height
);
347 if (frame
.area
.w() < 1)
350 frame
.area
.setW(frame
.area
.w() + screen
.getBevelWidth());
352 if (frame
.area
.h() < 1)
355 frame
.area
.setH(frame
.area
.h() + (screen
.getBevelWidth() * 2));
362 XSetWindowBorderWidth(display
,frame
.window
, screen
.getBorderWidth());
363 XSetWindowBorder(display
, frame
.window
,
364 screen
.getBorderColor()->getPixel());
366 if (! clientList
->count())
367 XUnmapWindow(display
, frame
.window
);
369 XMapWindow(display
, frame
.window
);
371 Pixmap tmp
= frame
.pixmap
;
372 BImageControl
*image_ctrl
= screen
.getImageControl();
373 BTexture
*texture
= &(screen
.getToolbarStyle()->toolbar
);
374 if (texture
->getTexture() == (BImage_Flat
| BImage_Solid
)) {
376 XSetWindowBackground(display
, frame
.window
,
377 texture
->getColor()->getPixel());
379 frame
.pixmap
= image_ctrl
->renderImage(frame
.area
.w(), frame
.area
.h(),
381 XSetWindowBackgroundPixmap(display
, frame
.window
, frame
.pixmap
);
383 if (tmp
) image_ctrl
->removeImage(tmp
);
384 XClearWindow(display
, frame
.window
);
389 switch (m_direction
) {
392 y
= screen
.getBevelWidth();
394 for (client
= it
.current(); client
; it
++, client
= it
.current()) {
395 x
= (frame
.area
.w() - client
->width
) / 2;
397 XMoveResizeWindow(display
, client
->window
, x
, y
,
398 client
->width
, client
->height
);
399 XMapWindow(display
, client
->window
);
401 // for ICCCM compliance
406 event
.type
= ConfigureNotify
;
408 event
.xconfigure
.display
= display
;
409 event
.xconfigure
.event
= client
->window
;
410 event
.xconfigure
.window
= client
->window
;
411 event
.xconfigure
.x
= x
;
412 event
.xconfigure
.y
= y
;
413 event
.xconfigure
.width
= client
->width
;
414 event
.xconfigure
.height
= client
->height
;
415 event
.xconfigure
.border_width
= 0;
416 event
.xconfigure
.above
= frame
.window
;
417 event
.xconfigure
.override_redirect
= False
;
419 XSendEvent(display
, client
->window
, False
, StructureNotifyMask
, &event
);
421 y
+= client
->height
+ screen
.getBevelWidth();
427 x
= screen
.getBevelWidth();
430 for (client
= it
.current(); client
; it
++, client
= it
.current()) {
431 y
= (frame
.area
.h() - client
->height
) / 2;
433 XMoveResizeWindow(display
, client
->window
, x
, y
,
434 client
->width
, client
->height
);
435 XMapWindow(display
, client
->window
);
437 // for ICCCM compliance
442 event
.type
= ConfigureNotify
;
444 event
.xconfigure
.display
= display
;
445 event
.xconfigure
.event
= client
->window
;
446 event
.xconfigure
.window
= client
->window
;
447 event
.xconfigure
.x
= x
;
448 event
.xconfigure
.y
= y
;
449 event
.xconfigure
.width
= client
->width
;
450 event
.xconfigure
.height
= client
->height
;
451 event
.xconfigure
.border_width
= 0;
452 event
.xconfigure
.above
= frame
.window
;
453 event
.xconfigure
.override_redirect
= False
;
455 XSendEvent(display
, client
->window
, False
, StructureNotifyMask
, &event
);
457 x
+= client
->width
+ screen
.getBevelWidth();
463 slitmenu
->reconfigure();
467 void Slit::reposition(void) {
468 // place the slit in the appropriate place
469 switch (m_placement
) {
471 frame
.area
.setOrigin(0, 0);
472 if (m_direction
== Vertical
) {
473 frame
.hidden
= Point(screen
.getBevelWidth() - screen
.getBorderWidth()
474 - frame
.area
.w(), 0);
476 frame
.hidden
= Point(0, screen
.getBevelWidth() - screen
.getBorderWidth()
482 frame
.area
.setOrigin(0, (screen
.size().h() - frame
.area
.h()) / 2);
483 frame
.hidden
= Point(screen
.getBevelWidth() - screen
.getBorderWidth()
484 - frame
.area
.w(), frame
.area
.y());
488 frame
.area
.setOrigin(0, screen
.size().h() - frame
.area
.h()
489 - (screen
.getBorderWidth() * 2));
490 if (m_direction
== Vertical
)
491 frame
.hidden
= Point(screen
.getBevelWidth() - screen
.getBorderWidth()
492 - frame
.area
.w(), frame
.area
.y());
494 frame
.hidden
= Point(0, screen
.size().h() - screen
.getBevelWidth()
495 - screen
.getBorderWidth());
499 frame
.area
.setOrigin((screen
.size().w() - frame
.area
.w()) / 2, 0);
500 frame
.hidden
= Point(frame
.area
.x(), screen
.getBevelWidth()
501 - screen
.getBorderWidth() - frame
.area
.h());
505 frame
.area
.setOrigin((screen
.size().w() - frame
.area
.w()) / 2,
506 screen
.size().h() - frame
.area
.h()
507 - (screen
.getBorderWidth() * 2));
508 frame
.hidden
= Point(frame
.area
.x(), screen
.size().h()
509 - screen
.getBevelWidth() - screen
.getBorderWidth());
513 frame
.area
.setOrigin(screen
.size().w() - frame
.area
.w()
514 - (screen
.getBorderWidth() * 2), 0);
515 if (m_direction
== Vertical
)
516 frame
.hidden
= Point(screen
.size().w() - screen
.getBevelWidth()
517 - screen
.getBorderWidth(), 0);
519 frame
.hidden
= Point(frame
.area
.x(), screen
.getBevelWidth()
520 - screen
.getBorderWidth() - frame
.area
.h());
525 frame
.area
.setOrigin(screen
.size().w() - frame
.area
.w()
526 - (screen
.getBorderWidth() * 2),
527 (screen
.size().h() - frame
.area
.h()) / 2);
528 frame
.hidden
= Point(screen
.size().w() - screen
.getBevelWidth()
529 - screen
.getBorderWidth(), frame
.area
.y());
533 frame
.area
.setOrigin(screen
.size().w() - frame
.area
.w()
534 - (screen
.getBorderWidth() * 2),
535 screen
.size().h() - frame
.area
.h()
536 - (screen
.getBorderWidth() * 2));
537 if (m_direction
== Vertical
)
538 frame
.hidden
= Point(screen
.size().w() - screen
.getBevelWidth()
539 - screen
.getBorderWidth(), frame
.area
.y());
541 frame
.hidden
= Point(frame
.area
.x(), screen
.size().h() -
542 screen
.getBevelWidth() - screen
.getBorderWidth());
546 Toolbar
*tbar
= screen
.getToolbar();
547 int sw
= frame
.area
.w() + (screen
.getBorderWidth() * 2),
548 sh
= frame
.area
.h() + (screen
.getBorderWidth() * 2),
549 tw
= tbar
->getWidth() + screen
.getBorderWidth(),
550 th
= tbar
->getHeight() + screen
.getBorderWidth();
552 if (tbar
->getX() < frame
.area
.x() + sw
&&
553 tbar
->getX() + tw
> frame
.area
.x() &&
554 tbar
->getY() < frame
.area
.y() + sh
&&
555 tbar
->getY() + th
> frame
.area
.y()) {
556 if (frame
.area
.y() < th
) {
557 frame
.area
.setY(frame
.area
.y() + tbar
->getExposedHeight());
558 if (m_direction
== Vertical
)
559 frame
.hidden
.setY(frame
.hidden
.y() + tbar
->getExposedHeight());
561 frame
.hidden
.setY(frame
.area
.y());
563 frame
.area
.setY(frame
.area
.y() - tbar
->getExposedHeight());
564 if (m_direction
== Vertical
)
565 frame
.hidden
.setY(frame
.area
.y() - tbar
->getExposedHeight());
567 frame
.hidden
.setY(frame
.area
.y());
572 XMoveResizeWindow(display
, frame
.window
, frame
.hidden
.x(),
573 frame
.hidden
.y(), frame
.area
.w(), frame
.area
.h());
575 XMoveResizeWindow(display
, frame
.window
, frame
.area
.x(),
576 frame
.area
.y(), frame
.area
.w(), frame
.area
.h());
580 void Slit::shutdown(void) {
581 while (clientList
->count())
582 removeClient(clientList
->first());
586 void Slit::buttonPressEvent(XButtonEvent
*e
) {
587 if (e
->window
!= frame
.window
) return;
589 if (e
->button
== Button1
&& !m_ontop
) {
590 Window w
[1] = { frame
.window
};
591 screen
.raiseWindows(w
, 1);
592 } else if (e
->button
== Button2
&& !m_ontop
) {
593 XLowerWindow(display
, frame
.window
);
594 } else if (e
->button
== Button3
) {
595 if (! slitmenu
->isVisible()) {
598 x
= e
->x_root
- (slitmenu
->getWidth() / 2);
599 y
= e
->y_root
- (slitmenu
->getHeight() / 2);
603 else if (x
+ slitmenu
->getWidth() > screen
.size().w())
604 x
= screen
.size().w() - slitmenu
->getWidth();
608 else if (y
+ slitmenu
->getHeight() > screen
.size().h())
609 y
= screen
.size().h() - slitmenu
->getHeight();
611 slitmenu
->move(x
, y
);
620 void Slit::enterNotifyEvent(XCrossingEvent
*) {
625 if (! timer
->isTiming()) timer
->start();
627 if (timer
->isTiming()) timer
->stop();
632 void Slit::leaveNotifyEvent(XCrossingEvent
*) {
637 if (timer
->isTiming()) timer
->stop();
638 } else if (! slitmenu
->isVisible()) {
639 if (!timer
->isTiming()) timer
->start();
644 void Slit::configureRequestEvent(XConfigureRequestEvent
*e
) {
647 if (openbox
.validateWindow(e
->window
)) {
653 xwc
.width
= e
->width
;
654 xwc
.height
= e
->height
;
655 xwc
.border_width
= 0;
656 xwc
.sibling
= e
->above
;
657 xwc
.stack_mode
= e
->detail
;
659 XConfigureWindow(display
, e
->window
, e
->value_mask
, &xwc
);
661 LinkedListIterator
<SlitClient
> it(clientList
);
662 SlitClient
*client
= it
.current();
663 for (; client
; it
++, client
= it
.current())
664 if (client
->window
== e
->window
)
665 if (client
->width
!= ((unsigned) e
->width
) ||
666 client
->height
!= ((unsigned) e
->height
)) {
667 client
->width
= (unsigned) e
->width
;
668 client
->height
= (unsigned) e
->height
;
675 if (reconf
) reconfigure();
683 void Slit::timeout(void) {
684 m_hidden
= !m_hidden
;
686 XMoveWindow(display
, frame
.window
, frame
.hidden
.x(), frame
.hidden
.y());
688 XMoveWindow(display
, frame
.window
, frame
.area
.x(), frame
.area
.y());
692 Slitmenu::Slitmenu(Slit
&sl
) : Basemenu(sl
.screen
), slit(sl
) {
693 setLabel(i18n
->getMessage(SlitSet
, SlitSlitTitle
, "Slit"));
696 directionmenu
= new Directionmenu(*this);
697 placementmenu
= new Placementmenu(*this);
699 insert(i18n
->getMessage(CommonSet
, CommonDirectionTitle
, "Direction"),
701 insert(i18n
->getMessage(CommonSet
, CommonPlacementTitle
, "Placement"),
703 insert(i18n
->getMessage(CommonSet
, CommonAlwaysOnTop
, "Always on top"), 1);
704 insert(i18n
->getMessage(CommonSet
, CommonAutoHide
, "Auto hide"), 2);
708 if (slit
.onTop()) setItemSelected(2, True
);
709 if (slit
.autoHide()) setItemSelected(3, True
);
713 Slitmenu::~Slitmenu(void) {
714 delete directionmenu
;
715 delete placementmenu
;
719 void Slitmenu::itemSelected(int button
, int index
) {
723 BasemenuItem
*item
= find(index
);
726 switch (item
->function()) {
727 case 1: { // always on top
728 bool change
= ((slit
.onTop()) ? false : true);
729 slit
.setOnTop(change
);
730 setItemSelected(2, change
);
732 if (slit
.onTop()) slit
.screen
.raiseWindows((Window
*) 0, 0);
736 case 2: { // auto hide
737 Bool change
= ((slit
.autoHide()) ? false : true);
738 slit
.setAutoHide(change
);
739 setItemSelected(3, change
);
747 void Slitmenu::internal_hide(void) {
748 Basemenu::internal_hide();
754 void Slitmenu::reconfigure(void) {
755 directionmenu
->reconfigure();
756 placementmenu
->reconfigure();
758 Basemenu::reconfigure();
762 Slitmenu::Directionmenu::Directionmenu(Slitmenu
&sm
)
763 : Basemenu(sm
.slit
.screen
), slitmenu(sm
) {
764 setLabel(i18n
->getMessage(SlitSet
, SlitSlitDirection
, "Slit Direction"));
767 insert(i18n
->getMessage(CommonSet
, CommonDirectionHoriz
, "Horizontal"),
769 insert(i18n
->getMessage(CommonSet
, CommonDirectionVert
, "Vertical"),
774 if (sm
.slit
.direction() == Slit::Horizontal
)
775 setItemSelected(0, True
);
777 setItemSelected(1, True
);
781 void Slitmenu::Directionmenu::itemSelected(int button
, int index
) {
785 BasemenuItem
*item
= find(index
);
788 slitmenu
.slit
.setDirection(item
->function());
790 if (item
->function() == Slit::Horizontal
) {
791 setItemSelected(0, True
);
792 setItemSelected(1, False
);
794 setItemSelected(0, False
);
795 setItemSelected(1, True
);
799 slitmenu
.slit
.reconfigure();
803 Slitmenu::Placementmenu::Placementmenu(Slitmenu
&sm
)
804 : Basemenu(sm
.slit
.screen
), slitmenu(sm
) {
806 setLabel(i18n
->getMessage(SlitSet
, SlitSlitPlacement
, "Slit Placement"));
807 setMinimumSublevels(3);
810 insert(i18n
->getMessage(CommonSet
, CommonPlacementTopLeft
, "Top Left"),
812 insert(i18n
->getMessage(CommonSet
, CommonPlacementCenterLeft
, "Center Left"),
814 insert(i18n
->getMessage(CommonSet
, CommonPlacementBottomLeft
, "Bottom Left"),
816 insert(i18n
->getMessage(CommonSet
, CommonPlacementTopCenter
, "Top Center"),
819 insert(i18n
->getMessage(CommonSet
, CommonPlacementBottomCenter
,
822 insert(i18n
->getMessage(CommonSet
, CommonPlacementTopRight
, "Top Right"),
824 insert(i18n
->getMessage(CommonSet
, CommonPlacementCenterRight
,
827 insert(i18n
->getMessage(CommonSet
, CommonPlacementBottomRight
,
835 void Slitmenu::Placementmenu::itemSelected(int button
, int index
) {
839 BasemenuItem
*item
= find(index
);
840 if (! (item
&& item
->function())) return;
842 slitmenu
.slit
.setPlacement(item
->function());
844 slitmenu
.slit
.reconfigure();