2008-05-05 12:05:52 +00:00
|
|
|
// TooltipWindow.hh
|
|
|
|
// Copyright (c) 2008 Fluxbox Team (fluxgen at fluxbox dot org)
|
|
|
|
//
|
|
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
// copy of this software and associated documentation files (the "Software"),
|
|
|
|
// to deal in the Software without restriction, including without limitation
|
|
|
|
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
// and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
// Software is furnished to do so, subject to the following conditions:
|
|
|
|
//
|
|
|
|
// The above copyright notice and this permission notice shall be included in
|
|
|
|
// all copies or substantial portions of the Software.
|
|
|
|
//
|
|
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
|
|
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
|
// DEALINGS IN THE SOFTWARE.
|
|
|
|
|
|
|
|
|
|
|
|
#include "TooltipWindow.hh"
|
|
|
|
#include "Screen.hh"
|
|
|
|
#include "FbWinFrameTheme.hh"
|
|
|
|
|
|
|
|
|
|
|
|
TooltipWindow::TooltipWindow(const FbTk::FbWindow &parent, BScreen &screen,
|
|
|
|
FbTk::ThemeProxy<FbWinFrameTheme> &theme):
|
|
|
|
OSDWindow(parent, screen, theme),
|
2008-05-09 17:39:02 +00:00
|
|
|
m_delay(-1) {
|
2008-05-05 12:05:52 +00:00
|
|
|
|
2008-05-09 17:39:02 +00:00
|
|
|
FbTk::RefCount<FbTk::Command<void> >
|
|
|
|
raisecmd(new FbTk::SimpleCommand<TooltipWindow>(*this,
|
|
|
|
&TooltipWindow::raiseTooltip));
|
|
|
|
m_timer.setCommand(raisecmd);
|
|
|
|
m_timer.fireOnce(true);
|
2008-05-05 12:05:52 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2010-09-08 18:17:21 +00:00
|
|
|
void TooltipWindow::showText(const FbTk::BiDiString& text) {
|
2008-05-05 12:05:52 +00:00
|
|
|
|
2008-05-09 17:39:02 +00:00
|
|
|
m_lastText = text;
|
|
|
|
if (m_delay == 0)
|
2008-05-05 12:05:52 +00:00
|
|
|
raiseTooltip();
|
|
|
|
else
|
2008-05-09 17:39:02 +00:00
|
|
|
m_timer.start();
|
2008-05-05 12:05:52 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void TooltipWindow::raiseTooltip() {
|
|
|
|
|
2010-09-08 18:17:21 +00:00
|
|
|
if (m_lastText.logical().empty())
|
2008-05-05 12:05:52 +00:00
|
|
|
return;
|
|
|
|
|
2008-05-09 17:39:02 +00:00
|
|
|
resize(m_lastText);
|
2008-05-05 12:05:52 +00:00
|
|
|
reconfigTheme();
|
2008-05-09 17:39:02 +00:00
|
|
|
int h = theme()->font().height() + theme()->bevelWidth() * 2;
|
2010-09-08 18:17:21 +00:00
|
|
|
int w = theme()->font().textWidth(m_lastText) + theme()->bevelWidth() * 2;
|
2008-05-05 12:05:52 +00:00
|
|
|
|
|
|
|
Window root_ret; // not used
|
|
|
|
Window window_ret; // not used
|
|
|
|
int rx = 0, ry = 0;
|
|
|
|
int wx, wy; // not used
|
|
|
|
unsigned int mask; // not used
|
|
|
|
|
2008-05-09 17:39:02 +00:00
|
|
|
XQueryPointer(display(), screen().rootWindow().window(),
|
2008-05-05 12:05:52 +00:00
|
|
|
&root_ret, &window_ret, &rx, &ry, &wx, &wy, &mask);
|
|
|
|
|
2008-05-09 17:39:02 +00:00
|
|
|
int head = screen().getHead(rx, ry);
|
|
|
|
int head_top = screen().getHeadY(head);
|
|
|
|
int head_left = screen().getHeadX(head);
|
|
|
|
int head_right = head_left + screen().getHeadWidth(head);
|
2008-05-05 12:05:52 +00:00
|
|
|
|
|
|
|
// center the mouse horizontally
|
|
|
|
rx -= w/2;
|
|
|
|
int yoffset = 10;
|
2008-05-05 13:37:35 +00:00
|
|
|
if (ry - yoffset - h >= head_top)
|
2008-05-05 12:05:52 +00:00
|
|
|
ry -= yoffset + h;
|
|
|
|
else
|
|
|
|
ry += yoffset;
|
|
|
|
|
|
|
|
// check that we are not out of screen
|
2008-05-05 13:37:35 +00:00
|
|
|
if (rx + w > head_right)
|
|
|
|
rx = head_right - w;
|
|
|
|
if (rx < head_left)
|
|
|
|
rx = head_left;
|
2008-05-05 12:05:52 +00:00
|
|
|
|
|
|
|
moveResize(rx,ry,w, h);
|
|
|
|
|
|
|
|
show();
|
|
|
|
clear();
|
2008-05-09 17:39:02 +00:00
|
|
|
theme()->font().drawText(*this, screen().screenNumber(),
|
|
|
|
theme()->iconbarTheme().text().textGC(),
|
2010-09-08 18:17:21 +00:00
|
|
|
m_lastText,
|
2008-05-09 17:39:02 +00:00
|
|
|
theme()->bevelWidth(),
|
|
|
|
theme()->bevelWidth() + theme()->font().ascent());
|
2008-05-05 12:05:52 +00:00
|
|
|
}
|
|
|
|
|
2010-09-08 18:17:21 +00:00
|
|
|
void TooltipWindow::updateText(const FbTk::BiDiString& text) {
|
2008-05-09 17:39:02 +00:00
|
|
|
m_lastText = text;
|
|
|
|
raiseTooltip();
|
|
|
|
}
|
2008-05-05 12:05:52 +00:00
|
|
|
|
|
|
|
void TooltipWindow::show() {
|
2008-05-09 17:39:02 +00:00
|
|
|
if (isVisible())
|
2008-05-05 12:05:52 +00:00
|
|
|
return;
|
2008-05-09 17:39:02 +00:00
|
|
|
setVisible(true);
|
2008-05-05 12:05:52 +00:00
|
|
|
raise();
|
|
|
|
FbTk::FbWindow::show();
|
|
|
|
}
|
|
|
|
|
|
|
|
void TooltipWindow::hide() {
|
2008-05-09 17:39:02 +00:00
|
|
|
m_timer.stop();
|
2008-05-05 12:05:52 +00:00
|
|
|
OSDWindow::hide();
|
|
|
|
}
|