aboutsummaryrefslogtreecommitdiff
path: root/src/Screen.cc
diff options
context:
space:
mode:
authorrathnor <rathnor>2003-05-19 14:26:30 (GMT)
committerrathnor <rathnor>2003-05-19 14:26:30 (GMT)
commitcc9c7960c1c5413002c3a6c456650e59ee1ff501 (patch)
treedb11494b3cbd61619229328b722f2c47c6b0a916 /src/Screen.cc
parent68e9677bbb9ebe8f7c1a5edea25f236c09ed3460 (diff)
downloadfluxbox_pavel-cc9c7960c1c5413002c3a6c456650e59ee1ff501.zip
fluxbox_pavel-cc9c7960c1c5413002c3a6c456650e59ee1ff501.tar.bz2
add back some xinerama support (toolbar, slit (+menu), screen)
Diffstat (limited to 'src/Screen.cc')
-rw-r--r--src/Screen.cc132
1 files changed, 124 insertions, 8 deletions
diff --git a/src/Screen.cc b/src/Screen.cc
index d3eb39e..aaa2209 100644
--- a/src/Screen.cc
+++ b/src/Screen.cc
@@ -22,7 +22,7 @@
22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23// DEALINGS IN THE SOFTWARE. 23// DEALINGS IN THE SOFTWARE.
24 24
25// $Id: Screen.cc,v 1.171 2003/05/18 22:01:14 fluxgen Exp $ 25// $Id: Screen.cc,v 1.172 2003/05/19 14:26:29 rathnor Exp $
26 26
27 27
28#include "Screen.hh" 28#include "Screen.hh"
@@ -114,6 +114,12 @@
114#include <X11/Xatom.h> 114#include <X11/Xatom.h>
115#include <X11/keysym.h> 115#include <X11/keysym.h>
116 116
117#ifdef XINERAMA
118extern "C" {
119#include <X11/extensions/Xinerama.h>
120}
121#endif // XINERAMA
122
117#include <iostream> 123#include <iostream>
118#include <memory> 124#include <memory>
119#include <algorithm> 125#include <algorithm>
@@ -480,13 +486,14 @@ BScreen::ScreenResource::ScreenResource(FbTk::ResourceManager &rm,
480 toolbar_on_head(rm, 0, scrname+".toolbar.onhead", altscrname+".Toolbar.onHead"), 486 toolbar_on_head(rm, 0, scrname+".toolbar.onhead", altscrname+".Toolbar.onHead"),
481 toolbar_placement(rm, Toolbar::BOTTOMCENTER, 487 toolbar_placement(rm, Toolbar::BOTTOMCENTER,
482 scrname+".toolbar.placement", altscrname+".Toolbar.Placement"), 488 scrname+".toolbar.placement", altscrname+".Toolbar.Placement"),
483 slit_auto_hide(rm, false, 489 slit_auto_hide(rm, false,
484 scrname+".slit.autoHide", altscrname+".Slit.AutoHide"), 490 scrname+".slit.autoHide", altscrname+".Slit.AutoHide"),
485 slit_placement(rm, Slit::BOTTOMRIGHT, 491 slit_placement(rm, Slit::BOTTOMRIGHT,
486 scrname+".slit.placement", altscrname+".Slit.Placement"), 492 scrname+".slit.placement", altscrname+".Slit.Placement"),
487 slit_direction(rm, Slit::VERTICAL, 493 slit_direction(rm, Slit::VERTICAL,
488 scrname+".slit.direction", altscrname+".Slit.Direction"), 494 scrname+".slit.direction", altscrname+".Slit.Direction"),
489 slit_alpha(rm, 255, scrname+".slit.alpha", altscrname+".Slit.Alpha") { 495 slit_alpha(rm, 255, scrname+".slit.alpha", altscrname+".Slit.Alpha"),
496 slit_on_head(rm, 0, scrname+".slit.onhead", altscrname+".Slit.onHead") {
490 497
491}; 498};
492 499
@@ -516,6 +523,10 @@ BScreen::BScreen(FbTk::ResourceManager &rm,
516 523
517 Display *disp = FbTk::App::instance()->display(); 524 Display *disp = FbTk::App::instance()->display();
518 525
526#ifdef XINERAMA
527 initXinerama(disp);
528#endif // XINERAMA
529
519 event_mask = ColormapChangeMask | EnterWindowMask | PropertyChangeMask | 530 event_mask = ColormapChangeMask | EnterWindowMask | PropertyChangeMask |
520 SubstructureRedirectMask | KeyPressMask | KeyReleaseMask | 531 SubstructureRedirectMask | KeyPressMask | KeyReleaseMask |
521 ButtonPressMask | ButtonReleaseMask| SubstructureNotifyMask; 532 ButtonPressMask | ButtonReleaseMask| SubstructureNotifyMask;
@@ -761,6 +772,12 @@ BScreen::~BScreen() {
761 } 772 }
762 773
763 netizenList.clear(); 774 netizenList.clear();
775
776#ifdef XINERAMA
777 if (hasXinerama() && m_xinerama_headinfo) {
778 delete [] m_xinerama_headinfo;
779 }
780#endif // XINERAMA
764} 781}
765 782
766const FbTk::Menu &BScreen::toolbarModemenu() const { 783const FbTk::Menu &BScreen::toolbarModemenu() const {
@@ -2524,3 +2541,102 @@ void BScreen::updateSize() {
2524 //!! TODO: should we re-maximize the maximized windows? 2541 //!! TODO: should we re-maximize the maximized windows?
2525 2542
2526} 2543}
2544
2545#ifdef XINERAMA
2546
2547void BScreen::initXinerama(Display *display) {
2548 if (!XineramaIsActive(display)) {
2549 m_xinerama_avail = false;
2550 m_xinerama_headinfo = 0;
2551 return;
2552 }
2553 m_xinerama_avail = true;
2554
2555 XineramaScreenInfo *screen_info;
2556 int number;
2557 screen_info = XineramaQueryScreens(display, &number);
2558 m_xinerama_headinfo = new XineramaHeadInfo[number];
2559 m_xinerama_num_heads = number;
2560 for (int i=0; i < number; i++) {
2561 m_xinerama_headinfo[i].x = screen_info[i].x_org;
2562 m_xinerama_headinfo[i].y = screen_info[i].y_org;
2563 m_xinerama_headinfo[i].width = screen_info[i].width;
2564 m_xinerama_headinfo[i].height = screen_info[i].height;
2565 }
2566
2567}
2568
2569int BScreen::getHead(int x, int y) const {
2570 if (!hasXinerama()) return 0;
2571
2572 for (int i=0; i < m_xinerama_num_heads; i++) {
2573 if (x >= m_xinerama_headinfo[i].x &&
2574 x < (m_xinerama_headinfo[i].x + m_xinerama_headinfo[i].width) &&
2575 y >= m_xinerama_headinfo[i].y &&
2576 y < (m_xinerama_headinfo[i].y + m_xinerama_headinfo[i].height)) {
2577 return i+1;
2578 }
2579 }
2580
2581 return 0;
2582}
2583
2584int BScreen::getCurrHead() const {
2585 if (!hasXinerama()) return 0;
2586 int root_x, root_y, ignore_i;
2587
2588 unsigned int ignore_ui;
2589
2590 Window ignore_w;
2591
2592 XQueryPointer(FbTk::App::instance()->display(),
2593 rootWindow().window(), &ignore_w,
2594 &ignore_w, &root_x, &root_y,
2595 &ignore_i, &ignore_i, &ignore_ui);
2596 return getHead(root_x, root_y);
2597
2598}
2599
2600int BScreen::getHeadX(int head) const {
2601 if (head == 0 || head > m_xinerama_num_heads) return 0;
2602 return m_xinerama_headinfo[head-1].x;
2603}
2604
2605int BScreen::getHeadY(int head) const {
2606 if (head == 0 || head > m_xinerama_num_heads) return 0;
2607 return m_xinerama_headinfo[head-1].y;
2608}
2609
2610int BScreen::getHeadWidth(int head) const {
2611 if (head == 0 || head > m_xinerama_num_heads) return width();
2612 return m_xinerama_headinfo[head-1].width;
2613}
2614
2615int BScreen::getHeadHeight(int head) const {
2616 if (head == 0 || head > m_xinerama_num_heads) return height();
2617 return m_xinerama_headinfo[head-1].height;
2618}
2619
2620template <>
2621int BScreen::getOnHead<Toolbar>(Toolbar &tbar) {
2622 return getToolbarOnHead();
2623}
2624
2625template <>
2626void BScreen::setOnHead<Toolbar>(Toolbar &tbar, int head) {
2627 saveToolbarOnHead(head);
2628 tbar.reconfigure();
2629}
2630
2631template <>
2632int BScreen::getOnHead<Slit>(Slit &tbar) {
2633 return getSlitOnHead();
2634}
2635
2636template <>
2637void BScreen::setOnHead<Slit>(Slit &slit, int head) {
2638 saveSlitOnHead(head);
2639 slit.reconfigure();
2640}
2641
2642#endif // XINERAMA