The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

#include <X11/keysym.h>
#include <il/ilImage.h>
#include <ifl/iflMinMax.h>

#include "imgProcess.h"
#include "imgDisplay.h"

imgDisplay::~imgDisplay()
{

}

imgDisplay::imgDisplay(imgProcess *image)
{
  iflXYint winSize(image->_image->getXsize(), image->_image->getYsize());
  int Xattributes = ilVisDoubleBuffer;

  _display = XOpenDisplay(NULL);

  if (_display != NULL) {

    int screen = DefaultScreen(_display);
    winSize.x = iflMin(winSize.x, DisplayWidth(_display, screen));
    winSize.y = iflMin(winSize.y, DisplayHeight(_display, screen));
    
    // Create X window viewer
    ilViewer viewer(_display, winSize.x, winSize.y, 
		    Xattributes);
    
    viewer.addView(image->_image, ilLast, ilClip|ilCenter|ilDefer);
    viewer.setStop(TRUE);
    
    XEvent event;
    short done = FALSE;
    while (!done) {

      XNextEvent(_display, &event);

      switch (event.type) {
      
      case KeyPress:
	switch(XLookupKeysym(&event.xkey, 0)) {
	  // center the selected view(s) in the viewer
	case XK_Home:
	  viewer.display(NULL, ilCenter|ilClip);
	  break;
	  
	  // control-Q and escape exit the program
	case XK_q:
	  if (!(event.xkey.state&ControlMask))
	    break;
	  /*FALLTHROUGH*/
	case XK_Escape:
	  done = TRUE;
	  break;
	  
	  // raise and lower the current view(s)
	case XK_Up:
	  viewer.raise();
	  break;
	case XK_Down:
	  viewer.lower();
	  break;
	  
	  // enable/disable paint pipelining
	case XK_p:
	  viewer.enableQueueing(!viewer.isQueueingEnabled());
	  break;
	}
	break;
	
      case DestroyNotify: 
	viewer.destroyNotify();
	done = TRUE; 
	break;
	
      default: 
	viewer.event(&event);
	break;
      }
    }
    viewer.remove();
    XCloseDisplay(_display);
  }
}