fluxbox/src/IconBar.cc

406 lines
11 KiB
C++
Raw Normal View History

// IconBar.cc for Fluxbox Window Manager
2003-02-23 00:51:40 +00:00
// Copyright (c) 2001 - 2003 Henrik Kinnunen (fluxgen at users.sourceforge.net)
2001-12-11 20:47:02 +00:00
//
// 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,
2003-04-14 15:01:55 +00:00
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
2001-12-11 20:47:02 +00:00
// 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.
2003-05-10 22:59:32 +00:00
// $Id: IconBar.cc,v 1.33 2003/05/10 22:55:10 fluxgen Exp $
2001-12-11 20:47:02 +00:00
#include "IconBar.hh"
2003-04-09 13:00:21 +00:00
2001-12-11 20:47:02 +00:00
#include "i18n.hh"
2002-01-20 02:10:37 +00:00
#include "Screen.hh"
2003-04-09 13:00:21 +00:00
#include "Window.hh"
2002-11-30 20:18:35 +00:00
#include "ImageControl.hh"
2003-02-23 00:51:40 +00:00
#include "Text.hh"
2003-04-25 10:40:31 +00:00
#include "RootTheme.hh"
2001-12-11 20:47:02 +00:00
#include <algorithm>
2003-02-23 00:51:40 +00:00
//!! TODO THIS FILE NEEDS CLEANING
2001-12-29 10:39:04 +00:00
IconBarObj::IconBarObj(FluxboxWindow *fluxboxwin, Window iconwin)
2001-12-17 19:23:21 +00:00
{
2002-12-01 13:42:15 +00:00
m_fluxboxwin = fluxboxwin;
m_iconwin = iconwin;
2001-12-11 20:47:02 +00:00
}
IconBarObj::~IconBarObj() {
}
2003-02-23 00:51:40 +00:00
/// @return the width of specified icon window
unsigned int IconBarObj::width() const {
2002-12-01 13:42:15 +00:00
Window root;
2002-12-01 13:42:15 +00:00
unsigned int width, height;
unsigned int border_width, depth; //not used
int x, y; //not used
2003-04-15 12:06:11 +00:00
Display *disp = FbTk::App::instance()->display();
2003-04-15 12:06:11 +00:00
XGetGeometry(disp, m_iconwin, &root, &x, &y,
2002-12-01 13:42:15 +00:00
&width, &height, &border_width, &depth);
2002-12-01 13:42:15 +00:00
return width;
}
2003-02-23 00:51:40 +00:00
/// @return the width of specified icon window
unsigned int IconBarObj::height() const {
Window root;
unsigned int width, height;
unsigned int border_width, depth; //not used
int x, y; //not used
2003-04-15 12:06:11 +00:00
Display *disp = FbTk::App::instance()->display();
2003-02-23 00:51:40 +00:00
2003-04-15 12:06:11 +00:00
XGetGeometry(disp, m_iconwin, &root, &x, &y,
2003-02-23 00:51:40 +00:00
&width, &height, &border_width, &depth);
return height;
}
2003-04-15 12:06:11 +00:00
IconBar::IconBar(BScreen &scrn, Window parent, FbTk::Font &font):
2002-12-01 13:42:15 +00:00
m_screen(scrn),
2003-04-15 12:06:11 +00:00
m_display(FbTk::App::instance()->display()),
2003-02-23 00:51:40 +00:00
m_parent(parent),
m_focus_pm(None),
2003-02-23 00:51:40 +00:00
m_vertical(false),
m_font(font)
2001-12-17 19:23:21 +00:00
{
2003-04-15 12:06:11 +00:00
2001-12-11 20:47:02 +00:00
}
IconBar::~IconBar() {
}
2003-02-23 00:51:40 +00:00
/**
Adds icon to iconbar and repostions the
icons.
returns window to iconobj
*/
2001-12-11 20:47:02 +00:00
Window IconBar::addIcon(FluxboxWindow *fluxboxwin) {
2002-12-01 13:42:15 +00:00
Window iconwin = createIconWindow(fluxboxwin, m_parent);
decorate(iconwin);
//add window object to list
m_iconlist.push_back(new IconBarObj(fluxboxwin, iconwin));
//reposition all icons to fit windowbar
repositionIcons();
2001-12-11 20:47:02 +00:00
2002-12-01 13:42:15 +00:00
XMapSubwindows(m_display, iconwin);
XMapWindow(m_display, iconwin);
2001-12-11 20:47:02 +00:00
2002-12-01 13:42:15 +00:00
return iconwin;
2001-12-11 20:47:02 +00:00
}
2003-02-23 00:51:40 +00:00
/**
Removes icon from list and
repositions the rest of the icons
Return X Window of the removed iconobj
returns None if no window was found
*/
2001-12-11 20:47:02 +00:00
Window IconBar::delIcon(FluxboxWindow *fluxboxwin) {
2002-12-01 13:42:15 +00:00
Window retwin = None;
IconBarObj *obj = findIcon(fluxboxwin);
if (obj) {
IconList::iterator it =
std::find(m_iconlist.begin(), m_iconlist.end(), obj);
if (it != m_iconlist.end()) {
2003-03-03 21:51:13 +00:00
m_iconlist.erase(it);
2002-12-01 13:42:15 +00:00
retwin = obj->getIconWin();
2003-03-03 21:51:13 +00:00
delete obj;
2002-12-01 13:42:15 +00:00
XDestroyWindow(m_display, retwin);
repositionIcons();
}
}
return retwin;
2001-12-11 20:47:02 +00:00
}
2003-03-03 21:51:13 +00:00
/**
* Removes all icons from list
* Return X Windows of the removed iconobjs
*/
IconBar::WindowList *IconBar::delAllIcons() {
Window retwin = None;
WindowList *ret = new WindowList();
while (!m_iconlist.empty()) {
IconBarObj *obj = m_iconlist.back();
m_iconlist.pop_back();
retwin = obj->getIconWin();
ret->push_back(retwin);
delete obj;
XDestroyWindow(m_display, retwin);
}
repositionIcons();
return ret;
}
2003-02-23 00:51:40 +00:00
/**
renders theme to m_focus_pm
with the size width * height
2003-04-25 10:40:31 +00:00
2003-02-23 00:51:40 +00:00
*/
2001-12-11 20:47:02 +00:00
void IconBar::loadTheme(unsigned int width, unsigned int height) {
2003-04-25 10:40:31 +00:00
//!! TODO: iconbar style theme
2003-04-15 12:06:11 +00:00
FbTk::ImageControl *image_ctrl = screen().getImageControl();
2002-12-01 13:42:15 +00:00
Pixmap tmp = m_focus_pm;
2003-04-25 10:40:31 +00:00
const FbTk::Texture *texture = &(screen().winFrameTheme().labelFocusTexture());
2001-12-11 20:47:02 +00:00
2002-12-01 13:42:15 +00:00
//If we are working on a PARENTRELATIVE, change to right focus value
if (texture->type() & FbTk::Texture::PARENTRELATIVE ) {
2003-04-25 10:40:31 +00:00
texture = &(screen().winFrameTheme().titleFocusTexture());
2002-12-01 13:42:15 +00:00
}
2001-12-11 20:47:02 +00:00
2002-12-01 13:42:15 +00:00
if (texture->type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) {
m_focus_pm = None;
m_focus_pixel = texture->color().pixel();
} else {
m_focus_pm =
image_ctrl->renderImage(width, height, *texture);
}
if (tmp)
image_ctrl->removeImage(tmp);
2001-12-11 20:47:02 +00:00
}
2003-02-23 00:51:40 +00:00
/**
sets the background pixmap/color,
border, border width of the window
*/
2001-12-11 20:47:02 +00:00
void IconBar::decorate(Window win) {
2003-04-25 10:40:31 +00:00
//!! TODO iconbar border width style
XSetWindowBorderWidth(m_display, win, 1);
XSetWindowBorder(m_display, win, BlackPixel(FbTk::App::instance()->display(),
screen().getScreenNumber()));
2002-12-01 13:42:15 +00:00
if (m_focus_pm)
XSetWindowBackgroundPixmap(m_display, win, m_focus_pm);
else
XSetWindowBackground(m_display, win, m_focus_pixel);
2001-12-11 20:47:02 +00:00
}
2003-02-23 00:51:40 +00:00
/**
Reconfigures the icons
theme, pos and width
*/
2001-12-11 20:47:02 +00:00
void IconBar::reconfigure() {
2002-12-01 13:42:15 +00:00
repositionIcons();
2001-12-11 20:47:02 +00:00
}
2003-02-23 00:51:40 +00:00
/**
Handles the expose event
just redraws all the icons
*/
2001-12-11 20:47:02 +00:00
void IconBar::exposeEvent(XExposeEvent *ee) {
2002-12-01 13:42:15 +00:00
IconBarObj *obj=0;
IconList::iterator it = m_iconlist.begin();
IconList::iterator it_end = m_iconlist.end();
for (; it != it_end; ++it) {
if ((*it)->getIconWin() == ee->window) {
obj = (*it);
break;
}
}
if (obj) {
Window root;
unsigned int width, height;
unsigned int border_width, depth; //not used
int x, y;
XGetGeometry(m_display, m_parent, &root, &x, &y, &width, &height,
&border_width, &depth);
//max width on every icon
unsigned int icon_width = width / m_iconlist.size();
2001-12-11 20:47:02 +00:00
2002-12-01 13:42:15 +00:00
//load right size of theme
loadTheme(icon_width, height);
2001-12-11 20:47:02 +00:00
2002-12-01 13:42:15 +00:00
draw(obj, icon_width);
2001-12-11 20:47:02 +00:00
2002-12-01 13:42:15 +00:00
}
2001-12-11 20:47:02 +00:00
}
2003-02-23 00:51:40 +00:00
/**
Calculates and moves/resizes the icons
*/
2002-10-29 15:53:45 +00:00
void IconBar::repositionIcons() {
2002-12-01 13:42:15 +00:00
if (m_iconlist.size() == 0)
return;
2001-12-11 20:47:02 +00:00
2002-12-01 13:42:15 +00:00
Window root;
unsigned int width, height;
unsigned int border_width, depth; //not used
int x, y;
XGetGeometry(m_display, m_parent, &root, &x, &y, &width, &height,
&border_width, &depth);
2001-12-11 20:47:02 +00:00
2002-12-01 13:42:15 +00:00
//max width on every icon
unsigned int icon_width = width / m_iconlist.size();
2003-02-23 14:29:08 +00:00
if (m_vertical)
icon_width = height / m_iconlist.size();
2002-12-01 13:42:15 +00:00
//load right size of theme
loadTheme(icon_width, height);
IconList::iterator it = m_iconlist.begin();
IconList::iterator it_end = m_iconlist.end();
for (x = 0; it != it_end; ++it, x += icon_width) {
Window iconwin = (*it)->getIconWin();
2003-02-23 14:29:08 +00:00
if (!m_vertical) {
XMoveResizeWindow(m_display, iconwin,
x, 0,
icon_width, height);
} else {
XMoveResizeWindow(m_display, iconwin,
0, x,
height, icon_width);
}
2002-12-01 13:42:15 +00:00
draw((*it), icon_width);
decorate(iconwin);
}
2001-12-11 20:47:02 +00:00
}
2003-02-23 00:51:40 +00:00
/**
creates the X Window of icon
@return the created X Window
*/
2001-12-11 20:47:02 +00:00
Window IconBar::createIconWindow(FluxboxWindow *fluxboxwin, Window parent) {
2002-12-01 13:42:15 +00:00
unsigned long attrib_mask = CWBackPixmap | CWBackPixel | CWBorderPixel |
CWColormap | CWOverrideRedirect | CWEventMask;
XSetWindowAttributes attrib;
attrib.background_pixmap = None;
attrib.background_pixel = attrib.border_pixel =
2003-04-25 10:40:31 +00:00
BlackPixel(m_display,
screen().getScreenNumber());
2003-05-10 22:59:32 +00:00
// fluxboxwin->screen().getWindowStyle()->tab.border_color.pixel();
attrib.colormap = fluxboxwin->screen().rootWindow().colormap();
2002-12-01 13:42:15 +00:00
attrib.override_redirect = True;
attrib.event_mask = ButtonPressMask | ButtonReleaseMask |
ButtonMotionMask | ExposureMask | EnterWindowMask;
2001-12-11 20:47:02 +00:00
2002-12-01 13:42:15 +00:00
//create iconwindow
Window iconwin = XCreateWindow(m_display, parent, 0, 0, 1, 1, 0,
2003-05-10 22:59:32 +00:00
fluxboxwin->screen().rootWindow().depth(),
InputOutput, fluxboxwin->screen().rootWindow().visual(),
2002-12-01 13:42:15 +00:00
attrib_mask, &attrib);
2001-12-11 20:47:02 +00:00
2002-12-01 13:42:15 +00:00
return iconwin;
2001-12-11 20:47:02 +00:00
}
2003-02-23 00:51:40 +00:00
/**
Draws theme and string to Window w
*/
2002-10-29 15:53:45 +00:00
void IconBar::draw(const IconBarObj * const obj, int width) const {
2002-12-01 13:42:15 +00:00
if (!obj)
return;
2001-12-11 20:47:02 +00:00
2002-12-01 13:42:15 +00:00
const FluxboxWindow * const fluxboxwin = obj->getFluxboxWin();
Window iconwin = obj->getIconWin();
unsigned int title_text_w;
2003-02-23 00:51:40 +00:00
title_text_w = m_font.textWidth(
2002-12-01 13:42:15 +00:00
fluxboxwin->getIconTitle().c_str(), fluxboxwin->getIconTitle().size());
2003-04-15 12:06:11 +00:00
2003-04-25 10:40:31 +00:00
unsigned int bevel_w = screen().rootTheme().bevelWidth();
2002-12-01 13:42:15 +00:00
int dx=bevel_w*2;
2003-02-23 00:51:40 +00:00
// center by default
unsigned int newlen = 0;
2003-04-15 12:06:11 +00:00
dx = FbTk::doAlignment(m_vertical ? obj->height() : obj->width(),
bevel_w*2, FbTk::CENTER, m_font,
fluxboxwin->getIconTitle().c_str(),
fluxboxwin->getIconTitle().size(),
2003-02-23 00:51:40 +00:00
newlen);
2002-12-01 13:42:15 +00:00
//Draw title to m_iconwin
XClearWindow(m_display, iconwin);
2003-02-23 00:51:40 +00:00
int dy = 1 + m_font.ascent();
if (m_vertical) {
int tmp = dy;
dy = obj->height() - dx;
2003-04-28 16:48:23 +00:00
dx = tmp + bevel_w;
} else
dy += bevel_w;
2003-02-23 00:51:40 +00:00
m_font.drawText(
2002-12-01 13:42:15 +00:00
iconwin,
2003-04-15 12:06:11 +00:00
screen().getScreenNumber(),
2003-04-25 10:40:31 +00:00
screen().winFrameTheme().labelTextFocusGC(),
2003-02-23 00:51:40 +00:00
fluxboxwin->getIconTitle().c_str(), newlen,
dx, dy, m_vertical);
2001-12-11 20:47:02 +00:00
}
2003-02-23 00:51:40 +00:00
/**
Tries to find the FluxboxWindow of the X Window
in iconbar
@return the fluxboxwindow on success else 0 on failure
*/
2001-12-11 20:47:02 +00:00
FluxboxWindow *IconBar::findWindow(Window w) {
2002-12-01 13:42:15 +00:00
IconList::iterator it = m_iconlist.begin();
IconList::iterator it_end = m_iconlist.end();
for (; it != it_end; ++it) {
IconBarObj *tmp = (*it);
if (tmp)
if (tmp->getIconWin() == w)
return tmp->getFluxboxWin();
}
2001-12-11 20:47:02 +00:00
2002-12-01 13:42:15 +00:00
return 0;
2001-12-11 20:47:02 +00:00
}
2003-02-23 00:51:40 +00:00
/*
Tries to find a fluxboxwin icon in the iconlist
@return pointer to IconBarObj on success else 0 on failure
*/
2001-12-11 20:47:02 +00:00
IconBarObj *IconBar::findIcon(FluxboxWindow *fluxboxwin) {
2002-12-01 13:42:15 +00:00
IconList::iterator it = m_iconlist.begin();
IconList::iterator it_end = m_iconlist.end();
for (; it != it_end; ++it) {
IconBarObj *tmp = (*it);
if (tmp)
if (tmp->getFluxboxWin() == fluxboxwin)
return tmp;
}
2001-12-11 20:47:02 +00:00
2002-12-01 13:42:15 +00:00
return 0;
2001-12-11 20:47:02 +00:00
}
2002-01-04 21:21:43 +00:00
2002-10-29 15:53:45 +00:00
const IconBarObj *IconBar::findIcon(const FluxboxWindow * const fluxboxwin) const {
2002-12-01 13:42:15 +00:00
IconList::const_iterator it = m_iconlist.begin();
IconList::const_iterator it_end = m_iconlist.end();
for (; it != it_end; ++it) {
IconBarObj *tmp = (*it);
if (tmp)
if (tmp->getFluxboxWin() == fluxboxwin)
return tmp;
}
2002-10-29 15:53:45 +00:00
2002-12-01 13:42:15 +00:00
return 0;
2002-10-29 15:53:45 +00:00
}