current label button focused

This commit is contained in:
fluxgen 2003-04-16 12:27:49 +00:00
parent 274e0a928e
commit 67929002b1
3 changed files with 118 additions and 49 deletions

View file

@ -19,7 +19,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: FbWinFrame.cc,v 1.20 2003/04/16 10:56:37 fluxgen Exp $ // $Id: FbWinFrame.cc,v 1.21 2003/04/16 12:26:21 fluxgen Exp $
#include "FbWinFrame.hh" #include "FbWinFrame.hh"
#include "ImageControl.hh" #include "ImageControl.hh"
@ -261,6 +261,17 @@ void FbWinFrame::removeLabelButton(FbTk::Button &btn) {
m_labelbuttons.erase(erase_it); m_labelbuttons.erase(erase_it);
} }
void FbWinFrame::setLabelButtonFocus(FbTk::Button &btn) {
ButtonList::iterator it = find(m_labelbuttons.begin(),
m_labelbuttons.end(),
&btn);
if (it == m_labelbuttons.end())
return;
m_current_label = *it; // current focused button
renderLabelButtons();
}
void FbWinFrame::setClientWindow(FbTk::FbWindow &win) { void FbWinFrame::setClientWindow(FbTk::FbWindow &win) {
setClientWindow(win.window()); setClientWindow(win.window());
} }
@ -649,51 +660,25 @@ void FbWinFrame::renderTitlebar() {
m_label.width(), m_label.height()); m_label.width(), m_label.height());
// finaly set up pixmaps for titlebar windows // finaly set up pixmaps for titlebar windows
Pixmap labelpm = None; Pixmap label_pm = None;
FbTk::Color labelcolor; Pixmap title_pm = None;
FbTk::Color label_color;
if (m_focused) { FbTk::Color title_color;
if (m_label_focused_pm != 0){ getCurrentFocusPixmap(label_pm, title_pm,
labelpm = m_label_focused_pm; label_color, title_color);
m_label.setBackgroundPixmap(m_label_focused_pm);
} else {
labelcolor = m_label_focused_color;
m_label.setBackgroundColor(m_label_focused_color);
}
if (m_title_focused_pm != 0)
m_titlebar.setBackgroundPixmap(m_title_focused_pm);
else
m_titlebar.setBackgroundColor(m_title_focused_color);
} else {
if (m_label_unfocused_pm != 0) {
labelpm = m_label_unfocused_pm;
m_label.setBackgroundPixmap(m_label_unfocused_pm);
} else {
labelcolor = m_label_unfocused_color;
m_label.setBackgroundColor(m_label_unfocused_color);
}
if (m_title_unfocused_pm != 0)
m_titlebar.setBackgroundPixmap(m_title_unfocused_pm);
else
m_titlebar.setBackgroundColor(m_title_unfocused_color);
}
ButtonList::iterator btn_it = m_labelbuttons.begin(); if (label_pm != 0)
ButtonList::iterator btn_it_end = m_labelbuttons.end(); m_label.setBackgroundPixmap(label_pm);
for (; btn_it != btn_it_end; ++btn_it) { else
(*btn_it)->setGC(theme().labelTextFocusGC()); m_label.setBackgroundColor(label_color);
(*btn_it)->window().setBorderWidth(1);
if (labelpm)
(*btn_it)->setBackgroundPixmap(labelpm);
else
(*btn_it)->setBackgroundColor(labelcolor);
}
if (title_pm != 0)
m_titlebar.setBackgroundPixmap(title_pm);
else
m_titlebar.setBackgroundColor(title_color);
renderLabelButtons();
redrawTitle(); redrawTitle();
} }
@ -779,6 +764,7 @@ void FbWinFrame::renderButtons() {
void FbWinFrame::init() { void FbWinFrame::init() {
// clear pixmaps // clear pixmaps
m_current_label = 0; // no focused button at first
m_title_focused_pm = m_title_unfocused_pm = 0; m_title_focused_pm = m_title_unfocused_pm = 0;
m_label_focused_pm = m_label_unfocused_pm = 0; m_label_focused_pm = m_label_unfocused_pm = 0;
m_button_unfocused_pm = m_button_pressed_pm = 0; m_button_unfocused_pm = m_button_pressed_pm = 0;
@ -843,3 +829,68 @@ void FbWinFrame::render(const FbTk::Texture &tex, FbTk::Color &col, Pixmap &pm,
m_imagectrl.removeImage(tmp); m_imagectrl.removeImage(tmp);
} }
void FbWinFrame::getCurrentFocusPixmap(Pixmap &label_pm, Pixmap &title_pm,
FbTk::Color &label_color, FbTk::Color &title_color) {
if (m_focused) {
if (m_label_focused_pm != 0)
label_pm = m_label_focused_pm;
else
label_color = m_label_focused_color;
if (m_title_focused_pm != 0)
title_pm = m_title_focused_pm;
else
title_color = m_title_focused_color;
} else {
getUnFocusPixmap(label_pm, title_pm,
label_color, title_color);
}
}
void FbWinFrame::getUnFocusPixmap(Pixmap &label_pm, Pixmap &title_pm,
FbTk::Color &label_color, FbTk::Color &title_color) {
if (m_label_unfocused_pm != 0)
label_pm = m_label_unfocused_pm;
else
label_color = m_label_unfocused_color;
if (m_title_unfocused_pm != 0)
title_pm = m_title_unfocused_pm;
else
title_color = m_title_unfocused_color;
}
void FbWinFrame::renderLabelButtons() {
Pixmap label_pm = None;
Pixmap not_used_pm = None;
FbTk::Color label_color;
FbTk::Color not_used_color;
getCurrentFocusPixmap(label_pm, not_used_pm,
label_color, not_used_color);
ButtonList::iterator btn_it = m_labelbuttons.begin();
ButtonList::iterator btn_it_end = m_labelbuttons.end();
for (; btn_it != btn_it_end; ++btn_it) {
(*btn_it)->setGC(theme().labelTextFocusGC());
(*btn_it)->window().setBorderWidth(1);
if ((*btn_it) != m_current_label) {
if (m_label_unfocused_pm != 0)
(*btn_it)->setBackgroundPixmap(m_label_unfocused_pm);
else
(*btn_it)->setBackgroundColor(m_label_unfocused_color);
} else {
if (label_pm)
(*btn_it)->setBackgroundPixmap(label_pm);
else
(*btn_it)->setBackgroundColor(label_color);
}
(*btn_it)->clear();
}
}

View file

@ -19,7 +19,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: FbWinFrame.hh,v 1.5 2003/04/14 14:38:21 fluxgen Exp $ // $Id: FbWinFrame.hh,v 1.6 2003/04/16 12:24:28 fluxgen Exp $
#ifndef FBWINFRAME_HH #ifndef FBWINFRAME_HH
#define FBWINFRAME_HH #define FBWINFRAME_HH
@ -42,7 +42,8 @@ namespace FbTk {
class ImageControl; class ImageControl;
}; };
/// holds a window frame with a client window (see: <a href="fluxbox_fbwinframe.png">image</a>) /// holds a window frame with a client window
/// (see: <a href="fluxbox_fbwinframe.png">image</a>)
class FbWinFrame:public FbTk::EventHandler { class FbWinFrame:public FbTk::EventHandler {
public: public:
@ -89,7 +90,8 @@ public:
void addLabelButton(FbTk::Button &btn); void addLabelButton(FbTk::Button &btn);
/// removes a specific button from label window /// removes a specific button from label window
void removeLabelButton(FbTk::Button &btn); void removeLabelButton(FbTk::Button &btn);
/// which button is to be rendered focused
void setLabelButtonFocus(FbTk::Button &btn);
/// attach a client window for client area /// attach a client window for client area
void setClientWindow(Window win); void setClientWindow(Window win);
/// same as above but with FbWindow /// same as above but with FbWindow
@ -172,6 +174,11 @@ private:
/// renders to pixmap or sets color /// renders to pixmap or sets color
void render(const FbTk::Texture &tex, FbTk::Color &col, Pixmap &pm, void render(const FbTk::Texture &tex, FbTk::Color &col, Pixmap &pm,
unsigned int width, unsigned int height); unsigned int width, unsigned int height);
void getUnFocusPixmap(Pixmap &label_pm, Pixmap &title_pm,
FbTk::Color &label_color, FbTk::Color &title_color);
void getCurrentFocusPixmap(Pixmap &label_pm, Pixmap &title_pm,
FbTk::Color &label_color, FbTk::Color &title_color);
void renderLabelButtons();
//@} //@}
/// initiate some commont variables /// initiate some commont variables
@ -197,6 +204,7 @@ private:
ButtonList m_buttons_left, ///< buttons to the left ButtonList m_buttons_left, ///< buttons to the left
m_buttons_right; ///< buttons to the right m_buttons_right; ///< buttons to the right
ButtonList m_labelbuttons; ///< holds buttons inside label window ButtonList m_labelbuttons; ///< holds buttons inside label window
FbTk::Button *m_current_label; ///< which button is focused at the moment
std::string m_titletext; ///< text to be displayed int m_label std::string m_titletext; ///< text to be displayed int m_label
int m_bevel; ///< bevel between titlebar items and titlebar int m_bevel; ///< bevel between titlebar items and titlebar
bool m_use_titlebar; ///< if we should use titlebar bool m_use_titlebar; ///< if we should use titlebar

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: Window.cc,v 1.139 2003/04/16 00:38:06 fluxgen Exp $ // $Id: Window.cc,v 1.140 2003/04/16 12:27:49 fluxgen Exp $
#include "Window.hh" #include "Window.hh"
@ -307,7 +307,8 @@ void FluxboxWindow::init() {
btn->setJustify(m_frame.theme().justify()); btn->setJustify(m_frame.theme().justify());
m_labelbuttons[m_client] = btn; m_labelbuttons[m_client] = btn;
m_frame.addLabelButton(*btn); m_frame.addLabelButton(*btn);
btn->show(); m_frame.setLabelButtonFocus(*btn);
btn->show();
FbTk::EventManager &evm = *FbTk::EventManager::instance(); FbTk::EventManager &evm = *FbTk::EventManager::instance();
// we need motion notify so we mask it // we need motion notify so we mask it
btn->window().setEventMask(ExposureMask | ButtonPressMask | ButtonReleaseMask | btn->window().setEventMask(ExposureMask | ButtonPressMask | ButtonReleaseMask |
@ -594,6 +595,13 @@ bool FluxboxWindow::detachClient(WinClient &client) {
return true; return true;
} }
void FluxboxWindow::detachCurrentClient() {
// should only operate if we had more than one client
if (numClients() <= 1)
return;
detachClient(*m_client);
}
/// removes client from client list, does not create new fluxboxwindow for it /// removes client from client list, does not create new fluxboxwindow for it
bool FluxboxWindow::removeClient(WinClient &client) { bool FluxboxWindow::removeClient(WinClient &client) {
if (client.m_win != this || numClients() == 0) if (client.m_win != this || numClients() == 0)
@ -662,6 +670,7 @@ void FluxboxWindow::nextClient() {
else else
m_client = *it; m_client = *it;
m_client->raise(); m_client->raise();
m_frame.setLabelButtonFocus(*m_labelbuttons[m_client]);
setInputFocus(); setInputFocus();
} }
@ -680,6 +689,7 @@ void FluxboxWindow::prevClient() {
m_client = *(--it); m_client = *(--it);
m_client->raise(); m_client->raise();
m_frame.setLabelButtonFocus(*m_labelbuttons[m_client]);
setInputFocus(); setInputFocus();
} }
@ -691,6 +701,7 @@ void FluxboxWindow::setCurrentClient(WinClient &client) {
m_client = &client; m_client = &client;
m_client->raise(); m_client->raise();
Fluxbox::instance()->setFocusedWindow(this); Fluxbox::instance()->setFocusedWindow(this);
m_frame.setLabelButtonFocus(*m_labelbuttons[m_client]);
setInputFocus(); setInputFocus();
} }
@ -2365,7 +2376,6 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) {
// drag'n'drop code for tabs // drag'n'drop code for tabs
// //
if (m_attaching_tab == 0) { if (m_attaching_tab == 0) {
cerr<<"starting m_attching_tab for this="<<this<<endl;
// start drag'n'drop for tab // start drag'n'drop for tab
m_attaching_tab = client; m_attaching_tab = client;