using new toolbartheme, fixed placement function and changed to FbTk EventHandler

This commit is contained in:
fluxgen 2002-12-02 21:54:30 +00:00
parent fdb116cec5
commit af7c6a7c6b
2 changed files with 265 additions and 229 deletions

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
// $Id: Toolbar.cc,v 1.45 2002/12/01 13:42:01 rathnor Exp $ // $Id: Toolbar.cc,v 1.46 2002/12/02 21:54:30 fluxgen Exp $
#include "Toolbar.hh" #include "Toolbar.hh"
@ -36,6 +36,9 @@
#include "Workspace.hh" #include "Workspace.hh"
#include "Workspacemenu.hh" #include "Workspacemenu.hh"
#include "ImageControl.hh" #include "ImageControl.hh"
#include "ToolbarTheme.hh"
#include "EventManager.hh"
#include "Text.hh"
// use GNU extensions // use GNU extensions
#ifndef _GNU_SOURCE #ifndef _GNU_SOURCE
@ -67,16 +70,27 @@
using namespace std; using namespace std;
Toolbar::Toolbar(BScreen *scrn): Toolbar::Toolbar(BScreen *scrn, size_t width):
on_top(scrn->isToolbarOnTop()), on_top(scrn->isToolbarOnTop()),
editing(false), editing(false),
hidden(scrn->doToolbarAutoHide()), hidden(scrn->doToolbarAutoHide()),
do_auto_hide(scrn->doToolbarAutoHide()), do_auto_hide(scrn->doToolbarAutoHide()),
m_screen(scrn), m_screen(scrn),
image_ctrl(scrn->getImageControl()), image_ctrl(*scrn->getImageControl()),
clock_timer(this), // get the clock updating every minute clock_timer(this), // get the clock updating every minute
hide_timer(&hide_handler), hide_timer(&hide_handler),
m_toolbarmenu(*this) { m_toolbarmenu(*this),
m_theme(scrn->getScreenNumber()),
m_place(BOTTOMCENTER) {
// geometry settings
frame.width = width;
frame.height = frame.label_h = 10;
frame.window_label_w =
frame.workspace_label_w = frame.clock_w = width/3;
frame.button_w = 20;
frame.bevel_w = 1;
timeval delay; timeval delay;
delay.tv_sec = 1; delay.tv_sec = 1;
delay.tv_usec = 0; delay.tv_usec = 0;
@ -102,14 +116,15 @@ Toolbar::Toolbar(BScreen *scrn):
attrib.event_mask = ButtonPressMask | ButtonReleaseMask | attrib.event_mask = ButtonPressMask | ButtonReleaseMask |
EnterWindowMask | LeaveWindowMask; EnterWindowMask | LeaveWindowMask;
Fluxbox * const fluxbox = Fluxbox::instance(); FbTk::EventManager &evm = *FbTk::EventManager::instance();
int depth = m_screen->getDepth(); int depth = m_screen->getDepth();
Visual *vis = m_screen->getVisual(); Visual *vis = m_screen->getVisual();
frame.window = frame.window =
XCreateWindow(display, m_screen->getRootWindow(), 0, 0, 1, 1, 0, XCreateWindow(display, m_screen->getRootWindow(), 0, 0, 1, 1, 0,
depth, InputOutput, vis, depth, InputOutput, vis,
create_mask, &attrib); create_mask, &attrib);
fluxbox->saveToolbarSearch(frame.window, this); evm.add(*this, frame.window);
attrib.event_mask = ButtonPressMask | ButtonReleaseMask | ExposureMask | attrib.event_mask = ButtonPressMask | ButtonReleaseMask | ExposureMask |
KeyPressMask | EnterWindowMask; KeyPressMask | EnterWindowMask;
@ -117,37 +132,37 @@ Toolbar::Toolbar(BScreen *scrn):
frame.workspace_label = frame.workspace_label =
XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, depth, XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, depth,
InputOutput, vis, create_mask, &attrib); InputOutput, vis, create_mask, &attrib);
fluxbox->saveToolbarSearch(frame.workspace_label, this); evm.add(*this, frame.workspace_label);
frame.window_label = frame.window_label =
XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, depth, XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, depth,
InputOutput, vis, create_mask, &attrib); InputOutput, vis, create_mask, &attrib);
fluxbox->saveToolbarSearch(frame.window_label, this); evm.add(*this, frame.window_label);
frame.clock = frame.clock =
XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, depth, XCreateWindow(display, frame.window, 0, 0, 1, 1, 0, depth,
InputOutput, vis, create_mask, &attrib); InputOutput, vis, create_mask, &attrib);
fluxbox->saveToolbarSearch(frame.clock, this); evm.add(*this, frame.clock);
frame.psbutton = frame.psbutton =
XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, depth, XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, depth,
InputOutput, vis, create_mask, &attrib); InputOutput, vis, create_mask, &attrib);
fluxbox->saveToolbarSearch(frame.psbutton, this); evm.add(*this, frame.psbutton);
frame.nsbutton = frame.nsbutton =
XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, depth, XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, depth,
InputOutput, vis, create_mask, &attrib); InputOutput, vis, create_mask, &attrib);
fluxbox->saveToolbarSearch(frame.nsbutton, this); evm.add(*this, frame.nsbutton);
frame.pwbutton = frame.pwbutton =
XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, depth, XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, depth,
InputOutput, vis, create_mask, &attrib); InputOutput, vis, create_mask, &attrib);
fluxbox->saveToolbarSearch(frame.pwbutton, this); evm.add(*this, frame.pwbutton);
frame.nwbutton = frame.nwbutton =
XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, depth, XCreateWindow(display ,frame.window, 0, 0, 1, 1, 0, depth,
InputOutput, vis, create_mask, &attrib); InputOutput, vis, create_mask, &attrib);
fluxbox->saveToolbarSearch(frame.nwbutton, this); evm.add(*this, frame.nwbutton);
frame.base = frame.label = frame.wlabel = frame.clk = frame.button = frame.base = frame.label = frame.wlabel = frame.clk = frame.button =
frame.pbutton = None; frame.pbutton = None;
@ -168,23 +183,24 @@ Toolbar::Toolbar(BScreen *scrn):
Toolbar::~Toolbar() { Toolbar::~Toolbar() {
XUnmapWindow(display, frame.window); XUnmapWindow(display, frame.window);
if (frame.base) image_ctrl->removeImage(frame.base); if (frame.base) image_ctrl.removeImage(frame.base);
if (frame.label) image_ctrl->removeImage(frame.label); if (frame.label) image_ctrl.removeImage(frame.label);
if (frame.wlabel) image_ctrl->removeImage(frame.wlabel); if (frame.wlabel) image_ctrl.removeImage(frame.wlabel);
if (frame.clk) image_ctrl->removeImage(frame.clk); if (frame.clk) image_ctrl.removeImage(frame.clk);
if (frame.button) image_ctrl->removeImage(frame.button); if (frame.button) image_ctrl.removeImage(frame.button);
if (frame.pbutton) image_ctrl->removeImage(frame.pbutton); if (frame.pbutton) image_ctrl.removeImage(frame.pbutton);
Fluxbox * const fluxbox = Fluxbox::instance(); FbTk::EventManager &evm = *FbTk::EventManager::instance();
fluxbox->removeToolbarSearch(frame.window);
evm.remove(frame.window);
fluxbox->removeToolbarSearch(frame.workspace_label); evm.remove(frame.workspace_label);
fluxbox->removeToolbarSearch(frame.window_label); evm.remove(frame.window_label);
fluxbox->removeToolbarSearch(frame.clock); evm.remove(frame.clock);
fluxbox->removeToolbarSearch(frame.psbutton); evm.remove(frame.psbutton);
fluxbox->removeToolbarSearch(frame.nsbutton); evm.remove(frame.nsbutton);
fluxbox->removeToolbarSearch(frame.pwbutton); evm.remove(frame.pwbutton);
fluxbox->removeToolbarSearch(frame.nwbutton); evm.remove(frame.nwbutton);
XDestroyWindow(display, frame.workspace_label); XDestroyWindow(display, frame.workspace_label);
XDestroyWindow(display, frame.window_label); XDestroyWindow(display, frame.window_label);
@ -196,103 +212,20 @@ Toolbar::~Toolbar() {
void Toolbar::addIcon(FluxboxWindow *w) { void Toolbar::addIcon(FluxboxWindow *w) {
if (m_iconbar.get() != 0) if (m_iconbar.get() != 0)
Fluxbox::instance()->saveToolbarSearch(m_iconbar->addIcon(w), this); FbTk::EventManager::instance()->add(*this, m_iconbar->addIcon(w));
} }
void Toolbar::delIcon(FluxboxWindow *w) { void Toolbar::delIcon(FluxboxWindow *w) {
if (m_iconbar.get() != 0) if (m_iconbar.get() != 0)
Fluxbox::instance()->removeToolbarSearch(m_iconbar->delIcon(w)); FbTk::EventManager::instance()->remove(m_iconbar->delIcon(w));
} }
void Toolbar::reconfigure() { void Toolbar::reconfigure() {
int head_x = 0,
head_y = 0,
head_w,
head_h;
frame.bevel_w = screen()->getBevelWidth(); frame.bevel_w = screen()->getBevelWidth();
#ifdef XINERAMA
int head = (screen->hasXinerama())
? screen->getToolbarOnHead()
: -1;
if (head >= 0) { // toolbar on head nr, if -1 then over ALL heads
head_x = screen()->getHeadX(head);
head_y = screen()->getHeadY(head);
head_w = screen()->getHeadWidth(head);
head_h = screen()->getHeadHeight(head);
frame.width =
(screen()->getHeadWidth(head) * screen()->getToolbarWidthPercent() / 100);
} else {
head_w = screen->getWidth();
head_h = screen->getHeight();
frame.width = screen()->getWidth() * screen()->getToolbarWidthPercent() / 100;
}
#else // !XINERAMA
head_w = screen()->getWidth();
head_h = screen()->getHeight();
frame.width = screen()->getWidth() * screen()->getToolbarWidthPercent() / 100;
#endif // XINERAMA
frame.height = screen()->getToolbarStyle()->font.height();
frame.button_w = frame.height; frame.button_w = frame.height;
frame.height += 2;
frame.label_h = frame.height;
frame.height += (frame.bevel_w * 2);
switch (screen()->getToolbarPlacement()) {
case TOPLEFT:
frame.x = head_x;
frame.y = head_y;
frame.x_hidden = head_x;
frame.y_hidden = head_y +
screen()->getBevelWidth() - screen()->getBorderWidth() - frame.height;
break;
case BOTTOMLEFT: // setPlacement(m_place);
frame.x = head_x;
frame.y = head_y + head_h - frame.height - screen()->getBorderWidth2x();
frame.x_hidden = head_x;
frame.y_hidden = head_y + head_h - screen()->getBevelWidth() -
screen()->getBorderWidth();
break;
case TOPCENTER:
frame.x = head_x + ((head_w - frame.width) / 2);
frame.y = head_y;
frame.x_hidden = frame.x;
frame.y_hidden = head_y +
screen()->getBevelWidth() - screen()->getBorderWidth() - frame.height;
break;
case BOTTOMCENTER:
default:
frame.x = head_x + ((head_w - frame.width) / 2);
frame.y = head_y + head_h - frame.height - screen()->getBorderWidth2x();
frame.x_hidden = frame.x;
frame.y_hidden = head_y + head_h - screen()->getBevelWidth() -
screen()->getBorderWidth();
break;
case TOPRIGHT:
frame.x = head_x + head_w - frame.width - screen()->getBorderWidth2x();
frame.y = head_y;
frame.x_hidden = frame.x;
frame.y_hidden = head_y +
screen()->getBevelWidth() - screen()->getBorderWidth() - frame.height;
break;
case BOTTOMRIGHT:
frame.x = head_x + head_w - frame.width - screen()->getBorderWidth2x();
frame.y = head_y + head_h - frame.height - screen()->getBorderWidth2x();
frame.x_hidden = frame.x;
frame.y_hidden = head_y + head_h - screen()->getBevelWidth() -
screen()->getBorderWidth();
break;
}
#ifdef HAVE_STRFTIME #ifdef HAVE_STRFTIME
time_t ttmp = time(0); time_t ttmp = time(0);
@ -309,7 +242,7 @@ void Toolbar::reconfigure() {
memset(time_string, '0', len); memset(time_string, '0', len);
*(time_string + len) = '\0'; *(time_string + len) = '\0';
frame.clock_w = screen()->getToolbarStyle()->font.textWidth(time_string, len); frame.clock_w = m_theme.font().textWidth(time_string, len);
frame.clock_w += (frame.bevel_w * 4); frame.clock_w += (frame.bevel_w * 4);
delete [] time_string; delete [] time_string;
@ -319,13 +252,13 @@ void Toolbar::reconfigure() {
frame.clock_w = 0; frame.clock_w = 0;
#else // !HAVE_STRFTIME #else // !HAVE_STRFTIME
frame.clock_w = screen()->getToolbarStyle()->font.textWidth( frame.clock_w = m_theme.font().textWidth(
i18n->getMessage( i18n->getMessage(
ToolbarSet, ToolbarNoStrftimeLength, ToolbarSet, ToolbarNoStrftimeLength,
"00:00000"), "00:00000"),
strlen(i18n->getMessage( strlen(i18n->getMessage(
ToolbarSet, ToolbarNoStrftimeLength, ToolbarSet, ToolbarNoStrftimeLength,
"00:00000"))) + (frame.bevel_w * 4); "00:00000"))) + (frame.bevel_w * 4);
#endif // HAVE_STRFTIME #endif // HAVE_STRFTIME
@ -334,9 +267,9 @@ void Toolbar::reconfigure() {
frame.workspace_label_w = 0; frame.workspace_label_w = 0;
for (i = 0; i < screen()->getCount(); i++) { for (i = 0; i < screen()->getCount(); i++) {
w = screen()->getToolbarStyle()->font.textWidth( w = m_theme.font().textWidth(
screen()->getWorkspace(i)->name().c_str(), screen()->getWorkspace(i)->name().c_str(),
screen()->getWorkspace(i)->name().size()); screen()->getWorkspace(i)->name().size());
w += (frame.bevel_w * 4); w += (frame.bevel_w * 4);
@ -385,58 +318,58 @@ void Toolbar::reconfigure() {
frame.label_h); frame.label_h);
Pixmap tmp = frame.base; Pixmap tmp = frame.base;
const FbTk::Texture *texture = &(screen()->getToolbarStyle()->toolbar); const FbTk::Texture *texture = &(m_theme.toolbar());
if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) { if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) {
frame.base = None; frame.base = None;
XSetWindowBackground(display, frame.window, XSetWindowBackground(display, frame.window,
texture->color().pixel()); texture->color().pixel());
} else { } else {
frame.base = frame.base =
image_ctrl->renderImage(frame.width, frame.height, *texture); image_ctrl.renderImage(frame.width, frame.height, *texture);
XSetWindowBackgroundPixmap(display, frame.window, frame.base); XSetWindowBackgroundPixmap(display, frame.window, frame.base);
} }
if (tmp) image_ctrl->removeImage(tmp); if (tmp) image_ctrl.removeImage(tmp);
tmp = frame.label; tmp = frame.label;
texture = &(screen()->getToolbarStyle()->window); texture = &(m_theme.window());
if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) { if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) {
frame.label = None; frame.label = None;
XSetWindowBackground(display, frame.window_label, XSetWindowBackground(display, frame.window_label,
texture->color().pixel()); texture->color().pixel());
} else { } else {
frame.label = frame.label =
image_ctrl->renderImage(frame.window_label_w, frame.label_h, *texture); image_ctrl.renderImage(frame.window_label_w, frame.label_h, *texture);
XSetWindowBackgroundPixmap(display, frame.window_label, frame.label); XSetWindowBackgroundPixmap(display, frame.window_label, frame.label);
} }
if (tmp) image_ctrl->removeImage(tmp); if (tmp) image_ctrl.removeImage(tmp);
tmp = frame.wlabel; tmp = frame.wlabel;
texture = &(screen()->getToolbarStyle()->label); texture = &(m_theme.label());
if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) { if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) {
frame.wlabel = None; frame.wlabel = None;
XSetWindowBackground(display, frame.workspace_label, XSetWindowBackground(display, frame.workspace_label,
texture->color().pixel()); texture->color().pixel());
} else { } else {
frame.wlabel = frame.wlabel =
image_ctrl->renderImage(frame.workspace_label_w, frame.label_h, *texture); image_ctrl.renderImage(frame.workspace_label_w, frame.label_h, *texture);
XSetWindowBackgroundPixmap(display, frame.workspace_label, frame.wlabel); XSetWindowBackgroundPixmap(display, frame.workspace_label, frame.wlabel);
} }
if (tmp) image_ctrl->removeImage(tmp); if (tmp) image_ctrl.removeImage(tmp);
tmp = frame.clk; tmp = frame.clk;
texture = &(screen()->getToolbarStyle()->clock); texture = &(m_theme.clock());
if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) { if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) {
frame.clk = None; frame.clk = None;
XSetWindowBackground(display, frame.clock, texture->color().pixel()); XSetWindowBackground(display, frame.clock, texture->color().pixel());
} else { } else {
frame.clk = frame.clk =
image_ctrl->renderImage(frame.clock_w, frame.label_h, *texture); image_ctrl.renderImage(frame.clock_w, frame.label_h, *texture);
XSetWindowBackgroundPixmap(display, frame.clock, frame.clk); XSetWindowBackgroundPixmap(display, frame.clock, frame.clk);
} }
if (tmp) image_ctrl->removeImage(tmp); if (tmp) image_ctrl.removeImage(tmp);
tmp = frame.button; tmp = frame.button;
texture = &(screen()->getToolbarStyle()->button); texture = &(m_theme.button());
if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) { if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) {
frame.button = None; frame.button = None;
@ -447,7 +380,7 @@ void Toolbar::reconfigure() {
XSetWindowBackground(display, frame.nwbutton, frame.button_pixel); XSetWindowBackground(display, frame.nwbutton, frame.button_pixel);
} else { } else {
frame.button = frame.button =
image_ctrl->renderImage(frame.button_w, frame.button_w, *texture); image_ctrl.renderImage(frame.button_w, frame.button_w, *texture);
XSetWindowBackgroundPixmap(display, frame.psbutton, frame.button); XSetWindowBackgroundPixmap(display, frame.psbutton, frame.button);
XSetWindowBackgroundPixmap(display, frame.nsbutton, frame.button); XSetWindowBackgroundPixmap(display, frame.nsbutton, frame.button);
@ -455,18 +388,18 @@ void Toolbar::reconfigure() {
XSetWindowBackgroundPixmap(display, frame.nwbutton, frame.button); XSetWindowBackgroundPixmap(display, frame.nwbutton, frame.button);
} }
if (tmp) if (tmp)
image_ctrl->removeImage(tmp); image_ctrl.removeImage(tmp);
tmp = frame.pbutton; tmp = frame.pbutton;
texture = &(screen()->getToolbarStyle()->pressed); texture = &(m_theme.pressedButton());
if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) { if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) {
frame.pbutton = None; frame.pbutton = None;
frame.pbutton_pixel = texture->color().pixel(); frame.pbutton_pixel = texture->color().pixel();
} else } else
frame.pbutton = frame.pbutton =
image_ctrl->renderImage(frame.button_w, frame.button_w, *texture); image_ctrl.renderImage(frame.button_w, frame.button_w, *texture);
if (tmp) if (tmp)
image_ctrl->removeImage(tmp); image_ctrl.removeImage(tmp);
XSetWindowBorder(display, frame.window, XSetWindowBorder(display, frame.window,
screen()->getBorderColor()->pixel()); screen()->getBorderColor()->pixel());
@ -515,6 +448,7 @@ void Toolbar::reconfigure() {
m_iconbar.reset(0); // destroy iconbar m_iconbar.reset(0); // destroy iconbar
} }
} }
@ -589,18 +523,18 @@ void Toolbar::checkClock(bool redraw, bool date) {
#endif // HAVE_STRFTIME #endif // HAVE_STRFTIME
size_t newlen = strlen(t); size_t newlen = strlen(t);
int dx = DrawUtil::doAlignment(frame.clock_w, int dx = FbTk::doAlignment(frame.clock_w,
frame.bevel_w*2, frame.bevel_w*2,
screen()->getToolbarStyle()->justify, m_theme.justify(),
screen()->getToolbarStyle()->font, m_theme.font(),
t, strlen(t), newlen); t, strlen(t), newlen);
screen()->getToolbarStyle()->font.drawText( m_theme.font().drawText(
frame.clock, frame.clock,
screen()->getScreenNumber(), screen()->getScreenNumber(),
screen()->getToolbarStyle()->c_text_gc, m_theme.clockTextGC(),
t, newlen, t, newlen,
dx, 1 + screen()->getToolbarStyle()->font.ascent()); dx, 1 + m_theme.font().ascent());
} }
} }
@ -615,17 +549,17 @@ void Toolbar::redrawWindowLabel(bool redraw) {
return; return;
size_t newlen = foc->getTitle().size(); size_t newlen = foc->getTitle().size();
int dx = DrawUtil::doAlignment(frame.window_label_w, frame.bevel_w*2, int dx = FbTk::doAlignment(frame.window_label_w, frame.bevel_w*2,
screen()->getToolbarStyle()->justify, m_theme.justify(),
screen()->getToolbarStyle()->font, m_theme.font(),
foc->getTitle().c_str(), foc->getTitle().size(), newlen); foc->getTitle().c_str(), foc->getTitle().size(), newlen);
screen()->getToolbarStyle()->font.drawText( m_theme.font().drawText(
frame.window_label, frame.window_label,
screen()->getScreenNumber(), screen()->getScreenNumber(),
screen()->getToolbarStyle()->w_text_gc, m_theme.windowTextGC(),
foc->getTitle().c_str(), newlen, foc->getTitle().c_str(), newlen,
dx, 1 + screen()->getToolbarStyle()->font.ascent()); dx, 1 + m_theme.font().ascent());
} else } else
XClearWindow(display, frame.window_label); XClearWindow(display, frame.window_label);
} }
@ -641,17 +575,17 @@ void Toolbar::redrawWorkspaceLabel(bool redraw) {
const char *text = screen()->getCurrentWorkspace()->name().c_str(); const char *text = screen()->getCurrentWorkspace()->name().c_str();
size_t textlen = screen()->getCurrentWorkspace()->name().size(); size_t textlen = screen()->getCurrentWorkspace()->name().size();
size_t newlen = textlen; size_t newlen = textlen;
int dx = DrawUtil::doAlignment(frame.workspace_label_w, frame.bevel_w, int dx = FbTk::doAlignment(frame.workspace_label_w, frame.bevel_w,
screen()->getToolbarStyle()->justify, m_theme.justify(),
screen()->getToolbarStyle()->font, m_theme.font(),
text, textlen, newlen); text, textlen, newlen);
screen()->getToolbarStyle()->font.drawText( m_theme.font().drawText(
frame.workspace_label, frame.workspace_label,
screen()->getScreenNumber(), screen()->getScreenNumber(),
screen()->getToolbarStyle()->l_text_gc, m_theme.labelTextGC(),
text, newlen, text, newlen,
dx, 1 + screen()->getToolbarStyle()->font.ascent()); dx, 1 + m_theme.font().ascent());
} }
@ -678,7 +612,7 @@ void Toolbar::redrawPrevWorkspaceButton(bool pressed, bool redraw) {
pts[1].x = 4; pts[1].y = 2; pts[1].x = 4; pts[1].y = 2;
pts[2].x = 0; pts[2].y = -4; pts[2].x = 0; pts[2].y = -4;
XFillPolygon(display, frame.psbutton, screen()->getToolbarStyle()->b_pic_gc, XFillPolygon(display, frame.psbutton, m_theme.buttonPicGC(),
pts, 3, Convex, CoordModePrevious); pts, 3, Convex, CoordModePrevious);
} }
@ -706,7 +640,7 @@ void Toolbar::redrawNextWorkspaceButton(bool pressed, bool redraw) {
pts[1].x = 4; pts[1].y = 2; pts[1].x = 4; pts[1].y = 2;
pts[2].x = -4; pts[2].y = 2; pts[2].x = -4; pts[2].y = 2;
XFillPolygon(display, frame.nsbutton, screen()->getToolbarStyle()->b_pic_gc, XFillPolygon(display, frame.nsbutton, m_theme.buttonPicGC(),
pts, 3, Convex, CoordModePrevious); pts, 3, Convex, CoordModePrevious);
} }
@ -734,7 +668,7 @@ void Toolbar::redrawPrevWindowButton(bool pressed, bool redraw) {
pts[1].x = 4; pts[1].y = 2; pts[1].x = 4; pts[1].y = 2;
pts[2].x = 0; pts[2].y = -4; pts[2].x = 0; pts[2].y = -4;
XFillPolygon(display, frame.pwbutton, screen()->getToolbarStyle()->b_pic_gc, XFillPolygon(display, frame.pwbutton, m_theme.buttonPicGC(),
pts, 3, Convex, CoordModePrevious); pts, 3, Convex, CoordModePrevious);
} }
@ -762,7 +696,7 @@ void Toolbar::redrawNextWindowButton(bool pressed, bool redraw) {
pts[1].x = 4; pts[1].y = 2; pts[1].x = 4; pts[1].y = 2;
pts[2].x = -4; pts[2].y = 2; pts[2].x = -4; pts[2].y = 2;
XFillPolygon(display, frame.nwbutton, screen()->getToolbarStyle()->b_pic_gc, XFillPolygon(display, frame.nwbutton, m_theme.buttonPicGC(),
pts, 3, Convex, CoordModePrevious); pts, 3, Convex, CoordModePrevious);
} }
@ -796,23 +730,23 @@ void Toolbar::edit() {
} }
void Toolbar::buttonPressEvent(XButtonEvent *be) { void Toolbar::buttonPressEvent(XButtonEvent &be) {
FluxboxWindow *fluxboxwin=0; FluxboxWindow *fluxboxwin=0;
if (be->button == 1) { if (be.button == 1) {
if (be->window == frame.psbutton) if (be.window == frame.psbutton)
redrawPrevWorkspaceButton(true, true); redrawPrevWorkspaceButton(true, true);
else if (be->window == frame.nsbutton) else if (be.window == frame.nsbutton)
redrawNextWorkspaceButton(true, true); redrawNextWorkspaceButton(true, true);
else if (be->window == frame.pwbutton) else if (be.window == frame.pwbutton)
redrawPrevWindowButton(true, true); redrawPrevWindowButton(true, true);
else if (be->window == frame.nwbutton) else if (be.window == frame.nwbutton)
redrawNextWindowButton(true, true); redrawNextWindowButton(true, true);
else if ( m_iconbar.get() != 0 ) { else if ( m_iconbar.get() != 0 ) {
if ( (fluxboxwin = m_iconbar->findWindow(be->window)) ) if ( (fluxboxwin = m_iconbar->findWindow(be.window)) )
fluxboxwin->deiconify(); fluxboxwin->deiconify();
} }
#ifndef HAVE_STRFTIME #ifndef HAVE_STRFTIME
else if (be->window == frame.clock) { else if (be.window == frame.clock) {
XClearWindow(display, frame.clock); XClearWindow(display, frame.clock);
checkClock(true, true); checkClock(true, true);
} }
@ -822,16 +756,16 @@ void Toolbar::buttonPressEvent(XButtonEvent *be) {
st.push_back(frame.window); st.push_back(frame.window);
screen()->raiseWindows(st); screen()->raiseWindows(st);
} }
} else if (be->button == 2 && (! on_top)) { } else if (be.button == 2 && (! on_top)) {
XLowerWindow(display, frame.window); XLowerWindow(display, frame.window);
} else if (be->button == 3) { } else if (be.button == 3) {
FluxboxWindow *fluxboxwin = 0; FluxboxWindow *fluxboxwin = 0;
// if we clicked on a icon then show window menu // if we clicked on a icon then show window menu
if ( m_iconbar.get() != 0 && (fluxboxwin = m_iconbar->findWindow(be->window)) ) { if ( m_iconbar.get() != 0 && (fluxboxwin = m_iconbar->findWindow(be.window)) ) {
const Windowmenu * const wm = fluxboxwin->getWindowmenu(); const Windowmenu * const wm = fluxboxwin->getWindowmenu();
if (wm != 0) { if (wm != 0) {
int menu_y = be->y_root - wm->height(); int menu_y = be.y_root - wm->height();
int menu_x = be->x_root; int menu_x = be.x_root;
// make sure the menu is visible // make sure the menu is visible
if (menu_y < 0) { if (menu_y < 0) {
menu_y = 0; menu_y = 0;
@ -846,8 +780,8 @@ void Toolbar::buttonPressEvent(XButtonEvent *be) {
} else if (! m_toolbarmenu.isVisible()) { } else if (! m_toolbarmenu.isVisible()) {
int x, y; int x, y;
x = be->x_root - (m_toolbarmenu.width() / 2); x = be.x_root - (m_toolbarmenu.width() / 2);
y = be->y_root - (m_toolbarmenu.height() / 2); y = be.y_root - (m_toolbarmenu.height() / 2);
if (x < 0) if (x < 0)
x = 0; x = 0;
@ -869,36 +803,36 @@ void Toolbar::buttonPressEvent(XButtonEvent *be) {
} }
void Toolbar::buttonReleaseEvent(XButtonEvent *re) { void Toolbar::buttonReleaseEvent(XButtonEvent &re) {
if (re->button == 1) { if (re.button == 1) {
if (re->window == frame.psbutton) { if (re.window == frame.psbutton) {
redrawPrevWorkspaceButton(false, true); redrawPrevWorkspaceButton(false, true);
if (re->x >= 0 && re->x < (signed) frame.button_w && if (re.x >= 0 && re.x < (signed) frame.button_w &&
re->y >= 0 && re->y < (signed) frame.button_w) re.y >= 0 && re.y < (signed) frame.button_w)
screen()->prevWorkspace(1); screen()->prevWorkspace(1);
} else if (re->window == frame.nsbutton) { } else if (re.window == frame.nsbutton) {
redrawNextWorkspaceButton(false, true); redrawNextWorkspaceButton(false, true);
if (re->x >= 0 && re->x < (signed) frame.button_w && if (re.x >= 0 && re.x < (signed) frame.button_w &&
re->y >= 0 && re->y < (signed) frame.button_w) re.y >= 0 && re.y < (signed) frame.button_w)
screen()->nextWorkspace(1); screen()->nextWorkspace(1);
} else if (re->window == frame.pwbutton) { } else if (re.window == frame.pwbutton) {
redrawPrevWindowButton(false, true); redrawPrevWindowButton(false, true);
if (re->x >= 0 && re->x < (signed) frame.button_w && if (re.x >= 0 && re.x < (signed) frame.button_w &&
re->y >= 0 && re->y < (signed) frame.button_w) re.y >= 0 && re.y < (signed) frame.button_w)
screen()->prevFocus(); screen()->prevFocus();
} else if (re->window == frame.nwbutton) { } else if (re.window == frame.nwbutton) {
redrawNextWindowButton(false, true); redrawNextWindowButton(false, true);
if (re->x >= 0 && re->x < (signed) frame.button_w && if (re.x >= 0 && re.x < (signed) frame.button_w &&
re->y >= 0 && re->y < (signed) frame.button_w) re.y >= 0 && re.y < (signed) frame.button_w)
screen()->nextFocus(); screen()->nextFocus();
} else if (re->window == frame.workspace_label) { } else if (re.window == frame.workspace_label) {
Basemenu *menu = screen()->getWorkspacemenu(); Basemenu *menu = screen()->getWorkspacemenu();
//move the workspace label and make it visible //move the workspace label and make it visible
menu->move(re->x_root, re->y_root); menu->move(re.x_root, re.y_root);
// make sure the entire menu is visible (TODO: this is repeated by other menus, make a function!) // make sure the entire menu is visible (TODO: this is repeated by other menus, make a function!)
int newx = menu->x(); // new x position of menu int newx = menu->x(); // new x position of menu
int newy = menu->y(); // new y position of menu int newy = menu->y(); // new y position of menu
@ -914,22 +848,22 @@ void Toolbar::buttonReleaseEvent(XButtonEvent *re) {
// move and show menu // move and show menu
menu->move(newx, newy); menu->move(newx, newy);
menu->show(); menu->show();
} else if (re->window == frame.window_label) } else if (re.window == frame.window_label)
screen()->raiseFocus(); screen()->raiseFocus();
#ifndef HAVE_STRFTIME #ifndef HAVE_STRFTIME
else if (re->window == frame.clock) { else if (re.window == frame.clock) {
XClearWindow(display, frame.clock); XClearWindow(display, frame.clock);
checkClock(true); checkClock(true);
} }
#endif // HAVE_STRFTIME #endif // HAVE_STRFTIME
} else if (re->button == 4) //mousewheel scroll up } else if (re.button == 4) //mousewheel scroll up
screen()->nextWorkspace(1); screen()->nextWorkspace(1);
else if (re->button == 5) //mousewheel scroll down else if (re.button == 5) //mousewheel scroll down
screen()->prevWorkspace(1); screen()->prevWorkspace(1);
} }
void Toolbar::enterNotifyEvent(XCrossingEvent *) { void Toolbar::enterNotifyEvent(XCrossingEvent &not_used) {
if (! do_auto_hide) if (! do_auto_hide)
return; return;
@ -942,7 +876,7 @@ void Toolbar::enterNotifyEvent(XCrossingEvent *) {
} }
} }
void Toolbar::leaveNotifyEvent(XCrossingEvent *) { void Toolbar::leaveNotifyEvent(XCrossingEvent &not_used) {
if (! do_auto_hide) if (! do_auto_hide)
return; return;
@ -955,27 +889,27 @@ void Toolbar::leaveNotifyEvent(XCrossingEvent *) {
} }
void Toolbar::exposeEvent(XExposeEvent *ee) { void Toolbar::exposeEvent(XExposeEvent &ee) {
if (ee->window == frame.clock) if (ee.window == frame.clock)
checkClock(true); checkClock(true);
else if (ee->window == frame.workspace_label && (! editing)) else if (ee.window == frame.workspace_label && (! editing))
redrawWorkspaceLabel(); redrawWorkspaceLabel();
else if (ee->window == frame.window_label) redrawWindowLabel(); else if (ee.window == frame.window_label) redrawWindowLabel();
else if (ee->window == frame.psbutton) redrawPrevWorkspaceButton(); else if (ee.window == frame.psbutton) redrawPrevWorkspaceButton();
else if (ee->window == frame.nsbutton) redrawNextWorkspaceButton(); else if (ee.window == frame.nsbutton) redrawNextWorkspaceButton();
else if (ee->window == frame.pwbutton) redrawPrevWindowButton(); else if (ee.window == frame.pwbutton) redrawPrevWindowButton();
else if (ee->window == frame.nwbutton) redrawNextWindowButton(); else if (ee.window == frame.nwbutton) redrawNextWindowButton();
else if (m_iconbar.get() != 0) else if (m_iconbar.get() != 0)
m_iconbar->exposeEvent(ee); m_iconbar->exposeEvent(&ee);
} }
void Toolbar::keyPressEvent(XKeyEvent *ke) { void Toolbar::keyPressEvent(XKeyEvent &ke) {
if (ke->window == frame.workspace_label && editing) { if (ke.window == frame.workspace_label && editing) {
KeySym ks; KeySym ks;
char keychar[1]; char keychar[1];
XLookupString(ke, keychar, 1, &ks, 0); XLookupString(&ke, keychar, 1, &ks, 0);
if (ks == XK_Return || ks == XK_Escape) { if (ks == XK_Return || ks == XK_Escape) {
@ -1018,18 +952,18 @@ void Toolbar::keyPressEvent(XKeyEvent *ke) {
XClearWindow(display, frame.workspace_label); XClearWindow(display, frame.workspace_label);
int l = new_workspace_name.size(), tw, x; int l = new_workspace_name.size(), tw, x;
tw = screen()->getToolbarStyle()->font.textWidth(new_workspace_name.c_str(), l); tw = m_theme.font().textWidth(new_workspace_name.c_str(), l);
x = (frame.workspace_label_w - tw) / 2; x = (frame.workspace_label_w - tw) / 2;
if (x < (signed) frame.bevel_w) if (x < (signed) frame.bevel_w)
x = frame.bevel_w; x = frame.bevel_w;
screen()->getToolbarStyle()->font.drawText( m_theme.font().drawText(
frame.workspace_label, frame.workspace_label,
screen()->getScreenNumber(), screen()->getScreenNumber(),
screen()->getWindowStyle()->l_text_focus_gc, screen()->getWindowStyle()->l_text_focus_gc,
new_workspace_name.c_str(), l, new_workspace_name.c_str(), l,
x, 1 + screen()->getToolbarStyle()->font.ascent()); x, 1 + m_theme.font().ascent());
XDrawRectangle(display, frame.workspace_label, XDrawRectangle(display, frame.workspace_label,
screen()->getWindowStyle()->l_text_focus_gc, x + tw, 0, 1, screen()->getWindowStyle()->l_text_focus_gc, x + tw, 0, 1,
@ -1050,6 +984,99 @@ void Toolbar::timeout() {
} }
void Toolbar::setPlacement(Toolbar::Placement where) {
int head_x = 0,
head_y = 0,
head_w,
head_h;
m_place = where;
#ifdef XINERAMA
int head = (screen->hasXinerama())
? screen->getToolbarOnHead()
: -1;
if (head >= 0) { // toolbar on head nr, if -1 then over ALL heads
head_x = screen()->getHeadX(head);
head_y = screen()->getHeadY(head);
head_w = screen()->getHeadWidth(head);
head_h = screen()->getHeadHeight(head);
frame.width =
(screen()->getHeadWidth(head) * screen()->getToolbarWidthPercent() / 100);
} else {
head_w = screen->getWidth();
head_h = screen->getHeight();
frame.width = screen()->getWidth() * screen()->getToolbarWidthPercent() / 100;
}
#else // !XINERAMA
head_w = screen()->getWidth();
head_h = screen()->getHeight();
frame.width = screen()->getWidth() * screen()->getToolbarWidthPercent() / 100;
#endif // XINERAMA
frame.height = m_theme.font().height();
frame.height += 2;
frame.label_h = frame.height;
frame.height += (frame.bevel_w * 2);
switch (where) {
case TOPLEFT:
frame.x = head_x;
frame.y = head_y;
frame.x_hidden = head_x;
frame.y_hidden = head_y +
screen()->getBevelWidth() - screen()->getBorderWidth() - frame.height;
break;
case BOTTOMLEFT:
frame.x = head_x;
frame.y = head_y + head_h - frame.height - screen()->getBorderWidth2x();
frame.x_hidden = head_x;
frame.y_hidden = head_y + head_h - screen()->getBevelWidth() -
screen()->getBorderWidth();
break;
case TOPCENTER:
frame.x = head_x + ((head_w - frame.width) / 2);
frame.y = head_y;
frame.x_hidden = frame.x;
frame.y_hidden = head_y +
screen()->getBevelWidth() - screen()->getBorderWidth() - frame.height;
break;
case TOPRIGHT:
frame.x = head_x + head_w - frame.width - screen()->getBorderWidth2x();
frame.y = head_y;
frame.x_hidden = frame.x;
frame.y_hidden = head_y +
screen()->getBevelWidth() - screen()->getBorderWidth() - frame.height;
break;
case BOTTOMRIGHT:
frame.x = head_x + head_w - frame.width - screen()->getBorderWidth2x();
frame.y = head_y + head_h - frame.height - screen()->getBorderWidth2x();
frame.x_hidden = frame.x;
frame.y_hidden = head_y + head_h - screen()->getBevelWidth() -
screen()->getBorderWidth();
break;
case BOTTOMCENTER: // default is BOTTOMCENTER
default:
frame.x = head_x + ((head_w - frame.width) / 2);
frame.y = head_y + head_h - frame.height - screen()->getBorderWidth2x();
frame.x_hidden = frame.x;
frame.y_hidden = head_y + head_h - screen()->getBevelWidth() -
screen()->getBorderWidth();
break;
}
}
void Toolbar::HideHandler::timeout() { void Toolbar::HideHandler::timeout() {
if (toolbar->isEditing()) { // don't hide if we're editing workspace label if (toolbar->isEditing()) { // don't hide if we're editing workspace label
toolbar->hide_timer.fireOnce(false); toolbar->hide_timer.fireOnce(false);
@ -1230,6 +1257,7 @@ void Toolbarmenu::Placementmenu::itemSelected(int button, unsigned int index) {
m_toolbarmenu.m_toolbar.screen()->saveToolbarPlacement( m_toolbarmenu.m_toolbar.screen()->saveToolbarPlacement(
static_cast<Toolbar::Placement>(item->function())); static_cast<Toolbar::Placement>(item->function()));
m_toolbarmenu.m_toolbar.setPlacement(static_cast<Toolbar::Placement>(item->function()));
hide(); hide();
m_toolbarmenu.m_toolbar.reconfigure(); m_toolbarmenu.m_toolbar.reconfigure();

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE. // DEALINGS IN THE SOFTWARE.
// $Id: Toolbar.hh,v 1.15 2002/12/01 13:42:02 rathnor Exp $ // $Id: Toolbar.hh,v 1.16 2002/12/02 21:52:30 fluxgen Exp $
#ifndef TOOLBAR_HH #ifndef TOOLBAR_HH
#define TOOLBAR_HH #define TOOLBAR_HH
@ -30,6 +30,8 @@
#include "Basemenu.hh" #include "Basemenu.hh"
#include "Timer.hh" #include "Timer.hh"
#include "IconBar.hh" #include "IconBar.hh"
#include "ToolbarTheme.hh"
#include "EventHandler.hh"
#include <memory> #include <memory>
@ -86,10 +88,11 @@ private:
}; };
/** /**
the toolbar. the toolbar.
*/ */
class Toolbar : public TimeoutHandler { class Toolbar : public TimeoutHandler, public FbTk::EventHandler {
public: public:
/** /**
Toolbar placement on the screen Toolbar placement on the screen
@ -97,7 +100,7 @@ public:
enum Placement{ TOPLEFT = 1, BOTTOMLEFT, TOPCENTER, enum Placement{ TOPLEFT = 1, BOTTOMLEFT, TOPCENTER,
BOTTOMCENTER, TOPRIGHT, BOTTOMRIGHT }; BOTTOMCENTER, TOPRIGHT, BOTTOMRIGHT };
explicit Toolbar(BScreen *screen); explicit Toolbar(BScreen *screen, size_t width = 200);
virtual ~Toolbar(); virtual ~Toolbar();
/// add icon to iconbar /// add icon to iconbar
@ -125,16 +128,18 @@ public:
inline int y() const { return ((hidden) ? frame.y_hidden : frame.y); } inline int y() const { return ((hidden) ? frame.y_hidden : frame.y); }
/// @return pointer to iconbar if it got one, else 0 /// @return pointer to iconbar if it got one, else 0
inline const IconBar *iconBar() const { return m_iconbar.get(); } inline const IconBar *iconBar() const { return m_iconbar.get(); }
inline const ToolbarTheme &theme() const { return m_theme; }
inline ToolbarTheme &theme() { return m_theme; }
/** /**
@name eventhandlers @name eventhandlers
*/ */
//@{ //@{
void buttonPressEvent(XButtonEvent *be); void buttonPressEvent(XButtonEvent &be);
void buttonReleaseEvent(XButtonEvent *be); void buttonReleaseEvent(XButtonEvent &be);
void enterNotifyEvent(XCrossingEvent *ce); void enterNotifyEvent(XCrossingEvent &ce);
void leaveNotifyEvent(XCrossingEvent *ce); void leaveNotifyEvent(XCrossingEvent &ce);
void exposeEvent(XExposeEvent *ee); void exposeEvent(XExposeEvent &ee);
void keyPressEvent(XKeyEvent *ke); void keyPressEvent(XKeyEvent &ke);
//@} //@}
void redrawWindowLabel(bool redraw= false); void redrawWindowLabel(bool redraw= false);
@ -146,7 +151,7 @@ public:
/// enter edit mode on workspace label /// enter edit mode on workspace label
void edit(); void edit();
void reconfigure(); void reconfigure();
void setPlacement(Placement where);
void checkClock(bool redraw = false, bool date = false); void checkClock(bool redraw = false, bool date = false);
virtual void timeout(); virtual void timeout();
@ -178,7 +183,7 @@ private:
} hide_handler; } hide_handler;
BScreen *m_screen; BScreen *m_screen;
BImageControl *image_ctrl; BImageControl &image_ctrl;
BTimer clock_timer; ///< timer to update clock BTimer clock_timer; ///< timer to update clock
BTimer hide_timer; ///< timer to for auto hide toolbar BTimer hide_timer; ///< timer to for auto hide toolbar
Toolbarmenu m_toolbarmenu; Toolbarmenu m_toolbarmenu;
@ -186,6 +191,9 @@ private:
std::string new_workspace_name; ///< temp variable in edit workspace name mode std::string new_workspace_name; ///< temp variable in edit workspace name mode
ToolbarTheme m_theme;
Placement m_place;
friend class HideHandler; friend class HideHandler;
friend class Toolbarmenu; friend class Toolbarmenu;
friend class Toolbarmenu::Placementmenu; friend class Toolbarmenu::Placementmenu;