1 // Toolbar.cc for Openbox
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 "Clientmenu.h"
41 #include "Workspace.h"
42 #include "Workspacemenu.h"
44 #include <X11/keysym.h>
48 #endif // HAVE_STRING_H
52 #endif // HAVE_STDIO_H
54 #ifdef TIME_WITH_SYS_TIME
55 # include <sys/time.h>
57 #else // !TIME_WITH_SYS_TIME
58 # ifdef HAVE_SYS_TIME_H
59 # include <sys/time.h>
60 # else // !HAVE_SYS_TIME_H
62 # endif // HAVE_SYS_TIME_H
63 #endif // TIME_WITH_SYS_TIME
67 #endif // HAVE_SSTREAM
71 Toolbar::Toolbar(BScreen
&scrn
, Resource
&conf
) : screen(scrn
),
72 openbox(scrn
.getOpenbox()), config(conf
)
76 // get the clock updating every minute
77 clock_timer
= new BTimer(openbox
, *this);
79 gettimeofday(&now
, 0);
80 clock_timer
->setTimeout((60 - (now
.tv_sec
% 60)) * 1000);
83 hide_handler
.toolbar
= this;
84 hide_timer
= new BTimer(openbox
, hide_handler
);
85 hide_timer
->setTimeout(openbox
.getAutoRaiseDelay());
86 hide_timer
->fireOnce(True
);
88 image_ctrl
= screen
.getImageControl();
91 new_workspace_name
= (char *) 0;
93 frame
.grab_x
= frame
.grab_y
= 0;
95 toolbarmenu
= new Toolbarmenu(*this);
97 display
= openbox
.getXDisplay();
98 XSetWindowAttributes attrib
;
99 unsigned long create_mask
= CWBackPixmap
| CWBackPixel
| CWBorderPixel
|
100 CWColormap
| CWOverrideRedirect
| CWEventMask
;
101 attrib
.background_pixmap
= None
;
102 attrib
.background_pixel
= attrib
.border_pixel
=
103 screen
.getBorderColor()->getPixel();
104 attrib
.colormap
= screen
.getColormap();
105 attrib
.override_redirect
= True
;
106 attrib
.event_mask
= ButtonPressMask
| ButtonReleaseMask
|
107 EnterWindowMask
| LeaveWindowMask
;
110 XCreateWindow(display
, screen
.getRootWindow(), 0, 0, 1, 1, 0,
111 screen
.getDepth(), InputOutput
, screen
.getVisual(),
112 create_mask
, &attrib
);
113 openbox
.saveToolbarSearch(frame
.window
, this);
115 attrib
.event_mask
= ButtonPressMask
| ButtonReleaseMask
| ExposureMask
|
116 KeyPressMask
| EnterWindowMask
;
118 frame
.workspace_label
=
119 XCreateWindow(display
, frame
.window
, 0, 0, 1, 1, 0, screen
.getDepth(),
120 InputOutput
, screen
.getVisual(), create_mask
, &attrib
);
121 openbox
.saveToolbarSearch(frame
.workspace_label
, this);
124 XCreateWindow(display
, frame
.window
, 0, 0, 1, 1, 0, screen
.getDepth(),
125 InputOutput
, screen
.getVisual(), create_mask
, &attrib
);
126 openbox
.saveToolbarSearch(frame
.window_label
, this);
129 XCreateWindow(display
, frame
.window
, 0, 0, 1, 1, 0, screen
.getDepth(),
130 InputOutput
, screen
.getVisual(), create_mask
, &attrib
);
131 openbox
.saveToolbarSearch(frame
.clock
, this);
134 XCreateWindow(display
,frame
.window
, 0, 0, 1, 1, 0, screen
.getDepth(),
135 InputOutput
, screen
.getVisual(), create_mask
, &attrib
);
136 openbox
.saveToolbarSearch(frame
.psbutton
, this);
139 XCreateWindow(display
,frame
.window
, 0, 0, 1, 1, 0, screen
.getDepth(),
140 InputOutput
, screen
.getVisual(), create_mask
, &attrib
);
141 openbox
.saveToolbarSearch(frame
.nsbutton
, this);
144 XCreateWindow(display
,frame
.window
, 0, 0, 1, 1, 0, screen
.getDepth(),
145 InputOutput
, screen
.getVisual(), create_mask
, &attrib
);
146 openbox
.saveToolbarSearch(frame
.pwbutton
, this);
149 XCreateWindow(display
,frame
.window
, 0, 0, 1, 1, 0, screen
.getDepth(),
150 InputOutput
, screen
.getVisual(), create_mask
, &attrib
);
151 openbox
.saveToolbarSearch(frame
.nwbutton
, this);
153 frame
.base
= frame
.label
= frame
.wlabel
= frame
.clk
= frame
.button
=
154 frame
.pbutton
= None
;
160 Rect
Toolbar::area() const {
161 int x
= ((m_hidden
) ? frame
.x_hidden
: frame
.x
);
163 if (screen
.hideToolbar()) y
= screen
.size().h();
164 else if (m_hidden
) y
= frame
.y_hidden
;
166 return Rect(x
, y
, frame
.width
, frame
.height
);
169 unsigned int Toolbar::getExposedHeight() const {
170 if (screen
.hideToolbar()) return 0;
171 else if (m_autohide
) return frame
.bevel_w
;
172 else return frame
.height
;
175 void Toolbar::mapToolbar(){
176 if (!screen
.hideToolbar()) {
177 //not hidden, so windows should not maximize over the toolbar
178 XMapSubwindows(display
, frame
.window
);
179 XMapWindow(display
, frame
.window
);
183 void Toolbar::unMapToolbar(){
184 //hidden so we can maximize over the toolbar
185 XUnmapWindow(display
, frame
.window
);
188 Toolbar::~Toolbar() {
190 if (frame
.base
) image_ctrl
->removeImage(frame
.base
);
191 if (frame
.label
) image_ctrl
->removeImage(frame
.label
);
192 if (frame
.wlabel
) image_ctrl
->removeImage(frame
.wlabel
);
193 if (frame
.clk
) image_ctrl
->removeImage(frame
.clk
);
194 if (frame
.button
) image_ctrl
->removeImage(frame
.button
);
195 if (frame
.pbutton
) image_ctrl
->removeImage(frame
.pbutton
);
197 openbox
.removeToolbarSearch(frame
.window
);
198 openbox
.removeToolbarSearch(frame
.workspace_label
);
199 openbox
.removeToolbarSearch(frame
.window_label
);
200 openbox
.removeToolbarSearch(frame
.clock
);
201 openbox
.removeToolbarSearch(frame
.psbutton
);
202 openbox
.removeToolbarSearch(frame
.nsbutton
);
203 openbox
.removeToolbarSearch(frame
.pwbutton
);
204 openbox
.removeToolbarSearch(frame
.nwbutton
);
206 XDestroyWindow(display
, frame
.workspace_label
);
207 XDestroyWindow(display
, frame
.window_label
);
208 XDestroyWindow(display
, frame
.clock
);
210 XDestroyWindow(display
, frame
.window
);
218 void Toolbar::setOnTop(bool b
) {
220 std::ostringstream s
;
221 s
<< "session.screen" << screen
.getScreenNumber() << ".toolbar.onTop";
222 config
.setValue(s
.str(), m_ontop
? "True" : "False");
225 void Toolbar::setAutoHide(bool b
) {
227 std::ostringstream s
;
228 s
<< "session.screen" << screen
.getScreenNumber() << ".toolbar.autoHide";
229 config
.setValue(s
.str(), m_autohide
? "True" : "False");
232 void Toolbar::setWidthPercent(int w
) {
234 std::ostringstream s
;
235 s
<< "session.screen" << screen
.getScreenNumber() << ".toolbar.widthPercent"
237 config
.setValue(s
.str(), m_width_percent
);
240 void Toolbar::setPlacement(int p
) {
242 std::ostringstream s
;
243 s
<< "session.screen" << screen
.getScreenNumber() << ".toolbar.placement";
244 const char *placement
;
245 switch (m_placement
) {
246 case TopLeft
: placement
= "TopLeft"; break;
247 case BottomLeft
: placement
= "BottomLeft"; break;
248 case TopCenter
: placement
= "TopCenter"; break;
249 case TopRight
: placement
= "TopRight"; break;
250 case BottomRight
: placement
= "BottomRight"; break;
251 case BottomCenter
: default: placement
= "BottomCenter"; break;
253 config
.setValue(s
.str(), placement
);
256 void Toolbar::save() {
258 setAutoHide(m_autohide
);
259 setWidthPercent(m_width_percent
);
260 setPlacement(m_placement
);
263 void Toolbar::load() {
264 std::ostringstream rscreen
, rname
, rclass
;
268 rscreen
<< "session.screen" << screen
.getScreenNumber() << '.';
270 rname
<< rscreen
.str() << "toolbar.widthPercent";
271 rclass
<< rscreen
.str() << "Toolbar.WidthPercent";
272 if (config
.getValue(rname
.str(), rclass
.str(), l
) && (l
> 0 && l
<= 100))
277 rname
.seekp(0); rclass
.seekp(0);
278 rname
<< rscreen
.str() << "toolbar.placement";
279 rclass
<< rscreen
.str() << "Toolbar.Placement";
280 if (config
.getValue(rname
.str(), rclass
.str(), s
)) {
281 if (0 == strncasecmp(s
.c_str(), "TopLeft", s
.length()))
282 m_placement
= TopLeft
;
283 else if (0 == strncasecmp(s
.c_str(), "BottomLeft", s
.length()))
284 m_placement
= BottomLeft
;
285 else if (0 == strncasecmp(s
.c_str(), "TopCenter", s
.length()))
286 m_placement
= TopCenter
;
287 else if (0 == strncasecmp(s
.c_str(), "TopRight", s
.length()))
288 m_placement
= TopRight
;
289 else if ( 0 == strncasecmp(s
.c_str(), "BottomRight", s
.length()))
290 m_placement
= BottomRight
;
291 else if ( 0 == strncasecmp(s
.c_str(), "BottomCenter", s
.length()))
292 m_placement
= BottomCenter
;
294 m_placement
= BottomCenter
;
296 rname
.seekp(0); rclass
.seekp(0);
297 rname
<< rscreen
.str() << "toolbar.onTop";
298 rclass
<< rscreen
.str() << "Toolbar.OnTop";
299 if (config
.getValue(rname
.str(), rclass
.str(), b
))
304 rname
.seekp(0); rclass
.seekp(0);
305 rname
<< rscreen
.str() << "toolbar.autoHide";
306 rclass
<< rscreen
.str() << "Toolbar.AutoHide";
307 if (config
.getValue(rname
.str(), rclass
.str(), b
))
308 m_hidden
= m_autohide
= b
;
310 m_hidden
= m_autohide
= false;
313 void Toolbar::reconfigure() {
314 frame
.bevel_w
= screen
.getBevelWidth();
315 frame
.width
= screen
.size().w() * m_width_percent
/ 100;
317 if (i18n
->multibyte())
319 screen
.getToolbarStyle()->fontset_extents
->max_ink_extent
.height
;
321 frame
.height
= screen
.getToolbarStyle()->font
->ascent
+
322 screen
.getToolbarStyle()->font
->descent
;
323 frame
.button_w
= frame
.height
;
325 frame
.label_h
= frame
.height
;
326 frame
.height
+= (frame
.bevel_w
* 2);
328 switch (m_placement
) {
333 frame
.y_hidden
= screen
.getBevelWidth() - screen
.getBorderWidth()
339 frame
.y
= screen
.size().h() - frame
.height
340 - (screen
.getBorderWidth() * 2);
342 frame
.y_hidden
= screen
.size().h() - screen
.getBevelWidth()
343 - screen
.getBorderWidth();
347 frame
.x
= (screen
.size().w() - frame
.width
) / 2;
349 frame
.x_hidden
= frame
.x
;
350 frame
.y_hidden
= screen
.getBevelWidth() - screen
.getBorderWidth()
356 frame
.x
= (screen
.size().w() - frame
.width
) / 2;
357 frame
.y
= screen
.size().h() - frame
.height
358 - (screen
.getBorderWidth() * 2);
359 frame
.x_hidden
= frame
.x
;
360 frame
.y_hidden
= screen
.size().h() - screen
.getBevelWidth()
361 - screen
.getBorderWidth();
365 frame
.x
= screen
.size().w() - frame
.width
366 - (screen
.getBorderWidth() * 2);
368 frame
.x_hidden
= frame
.x
;
369 frame
.y_hidden
= screen
.getBevelWidth() - screen
.getBorderWidth()
374 frame
.x
= screen
.size().w() - frame
.width
375 - (screen
.getBorderWidth() * 2);
376 frame
.y
= screen
.size().h() - frame
.height
377 - (screen
.getBorderWidth() * 2);
378 frame
.x_hidden
= frame
.x
;
379 frame
.y_hidden
= screen
.size().h() - screen
.getBevelWidth()
380 - screen
.getBorderWidth();
385 time_t ttmp
= time(NULL
);
389 tt
= localtime(&ttmp
);
391 char t
[1025], *time_string
= (char *) 0;
392 int len
= strftime(t
, 1024, screen
.strftimeFormat(), tt
);
393 t
[len
++] = 'A'; // add size to the string for padding
394 t
[len
++] = 'A'; // add size to the string for padding
397 if (i18n
->multibyte()) {
398 XRectangle ink
, logical
;
399 XmbTextExtents(screen
.getToolbarStyle()->fontset
, t
, len
, &ink
,
401 frame
.clock_w
= logical
.width
;
403 // ben's additional solution to pad some space beside the numbers
405 // screen.getToolbarStyle()->fontset_extents->max_logical_extent.width *
408 // brad's solution, which is currently buggy, too big
410 // screen.getToolbarStyle()->fontset_extents->max_logical_extent.width
413 frame
.clock_w
= XTextWidth(screen
.getToolbarStyle()->font
, t
, len
);
414 // ben's additional solution to pad some space beside the numbers
415 //frame.clock_w += screen.getToolbarStyle()->font->max_bounds.width * 4;
416 // brad's solution again, too big
417 //frame.clock_w = screen.getToolbarStyle()->font->max_bounds.width * len;
419 frame
.clock_w
+= (frame
.bevel_w
* 4);
421 delete [] time_string
;
428 #else // !HAVE_STRFTIME
430 XTextWidth(screen
.getToolbarStyle()->font
,
431 i18n
->getMessage(ToolbarSet
, ToolbarNoStrftimeLength
,
433 strlen(i18n
->getMessage(ToolbarSet
, ToolbarNoStrftimeLength
,
434 "00:00000"))) + (frame
.bevel_w
* 4);
435 #endif // HAVE_STRFTIME
439 frame
.workspace_label_w
= 0;
441 for (i
= 0; i
< screen
.getWorkspaceCount(); i
++) {
442 if (i18n
->multibyte()) {
443 XRectangle ink
, logical
;
444 XmbTextExtents(screen
.getToolbarStyle()->fontset
,
445 screen
.getWorkspace(i
)->getName(),
446 strlen(screen
.getWorkspace(i
)->getName()),
450 w
= XTextWidth(screen
.getToolbarStyle()->font
,
451 screen
.getWorkspace(i
)->getName(),
452 strlen(screen
.getWorkspace(i
)->getName()));
454 w
+= (frame
.bevel_w
* 4);
456 if (w
> frame
.workspace_label_w
) frame
.workspace_label_w
= w
;
459 if (frame
.workspace_label_w
< frame
.clock_w
)
460 frame
.workspace_label_w
= frame
.clock_w
;
461 else if (frame
.workspace_label_w
> frame
.clock_w
)
462 frame
.clock_w
= frame
.workspace_label_w
;
464 frame
.window_label_w
=
465 (frame
.width
- (frame
.clock_w
+ (frame
.button_w
* 4) +
466 frame
.workspace_label_w
+ (frame
.bevel_w
* 8) + 6));
469 XMoveResizeWindow(display
, frame
.window
, frame
.x_hidden
, frame
.y_hidden
,
470 frame
.width
, frame
.height
);
472 XMoveResizeWindow(display
, frame
.window
, frame
.x
, frame
.y
,
473 frame
.width
, frame
.height
);
476 XMoveResizeWindow(display
, frame
.workspace_label
, frame
.bevel_w
,
477 frame
.bevel_w
, frame
.workspace_label_w
,
479 XMoveResizeWindow(display
, frame
.psbutton
, (frame
.bevel_w
* 2) +
480 frame
.workspace_label_w
+ 1, frame
.bevel_w
+ 1,
481 frame
.button_w
, frame
.button_w
);
482 XMoveResizeWindow(display
,frame
.nsbutton
, (frame
.bevel_w
* 3) +
483 frame
.workspace_label_w
+ frame
.button_w
+ 2,
484 frame
.bevel_w
+ 1, frame
.button_w
, frame
.button_w
);
485 XMoveResizeWindow(display
, frame
.window_label
, (frame
.bevel_w
* 4) +
486 (frame
.button_w
* 2) + frame
.workspace_label_w
+ 3,
487 frame
.bevel_w
, frame
.window_label_w
, frame
.label_h
);
488 XMoveResizeWindow(display
, frame
.pwbutton
, (frame
.bevel_w
* 5) +
489 (frame
.button_w
* 2) + frame
.workspace_label_w
+
490 frame
.window_label_w
+ 4, frame
.bevel_w
+ 1,
491 frame
.button_w
, frame
.button_w
);
492 XMoveResizeWindow(display
, frame
.nwbutton
, (frame
.bevel_w
* 6) +
493 (frame
.button_w
* 3) + frame
.workspace_label_w
+
494 frame
.window_label_w
+ 5, frame
.bevel_w
+ 1,
495 frame
.button_w
, frame
.button_w
);
496 XMoveResizeWindow(display
, frame
.clock
, frame
.width
- frame
.clock_w
-
497 frame
.bevel_w
, frame
.bevel_w
, frame
.clock_w
,
500 Pixmap tmp
= frame
.base
;
501 BTexture
*texture
= &(screen
.getToolbarStyle()->toolbar
);
502 if (texture
->getTexture() == (BImage_Flat
| BImage_Solid
)) {
504 XSetWindowBackground(display
, frame
.window
,
505 texture
->getColor()->getPixel());
508 image_ctrl
->renderImage(frame
.width
, frame
.height
, texture
);
509 XSetWindowBackgroundPixmap(display
, frame
.window
, frame
.base
);
511 if (tmp
) image_ctrl
->removeImage(tmp
);
514 texture
= &(screen
.getToolbarStyle()->window
);
515 if (texture
->getTexture() == (BImage_Flat
| BImage_Solid
)) {
517 XSetWindowBackground(display
, frame
.window_label
,
518 texture
->getColor()->getPixel());
521 image_ctrl
->renderImage(frame
.window_label_w
, frame
.label_h
, texture
);
522 XSetWindowBackgroundPixmap(display
, frame
.window_label
, frame
.label
);
524 if (tmp
) image_ctrl
->removeImage(tmp
);
527 texture
= &(screen
.getToolbarStyle()->label
);
528 if (texture
->getTexture() == (BImage_Flat
| BImage_Solid
)) {
530 XSetWindowBackground(display
, frame
.workspace_label
,
531 texture
->getColor()->getPixel());
534 image_ctrl
->renderImage(frame
.workspace_label_w
, frame
.label_h
, texture
);
535 XSetWindowBackgroundPixmap(display
, frame
.workspace_label
, frame
.wlabel
);
537 if (tmp
) image_ctrl
->removeImage(tmp
);
540 texture
= &(screen
.getToolbarStyle()->clock
);
541 if (texture
->getTexture() == (BImage_Flat
| BImage_Solid
)) {
543 XSetWindowBackground(display
, frame
.clock
,
544 texture
->getColor()->getPixel());
547 image_ctrl
->renderImage(frame
.clock_w
, frame
.label_h
, texture
);
548 XSetWindowBackgroundPixmap(display
, frame
.clock
, frame
.clk
);
550 if (tmp
) image_ctrl
->removeImage(tmp
);
553 texture
= &(screen
.getToolbarStyle()->button
);
554 if (texture
->getTexture() == (BImage_Flat
| BImage_Solid
)) {
557 frame
.button_pixel
= texture
->getColor()->getPixel();
558 XSetWindowBackground(display
, frame
.psbutton
, frame
.button_pixel
);
559 XSetWindowBackground(display
, frame
.nsbutton
, frame
.button_pixel
);
560 XSetWindowBackground(display
, frame
.pwbutton
, frame
.button_pixel
);
561 XSetWindowBackground(display
, frame
.nwbutton
, frame
.button_pixel
);
564 image_ctrl
->renderImage(frame
.button_w
, frame
.button_w
, texture
);
566 XSetWindowBackgroundPixmap(display
, frame
.psbutton
, frame
.button
);
567 XSetWindowBackgroundPixmap(display
, frame
.nsbutton
, frame
.button
);
568 XSetWindowBackgroundPixmap(display
, frame
.pwbutton
, frame
.button
);
569 XSetWindowBackgroundPixmap(display
, frame
.nwbutton
, frame
.button
);
571 if (tmp
) image_ctrl
->removeImage(tmp
);
574 texture
= &(screen
.getToolbarStyle()->pressed
);
575 if (texture
->getTexture() == (BImage_Flat
| BImage_Solid
)) {
576 frame
.pbutton
= None
;
577 frame
.pbutton_pixel
= texture
->getColor()->getPixel();
580 image_ctrl
->renderImage(frame
.button_w
, frame
.button_w
, texture
);
582 if (tmp
) image_ctrl
->removeImage(tmp
);
584 XSetWindowBorder(display
, frame
.window
,
585 screen
.getBorderColor()->getPixel());
586 XSetWindowBorderWidth(display
, frame
.window
, screen
.getBorderWidth());
588 XClearWindow(display
, frame
.window
);
589 XClearWindow(display
, frame
.workspace_label
);
590 XClearWindow(display
, frame
.window_label
);
591 XClearWindow(display
, frame
.clock
);
592 XClearWindow(display
, frame
.psbutton
);
593 XClearWindow(display
, frame
.nsbutton
);
594 XClearWindow(display
, frame
.pwbutton
);
595 XClearWindow(display
, frame
.nwbutton
);
598 redrawWorkspaceLabel();
599 redrawPrevWorkspaceButton();
600 redrawNextWorkspaceButton();
601 redrawPrevWindowButton();
602 redrawNextWindowButton();
605 toolbarmenu
->reconfigure();
610 void Toolbar::checkClock(Bool redraw
) {
611 #else // !HAVE_STRFTIME
612 void Toolbar::checkClock(Bool redraw
, Bool date
) {
613 #endif // HAVE_STRFTIME
617 if ((tmp
= time(NULL
)) != -1) {
618 if (! (tt
= localtime(&tmp
))) return;
619 if (tt
->tm_min
!= frame
.minute
|| tt
->tm_hour
!= frame
.hour
) {
620 frame
.hour
= tt
->tm_hour
;
621 frame
.minute
= tt
->tm_min
;
622 XClearWindow(display
, frame
.clock
);
630 if (! strftime(t
, 1024, screen
.strftimeFormat(), tt
))
632 #else // !HAVE_STRFTIME
635 // format the date... with special consideration for y2k ;)
636 if (screen
.getDateFormat() == Openbox::B_EuropeanDate
)
637 sprintf(t
, 18n
->getMessage(ToolbarSet
, ToolbarNoStrftimeDateFormatEu
,
639 tt
->tm_mday
, tt
->tm_mon
+ 1,
640 (tt
->tm_year
>= 100) ? tt
->tm_year
- 100 : tt
->tm_year
);
642 sprintf(t
, i18n
->getMessage(ToolbarSet
, ToolbarNoStrftimeDateFormat
,
644 tt
->tm_mon
+ 1, tt
->tm_mday
,
645 (tt
->tm_year
>= 100) ? tt
->tm_year
- 100 : tt
->tm_year
);
647 if (screen
.isClock24Hour())
648 sprintf(t
, i18n
->getMessage(ToolbarSet
, ToolbarNoStrftimeTimeFormat24
,
650 frame
.hour
, frame
.minute
);
652 sprintf(t
, i18n
->getMessage(ToolbarSet
, ToolbarNoStrftimeTimeFormat12
,
654 ((frame
.hour
> 12) ? frame
.hour
- 12 :
655 ((frame
.hour
== 0) ? 12 : frame
.hour
)), frame
.minute
,
656 ((frame
.hour
>= 12) ?
657 i18n
->getMessage(ToolbarSet
,
658 ToolbarNoStrftimeTimeFormatP
, "p") :
659 i18n
->getMessage(ToolbarSet
,
660 ToolbarNoStrftimeTimeFormatA
, "a")));
662 #endif // HAVE_STRFTIME
664 int dx
= (frame
.bevel_w
* 2), dlen
= strlen(t
);
667 if (i18n
->multibyte()) {
668 XRectangle ink
, logical
;
669 XmbTextExtents(screen
.getToolbarStyle()->fontset
,
670 t
, dlen
, &ink
, &logical
);
673 l
= XTextWidth(screen
.getToolbarStyle()->font
, t
, dlen
);
676 l
+= (frame
.bevel_w
* 4);
678 if (l
> frame
.clock_w
) {
679 for (; dlen
>= 0; dlen
--) {
680 if (i18n
->multibyte()) {
681 XRectangle ink
, logical
;
682 XmbTextExtents(screen
.getToolbarStyle()->fontset
,
683 t
, dlen
, &ink
, &logical
);
686 l
= XTextWidth(screen
.getToolbarStyle()->font
, t
, dlen
);
688 l
+= (frame
.bevel_w
* 4);
690 if (l
< frame
.clock_w
)
694 switch (screen
.getToolbarStyle()->justify
) {
695 case BScreen::RightJustify
:
696 dx
+= frame
.clock_w
- l
;
699 case BScreen::CenterJustify
:
700 dx
+= (frame
.clock_w
- l
) / 2;
704 ToolbarStyle
*style
= screen
.getToolbarStyle();
705 if (i18n
->multibyte())
706 XmbDrawString(display
, frame
.clock
, style
->fontset
, style
->c_text_gc
,
707 dx
, (1 - style
->fontset_extents
->max_ink_extent
.y
),
710 XDrawString(display
, frame
.clock
, style
->c_text_gc
, dx
,
711 (style
->font
->ascent
+ 1), t
, dlen
);
716 void Toolbar::redrawWindowLabel(Bool redraw
) {
717 if (screen
.getOpenbox().getFocusedWindow()) {
719 XClearWindow(display
, frame
.window_label
);
721 OpenboxWindow
*foc
= screen
.getOpenbox().getFocusedWindow();
722 if (foc
->getScreen() != &screen
) return;
724 int dx
= (frame
.bevel_w
* 2), dlen
= strlen(*foc
->getTitle());
727 if (i18n
->multibyte()) {
728 XRectangle ink
, logical
;
729 XmbTextExtents(screen
.getToolbarStyle()->fontset
, *foc
->getTitle(),
730 dlen
, &ink
, &logical
);
733 l
= XTextWidth(screen
.getToolbarStyle()->font
, *foc
->getTitle(), dlen
);
735 l
+= (frame
.bevel_w
* 4);
737 if (l
> frame
.window_label_w
) {
738 for (; dlen
>= 0; dlen
--) {
739 if (i18n
->multibyte()) {
740 XRectangle ink
, logical
;
741 XmbTextExtents(screen
.getToolbarStyle()->fontset
,
742 *foc
->getTitle(), dlen
, &ink
, &logical
);
745 l
= XTextWidth(screen
.getToolbarStyle()->font
,
746 *foc
->getTitle(), dlen
);
748 l
+= (frame
.bevel_w
* 4);
750 if (l
< frame
.window_label_w
)
754 switch (screen
.getToolbarStyle()->justify
) {
755 case BScreen::RightJustify
:
756 dx
+= frame
.window_label_w
- l
;
759 case BScreen::CenterJustify
:
760 dx
+= (frame
.window_label_w
- l
) / 2;
764 ToolbarStyle
*style
= screen
.getToolbarStyle();
765 if (i18n
->multibyte())
766 XmbDrawString(display
, frame
.window_label
, style
->fontset
,
767 style
->w_text_gc
, dx
,
768 (1 - style
->fontset_extents
->max_ink_extent
.y
),
769 *foc
->getTitle(), dlen
);
771 XDrawString(display
, frame
.window_label
, style
->w_text_gc
, dx
,
772 (style
->font
->ascent
+ 1), *foc
->getTitle(), dlen
);
774 XClearWindow(display
, frame
.window_label
);
779 void Toolbar::redrawWorkspaceLabel(Bool redraw
) {
780 if (screen
.getCurrentWorkspace()->getName()) {
782 XClearWindow(display
, frame
.workspace_label
);
784 int dx
= (frame
.bevel_w
* 2), dlen
=
785 strlen(screen
.getCurrentWorkspace()->getName());
788 if (i18n
->multibyte()) {
789 XRectangle ink
, logical
;
790 XmbTextExtents(screen
.getToolbarStyle()->fontset
,
791 screen
.getCurrentWorkspace()->getName(), dlen
,
795 l
= XTextWidth(screen
.getToolbarStyle()->font
,
796 screen
.getCurrentWorkspace()->getName(), dlen
);
798 l
+= (frame
.bevel_w
* 4);
800 if (l
> frame
.workspace_label_w
) {
801 for (; dlen
>= 0; dlen
--) {
802 if (i18n
->multibyte()) {
803 XRectangle ink
, logical
;
804 XmbTextExtents(screen
.getToolbarStyle()->fontset
,
805 screen
.getCurrentWorkspace()->getName(), dlen
,
809 l
= XTextWidth(screen
.getWindowStyle()->font
,
810 screen
.getCurrentWorkspace()->getName(), dlen
);
812 l
+= (frame
.bevel_w
* 4);
814 if (l
< frame
.workspace_label_w
)
818 switch (screen
.getToolbarStyle()->justify
) {
819 case BScreen::RightJustify
:
820 dx
+= frame
.workspace_label_w
- l
;
823 case BScreen::CenterJustify
:
824 dx
+= (frame
.workspace_label_w
- l
) / 2;
828 ToolbarStyle
*style
= screen
.getToolbarStyle();
829 if (i18n
->multibyte())
830 XmbDrawString(display
, frame
.workspace_label
, style
->fontset
,
831 style
->l_text_gc
, dx
,
832 (1 - style
->fontset_extents
->max_ink_extent
.y
),
833 (char *) screen
.getCurrentWorkspace()->getName(), dlen
);
835 XDrawString(display
, frame
.workspace_label
, style
->l_text_gc
, dx
,
836 (style
->font
->ascent
+ 1),
837 (char *) screen
.getCurrentWorkspace()->getName(), dlen
);
842 void Toolbar::redrawPrevWorkspaceButton(Bool pressed
, Bool redraw
) {
846 XSetWindowBackgroundPixmap(display
, frame
.psbutton
, frame
.pbutton
);
848 XSetWindowBackground(display
, frame
.psbutton
, frame
.pbutton_pixel
);
851 XSetWindowBackgroundPixmap(display
, frame
.psbutton
, frame
.button
);
853 XSetWindowBackground(display
, frame
.psbutton
, frame
.button_pixel
);
855 XClearWindow(display
, frame
.psbutton
);
858 int hh
= frame
.button_w
/ 2, hw
= frame
.button_w
/ 2;
861 pts
[0].x
= hw
- 2; pts
[0].y
= hh
;
862 pts
[1].x
= 4; pts
[1].y
= 2;
863 pts
[2].x
= 0; pts
[2].y
= -4;
865 XFillPolygon(display
, frame
.psbutton
, screen
.getToolbarStyle()->b_pic_gc
,
866 pts
, 3, Convex
, CoordModePrevious
);
870 void Toolbar::redrawNextWorkspaceButton(Bool pressed
, Bool redraw
) {
874 XSetWindowBackgroundPixmap(display
, frame
.nsbutton
, frame
.pbutton
);
876 XSetWindowBackground(display
, frame
.nsbutton
, frame
.pbutton_pixel
);
879 XSetWindowBackgroundPixmap(display
, frame
.nsbutton
, frame
.button
);
881 XSetWindowBackground(display
, frame
.nsbutton
, frame
.button_pixel
);
883 XClearWindow(display
, frame
.nsbutton
);
886 int hh
= frame
.button_w
/ 2, hw
= frame
.button_w
/ 2;
889 pts
[0].x
= hw
- 2; pts
[0].y
= hh
- 2;
890 pts
[1].x
= 4; pts
[1].y
= 2;
891 pts
[2].x
= -4; pts
[2].y
= 2;
893 XFillPolygon(display
, frame
.nsbutton
, screen
.getToolbarStyle()->b_pic_gc
,
894 pts
, 3, Convex
, CoordModePrevious
);
898 void Toolbar::redrawPrevWindowButton(Bool pressed
, Bool redraw
) {
902 XSetWindowBackgroundPixmap(display
, frame
.pwbutton
, frame
.pbutton
);
904 XSetWindowBackground(display
, frame
.pwbutton
, frame
.pbutton_pixel
);
907 XSetWindowBackgroundPixmap(display
, frame
.pwbutton
, frame
.button
);
909 XSetWindowBackground(display
, frame
.pwbutton
, frame
.button_pixel
);
911 XClearWindow(display
, frame
.pwbutton
);
914 int hh
= frame
.button_w
/ 2, hw
= frame
.button_w
/ 2;
917 pts
[0].x
= hw
- 2; pts
[0].y
= hh
;
918 pts
[1].x
= 4; pts
[1].y
= 2;
919 pts
[2].x
= 0; pts
[2].y
= -4;
921 XFillPolygon(display
, frame
.pwbutton
, screen
.getToolbarStyle()->b_pic_gc
,
922 pts
, 3, Convex
, CoordModePrevious
);
926 void Toolbar::redrawNextWindowButton(Bool pressed
, Bool redraw
) {
930 XSetWindowBackgroundPixmap(display
, frame
.nwbutton
, frame
.pbutton
);
932 XSetWindowBackground(display
, frame
.nwbutton
, frame
.pbutton_pixel
);
935 XSetWindowBackgroundPixmap(display
, frame
.nwbutton
, frame
.button
);
937 XSetWindowBackground(display
, frame
.nwbutton
, frame
.button_pixel
);
939 XClearWindow(display
, frame
.nwbutton
);
942 int hh
= frame
.button_w
/ 2, hw
= frame
.button_w
/ 2;
945 pts
[0].x
= hw
- 2; pts
[0].y
= hh
- 2;
946 pts
[1].x
= 4; pts
[1].y
= 2;
947 pts
[2].x
= -4; pts
[2].y
= 2;
949 XFillPolygon(display
, frame
.nwbutton
, screen
.getToolbarStyle()->b_pic_gc
,
950 pts
, 3, Convex
, CoordModePrevious
);
954 void Toolbar::edit() {
959 if (XGetInputFocus(display
, &window
, &foo
) &&
960 window
== frame
.workspace_label
)
963 XSetInputFocus(display
, frame
.workspace_label
,
964 ((screen
.sloppyFocus()) ? RevertToPointerRoot
:
967 XClearWindow(display
, frame
.workspace_label
);
969 openbox
.setNoFocus(True
);
970 if (openbox
.getFocusedWindow())
971 openbox
.getFocusedWindow()->setFocusFlag(False
);
973 XDrawRectangle(display
, frame
.workspace_label
,
974 screen
.getWindowStyle()->l_text_focus_gc
,
975 frame
.workspace_label_w
/ 2, 0, 1,
978 // change the background of the window to that of an active window label
979 Pixmap tmp
= frame
.wlabel
;
980 BTexture
*texture
= &(screen
.getWindowStyle()->l_focus
);
981 if (texture
->getTexture() == (BImage_Flat
| BImage_Solid
)) {
983 XSetWindowBackground(display
, frame
.workspace_label
,
984 texture
->getColor()->getPixel());
987 image_ctrl
->renderImage(frame
.workspace_label_w
, frame
.label_h
, texture
);
988 XSetWindowBackgroundPixmap(display
, frame
.workspace_label
, frame
.wlabel
);
990 if (tmp
) image_ctrl
->removeImage(tmp
);
994 void Toolbar::buttonPressEvent(XButtonEvent
*be
) {
995 if (be
->button
== 1) {
996 if (be
->window
== frame
.psbutton
)
997 redrawPrevWorkspaceButton(True
, True
);
998 else if (be
->window
== frame
.nsbutton
)
999 redrawNextWorkspaceButton(True
, True
);
1000 else if (be
->window
== frame
.pwbutton
)
1001 redrawPrevWindowButton(True
, True
);
1002 else if (be
->window
== frame
.nwbutton
)
1003 redrawNextWindowButton(True
, True
);
1004 #ifndef HAVE_STRFTIME
1005 else if (be
->window
== frame
.clock
) {
1006 XClearWindow(display
, frame
.clock
);
1007 checkClock(True
, True
);
1009 #endif // HAVE_STRFTIME
1010 else if (! m_ontop
) {
1011 Window w
[1] = { frame
.window
};
1012 screen
.raiseWindows(w
, 1);
1014 } else if (be
->button
== 2 && (! m_ontop
)) {
1015 XLowerWindow(display
, frame
.window
);
1016 } else if (be
->button
== 3) {
1017 if (! toolbarmenu
->isVisible()) {
1020 x
= be
->x_root
- (toolbarmenu
->getWidth() / 2);
1021 y
= be
->y_root
- (toolbarmenu
->getHeight() / 2);
1025 else if (x
+ toolbarmenu
->getWidth() > screen
.size().w())
1026 x
= screen
.size().w() - toolbarmenu
->getWidth();
1030 else if (y
+ toolbarmenu
->getHeight() > screen
.size().h())
1031 y
= screen
.size().h() - toolbarmenu
->getHeight();
1033 toolbarmenu
->move(x
, y
);
1034 toolbarmenu
->show();
1036 toolbarmenu
->hide();
1042 void Toolbar::buttonReleaseEvent(XButtonEvent
*re
) {
1043 if (re
->button
== 1) {
1044 if (re
->window
== frame
.psbutton
) {
1045 redrawPrevWorkspaceButton(False
, True
);
1047 if (re
->x
>= 0 && re
->x
< (signed) frame
.button_w
&&
1048 re
->y
>= 0 && re
->y
< (signed) frame
.button_w
)
1049 if (screen
.getCurrentWorkspace()->getWorkspaceID() > 0)
1050 screen
.changeWorkspaceID(screen
.getCurrentWorkspace()->
1051 getWorkspaceID() - 1);
1053 screen
.changeWorkspaceID(screen
.getWorkspaceCount() - 1);
1054 } else if (re
->window
== frame
.nsbutton
) {
1055 redrawNextWorkspaceButton(False
, True
);
1057 if (re
->x
>= 0 && re
->x
< (signed) frame
.button_w
&&
1058 re
->y
>= 0 && re
->y
< (signed) frame
.button_w
)
1059 if (screen
.getCurrentWorkspace()->getWorkspaceID() <
1060 screen
.getWorkspaceCount() - 1)
1061 screen
.changeWorkspaceID(screen
.getCurrentWorkspace()->
1062 getWorkspaceID() + 1);
1064 screen
.changeWorkspaceID(0);
1065 } else if (re
->window
== frame
.pwbutton
) {
1066 redrawPrevWindowButton(False
, True
);
1068 if (re
->x
>= 0 && re
->x
< (signed) frame
.button_w
&&
1069 re
->y
>= 0 && re
->y
< (signed) frame
.button_w
)
1071 } else if (re
->window
== frame
.nwbutton
) {
1072 redrawNextWindowButton(False
, True
);
1074 if (re
->x
>= 0 && re
->x
< (signed) frame
.button_w
&&
1075 re
->y
>= 0 && re
->y
< (signed) frame
.button_w
)
1077 } else if (re
->window
== frame
.window_label
)
1078 screen
.raiseFocus();
1079 #ifndef HAVE_STRFTIME
1080 else if (re
->window
== frame
.clock
) {
1081 XClearWindow(display
, frame
.clock
);
1084 #endif // HAVE_STRFTIME
1089 void Toolbar::enterNotifyEvent(XCrossingEvent
*) {
1094 if (! hide_timer
->isTiming()) hide_timer
->start();
1096 if (hide_timer
->isTiming()) hide_timer
->stop();
1100 void Toolbar::leaveNotifyEvent(XCrossingEvent
*) {
1105 if (hide_timer
->isTiming()) hide_timer
->stop();
1106 } else if (! toolbarmenu
->isVisible()) {
1107 if (! hide_timer
->isTiming()) hide_timer
->start();
1112 void Toolbar::exposeEvent(XExposeEvent
*ee
) {
1113 if (ee
->window
== frame
.clock
) checkClock(True
);
1114 else if (ee
->window
== frame
.workspace_label
&& (! m_editing
))
1115 redrawWorkspaceLabel();
1116 else if (ee
->window
== frame
.window_label
) redrawWindowLabel();
1117 else if (ee
->window
== frame
.psbutton
) redrawPrevWorkspaceButton();
1118 else if (ee
->window
== frame
.nsbutton
) redrawNextWorkspaceButton();
1119 else if (ee
->window
== frame
.pwbutton
) redrawPrevWindowButton();
1120 else if (ee
->window
== frame
.nwbutton
) redrawNextWindowButton();
1124 void Toolbar::keyPressEvent(XKeyEvent
*ke
) {
1125 if (ke
->window
== frame
.workspace_label
&& m_editing
) {
1128 if (! new_workspace_name
) {
1129 new_workspace_name
= new char[128];
1132 if (! new_workspace_name
) return;
1137 XLookupString(ke
, keychar
, 1, &ks
, 0);
1139 // either we are told to end with a return or we hit the end of the buffer
1140 if (ks
== XK_Return
|| new_name_pos
== 127) {
1141 *(new_workspace_name
+ new_name_pos
) = 0;
1145 openbox
.setNoFocus(False
);
1146 if (openbox
.getFocusedWindow()) {
1147 openbox
.getFocusedWindow()->setInputFocus();
1148 openbox
.getFocusedWindow()->setFocusFlag(True
);
1150 XSetInputFocus(display
, PointerRoot
, None
, CurrentTime
);
1152 // check to make sure that new_name[0] != 0... otherwise we have a null
1153 // workspace name which causes serious problems, especially for the
1154 // Openbox::LoadRC() method.
1155 if (*new_workspace_name
) {
1156 screen
.getCurrentWorkspace()->setName(new_workspace_name
);
1157 screen
.getCurrentWorkspace()->getMenu()->hide();
1158 screen
.getWorkspacemenu()->
1159 remove(screen
.getCurrentWorkspace()->getWorkspaceID() + 2);
1160 screen
.getWorkspacemenu()->
1161 insert(screen
.getCurrentWorkspace()->getName(),
1162 screen
.getCurrentWorkspace()->getMenu(),
1163 screen
.getCurrentWorkspace()->getWorkspaceID() + 2);
1164 screen
.getWorkspacemenu()->update();
1167 delete [] new_workspace_name
;
1168 new_workspace_name
= (char *) 0;
1171 // reset the background to that of the workspace label (its normal
1173 Pixmap tmp
= frame
.wlabel
;
1174 BTexture
*texture
= &(screen
.getToolbarStyle()->label
);
1175 if (texture
->getTexture() == (BImage_Flat
| BImage_Solid
)) {
1176 frame
.wlabel
= None
;
1177 XSetWindowBackground(display
, frame
.workspace_label
,
1178 texture
->getColor()->getPixel());
1181 image_ctrl
->renderImage(frame
.workspace_label_w
, frame
.label_h
, texture
);
1182 XSetWindowBackgroundPixmap(display
, frame
.workspace_label
, frame
.wlabel
);
1184 if (tmp
) image_ctrl
->removeImage(tmp
);
1187 } else if (! (ks
== XK_Shift_L
|| ks
== XK_Shift_R
||
1188 ks
== XK_Control_L
|| ks
== XK_Control_R
||
1189 ks
== XK_Caps_Lock
|| ks
== XK_Shift_Lock
||
1190 ks
== XK_Meta_L
|| ks
== XK_Meta_R
||
1191 ks
== XK_Alt_L
|| ks
== XK_Alt_R
||
1192 ks
== XK_Super_L
|| ks
== XK_Super_R
||
1193 ks
== XK_Hyper_L
|| ks
== XK_Hyper_R
)) {
1194 if (ks
== XK_BackSpace
) {
1195 if (new_name_pos
> 0) {
1197 *(new_workspace_name
+ new_name_pos
) = '\0';
1199 *new_workspace_name
= '\0';
1202 *(new_workspace_name
+ new_name_pos
) = *keychar
;
1204 *(new_workspace_name
+ new_name_pos
) = '\0';
1207 XClearWindow(display
, frame
.workspace_label
);
1208 int l
= strlen(new_workspace_name
), tw
, x
;
1210 if (i18n
->multibyte()) {
1211 XRectangle ink
, logical
;
1212 XmbTextExtents(screen
.getToolbarStyle()->fontset
,
1213 new_workspace_name
, l
, &ink
, &logical
);
1216 tw
= XTextWidth(screen
.getToolbarStyle()->font
,
1217 new_workspace_name
, l
);
1219 x
= (frame
.workspace_label_w
- tw
) / 2;
1221 if (x
< (signed) frame
.bevel_w
) x
= frame
.bevel_w
;
1223 WindowStyle
*style
= screen
.getWindowStyle();
1224 if (i18n
->multibyte())
1225 XmbDrawString(display
, frame
.workspace_label
, style
->fontset
,
1226 style
->l_text_focus_gc
, x
,
1227 (1 - style
->fontset_extents
->max_ink_extent
.y
),
1228 new_workspace_name
, l
);
1230 XDrawString(display
, frame
.workspace_label
, style
->l_text_focus_gc
, x
,
1231 (style
->font
->ascent
+ 1),
1232 new_workspace_name
, l
);
1234 XDrawRectangle(display
, frame
.workspace_label
,
1235 screen
.getWindowStyle()->l_text_focus_gc
, x
+ tw
, 0, 1,
1244 void Toolbar::timeout() {
1248 gettimeofday(&now
, 0);
1249 clock_timer
->setTimeout((60 - (now
.tv_sec
% 60)) * 1000);
1253 void Toolbar::HideHandler::timeout() {
1254 toolbar
->m_hidden
= !toolbar
->m_hidden
;
1255 if (toolbar
->m_hidden
)
1256 XMoveWindow(toolbar
->display
, toolbar
->frame
.window
,
1257 toolbar
->frame
.x_hidden
, toolbar
->frame
.y_hidden
);
1259 XMoveWindow(toolbar
->display
, toolbar
->frame
.window
,
1260 toolbar
->frame
.x
, toolbar
->frame
.y
);
1264 Toolbarmenu::Toolbarmenu(Toolbar
&tb
) : Basemenu(tb
.screen
), toolbar(tb
) {
1265 setLabel(i18n
->getMessage(ToolbarSet
, ToolbarToolbarTitle
, "Toolbar"));
1268 placementmenu
= new Placementmenu(*this);
1270 insert(i18n
->getMessage(CommonSet
, CommonPlacementTitle
, "Placement"),
1272 insert(i18n
->getMessage(CommonSet
, CommonAlwaysOnTop
, "Always on top"), 1);
1273 insert(i18n
->getMessage(CommonSet
, CommonAutoHide
, "Auto hide"), 2);
1274 insert(i18n
->getMessage(ToolbarSet
, ToolbarEditWkspcName
,
1275 "Edit current workspace name"), 3);
1282 void Toolbarmenu::setValues() {
1283 setItemSelected(1, toolbar
.onTop());
1284 setItemSelected(2, toolbar
.autoHide());
1288 Toolbarmenu::~Toolbarmenu() {
1289 delete placementmenu
;
1293 void Toolbarmenu::itemSelected(int button
, int index
) {
1297 BasemenuItem
*item
= find(index
);
1300 switch (item
->function()) {
1301 case 1: { // always on top
1302 Bool change
= ((toolbar
.onTop()) ? False
: True
);
1303 toolbar
.setOnTop(change
);
1304 setItemSelected(1, change
);
1306 if (toolbar
.onTop()) toolbar
.screen
.raiseWindows((Window
*) 0, 0);
1310 case 2: { // auto hide
1311 Bool change
= ((toolbar
.autoHide()) ? False
: True
);
1312 toolbar
.setAutoHide(change
);
1313 setItemSelected(2, change
);
1316 toolbar
.screen
.getSlit()->reposition();
1321 case 3: { // edit current workspace name
1331 void Toolbarmenu::internal_hide() {
1332 Basemenu::internal_hide();
1333 if (toolbar
.autoHide() && ! toolbar
.isEditing())
1334 toolbar
.hide_handler
.timeout();
1338 void Toolbarmenu::reconfigure() {
1340 placementmenu
->reconfigure();
1342 Basemenu::reconfigure();
1346 Toolbarmenu::Placementmenu::Placementmenu(Toolbarmenu
&tm
)
1347 : Basemenu(tm
.toolbar
.screen
), toolbarmenu(tm
) {
1348 setLabel(i18n
->getMessage(ToolbarSet
, ToolbarToolbarPlacement
,
1349 "Toolbar Placement"));
1351 setMinimumSublevels(3);
1353 insert(i18n
->getMessage(CommonSet
, CommonPlacementTopLeft
,
1354 "Top Left"), Toolbar::TopLeft
);
1355 insert(i18n
->getMessage(CommonSet
, CommonPlacementBottomLeft
,
1356 "Bottom Left"), Toolbar::BottomLeft
);
1357 insert(i18n
->getMessage(CommonSet
, CommonPlacementTopCenter
,
1358 "Top Center"), Toolbar::TopCenter
);
1359 insert(i18n
->getMessage(CommonSet
, CommonPlacementBottomCenter
,
1360 "Bottom Center"), Toolbar::BottomCenter
);
1361 insert(i18n
->getMessage(CommonSet
, CommonPlacementTopRight
,
1362 "Top Right"), Toolbar::TopRight
);
1363 insert(i18n
->getMessage(CommonSet
, CommonPlacementBottomRight
,
1364 "Bottom Right"), Toolbar::BottomRight
);
1368 void Toolbarmenu::Placementmenu::itemSelected(int button
, int index
) {
1372 BasemenuItem
*item
= find(index
);
1375 toolbarmenu
.toolbar
.setPlacement(item
->function());
1377 toolbarmenu
.toolbar
.reconfigure();
1380 // reposition the slit as well to make sure it doesn't intersect the
1382 toolbarmenu
.toolbar
.screen
.getSlit()->reposition();