all repos — fluxbox @ b68b1c7623be09100bb1e6a0d3923d6e1c86a91a

custom fork of the fluxbox windowmanager

xinerama updates
rathnor rathnor
commit

b68b1c7623be09100bb1e6a0d3923d6e1c86a91a

parent

3b2afa5a305f0106baef32068066b7d41eeab777

7 files changed, 102 insertions(+), 67 deletions(-)

jump to
M ChangeLogChangeLog

@@ -1,6 +1,8 @@

(Format: Year/Month/Day) Changes for 0.9.3: *03/05/19: + * Clean + change xinerama, plus add maximize smarts (Simon) + Screen.hh/cc Window.cc Workspace.cc Toolbar.cc Slit.cc * Fixed minor bug in bsetroot (Henrik) bsetroot.cc * Add back some Xinerama support (still need placement + maximise) (Simon)
M src/Screen.ccsrc/Screen.cc

@@ -22,7 +22,7 @@ // 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. -// $Id: Screen.cc,v 1.172 2003/05/19 14:26:29 rathnor Exp $ +// $Id: Screen.cc,v 1.173 2003/05/19 15:32:46 rathnor Exp $ #include "Screen.hh"

@@ -53,6 +53,7 @@ #include "LayerMenu.hh"

#include "WinClient.hh" #include "Subject.hh" #include "FbWinFrame.hh" +#include "FbWindow.hh" //use GNU extensions #ifndef _GNU_SOURCE

@@ -523,9 +524,7 @@

Display *disp = FbTk::App::instance()->display(); -#ifdef XINERAMA - initXinerama(disp); -#endif // XINERAMA + initXinerama(); event_mask = ColormapChangeMask | EnterWindowMask | PropertyChangeMask | SubstructureRedirectMask | KeyPressMask | KeyReleaseMask |

@@ -815,23 +814,47 @@ return root_pm;

} -/// TODO -unsigned int BScreen::maxLeft() const { - return 0; +unsigned int BScreen::maxLeft(FbTk::FbWindow &win) const { + if (hasXinerama()) { + int head = getHead(win.x() + win.width()/2, win.y() + win.height()/2); + // we MUST use a head, we use the center of the window, or if that + // isn't in a head, then the mouse's head + if (head == 0) head = getCurrHead(); + return getHeadX(head); + } else + return 0; } -///!! TODO -unsigned int BScreen::maxRight() const { - return width(); +unsigned int BScreen::maxRight(FbTk::FbWindow &win) const { + if (hasXinerama()) { + int head = getHead(win.x() + win.width()/2, win.y() + win.height()/2); + // we MUST use a head, we use the center of the window, or if that + // isn't in a head, then the mouse's head + if (head == 0) head = getCurrHead(); + return getHeadX(head) + getHeadWidth(head); + } else + return width(); } -///!! TODO -unsigned int BScreen::maxTop() const { - return 0; +unsigned int BScreen::maxTop(FbTk::FbWindow &win) const { + if (hasXinerama()) { + int head = getHead(win.x() + win.width()/2, win.y() + win.height()/2); + // we MUST use a head, we use the center of the window, or if that + // isn't in a head, then the mouse's head + if (head == 0) head = getCurrHead(); + return getHeadY(head); + } else + return 0; } -///!! TODO -unsigned int BScreen::maxBottom() const { - return height(); +unsigned int BScreen::maxBottom(FbTk::FbWindow &win) const { + if (hasXinerama()) { + int head = getHead(win.x() + win.width()/2, win.y() + win.height()/2); + // we MUST use a head, we use the center of the window, or if that + // isn't in a head, then the mouse's head + if (head == 0) head = getCurrHead(); + return getHeadY(head) + getHeadHeight(head); + } else + return height(); } void BScreen::reconfigure() {

@@ -2542,9 +2565,11 @@ //!! TODO: should we re-maximize the maximized windows?

} + +void BScreen::initXinerama() { #ifdef XINERAMA + Display *display = FbTk::App::instance()->display(); -void BScreen::initXinerama(Display *display) { if (!XineramaIsActive(display)) { m_xinerama_avail = false; m_xinerama_headinfo = 0;

@@ -2563,11 +2588,16 @@ m_xinerama_headinfo[i].y = screen_info[i].y_org;

m_xinerama_headinfo[i].width = screen_info[i].width; m_xinerama_headinfo[i].height = screen_info[i].height; } +#else // XINERAMA + m_xinerama_avail = false; + m_xinerama_num_heads = 0; +#endif // XINERAMA } int BScreen::getHead(int x, int y) const { if (!hasXinerama()) return 0; +#ifdef XINERAMA for (int i=0; i < m_xinerama_num_heads; i++) { if (x >= m_xinerama_headinfo[i].x &&

@@ -2578,13 +2608,15 @@ return i+1;

} } +#endif // XINERAMA return 0; } int BScreen::getCurrHead() const { if (!hasXinerama()) return 0; - int root_x, root_y, ignore_i; - + int root_x = 0, root_y = 0; +#ifdef XINERAMA + int ignore_i; unsigned int ignore_ui; Window ignore_w;

@@ -2593,28 +2625,44 @@ XQueryPointer(FbTk::App::instance()->display(),

rootWindow().window(), &ignore_w, &ignore_w, &root_x, &root_y, &ignore_i, &ignore_i, &ignore_ui); +#endif // XINERAMA return getHead(root_x, root_y); - } int BScreen::getHeadX(int head) const { +#ifdef XINERAMA if (head == 0 || head > m_xinerama_num_heads) return 0; return m_xinerama_headinfo[head-1].x; +#else + return 0; +#endif // XINERAMA } int BScreen::getHeadY(int head) const { +#ifdef XINERAMA if (head == 0 || head > m_xinerama_num_heads) return 0; return m_xinerama_headinfo[head-1].y; +#else + return 0; +#endif // XINERAMA } int BScreen::getHeadWidth(int head) const { +#ifdef XINERAMA if (head == 0 || head > m_xinerama_num_heads) return width(); return m_xinerama_headinfo[head-1].width; +#else + return width(); +#endif // XINERAMA } int BScreen::getHeadHeight(int head) const { +#ifdef XINERAMA if (head == 0 || head > m_xinerama_num_heads) return height(); return m_xinerama_headinfo[head-1].height; +#else + return height(); +#endif // XINERAMA } template <>

@@ -2638,5 +2686,3 @@ void BScreen::setOnHead<Slit>(Slit &slit, int head) {

saveSlitOnHead(head); slit.reconfigure(); } - -#endif // XINERAMA
M src/Screen.hhsrc/Screen.hh

@@ -22,7 +22,7 @@ // 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. -// $Id: Screen.hh,v 1.100 2003/05/19 14:26:30 rathnor Exp $ +// $Id: Screen.hh,v 1.101 2003/05/19 15:32:46 rathnor Exp $ #ifndef SCREEN_HH #define SCREEN_HH

@@ -58,6 +58,7 @@ class MenuTheme;

class Menu; class ImageControl; class XLayerItem; +class FbWindow; }; /// Handles screen connection, screen clients and workspaces

@@ -134,12 +135,12 @@

unsigned int currentWorkspaceID() const; Pixmap rootPixmap() const; /* - maximum screen surface + maximum screen bounds for given window */ - unsigned int maxLeft() const; - unsigned int maxRight() const; - unsigned int maxTop() const; - unsigned int maxBottom() const; + unsigned int maxLeft(FbTk::FbWindow &win) const; + unsigned int maxRight(FbTk::FbWindow &win) const; + unsigned int maxTop(FbTk::FbWindow &win) const; + unsigned int maxBottom(FbTk::FbWindow &win) const; inline unsigned int width() const { return rootWindow().width(); } inline unsigned int height() const { return rootWindow().height(); }

@@ -296,12 +297,11 @@ /// that depends on screen size (toolbar, slit)

/// (and maximized windows?) void updateSize(); -#ifdef XINERAMA // Xinerama-related functions inline bool hasXinerama() const { return m_xinerama_avail; } inline int numHeads() const { return m_xinerama_num_heads; } - void initXinerama(Display *display); + void initXinerama(); int getHead(int x, int y) const; int getCurrHead() const;

@@ -310,14 +310,13 @@ int getHeadY(int head) const;

int getHeadWidth(int head) const; int getHeadHeight(int head) const; - // magic to allow us to have "on head" placement without + // magic to allow us to have "on head" placement (menu) without // the object really knowing about it. template <typename OnHeadObject> int getOnHead(OnHeadObject &obj); template <typename OnHeadObject> void setOnHead(OnHeadObject &obj, int head); -#endif // XINERAMA // notify netizens void updateNetizenCurrentWorkspace();

@@ -447,19 +446,17 @@ } resource;

std::auto_ptr<ToolbarHandler> m_toolbarhandler; -#ifdef XINERAMA - // Xinerama related private data bool m_xinerama_avail; int m_xinerama_num_heads; + +#ifdef XINERAMA + // Xinerama related private data int m_xinerama_center_x, m_xinerama_center_y; struct XineramaHeadInfo { int x, y, width, height; } *m_xinerama_headinfo; - - - #endif };
M src/Slit.ccsrc/Slit.cc

@@ -22,7 +22,7 @@ // 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. -// $Id: Slit.cc,v 1.56 2003/05/19 14:26:30 rathnor Exp $ +// $Id: Slit.cc,v 1.57 2003/05/19 15:32:47 rathnor Exp $ #include "Slit.hh"

@@ -51,10 +51,7 @@ #include "FbTk/Theme.hh"

#include "FbMenu.hh" #include "Transparent.hh" #include "IntResMenuItem.hh" - -#ifdef XINERAMA #include "Xinerama.hh" -#endif // XINERAMA #include <algorithm> #include <iostream>

@@ -794,16 +791,13 @@ head_y = 0,

head_w, head_h; -#ifdef XINERAMA if (screen().hasXinerama()) { int head = screen().getSlitOnHead(); head_x = screen().getHeadX(head); head_y = screen().getHeadY(head); head_w = screen().getHeadWidth(head); head_h = screen().getHeadHeight(head); - } else -#endif // XINERAMA - { + } else { head_w = screen().width(); head_h = screen().height(); }
M src/Toolbar.ccsrc/Toolbar.cc

@@ -22,7 +22,7 @@ // 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. -// $Id: Toolbar.cc,v 1.85 2003/05/19 14:26:30 rathnor Exp $ +// $Id: Toolbar.cc,v 1.86 2003/05/19 15:32:47 rathnor Exp $ #include "Toolbar.hh"

@@ -42,10 +42,7 @@ #include "MacroCommand.hh"

#include "RootTheme.hh" #include "BoolMenuItem.hh" #include "FbWinFrameTheme.hh" - -#ifdef XINERAMA #include "Xinerama.hh" -#endif XINERAMA // use GNU extensions #ifndef _GNU_SOURCE

@@ -138,7 +135,7 @@

menu.setInternalMenu(); menu.insert("Layer...", &tbar.layermenu()); -#ifdef XINERAMA + if (tbar.screen().hasXinerama()) { menu.insert("On Head...", new XineramaHeadMenu<Toolbar>( *tbar.screen().menuTheme(),

@@ -148,8 +145,6 @@ *tbar.screen().layerManager().getLayer(Fluxbox::instance()->getMenuLayer()),

&tbar )); } - -#endif //XINERAMA // setup items in placement menu struct {
M src/Window.ccsrc/Window.cc

@@ -22,7 +22,7 @@ // 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. -// $Id: Window.cc,v 1.179 2003/05/17 11:08:06 fluxgen Exp $ +// $Id: Window.cc,v 1.180 2003/05/19 15:32:47 rathnor Exp $ #include "Window.hh"

@@ -1386,12 +1386,12 @@ m_old_width = frame().width();

m_old_height = frame().height(); m_old_pos_x = frame().x(); m_old_pos_y = frame().y(); - unsigned int left_x = screen().maxLeft(); - unsigned int max_width = screen().maxRight(); - unsigned int max_top = screen().maxTop(); + unsigned int left_x = screen().maxLeft(frame().window()); + unsigned int max_width = screen().maxRight(frame().window()); + unsigned int max_top = screen().maxTop(frame().window()); moveResize(left_x, max_top, - max_width - left_x, - screen().maxBottom() - max_top - frame().window().borderWidth()); + max_width - left_x - 2*frame().window().borderWidth(), + screen().maxBottom(frame().window()) - max_top - 2*frame().window().borderWidth()); } else { // demaximize, restore to old values moveResize(m_old_pos_x, m_old_pos_y, m_old_width, m_old_height);

@@ -1401,8 +1401,8 @@ maximized = !maximized;

} void FluxboxWindow::maximizeHorizontal() { - unsigned int left_x = screen().maxLeft(); - unsigned int max_width = screen().maxRight(); + unsigned int left_x = screen().maxLeft(frame().window()); + unsigned int max_width = screen().maxRight(frame().window()); moveResize(left_x, frame().y(), max_width - left_x, frame().height() - frame().window().borderWidth());

@@ -1412,10 +1412,10 @@ /**

Maximize window horizontal */ void FluxboxWindow::maximizeVertical() { - unsigned int max_top = screen().maxTop(); + unsigned int max_top = screen().maxTop(frame().window()); moveResize(frame().x(), max_top, frame().width() - frame().window().borderWidth(), - screen().maxBottom() - max_top); + screen().maxBottom(frame().window()) - max_top); }
M src/Workspace.ccsrc/Workspace.cc

@@ -22,7 +22,7 @@ // 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. -// $Id: Workspace.cc,v 1.66 2003/05/15 23:30:07 fluxgen Exp $ +// $Id: Workspace.cc,v 1.67 2003/05/19 15:32:47 rathnor Exp $ #include "Workspace.hh"

@@ -33,6 +33,7 @@ #include "Window.hh"

#include "StringUtil.hh" #include "SimpleCommand.hh" #include "WinClient.hh" +#include "FbWinFrame.hh" // use GNU extensions #ifndef _GNU_SOURCE

@@ -507,10 +508,10 @@

test_x = root_x - (win_w / 2); test_y = root_y - (win_h / 2); - min_x = (int) screen().maxLeft(); - min_y = (int) screen().maxTop(); - max_x = (int) screen().maxRight() - win_w; - max_y = (int) screen().maxBottom() - win_h; + min_x = (int) screen().maxLeft(win.frame().window()); + min_y = (int) screen().maxTop(win.frame().window()); + max_x = (int) screen().maxRight(win.frame().window()) - win_w; + max_y = (int) screen().maxBottom(win.frame().window()) - win_h; // keep the window inside the screen