From b68b1c7623be09100bb1e6a0d3923d6e1c86a91a Mon Sep 17 00:00:00 2001 From: rathnor Date: Mon, 19 May 2003 15:32:47 +0000 Subject: xinerama updates --- ChangeLog | 2 ++ src/Screen.cc | 90 ++++++++++++++++++++++++++++++++++++++++++-------------- src/Screen.hh | 27 ++++++++--------- src/Slit.cc | 10 ++----- src/Toolbar.cc | 9 ++---- src/Window.cc | 20 ++++++------- src/Workspace.cc | 11 +++---- 7 files changed, 102 insertions(+), 67 deletions(-) diff --git a/ChangeLog b/ChangeLog index 55e76b8..3390ad7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -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) diff --git a/src/Screen.cc b/src/Screen.cc index aaa2209..5c61289 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -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.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 "WinClient.hh" #include "Subject.hh" #include "FbWinFrame.hh" +#include "FbWindow.hh" //use GNU extensions #ifndef _GNU_SOURCE @@ -523,9 +524,7 @@ BScreen::BScreen(FbTk::ResourceManager &rm, 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 @@ Pixmap BScreen::rootPixmap() const { } -/// 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 @@ void BScreen::updateSize() { } + +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 @@ void BScreen::initXinerama(Display *display) { 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 @@ int BScreen::getHead(int x, int y) const { } } +#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 @@ int BScreen::getCurrHead() const { 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, int head) { saveSlitOnHead(head); slit.reconfigure(); } - -#endif // XINERAMA diff --git a/src/Screen.hh b/src/Screen.hh index f5585c7..59a26c1 100644 --- a/src/Screen.hh +++ b/src/Screen.hh @@ -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.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 @@ public: 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 @@ public: /// (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 @@ public: 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 int getOnHead(OnHeadObject &obj); template void setOnHead(OnHeadObject &obj, int head); -#endif // XINERAMA // notify netizens void updateNetizenCurrentWorkspace(); @@ -447,19 +446,17 @@ private: std::auto_ptr 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 }; diff --git a/src/Slit.cc b/src/Slit.cc index b2dd383..8830cb8 100644 --- a/src/Slit.cc +++ b/src/Slit.cc @@ -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.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 "FbMenu.hh" #include "Transparent.hh" #include "IntResMenuItem.hh" - -#ifdef XINERAMA #include "Xinerama.hh" -#endif // XINERAMA #include #include @@ -794,16 +791,13 @@ void Slit::reposition() { 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(); } diff --git a/src/Toolbar.cc b/src/Toolbar.cc index 9a29f79..a000c99 100644 --- a/src/Toolbar.cc +++ b/src/Toolbar.cc @@ -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.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 "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 @@ void setupMenus(Toolbar &tbar) { menu.setInternalMenu(); menu.insert("Layer...", &tbar.layermenu()); -#ifdef XINERAMA + if (tbar.screen().hasXinerama()) { menu.insert("On Head...", new XineramaHeadMenu( *tbar.screen().menuTheme(), @@ -148,8 +145,6 @@ void setupMenus(Toolbar &tbar) { &tbar )); } - -#endif //XINERAMA // setup items in placement menu struct { diff --git a/src/Window.cc b/src/Window.cc index 21018c2..46c8e63 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -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.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 @@ void FluxboxWindow::maximize() { 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 @@ void FluxboxWindow::maximize() { } 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 @@ void FluxboxWindow::maximizeHorizontal() { 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); } diff --git a/src/Workspace.cc b/src/Workspace.cc index 3a662e6..db0cac2 100644 --- a/src/Workspace.cc +++ b/src/Workspace.cc @@ -22,7 +22,7 @@ // 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 "StringUtil.hh" #include "SimpleCommand.hh" #include "WinClient.hh" +#include "FbWinFrame.hh" // use GNU extensions #ifndef _GNU_SOURCE @@ -507,10 +508,10 @@ void Workspace::placeWindow(FluxboxWindow &win) { 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 -- cgit v0.11.2