/**
 * @file screen.c
 * @author Joe Wingbermuehle
 * @date 2005-2006
 *
 * @brief Screen functions.
 *
 * Note that screen here refers to physical monitors. Screens are
 * determined using the xinerama extension (if available). There will
 * always be at least one screen.
 *
 */

#include "jwm.h"
#include "screen.h"
#include "main.h"
#include "cursor.h"

static ScreenType *screens;
static int screenCount;

/** Initialize screen data. */
void InitializeScreens() {
   screens = NULL;
}

/** Startup screens. */
void StartupScreens() {
#ifdef USE_XINERAMA

   XineramaScreenInfo *info;
   int x;

   if(XineramaIsActive(display)) {

      info = XineramaQueryScreens(display, &screenCount);

      screens = Allocate(sizeof(ScreenType) * screenCount);
      for(x = 0; x < screenCount; x++) {
         screens[x].index = x;
         screens[x].x = info[x].x_org;
         screens[x].y = info[x].y_org;
         screens[x].width = info[x].width;
         screens[x].height = info[x].height;
      }

      JXFree(info);

   } else {

      screenCount = 1;
      screens = Allocate(sizeof(ScreenType));
      screens->index = 0;
      screens->x = 0;
      screens->y = 0;
      screens->width = rootWidth;
      screens->height = rootHeight;

   }

#else

   screenCount = 1;
   screens = Allocate(sizeof(ScreenType));
   screens->index = 0;
   screens->x = 0;
   screens->y = 0;
   screens->width = rootWidth;
   screens->height = rootHeight;

#endif /* USE_XINERAMA */
}

/** Shutdown screens. */
void ShutdownScreens() {
   if(screens) {
      Release(screens);
      screens = NULL;
   }
}

/** Destroy screen data. */
void DestroyScreens() {
}

/** Get the screen given global screen coordinates. */
const ScreenType *GetCurrentScreen(int x, int y) {

   ScreenType *sp;
   int index;

   for(index = 1; index < screenCount; index++) {
      sp = &screens[index];
      if(x >= sp->x && x < sp->x + sp->width) {
         if(y >= sp->y && y <= sp->y + sp->height) {
            return sp;
         }
      }
   }

   return &screens[0];

}

/** Get the screen the mouse is currently on. */
const ScreenType *GetMouseScreen() {
#ifdef USE_XINERAMA

   int x, y;

   GetMousePosition(&x, &y);
   return GetCurrentScreen(x, y);

#else

   return &screens[0];

#endif
}

/** Get data for a screen. */
const ScreenType *GetScreen(int index) {

   Assert(index >= 0);
   Assert(index < screenCount);

   return &screens[index];

}

/** Get the number of screens. */
int GetScreenCount() {

   return screenCount;

}




syntax highlighted by Code2HTML, v. 0.9.1