fluxbox/src/IconbarTool.cc

269 lines
8.8 KiB
C++
Raw Normal View History

2003-08-11 15:42:29 +00:00
// IconbarTool.cc
// Copyright (c) 2003 Henrik Kinnunen (fluxgen at users.sourceforge.net)
// and Simon Bowden (rathnor at users.sourceforge.net)
//
// 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.
2003-08-13 09:57:40 +00:00
// $Id: IconbarTool.cc,v 1.6 2003/08/13 09:57:40 fluxgen Exp $
2003-08-11 15:42:29 +00:00
#include "IconbarTool.hh"
#include "Screen.hh"
#include "ImageControl.hh"
#include "IconbarTheme.hh"
#include "Window.hh"
#include "IconButton.hh"
#include "Workspace.hh"
2003-08-11 15:42:29 +00:00
2003-08-13 09:57:40 +00:00
#include <iostream>
using namespace std;
2003-08-11 15:42:29 +00:00
IconbarTool::IconbarTool(const FbTk::FbWindow &parent, IconbarTheme &theme, BScreen &screen):
ToolbarItem(ToolbarItem::RELATIVE),
m_screen(screen),
m_icon_container(parent),
m_theme(theme),
m_focused_pm(0),
m_unfocused_pm(0),
m_empty_pm(0) {
2003-08-11 15:42:29 +00:00
2003-08-12 11:09:46 +00:00
// setup signals
2003-08-11 15:42:29 +00:00
theme.reconfigSig().attach(this);
screen.clientListSig().attach(this);
screen.currentWorkspaceSig().attach(this);
2003-08-11 15:42:29 +00:00
update(0);
2003-08-13 09:57:40 +00:00
2003-08-11 15:42:29 +00:00
}
IconbarTool::~IconbarTool() {
2003-08-12 12:16:28 +00:00
deleteIcons();
// remove cached images
if (m_focused_pm)
m_screen.imageControl().removeImage(m_focused_pm);
if (m_unfocused_pm)
m_screen.imageControl().removeImage(m_focused_pm);
if (m_empty_pm)
m_screen.imageControl().removeImage(m_empty_pm);
}
2003-08-11 15:42:29 +00:00
void IconbarTool::move(int x, int y) {
m_icon_container.move(x, y);
}
void IconbarTool::resize(unsigned int width, unsigned int height) {
m_icon_container.resize(width, height);
renderTheme();
}
void IconbarTool::moveResize(int x, int y,
unsigned int width, unsigned int height) {
m_icon_container.moveResize(x, y, width, height);
renderTheme();
}
void IconbarTool::show() {
m_icon_container.show();
}
void IconbarTool::hide() {
m_icon_container.hide();
}
unsigned int IconbarTool::width() const {
return m_icon_container.width();
}
unsigned int IconbarTool::height() const {
return m_icon_container.height();
}
2003-08-13 09:57:40 +00:00
unsigned int IconbarTool::borderWidth() const {
return m_icon_container.borderWidth();
}
2003-08-11 15:42:29 +00:00
void IconbarTool::update(FbTk::Subject *subj) {
2003-08-12 12:16:28 +00:00
// ignore updates if we're shutting down
if (m_screen.isShuttingdown())
return;
2003-08-12 01:01:16 +00:00
// just focus signal?
if (subj != 0 && typeid(*subj) == typeid(FluxboxWindow::WinSubject)) {
2003-08-12 01:01:16 +00:00
// we handle everything except die signal here
FluxboxWindow::WinSubject *winsubj = static_cast<FluxboxWindow::WinSubject *>(subj);
if (subj != &(winsubj->win().dieSig())) {
2003-08-12 12:16:28 +00:00
renderWindow(winsubj->win());
2003-08-12 01:01:16 +00:00
return;
2003-08-12 12:16:28 +00:00
} else {
// got window die signal, lets find and remove the window
IconList::iterator it = m_icon_list.begin();
IconList::iterator it_end = m_icon_list.end();
for (; it != it_end; ++it) {
if (&(*it)->win() == &winsubj->win())
break;
}
// did we find it?
if (it == m_icon_list.end())
return;
// remove from list and render theme again
delete *it;
m_icon_list.erase(it);
m_icon_container.removeItem(m_icon_container.find(*it));
renderTheme();
return; // we don't need to update the entire list
2003-08-12 01:01:16 +00:00
}
}
// ok, we got some signal that we need to update our iconbar container
// remove all clients and add them again...the only way to do it now
2003-08-12 12:16:28 +00:00
deleteIcons();
// get current workspace and all it's clients
Workspace &space = *m_screen.currentWorkspace();
// build a ItemList and add it (faster than adding single items)
Container::ItemList items;
Workspace::Windows::iterator it = space.windowList().begin();
Workspace::Windows::iterator it_end = space.windowList().end();
for (; it != it_end; ++it) {
2003-08-13 09:57:40 +00:00
// we just want windows that has clients
if ((*it)->clientList().size() == 0)
continue;
2003-08-13 09:57:40 +00:00
IconButton *button = new IconButton(m_icon_container, m_theme.focusedText().font(), **it);
items.push_back(button);
m_icon_list.push_back(button);
2003-08-12 01:01:16 +00:00
(*it)->focusSig().attach(this);
2003-08-12 01:01:16 +00:00
(*it)->dieSig().attach(this);
}
m_icon_container.showSubwindows();
m_icon_container.insertItems(items);
2003-08-11 15:42:29 +00:00
renderTheme();
}
2003-08-12 12:16:28 +00:00
void IconbarTool::renderWindow(FluxboxWindow &win) {
2003-08-12 11:09:46 +00:00
IconList::iterator icon_it = m_icon_list.begin();
IconList::iterator icon_it_end = m_icon_list.end();
for (; icon_it != icon_it_end; ++icon_it) {
if (&(*icon_it)->win() == &win)
break;
}
2003-08-12 12:16:28 +00:00
2003-08-12 11:09:46 +00:00
if (icon_it == m_icon_list.end())
return;
2003-08-12 12:16:28 +00:00
renderButton(*(*icon_it));
2003-08-12 11:09:46 +00:00
}
2003-08-11 15:42:29 +00:00
void IconbarTool::renderTheme() {
Pixmap tmp = m_focused_pm;
if (m_theme.focusedTexture().type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) {
m_focused_pm = 0;
} else {
m_focused_pm = m_screen.imageControl().renderImage(m_icon_container.maxWidthPerClient(),
m_icon_container.height(),
2003-08-11 15:42:29 +00:00
m_theme.focusedTexture());
}
if (tmp)
m_screen.imageControl().removeImage(tmp);
tmp = m_unfocused_pm;
if (m_theme.unfocusedTexture().type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) {
m_unfocused_pm = 0;
} else {
m_unfocused_pm = m_screen.imageControl().renderImage(m_icon_container.maxWidthPerClient(),
m_icon_container.height(),
2003-08-11 15:42:29 +00:00
m_theme.unfocusedTexture());
}
if (tmp)
m_screen.imageControl().removeImage(tmp);
// if we dont have any icons then we should render empty texture
tmp = m_empty_pm;
if (m_theme.emptyTexture().type() == (FbTk::Texture::FLAT | FbTk::Texture::SOLID)) {
m_empty_pm = 0;
m_icon_container.setBackgroundColor(m_theme.emptyTexture().color());
} else {
m_empty_pm = m_screen.imageControl().renderImage(m_icon_container.width(), m_icon_container.height(),
m_theme.emptyTexture());
m_icon_container.setBackgroundPixmap(m_empty_pm);
}
if (tmp)
m_screen.imageControl().removeImage(m_empty_pm);
2003-08-11 15:42:29 +00:00
2003-08-13 09:57:40 +00:00
m_icon_container.setBorderWidth(m_theme.border().width());
m_icon_container.setBorderColor(m_theme.border().color());
2003-08-11 15:42:29 +00:00
// update buttons
IconList::iterator icon_it = m_icon_list.begin();
IconList::iterator icon_it_end = m_icon_list.end();
2003-08-12 12:16:28 +00:00
for (; icon_it != icon_it_end; ++icon_it)
renderButton(*(*icon_it));
2003-08-13 09:57:40 +00:00
2003-08-12 12:16:28 +00:00
}
2003-08-12 12:16:28 +00:00
void IconbarTool::renderButton(IconButton &button) {
2003-08-11 15:42:29 +00:00
2003-08-12 12:16:28 +00:00
if (button.win().isFocused()) { // focused texture
button.setGC(m_theme.focusedText().textGC());
button.setFont(m_theme.focusedText().font());
button.setJustify(m_theme.focusedText().justify());
2003-08-11 15:42:29 +00:00
2003-08-12 12:16:28 +00:00
if (m_focused_pm != 0)
button.setBackgroundPixmap(m_focused_pm);
else
button.setBackgroundColor(m_theme.focusedTexture().color());
2003-08-11 15:42:29 +00:00
2003-08-13 09:57:40 +00:00
button.setBorderWidth(m_theme.focusedBorder().width());
button.setBorderColor(m_theme.focusedBorder().color());
2003-08-12 12:16:28 +00:00
} else { // unfocused
button.setGC(m_theme.unfocusedText().textGC());
button.setFont(m_theme.unfocusedText().font());
button.setJustify(m_theme.unfocusedText().justify());
2003-08-11 15:42:29 +00:00
2003-08-12 12:16:28 +00:00
if (m_unfocused_pm != 0)
button.setBackgroundPixmap(m_unfocused_pm);
else
button.setBackgroundColor(m_theme.unfocusedTexture().color());
2003-08-13 09:57:40 +00:00
button.setBorderWidth(m_theme.unfocusedBorder().width());
button.setBorderColor(m_theme.unfocusedBorder().color());
2003-08-12 12:16:28 +00:00
}
}
2003-08-11 15:42:29 +00:00
2003-08-12 12:16:28 +00:00
void IconbarTool::deleteIcons() {
m_icon_container.removeAll();
while (!m_icon_list.empty()) {
delete m_icon_list.back();
m_icon_list.pop_back();
2003-08-11 15:42:29 +00:00
}
}