Index: /trunk/Ohana/src/kii/event/CheckPipe.c
===================================================================
--- /trunk/Ohana/src/kii/event/CheckPipe.c	(revision 5636)
+++ /trunk/Ohana/src/kii/event/CheckPipe.c	(revision 5637)
@@ -101,5 +101,5 @@
 
   if (!strcmp (buffer, "JPEG")) {
-    status = JPEGit (graphic, layout);
+    status = JPEGit24 (graphic, layout);
     write (layout[0].Ximage, "DONE", 4);
     return (status);
Index: /trunk/Ohana/src/kii/event/EventLoop.c
===================================================================
--- /trunk/Ohana/src/kii/event/EventLoop.c	(revision 5636)
+++ /trunk/Ohana/src/kii/event/EventLoop.c	(revision 5637)
@@ -20,5 +20,5 @@
   Display        *display;
   
-  Refresh (graphic, layout, 1);
+  if (USE_XWINDOW) Refresh (graphic, layout, 1);
 
   status = TRUE;
@@ -28,4 +28,9 @@
       return (FALSE);
     
+    if (!USE_XWINDOW) {
+      usleep (50000);
+      continue;
+    }
+
     if (XEventsQueued (graphic[0].display, QueuedAfterFlush) < 1) {
       usleep (10000);
Index: /trunk/Ohana/src/kii/include/prototypes.h
===================================================================
--- /trunk/Ohana/src/kii/include/prototypes.h	(revision 5636)
+++ /trunk/Ohana/src/kii/include/prototypes.h	(revision 5637)
@@ -6,4 +6,5 @@
 int PSit (Graphic *graphic, Layout *layout, int Raw);
 int JPEGit (Graphic *graphic, Layout *layout);
+int JPEGit24 (Graphic *graphic, Layout *layout);
 int Resize (Graphic *graphic, Layout *layout);
 int Center (Graphic *graphic, Layout *layout);
Index: /trunk/Ohana/src/kii/picture/JPEGit24.c
===================================================================
--- /trunk/Ohana/src/kii/picture/JPEGit24.c	(revision 5637)
+++ /trunk/Ohana/src/kii/picture/JPEGit24.c	(revision 5637)
@@ -0,0 +1,192 @@
+# include "Ximage.h"
+# include "jpeglib.h"
+
+void JPEGit24 (Graphic *graphic, Layout *layout) {
+
+  struct jpeg_compress_struct cinfo;
+  struct jpeg_error_mgr jerr;
+  JSAMPROW row_pointer[1];	/* pointer to JSAMPLE row[s] */
+  JSAMPLE *image_buffer;	/* Points to data for current line */
+
+  int i, j, ii, jj;
+  int i_start, i_end, j_start, j_end;
+  int dropback, extra;  /* this is a bit of a kludge... */
+  int dx, dy, DX, DY;
+  double expand, Rx, Ry, X, Y;
+  int expand_in, expand_out;
+  unsigned char *out_pix, *out_pix2, *data;
+  unsigned char *in_pix,  *in_pix2;
+  unsigned char pixel1[256], pixel2[256], pixel3[256];
+  unsigned char pixvalue1, pixvalue2, pixvalue3;
+  unsigned long white;
+  unsigned char white1, white2, white3;
+  FILE *f;
+
+  /* expect a line telling the number of bytes and a filename */
+  status = read (layout[0].Ximage, filename, 16);
+  filename[16] = 0;
+  sscanf (filename, "%*s %d", &Nbytes);
+  status = read (layout[0].Ximage, filename, Nbytes);
+  filename[status] = 0; /* make the string easy to parse */
+
+  /***** JPEG init calls */
+  cinfo.err = jpeg_std_error (&jerr);
+  jpeg_create_compress (&cinfo);
+
+  f = fopen (filename, "w");
+  if (f == (FILE *) NULL) {
+    fprintf (stderr, "failed to open %s for output\n", filename);
+    return (TRUE);
+  }
+  jpeg_stdio_dest(&cinfo, f);
+  
+  quality = 75;
+  cinfo.image_width = layout[0].picture.dx; 	/* image width and height, in pixels */
+  cinfo.image_height = layout[0].picture.dy;
+# ifdef GREYSCALE
+  cinfo.input_components = 1;		        /* # of color components per pixel */
+  cinfo.in_color_space = JCS_GRAYSCALE; 	/* colorspace of input image */
+# else 
+  cinfo.input_components = 3;		        
+  cinfo.in_color_space = JCS_RGB; 	
+# endif
+  jpeg_set_defaults (&cinfo);
+  jpeg_set_quality (&cinfo, quality, TRUE       /* limit to baseline-JPEG values */);
+  jpeg_start_compress (&cinfo, TRUE);
+
+  /* output line buffer */
+  ALLOCATE (image_buffer, JSAMPLE, 3*layout[0].picture.dx);
+
+  /** cmap[i].pixel must be defined even if X is not used **/
+  for (i = 0; i < 256; i++) { /* set up pixel array */
+    pixel1[i] = 0x0000ff & (layout[0].cmap[i].pixel >> 0);
+    pixel2[i] = 0x0000ff & (layout[0].cmap[i].pixel >> 8);
+    pixel3[i] = 0x0000ff & (layout[0].cmap[i].pixel >> 16);
+  }
+  white = layout[0].white;
+  white1 = 0x0000ff & (white >> 0);
+  white2 = 0x0000ff & (white >> 8);
+  white3 = 0x0000ff & (white >> 16);
+
+  expand = expand_in = expand_out = 1.0;
+  if (layout[0].expand == 0) /* set up expansions */
+    layout[0].expand = 1;
+  if (layout[0].expand > 0) {
+    expand = 1 / (1.0*layout[0].expand);
+    expand_out = layout[0].expand;
+    expand_in  = 1;
+  }
+  if (layout[0].expand < 0) {
+    expand = fabs((double)layout[0].expand);
+    expand_out = 1;
+    expand_in  = -layout[0].expand;
+  }
+
+  dx = layout[0].picture.dx;
+  dy = layout[0].picture.dy;
+  DX = layout[0].matrix[0].Naxis[0];
+  DY = layout[0].matrix[0].Naxis[1];
+  extra = 4 - (dx * 3) % 4;  /* why is this needed?? */
+
+  /* X,Y are the image coordinates of the first image pixel */
+  X = MAX(0.5*(DX - dx*expand) - layout[0].X, 0);
+  if ((int)X != X) 
+    X = (int) X + 1;
+  else 
+    X = (int) X;
+  Y = MAX(0.5*(DY - dy*expand) - layout[0].Y, 0);
+  if ((int)Y != Y) 
+    Y = (int) Y + 1;
+  else 
+    Y = (int) Y;
+
+  /* Rx,Ry are the screen coordinates of the first image pixel */
+  Rx = (X + layout[0].X - 0.5*DX)/expand + 0.5*dx;
+  Ry = (Y + layout[0].Y - 0.5*DY)/expand + 0.5*dy;
+
+  i_start = MIN (MAX (Rx, 0), dx - expand_out + 1);
+  j_start = MIN (MAX (Ry, 0), dy - expand_out + 1);
+  
+  if (layout[0].expand > 0) {
+    i_end = MAX (MIN (i_start + ((int)(expand*(dx-i_start)))/expand, expand_out*(DX-X) + Rx), 0);
+    j_end = MAX (MIN (j_start + ((int)(expand*(dy-j_start)))/expand, expand_out*(DY-Y) + Ry), 0);
+  } else {
+    i_end = MAX (MIN (dx, (DX-X)/expand + Rx), 0);
+    j_end = MAX (MIN (dy, (DY-Y)/expand + Ry), 0);
+  }    
+
+  dropback = expand_out - (i_end - i_start) % expand_out;
+  if ((i_end - i_start) % expand_out == 0) dropback = 0;
+
+  out_pix = image_buffer;
+  in_pix  = (unsigned char *) (layout[0].matrix[0].buffer) + DX*(int)MAX(Y,0) + (int)MAX(X,0);
+
+  /********** below we do the mapping from buffer pixels (in) to picture pixels (out) **********/
+
+  /* we write the jpeg image data one row at a time */
+
+  /**** fill in bottom area ****/
+  out_pix = image_buffer;
+  for (i = 0; i < dx; i++, out_pix+=3) {
+    out_pix[0] = WHITE_R;
+    out_pix[1] = WHITE_G;
+    out_pix[2] = WHITE_B;
+  }
+  for (j = 0; j < j_start; j++) {
+    row_pointer[0] = image_buffer;
+    (void) jpeg_write_scanlines (&cinfo, row_pointer, 1);
+  }
+  
+  /*** fill in the image data region ***/
+  for (j = j_start; j < j_end; j+= expand_out, in_pix += expand_in*DX) {
+    
+    /* create one output image line */
+    out_pix = image_buffer;
+
+    /**** fill in area to the left of the picture ****/
+    for (i = 0; i < i_start; i++, out_pix+=3) {
+      out_pix[0] = WHITE_R;
+      out_pix[1] = WHITE_G;
+      out_pix[2] = WHITE_B;
+    }
+    
+    /*** fill in the picture region ***/
+    for (i = i_start; i < i_end; i++, in_pix+=expand_in, out_pix+=3) {
+      out_pix[0] = pixel1[*in_pix];
+      out_pix[1] = pixel2[*in_pix];
+      out_pix[2] = pixel3[*in_pix];
+    }
+    
+    /**** fill in area to the right of the picture ****/
+    for (i = i_end; i < dx; i++, out_pix+=3) {
+      out_pix[0] = WHITE_R;
+      out_pix[1] = WHITE_G;
+      out_pix[2] = WHITE_B;
+    }
+
+    /* write out the image line expand_out times */
+    for (i = 0; i < expand_out; i++) {
+      row_pointer[0] = image_buffer;
+      (void) jpeg_write_scanlines (&cinfo, row_pointer, 1);
+    }
+  }
+
+  /**** fill in top area ****/
+  out_pix = image_buffer;
+  for (i = 0; i < dx; i++, out_pix+=3) { 
+    out_pix[0] = WHITE_R;
+    out_pix[1] = WHITE_G;
+    out_pix[2] = WHITE_B;
+  }
+  for (j = 0; j < (dy - j_end); j++) {
+    row_pointer[0] = image_buffer;
+    (void) jpeg_write_scanlines (&cinfo, row_pointer, 1);
+  }
+
+  jpeg_finish_compress (&cinfo);
+  fclose (f);
+  jpeg_destroy_compress (&cinfo);
+
+  return (TRUE);
+}
+
Index: /trunk/Ohana/src/kii/setup/CloseDisplay.c
===================================================================
--- /trunk/Ohana/src/kii/setup/CloseDisplay.c	(revision 5636)
+++ /trunk/Ohana/src/kii/setup/CloseDisplay.c	(revision 5637)
@@ -2,8 +2,8 @@
 
 /************** CloseDisplay *************/
-void
-CloseDisplay (graphic)
-Graphic *graphic;
-{
+void CloseDisplay (Graphic *graphic) {
+
+  XFlush (graphic[0].display);
+  XFreeFont (graphic[0].display, graphic[0].font); 
   XFreeGC (graphic[0].display, graphic[0].gc);
   XDestroySubwindows (graphic[0].display, graphic[0].window);
@@ -11,4 +11,5 @@
   XFlush (graphic[0].display);
   XCloseDisplay (graphic[0].display);
+  return;
 }
 
Index: /trunk/Ohana/src/kii/setup/DefineLayout.c
===================================================================
--- /trunk/Ohana/src/kii/setup/DefineLayout.c	(revision 5636)
+++ /trunk/Ohana/src/kii/setup/DefineLayout.c	(revision 5637)
@@ -6,10 +6,4 @@
   struct sockaddr_un Address;
   char temp[100];
-
-  DEBUG = FALSE;
-  if ((N = get_argument (argc, argv, "-debug"))) {
-    remove_argument(N, &argc, argv);
-    DEBUG = TRUE;
-  }
 
   /** initiate connection with mana **/
Index: /trunk/Ohana/src/kii/setup/Ximage.c
===================================================================
--- /trunk/Ohana/src/kii/setup/Ximage.c	(revision 5636)
+++ /trunk/Ohana/src/kii/setup/Ximage.c	(revision 5637)
@@ -6,16 +6,16 @@
   Layout  layout;
   
+  args (&argc, argv);
+
   bzero (&graphic, sizeof(Graphic));
   bzero (&layout, sizeof(Layout));
 
-  SetUpDisplay (&graphic, &argc, argv);
-  SetUpWindow (&graphic, &argc, argv);
+  if (USE_XWINDOW) SetUpDisplay (&graphic, &argc, argv);
+  if (USE_XWINDOW) SetUpWindow (&graphic, &argc, argv);
 
   DefineLayout (&layout, &graphic, argc, argv);
   EventLoop (&graphic, &layout);
 
-  XFlush (graphic.display);
-  XFreeFont (graphic.display, graphic.font); 
-  CloseDisplay (&graphic);
+  if (USE_XWINDOW) CloseDisplay (&graphic);
   exit (0);
 }
Index: /trunk/Ohana/src/kii/setup/args.c
===================================================================
--- /trunk/Ohana/src/kii/setup/args.c	(revision 5637)
+++ /trunk/Ohana/src/kii/setup/args.c	(revision 5637)
@@ -0,0 +1,27 @@
+# include "Ximage.h"
+
+int args (int *argc, char **argv) {
+
+  int N;
+
+  MAP_WINDOW = TRUE;
+  if ((N = get_argument (*argc, argv, "-nomap"))) {
+    remove_argument(N, argc, argv);
+    MAP_WINDOW = FALSE;
+  }
+
+  USE_XWINDOW = TRUE;
+  if ((N = get_argument (*argc, argv, "-noX"))) {
+    remove_argument(N, argc, argv);
+    USE_XWINDOW = FALSE;
+  }
+
+  if ((N = get_argument (*argc, argv, "-debug"))) {
+    remove_argument(N, argc, argv);
+    DEBUG = TRUE;
+  } else {
+    DEBUG = FALSE;
+  }
+
+  return (TRUE);
+}
