aboutsummaryrefslogtreecommitdiff
path: root/src/BaseDisplay.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/BaseDisplay.cc')
-rw-r--r--src/BaseDisplay.cc203
1 files changed, 202 insertions, 1 deletions
diff --git a/src/BaseDisplay.cc b/src/BaseDisplay.cc
index 6bcbd5e..e540136 100644
--- a/src/BaseDisplay.cc
+++ b/src/BaseDisplay.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: BaseDisplay.cc,v 1.8 2002/03/18 23:41:08 fluxgen Exp $ 25// $Id: BaseDisplay.cc,v 1.9 2002/03/19 14:30:42 fluxgen Exp $
26 26
27// use GNU extensions 27// use GNU extensions
28#ifndef _GNU_SOURCE 28#ifndef _GNU_SOURCE
@@ -423,4 +423,205 @@ ScreenInfo::ScreenInfo(BaseDisplay *d, int num) {
423 visual = DefaultVisual(basedisplay->getXDisplay(), screen_number); 423 visual = DefaultVisual(basedisplay->getXDisplay(), screen_number);
424 colormap = DefaultColormap(basedisplay->getXDisplay(), screen_number); 424 colormap = DefaultColormap(basedisplay->getXDisplay(), screen_number);
425 } 425 }
426
427#ifdef XINERAMA
428 // check if we have Xinerama extension enabled
429 if (XineramaIsActive(basedisplay->getXDisplay())) {
430 m_hasXinerama = true;
431 xineramaLastHead = 0; // initialize this
432 xineramaInfos =
433 XineramaQueryScreens(basedisplay->getXDisplay(), &xineramaNumHeads);
434 } else {
435 m_hasXinerama = false;
436 xineramaInfos = 0; // make sure we don't point anywhere we shouldn't
437 }
438#endif // XINERAMA
426} 439}
440
441ScreenInfo::~ScreenInfo(void) {
442#ifdef XINERAMA
443 if (m_hasXinerama) { // only free if we first had it
444 XFree(xineramaInfos);
445 xineramaInfos = 0;
446 }
447#endif // XINERAMA
448}
449
450#ifdef XINERAMA
451
452//---------------- getHead ---------------
453// Searches for the head at the coordinates
454// x,y. If it fails or Xinerama isn't
455// activated it'll return head nr 0
456//-----------------------------------------
457unsigned int ScreenInfo::getHead(int x, int y) {
458 unsigned int head = 0;
459
460 // is Xinerama extensions enabled?
461 if (hasXinerama()) {
462 // check if last head is still active
463 if ((xineramaInfos[xineramaLastHead].x_org <= x) &&
464 ((xineramaInfos[xineramaLastHead].x_org +
465 xineramaInfos[xineramaLastHead].width) > x) &&
466 (xineramaInfos[xineramaLastHead].y_org <= y) &&
467 ((xineramaInfos[xineramaLastHead].y_org +
468 xineramaInfos[xineramaLastHead].height) > y)) {
469 head = xineramaLastHead;
470
471 } else {
472 // go trough all the heads, and search
473 for (int i = 0; (signed) head < xineramaNumHeads; i++) {
474 if ((xineramaInfos[i].x_org <= x) &&
475 ((xineramaInfos[i].x_org + xineramaInfos[i].width) > x) &&
476 (xineramaInfos[i].y_org <= y) &&
477 ((xineramaInfos[i].y_org + xineramaInfos[i].height) > y)) {
478 // TODO: actually set this to last head?
479 head = xineramaLastHead = i;
480
481 break; // we don't wanna spend CPU searching what we
482 } // allready have found, do we?
483 }
484 }
485 }
486
487 return head;
488}
489
490//------------- getCurrHead --------------
491// Searches for the head that the pointer
492// currently is on, if it isn't found
493// the first one is returned
494//----------------------------------------
495unsigned int ScreenInfo::getCurrHead(void) {
496 unsigned int head = 0;
497
498 // is Xinerama extensions enabled?
499 if (hasXinerama()) {
500 int pX, pY, wX, wY;
501 unsigned int mask;
502 Window rRoot, rChild;
503
504 // check if last head is still active
505 if ((xineramaInfos[xineramaLastHead].x_org <= pX) &&
506 ((xineramaInfos[xineramaLastHead].x_org +
507 xineramaInfos[xineramaLastHead].width) > pX) &&
508 (xineramaInfos[xineramaLastHead].y_org <= pY) &&
509 ((xineramaInfos[xineramaLastHead].y_org +
510 xineramaInfos[xineramaLastHead].height) > pY)) {
511 head = xineramaLastHead;
512
513 } else {
514 // get pointer cordinates , we need to know were we are!
515 if ( (XQueryPointer(basedisplay->getXDisplay(), root_window,
516 &rRoot, &rChild, &pX, &pY, &wX, &wY, &mask)) != 0 ) {
517
518 // go trough all the heads, and search
519 for (int i = 0; i < xineramaNumHeads; i++) {
520 if ((xineramaInfos[i].x_org <= pX) &&
521 ((xineramaInfos[i].x_org + xineramaInfos[i].width) > pX) &&
522 (xineramaInfos[i].y_org <= pY) &&
523 ((xineramaInfos[i].y_org + xineramaInfos[i].height) > pY)) {
524
525 head = xineramaLastHead = i;
526 break; // we don't wanna spend CPU searching what we
527 } // allready have found, do we?
528 }
529 }
530 }
531 }
532
533 return head;
534}
535
536//----------- getHeadWidth ------------
537// Returns the width of head nr head
538//-------------------------------------
539unsigned int ScreenInfo::getHeadWidth(unsigned int head) {
540 unsigned int width;
541
542 if (hasXinerama()) {
543 if ((signed) head >= xineramaNumHeads) {
544 #ifdef DEBUG
545 cerr << __FILE__ << ":" <<__LINE__ << ": " <<
546 "Head: " << head << " doesn't exist!" << endl;
547 #endif // DEBUG
548
549 head = xineramaNumHeads - 1;
550 }
551
552 width = xineramaInfos[head].width;
553 } else {
554 width = getWidth();
555 }
556
557 return width;
558}
559
560//----------- getHeadHeight ------------
561// Returns the heigt of head nr head
562//--------------------------------------
563unsigned int ScreenInfo::getHeadHeight(unsigned int head) {
564 unsigned int height;
565
566 if (hasXinerama()) {
567 if ((signed) head >= xineramaNumHeads) {
568 #ifdef DEBUG
569 cerr << __FILE__ << ":" <<__LINE__ << ": " <<
570 "Head: " << head << " doesn't exist!" << endl;
571 #endif // DEBUG
572
573 head = xineramaNumHeads - 1;
574 }
575
576 height = xineramaInfos[head].height;
577 } else {
578 height = getHeight();
579 }
580
581 return height;
582}
583
584
585//----------- getHeadX -----------------
586// Returns the X start of head nr head
587//--------------------------------------
588int ScreenInfo::getHeadX(unsigned int head) {
589 int x = 0;
590
591 if (hasXinerama()) {
592 if ((signed) head >= xineramaNumHeads) {
593 #ifdef DEBUG
594 cerr << __FILE__ << ":" <<__LINE__ << ": " <<
595 "Head: " << head << " doesn't exist!" << endl;
596 #endif // DEBUG
597
598 head = xineramaNumHeads - 1;
599 }
600 x = xineramaInfos[head].x_org;
601 }
602
603 return x;
604}
605
606//----------- getHeadY -----------------
607// Returns the Y start of head nr head
608//--------------------------------------
609int ScreenInfo::getHeadY(unsigned int head) {
610 int y = 0;
611
612 if (hasXinerama()) {
613 if ((signed) head >= xineramaNumHeads) {
614 #ifdef DEBUG
615 cerr << __FILE__ << ":" <<__LINE__ << ": " <<
616 "Head: " << head << " doesn't exist!" << endl;
617 #endif // DEBUG
618
619 head = xineramaNumHeads - 1;
620 }
621 y = xineramaInfos[head].y_org;
622 }
623
624 return y;
625}
626
627#endif // XINERAMA