Added layer menus for windows, toolbar, and slit, plus associated

resources. Cleaned up some cruft from the previous layering setup.
This commit is contained in:
rathnor 2003-02-18 15:11:12 +00:00
parent aa602770fb
commit b4ffe4fe21
15 changed files with 210 additions and 162 deletions

View file

@ -1,6 +1,13 @@
(Format: Year/Month/Day)
Changes for 0.1.15:
*03/02/17:
* Added layer menus for windows, toolbar, and slit, plus associated
resources. Cleaned up some cruft from the previous layering setup.
Gnome.cc LayerMenu.hh Screen.hh/cc Slit.hh/cc Tab.cc Toolbar.hh/cc Window.hh/cc Workspace.hh fluxbox.hh/cc
* Renamed LayeredMenu to FbMenu
LayeredMenu.hh FbMenu.hh
* Changed XLayerItem to hold FbWindows instead of Windows
XLayerItem.hh/cc XLayer.cc MultLayers.cc Window.cc
* Added shade option for button config (Henrik)
Screen.cc
* Fixed antialias toggle for menus (Henrik)

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Menu.hh,v 1.8 2003/02/15 01:47:43 fluxgen Exp $
// $Id: Menu.hh,v 1.9 2003/02/18 15:11:12 rathnor Exp $
#ifndef FBTK_MENU_HH
#define FBTK_MENU_HH
@ -121,6 +121,8 @@ public:
bool isVisible() const { return visible; }
int screenNumber() const { return m_screen_num; }
Window window() const { return menu.window.window(); }
FbTk::FbWindow &fbwindow() { return menu.window; }
const FbTk::FbWindow &fbwindow() const { return menu.window; }
const std::string &label() const { return menu.label; }
int x() const { return menu.x; }
int y() const { return menu.y; }

View file

@ -19,7 +19,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Gnome.cc,v 1.10 2003/02/16 17:57:54 rathnor Exp $
// $Id: Gnome.cc,v 1.11 2003/02/18 15:11:07 rathnor Exp $
#include "Gnome.hh"
@ -366,9 +366,11 @@ void Gnome::setLayer(FluxboxWindow *win, int layer) {
layer = Fluxbox::instance()->getTopLayer();
break;
case WIN_LAYER_DOCK:
layer = Fluxbox::instance()->getSlitLayer();
layer = Fluxbox::instance()->getDockLayer();
break;
case WIN_LAYER_ABOVE_DOCK:
layer = Fluxbox::instance()->getAboveDockLayer();
break;
//case WIN_LAYER_ABOVE_DOCK:
case WIN_LAYER_MENU:
layer = Fluxbox::instance()->getMenuLayer();
break;

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Screen.cc,v 1.110 2003/02/17 12:35:59 fluxgen Exp $
// $Id: Screen.cc,v 1.111 2003/02/18 15:11:07 rathnor Exp $
#include "Screen.hh"
@ -45,7 +45,8 @@
#include "MacroCommand.hh"
#include "XLayerItem.hh"
#include "MultLayers.hh"
#include "LayeredMenu.hh"
#include "FbMenu.hh"
#include "LayerMenu.hh"
//use GNU extensions
#ifndef _GNU_SOURCE
@ -131,13 +132,14 @@ int anotherWMRunning(Display *display, XErrorEvent *) {
}
FbTk::Menu *createMenuFromScreen(BScreen &screen) {
FbTk::Menu *menu = new LayeredMenu(*screen.menuTheme(),
FbTk::Menu *menu = new FbMenu(*screen.menuTheme(),
screen.getScreenNumber(),
*screen.getImageControl(),
*screen.layerManager().getLayer(Fluxbox::instance()->getMenuLayer()));
return menu;
}
/*
class WindowLayerMenuItem : public FbTk::MenuItem {
public:
WindowLayerMenuItem(const char *label, FluxboxWindow &win, int layernum):
@ -152,6 +154,8 @@ private:
FluxboxWindow &m_window;
int m_layernum;
};
*/
}; // End anonymous namespace
@ -345,7 +349,6 @@ void FbTk::ThemeItem<std::string>::setFromString(const char *str) {
BScreen::ScreenResource::ScreenResource(ResourceManager &rm,
const std::string &scrname,
const std::string &altscrname):
toolbar_on_top(rm, false, scrname+".toolbar.onTop", altscrname+".Toolbar.OnTop"),
toolbar_auto_hide(rm, false, scrname+".toolbar.autoHide", altscrname+".Toolbar.AutoHide"),
image_dither(rm, false, scrname+".imageDither", altscrname+".ImageDither"),
opaque_move(rm, false, "session.opaqueMove", "Session.OpaqueMove"),
@ -365,6 +368,8 @@ BScreen::ScreenResource::ScreenResource(ResourceManager &rm,
edge_snap_threshold(rm, 0, scrname+".edgeSnapThreshold", altscrname+".EdgeSnapThreshold"),
tab_width(rm, 64, scrname+".tab.width", altscrname+".Tab.Width"),
tab_height(rm, 16, scrname+".tab.height", altscrname+".Tab.Height"),
slit_layernum(rm, Fluxbox::instance()->getDockLayer(), scrname+".slit.layer", altscrname+".Slit.Layer"),
toolbar_layernum(rm, Fluxbox::instance()->getDesktopLayer(), scrname+".toolbar.layer", altscrname+".Toolbar.Layer"),
tab_placement(rm, Tab::PTOP, scrname+".tab.placement", altscrname+".Tab.Placement"),
tab_alignment(rm, Tab::ALEFT, scrname+".tab.alignment", altscrname+".Tab.Alignment"),
toolbar_on_head(rm, 0, scrname+".toolbar.onhead", altscrname+".Toolbar.onHead")
@ -515,10 +520,10 @@ BScreen::BScreen(ResourceManager &rm,
current_workspace = workspacesList.front();
#ifdef SLIT
m_slit.reset(new Slit(*this));
m_slit.reset(new Slit(*this, *layerManager().getLayer(getSlitLayerNum())));
#endif // SLIT
m_toolbar.reset(new Toolbar(*this));
m_toolbar.reset(new Toolbar(*this, *layerManager().getLayer(getToolbarLayerNum())));
// setup toolbar width menu item
FbTk::MenuItem *toolbar_menuitem = new IntResMenuItem("Toolbar width percent",
resource.toolbar_width_percent,
@ -536,6 +541,7 @@ BScreen::BScreen(ResourceManager &rm,
FbTk::RefCount<FbTk::Command> reconfig_toolbar_and_save_resource(toolbar_menuitem_macro);
toolbar_menuitem->setCommand(reconfig_toolbar_and_save_resource);
m_toolbar->menu().insert(toolbar_menuitem);
setupWorkspacemenu(*this, *workspacemenu);
@ -549,8 +555,6 @@ BScreen::BScreen(ResourceManager &rm,
initMenu(); // create and initiate rootmenu
raiseWindows(Workspace::Stack());
//update menus
m_rootmenu->update();
m_configmenu->update();
@ -749,7 +753,6 @@ void BScreen::reconfigure() {
m_configmenu->reconfigure();
initMenu();
raiseWindows(Workspace::Stack());
m_rootmenu->reconfigure();
@ -784,7 +787,6 @@ void BScreen::reconfigure() {
void BScreen::rereadMenu() {
initMenu();
raiseWindows(Workspace::Stack());
m_rootmenu->reconfigure();
}
@ -1253,35 +1255,6 @@ void BScreen::setupWindowActions(FluxboxWindow &win) {
menu.removeAll(); // clear old items
menu.disableTitle(); // not titlebar
// check and setup layer menu as a submenu windowmenu
FbTk::Menu &layer_menu = win.getLayermenu();
layer_menu.disableTitle(); // no titlebar
// if it hasn't already been setup (no need to reset it)
if (layer_menu.numberOfItems() == 0) {
Fluxbox *fluxbox = Fluxbox::instance();
struct {
int set;
int base;
const char *default_str;
int layernum;
} layer_menuitems[] = {
//TODO: nls
{0, 0, "Above Slit", fluxbox->getAboveSlitLayer()},
{0, 0, "Slit", fluxbox->getSlitLayer()},
{0, 0, "Top", fluxbox->getTopLayer()},
{0, 0, "Normal", fluxbox->getNormalLayer()},
{0, 0, "Bottom", fluxbox->getBottomLayer()},
{0, 0, "Desktop", fluxbox->getDesktopLayer()},
};
for (size_t i=0; i < 6; ++i) {
// TODO: fetch nls string
layer_menu.insert(new WindowLayerMenuItem(layer_menuitems[i].default_str,
win, layer_menuitems[i].layernum));
};
layer_menu.update();
}
// set new menu items
menu.insert("Shade", shade_cmd);
menu.insert("Stick", stick_cmd);
@ -1291,57 +1264,14 @@ void BScreen::setupWindowActions(FluxboxWindow &win) {
menu.insert("Iconify", iconify_cmd);
menu.insert("Raise", raise_cmd);
menu.insert("Lower", lower_cmd);
menu.insert("Layer...", &layer_menu);
menu.insert("Layer...", win.getLayermenu());
menu.insert("¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯");
menu.insert("Close", close_cmd);
menu.reconfigure(); // update graphics
}
void BScreen::raiseWindows(const Workspace::Stack &workspace_stack) {
// TODO: I don't think we need this...
#ifdef DEBUG
cerr<<"BScreen::raiseWindows() called"<<endl;
#endif //DEBUG
/*
Window session_stack[(workspace_stack.size() + workspacesList.size() + rootmenuList.size() + 30)];
int i = 0;
Workspaces::iterator wit = workspacesList.begin();
Workspaces::iterator wit_end = workspacesList.end();
for (; wit != wit_end; ++wit) {
session_stack[i++] = (*wit)->menu().windowID();
}
session_stack[i++] = workspacemenu->windowID();
Rootmenus::iterator rit = rootmenuList.begin();
Rootmenus::iterator rit_end = rootmenuList.end();
for (; rit != rit_end; ++rit) {
session_stack[i++] = (*rit)->windowID();
}
session_stack[i++] = m_rootmenu->windowID();
if (m_toolbar->isOnTop())
session_stack[i++] = m_toolbar->getWindowID();
#ifdef SLIT
if (m_slit->isOnTop())
session_stack[i++] = m_slit->getWindowID();
#endif // SLIT
if (!workspace_stack.empty()) {
Workspace::Stack::const_reverse_iterator it = workspace_stack.rbegin();
Workspace::Stack::const_reverse_iterator it_end = workspace_stack.rend();
for (; it != it_end; ++it)
session_stack[i++] = (*it);
}
XRestackWindows(getBaseDisplay()->getXDisplay(), session_stack, i);
*/
}
void BScreen::saveStrftimeFormat(const char *format) {
//make sure std::string don't get 0 string

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Screen.hh,v 1.67 2003/02/16 00:36:17 fluxgen Exp $
// $Id: Screen.hh,v 1.68 2003/02/18 15:11:08 rathnor Exp $
#ifndef SCREEN_HH
#define SCREEN_HH
@ -36,6 +36,7 @@
#include "FbWinFrameTheme.hh"
#include "MultLayers.hh"
#include "XLayerItem.hh"
#include "fluxbox.hh"
#include <X11/Xlib.h>
#include <X11/Xresource.h>
@ -77,7 +78,6 @@ public:
int scrn, int number_of_layers);
~BScreen();
inline bool isToolbarOnTop() const { return *resource.toolbar_on_top; }
inline bool doToolbarAutoHide() const { return *resource.toolbar_auto_hide; }
inline bool isSloppyFocus() const { return resource.sloppy_focus; }
inline bool isSemiSloppyFocus() const { return resource.semi_sloppy_focus; }
@ -105,7 +105,6 @@ public:
inline const std::string &getRootCommand() const { return *resource.rootcommand; }
inline bool isSlitOnTop() const { return resource.slit_on_top; }
inline bool doSlitAutoHide() const { return resource.slit_auto_hide; }
#ifdef SLIT
inline Slit *getSlit() { return m_slit.get(); }
@ -115,7 +114,6 @@ public:
inline int getSlitDirection() const { return resource.slit_direction; }
inline void saveSlitPlacement(int p) { resource.slit_placement = p; }
inline void saveSlitDirection(int d) { resource.slit_direction = d; }
inline void saveSlitOnTop(bool t) { resource.slit_on_top = t; }
inline void saveSlitAutoHide(bool t) { resource.slit_auto_hide = t; }
inline unsigned int getSlitOnHead() const { return resource.slit_on_head; }
@ -181,6 +179,10 @@ public:
inline int getColPlacementDirection() const { return resource.col_direction; }
inline unsigned int getTabWidth() const { return *resource.tab_width; }
inline unsigned int getTabHeight() const { return *resource.tab_height; }
inline int getSlitLayerNum() const { return (*resource.slit_layernum).getNum(); }
inline int getToolbarLayerNum() const { return (*resource.toolbar_layernum).getNum(); }
inline Tab::Placement getTabPlacement() const { return *resource.tab_placement; }
inline Tab::Alignment getTabAlignment() const { return *resource.tab_alignment; }
@ -190,7 +192,6 @@ public:
inline void saveSemiSloppyFocus(bool s) { resource.semi_sloppy_focus = s; }
inline void saveAutoRaise(bool a) { resource.auto_raise = a; }
inline void saveWorkspaces(int w) { *resource.workspaces = w; }
inline void saveToolbarOnTop(bool r) { *resource.toolbar_on_top = r; }
inline void saveToolbarAutoHide(bool r) { *resource.toolbar_auto_hide = r; }
inline void saveToolbarWidthPercent(int w) { *resource.toolbar_width_percent = w; }
@ -262,7 +263,6 @@ public:
std::string getNameOfWorkspace(unsigned int workspace) const;
void changeWorkspaceID(unsigned int);
void sendToWorkspace(unsigned int workspace, FluxboxWindow *win=0, bool changeworkspace=true);
void raiseWindows(const Workspace::Stack &workspace_stack);
void reassociateGroup(FluxboxWindow *window, unsigned int workspace_id, bool ignore_sticky);
void reassociateWindow(FluxboxWindow *window, unsigned int workspace_id, bool ignore_sticky);
void prevFocus() { prevFocus(0); }
@ -375,7 +375,7 @@ private:
ScreenResource(ResourceManager &rm, const std::string &scrname,
const std::string &altscrname);
Resource<bool> toolbar_on_top, toolbar_auto_hide,
Resource<bool> toolbar_auto_hide,
image_dither, opaque_move, full_max,
max_over_slit, tab_rotate_vertical,
sloppy_window_grouping, workspace_warping,
@ -387,13 +387,14 @@ private:
ordered_dither;
Resource<int> workspaces, toolbar_width_percent, edge_snap_threshold,
tab_width, tab_height;
Resource<Fluxbox::Layer> slit_layernum, toolbar_layernum;
int placement_policy, row_direction, col_direction;
Resource<Tab::Placement> tab_placement;
Resource<Tab::Alignment> tab_alignment;
Resource<int> toolbar_on_head;
bool slit_on_top, slit_auto_hide;
bool slit_auto_hide;
int slit_placement, slit_direction;
unsigned int slit_on_head;

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Slit.cc,v 1.34 2003/02/17 12:53:21 fluxgen Exp $
// $Id: Slit.cc,v 1.35 2003/02/18 15:11:08 rathnor Exp $
#include "Slit.hh"
@ -43,6 +43,9 @@
#include "BoolMenuItem.hh"
#include "EventManager.hh"
#include "MacroCommand.hh"
#include "LayerMenu.hh"
#include "fluxbox.hh"
#include "XLayer.hh"
#include <algorithm>
#include <iostream>
@ -104,6 +107,7 @@ void getWMName(BScreen *screen, Window window, std::string& name) {
}
};
/// holds slit client info
class SlitClient {
public:
@ -226,8 +230,8 @@ private:
}; // End anonymous namespace
Slit::Slit(BScreen &scr, const char *filename):
m_screen(&scr), timer(this),
Slit::Slit(BScreen &scr, FbTk::XLayer &layer, const char *filename)
: m_screen(&scr), timer(this),
slitmenu(*scr.menuTheme(),
scr.getScreenNumber(),
*scr.getImageControl()),
@ -236,12 +240,20 @@ Slit::Slit(BScreen &scr, const char *filename):
*scr.getImageControl()),
clientlist_menu(*scr.menuTheme(),
scr.getScreenNumber(),
*scr.getImageControl()) {
*scr.getImageControl()),
slit_layermenu(0),
m_layeritem(0)
{
slit_layermenu = new LayerMenu<Slit>(*scr.menuTheme(),
scr.getScreenNumber(),
*scr.getImageControl(),
*scr.layerManager().getLayer(Fluxbox::instance()->getMenuLayer()),
this);
// default placement and direction
m_direction = HORIZONTAL;
m_placement = TOPLEFT;
on_top = false;
hidden = do_auto_hide = false;
frame.pixmap = None;
@ -270,6 +282,7 @@ Slit::Slit(BScreen &scr, const char *filename):
create_mask, &attrib);
FbTk::EventManager::instance()->add(*this, frame.window);
m_layeritem = new FbTk::XLayerItem(frame.window, layer);
//For KDE dock applets
kwm1_dockwindow = XInternAtom(disp, "KWM_DOCKWINDOW", False); //KDE v1.x
@ -287,6 +300,8 @@ Slit::Slit(BScreen &scr, const char *filename):
Slit::~Slit() {
if (frame.pixmap != 0)
screen()->getImageControl()->removeImage(frame.pixmap);
if (m_layeritem) delete m_layeritem;
if (slit_layermenu) delete slit_layermenu;
}
@ -904,13 +919,7 @@ void Slit::buttonPressEvent(XButtonEvent &e) {
if (e.window != frame.window.window())
return;
if (e.button == Button1 && (! on_top)) {
Workspace::Stack st;
st.push_back(frame.window.window());
screen()->raiseWindows(st);
} else if (e.button == Button2 && (! on_top)) {
frame.window.lower();
} else if (e.button == Button3) {
if (e.button == Button3) {
if (! slitmenu.isVisible()) {
int x = e.x_root - (slitmenu.width() / 2),
y = e.y_root - (slitmenu.height() / 2);
@ -1068,13 +1077,6 @@ void Slit::saveClientList() {
}
}
void Slit::setOnTop(bool val) {
if (isOnTop())
screen()->raiseWindows(Workspace::Stack());
}
void Slit::setAutoHide(bool val) {
do_auto_hide = val;
}
@ -1091,11 +1093,8 @@ void Slit::setupMenu() {
CommonSet, CommonPlacementTitle,
"Placement"),
&placement_menu);
slitmenu.insert(new BoolMenuItem(i18n->getMessage(
CommonSet, CommonAlwaysOnTop,
"Always on top"),
on_top,
menu_cmd));
slitmenu.insert("Layer...", slit_layermenu);
slitmenu.insert(new BoolMenuItem(i18n->getMessage(
CommonSet, CommonAutoHide,

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
/// $Id: Slit.hh,v 1.18 2003/01/12 17:53:10 fluxgen Exp $
/// $Id: Slit.hh,v 1.19 2003/02/18 15:11:08 rathnor Exp $
#ifndef SLIT_HH
#define SLIT_HH
@ -30,6 +30,8 @@
#include "Menu.hh"
#include "FbWindow.hh"
#include "Timer.hh"
#include "XLayerItem.hh"
#include "LayerMenu.hh"
#include <X11/Xlib.h>
#include <X11/Xutil.h>
@ -54,10 +56,9 @@ public:
enum Placement { TOPLEFT = 1, CENTERLEFT, BOTTOMLEFT, TOPCENTER, BOTTOMCENTER,
TOPRIGHT, CENTERRIGHT, BOTTOMRIGHT };
explicit Slit(BScreen &screen, const char *filename = 0);
explicit Slit(BScreen &screen, FbTk::XLayer &layer, const char *filename = 0);
virtual ~Slit();
inline bool isOnTop() const { return on_top; }
inline bool isHidden() const { return hidden; }
inline bool doAutoHide() const { return do_auto_hide; }
inline Direction direction() const { return m_direction; }
@ -74,7 +75,6 @@ public:
void setDirection(Direction dir);
void setPlacement(Placement place);
void setOnTop(bool val);
void setAutoHide(bool val);
void addClient(Window clientwin);
void removeClient(Window clientwin, bool = true);
@ -101,6 +101,9 @@ public:
void configureRequestEvent(XConfigureRequestEvent &event);
//@}
void moveToLayer(int layernum) { m_layeritem->moveToLayer(layernum); }
FbTk::XLayerItem &getLayerItem() { return *m_layeritem; }
virtual void timeout();
@ -111,7 +114,7 @@ private:
void loadClientList(const char *filename);
void updateClientmenu();
bool on_top, hidden, do_auto_hide;
bool hidden, do_auto_hide;
Direction m_direction;
Placement m_placement;
@ -122,6 +125,7 @@ private:
SlitClients clientList;
FbTk::Menu slitmenu, placement_menu, clientlist_menu;
LayerMenu<Slit> *slit_layermenu;
std::string clientListPath;
std::string m_filename;
@ -134,6 +138,8 @@ private:
} frame;
// for KDE
Atom kwm1_dockwindow, kwm2_dockwindow;
FbTk::XLayerItem *m_layeritem;
};

View file

@ -19,7 +19,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Tab.cc,v 1.54 2003/02/09 14:11:12 rathnor Exp $
// $Id: Tab.cc,v 1.55 2003/02/18 15:11:09 rathnor Exp $
#include "Tab.hh"
@ -152,6 +152,7 @@ void Tab::focus() {
//-----------------------------------------
void Tab::raise() {
//get first tab
/*
Tab *tab = 0;
//raise tabs
Workspace::Stack st;
@ -159,6 +160,7 @@ void Tab::raise() {
st.push_back(tab->m_tabwin);
}
m_win->getScreen()->raiseWindows(st);
*/
}
//-------------- lower --------------------

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Toolbar.cc,v 1.58 2003/02/17 12:32:21 fluxgen Exp $
// $Id: Toolbar.cc,v 1.59 2003/02/18 15:11:09 rathnor Exp $
#include "Toolbar.hh"
@ -92,6 +92,8 @@ void setupMenus(Toolbar &tbar) {
"Toolbar"));
menu.setInternalMenu();
menu.insert("Layer...", tbar.layermenu());
using namespace FbTk;
RefCount<Command> start_edit(new SimpleCommand<Toolbar>(tbar, &Toolbar::edit));
menu.insert(i18n->getMessage(
@ -166,8 +168,7 @@ Toolbar::Frame::~Frame() {
evm.remove(clock);
}
Toolbar::Toolbar(BScreen &scrn, size_t width):
on_top(scrn.isToolbarOnTop()),
Toolbar::Toolbar(BScreen &scrn, FbTk::XLayer &layer, size_t width):
editing(false),
hidden(scrn.doToolbarAutoHide()),
do_auto_hide(scrn.doToolbarAutoHide()),
@ -177,10 +178,20 @@ Toolbar::Toolbar(BScreen &scrn, size_t width):
clock_timer(this), // get the clock updating every minute
hide_timer(&hide_handler),
m_toolbarmenu(*scrn.menuTheme(), scrn.getScreenNumber(), *scrn.getImageControl()),
m_layermenu(0),
m_theme(scrn.getScreenNumber()),
m_place(BOTTOMCENTER),
m_themelistener(*this) {
m_themelistener(*this),
m_layeritem(0)
{
m_layermenu = new LayerMenu<Toolbar>(
*scrn.menuTheme(),
scrn.getScreenNumber(),
*scrn.getImageControl(),
*scrn.layerManager().getLayer(Fluxbox::instance()->getMenuLayer()),
this);
// we need to get notified when the theme is reloaded
m_theme.addListener(m_themelistener);
@ -194,6 +205,8 @@ Toolbar::Toolbar(BScreen &scrn, size_t width):
frame.button_w = 20;
frame.bevel_w = 1;
m_layeritem = new FbTk::XLayerItem(frame.window, layer);
timeval delay;
delay.tv_sec = 1;
delay.tv_usec = 0;
@ -247,6 +260,8 @@ Toolbar::~Toolbar() {
if (frame.clk) image_ctrl.removeImage(frame.clk);
if (frame.button) image_ctrl.removeImage(frame.button);
if (frame.pbutton) image_ctrl.removeImage(frame.pbutton);
if (m_layeritem) delete m_layeritem;
if (m_layermenu) delete m_layermenu;
}
@ -748,13 +763,6 @@ void Toolbar::buttonPressEvent(XButtonEvent &be) {
checkClock(true, true);
}
#endif // HAVE_STRFTIME
else if (! on_top) {
Workspace::Stack st;
st.push_back(frame.window.window());
screen().raiseWindows(st);
}
} else if (be.button == 2 && (! on_top)) {
frame.window.lower();
} else if (be.button == 3) {
FluxboxWindow *fluxboxwin = 0;
// if we clicked on a icon then show window menu

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Toolbar.hh,v 1.23 2003/02/16 00:08:29 fluxgen Exp $
// $Id: Toolbar.hh,v 1.24 2003/02/18 15:11:10 rathnor Exp $
#ifndef TOOLBAR_HH
#define TOOLBAR_HH
@ -34,11 +34,12 @@
#include "FbWindow.hh"
#include "ArrowButton.hh"
#include "Observer.hh"
#include "XLayer.hh"
#include "XLayerItem.hh"
#include "LayerMenu.hh"
#include <memory>
class Toolbar;
namespace FbTk {
class ImageControl;
};
@ -61,7 +62,7 @@ public:
};
/// create a toolbar on the screen with specific width
explicit Toolbar(BScreen &screen, size_t width = 200);
explicit Toolbar(BScreen &screen, FbTk::XLayer &layer, size_t width = 200);
/// destructor
virtual ~Toolbar();
@ -73,10 +74,15 @@ public:
inline const FbTk::Menu &menu() const { return m_toolbarmenu; }
inline FbTk::Menu &menu() { return m_toolbarmenu; }
inline FbTk::Menu *layermenu() { return m_layermenu; }
inline const FbTk::Menu *layermenu() const { return m_layermenu; }
void moveToLayer(int layernum) { m_layeritem->moveToLayer(layernum); }
FbTk::XLayerItem &getLayerItem() { return *m_layeritem; }
/// are we in workspacename editing?
inline bool isEditing() const { return editing; }
/// always on top?
inline bool isOnTop() const { return on_top; }
/// are we hidden?
inline bool isHidden() const { return hidden; }
/// do we auto hide the toolbar?
@ -120,7 +126,6 @@ public:
private:
bool on_top; ///< always on top
bool editing; ///< edit workspace label mode
bool hidden; ///< hidden state
bool do_auto_hide; ///< do we auto hide
@ -130,6 +135,7 @@ private:
struct Frame {
Frame(FbTk::EventHandler &evh, int screen_num);
~Frame();
Pixmap base, label, wlabel, clk, button, pbutton;
FbTk::FbWindow window, workspace_label, window_label, clock;
ArrowButton psbutton, nsbutton, pwbutton, nwbutton;
@ -152,6 +158,7 @@ private:
FbTk::Timer clock_timer; ///< timer to update clock
FbTk::Timer hide_timer; ///< timer to for auto hide toolbar
FbTk::Menu m_toolbarmenu;
LayerMenu<Toolbar> *m_layermenu;
std::auto_ptr<IconBar> m_iconbar;
std::string new_workspace_name; ///< temp variable in edit workspace name mode
@ -170,6 +177,8 @@ private:
};
ThemeListener m_themelistener;
FbTk::XLayerItem *m_layeritem;
};

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Window.cc,v 1.119 2003/02/17 22:42:52 fluxgen Exp $
// $Id: Window.cc,v 1.120 2003/02/18 15:11:10 rathnor Exp $
#include "Window.hh"
@ -112,13 +112,20 @@ FluxboxWindow::FluxboxWindow(Window w, BScreen *s, int screen_num,
display(0),
lastButtonPressTime(0),
m_windowmenu(menutheme, screen_num, imgctrl),
m_layermenu(menutheme, screen_num, imgctrl),
m_layermenu(0),
old_decoration(DECOR_NORMAL),
tab(0),
m_frame(tm, imgctrl, screen_num, 0, 0, 100, 100),
m_layeritem(getFrameWindow(), layer),
m_layernum(layer.getLayerNum()) {
m_layeritem(m_frame.window(), layer),
m_layernum(layer.getLayerNum())
{
m_layermenu = new LayerMenu<FluxboxWindow>(
menutheme,
screen_num,
imgctrl,
*s->layerManager().getLayer(Fluxbox::instance()->getMenuLayer()),
this);
// redirect events from frame to us
@ -354,6 +361,8 @@ FluxboxWindow::~FluxboxWindow() {
client.window_group = 0;
}
if (m_layermenu) delete m_layermenu;
if (client.window)
fluxbox->removeWindowSearch(client.window);

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Window.hh,v 1.49 2003/02/17 22:41:24 fluxgen Exp $
// $Id: Window.hh,v 1.50 2003/02/18 15:11:11 rathnor Exp $
#ifndef WINDOW_HH
#define WINDOW_HH
@ -34,6 +34,7 @@
#include "FbWinFrame.hh"
#include "EventHandler.hh"
#include "XLayerItem.hh"
#include "LayerMenu.hh"
#include <X11/Xlib.h>
#include <X11/Xutil.h>
@ -58,6 +59,7 @@ class ImageControl;
class XLayer;
};
/// Creates the window frame and handles any window event for it
class FluxboxWindow : public FbTk::TimeoutHandler, public FbTk::EventHandler {
public:
@ -223,11 +225,14 @@ public:
Window getFrameWindow() const { return m_frame.window().window(); }
Window getClientWindow() const { return client.window; }
FbTk::FbWindow &getFbWindow() { return m_frame.window(); }
const FbTk::FbWindow &getFbWindow() const { return m_frame.window(); }
FbTk::Menu &getWindowmenu() { return m_windowmenu; }
const FbTk::Menu &getWindowmenu() const { return m_windowmenu; }
FbTk::Menu &getLayermenu() { return m_layermenu; }
const FbTk::Menu &getLayermenu() const { return m_layermenu; }
FbTk::Menu *getLayermenu() { return m_layermenu; }
const FbTk::Menu *getLayermenu() const { return m_layermenu; }
const std::string &getTitle() const { return client.title; }
const std::string &getIconTitle() const { return client.icon_title; }
@ -341,7 +346,8 @@ private:
BaseDisplay::BlackboxAttributes blackbox_attrib;
Time lastButtonPressTime;
FbTk::Menu m_windowmenu, m_layermenu;
FbTk::Menu m_windowmenu;
LayerMenu<FluxboxWindow> *m_layermenu;
timeval lastFocusTime;
@ -403,5 +409,10 @@ private:
};
template <>
void LayerMenuItem<FluxboxWindow>::click(int button, int time) {
m_object->moveToLayer(m_layernum);
}
#endif // WINDOW_HH

View file

@ -45,7 +45,6 @@ class FluxboxWindow;
class Workspace:private FbTk::NotCopyable {
public:
typedef std::vector<FluxboxWindow *> Windows;
typedef std::vector<Window> Stack;
Workspace(BScreen &screen, FbTk::MultLayers &layermanager,
unsigned int workspaceid = 0);

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: fluxbox.cc,v 1.96 2003/02/17 12:31:17 fluxgen Exp $
// $Id: fluxbox.cc,v 1.97 2003/02/18 15:11:12 rathnor Exp $
#include "fluxbox.hh"
@ -283,6 +283,56 @@ getString() {
return string(tmpstr);
}
template<>
void Resource<Fluxbox::Layer>::
setFromString(const char *strval) {
int tempnum = 0;
if (sscanf(strval, "%d", &tempnum) == 1)
m_value = tempnum;
else if (strcasecmp(strval, "Menu") == 0)
m_value = Fluxbox::instance()->getMenuLayer();
else if (strcasecmp(strval, "AboveDock") == 0)
m_value = Fluxbox::instance()->getAboveDockLayer();
else if (strcasecmp(strval, "Dock") == 0)
m_value = Fluxbox::instance()->getDockLayer();
else if (strcasecmp(strval, "Top") == 0)
m_value = Fluxbox::instance()->getTopLayer();
else if (strcasecmp(strval, "Normal") == 0)
m_value = Fluxbox::instance()->getNormalLayer();
else if (strcasecmp(strval, "Bottom") == 0)
m_value = Fluxbox::instance()->getBottomLayer();
else if (strcasecmp(strval, "Desktop") == 0)
m_value = Fluxbox::instance()->getDesktopLayer();
else
setDefaultValue();
}
template<>
string Resource<Fluxbox::Layer>::
getString() {
if (m_value.getNum() == Fluxbox::instance()->getMenuLayer())
return string("Menu");
else if (m_value.getNum() == Fluxbox::instance()->getAboveDockLayer())
return string("AboveDock");
else if (m_value.getNum() == Fluxbox::instance()->getDockLayer())
return string("Dock");
else if (m_value.getNum() == Fluxbox::instance()->getTopLayer())
return string("Top");
else if (m_value.getNum() == Fluxbox::instance()->getNormalLayer())
return string("Normal");
else if (m_value.getNum() == Fluxbox::instance()->getBottomLayer())
return string("Bottom");
else if (m_value.getNum() == Fluxbox::instance()->getDesktopLayer())
return string("Desktop");
else {
char tmpstr[128];
sprintf(tmpstr, "%d", m_value.getNum());
return string(tmpstr);
}
}
//static singleton var
Fluxbox *Fluxbox::singleton=0;

View file

@ -22,7 +22,7 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: fluxbox.hh,v 1.42 2003/02/17 12:29:35 fluxgen Exp $
// $Id: fluxbox.hh,v 1.43 2003/02/18 15:11:12 rathnor Exp $
#ifndef FLUXBOX_HH
#define FLUXBOX_HH
@ -103,7 +103,7 @@ public:
/// obsolete
enum Titlebar{SHADE=0, MINIMIZE, MAXIMIZE, CLOSE, STICK, MENU, EMPTY};
inline const std::vector<Fluxbox::Titlebar>& getTitlebarRight() { return *m_rc_titlebar_right; }
inline const std::vector<Fluxbox::Titlebar>& getTitlebarLeft() { return *m_rc_titlebar_left; }
inline const std::string &getStyleFilename() const { return *m_rc_stylefile; }
@ -113,14 +113,26 @@ public:
inline int colorsPerChannel() const { return *m_rc_colors_per_channel; }
inline int getNumberOfLayers() const { return *m_rc_numlayers; }
// TODO there probably should be configurable
inline int getDesktopLayer() const { return 12; }
inline int getBottomLayer() const { return 10; }
inline int getNormalLayer() const { return 8; }
inline int getTopLayer() const { return 6; }
inline int getSlitLayer() const { return 4; }
inline int getAboveSlitLayer() const { return 2; }
// class to store layer numbers (special Resource type)
class Layer {
public:
Layer(int i) : m_num(i) {};
const int getNum() const { return m_num; }
Layer &operator=(int num) { m_num = num; return *this; }
private:
int m_num;
};
// TODO these probably should be configurable
inline int getMenuLayer() const { return 0; }
inline int getAboveDockLayer() const { return 2; }
inline int getDockLayer() const { return 4; }
inline int getTopLayer() const { return 6; }
inline int getNormalLayer() const { return 8; }
inline int getBottomLayer() const { return 10; }
inline int getDesktopLayer() const { return 12; }
inline const timeval &getAutoRaiseDelay() const { return resource.auto_raise_delay; }
@ -216,6 +228,7 @@ private:
Resource<std::string> m_rc_stylefile,
m_rc_menufile, m_rc_keyfile, m_rc_slitlistfile,
m_rc_groupfile;
Resource<TitlebarList> m_rc_titlebar_left, m_rc_titlebar_right;
Resource<unsigned int> m_rc_cache_life, m_rc_cache_max;