]> git.zerfleddert.de Git - micropolis/blobdiff - src/sim/w_x.c
allow overriding $CC for tclx
[micropolis] / src / sim / w_x.c
index 4f4c10e1ea6cc697d141b78635c4048c881ba708..b2a1c8b37d8cd9f0933eaa04ce52ece1258fa8e8 100644 (file)
@@ -91,7 +91,11 @@ unsigned char ColorIntensities[] = {
        /* COLOR_BLACK */               0,
 };
 
+void FreeTiles(SimView *view);
+void AllocTiles(SimView *view);
+void DoAdjustPan(struct SimView *view);
 
+void
 ViewToTileCoords(SimView *view, int x, int y, int *outx, int *outy)
 {
   x = (view->pan_x - ((view->w_width >>1) - x)) >>4;
@@ -120,6 +124,7 @@ ViewToTileCoords(SimView *view, int x, int y, int *outx, int *outy)
 }
 
 
+void
 ViewToPixelCoords(SimView *view, int x, int y, int *outx, int *outy)
 {
   x = view->pan_x - ((view->w_width >>1) - x);
@@ -148,7 +153,8 @@ ViewToPixelCoords(SimView *view, int x, int y, int *outx, int *outy)
 }
 
 
-UpdateFlush()
+void
+UpdateFlush(void)
 {
   struct XDisplay *xd;
 
@@ -216,7 +222,8 @@ printf("GOT X ERROR code %d request code %d %d\n",
 }
 
 
-DoStopMicropolis()
+void
+DoStopMicropolis(void)
 {
   (void)XSetErrorHandler(CatchXError);
 
@@ -244,7 +251,8 @@ DoStopMicropolis()
 }
 
 
-DoTimeoutListen()
+void
+DoTimeoutListen(void)
 {
   while (Tk_DoOneEvent(TK_DONT_WAIT)) ;
 }
@@ -273,10 +281,7 @@ XDisplay *
 FindXDisplay(Tk_Window tkwin)
 {
   XDisplay *xd;
-  int d = 8;
-  unsigned long valuemask = 0;
-  XGCValues values;
-  XColor rgb, *color;
+  XColor *color;
   Display *dpy = Tk_Display(tkwin);
   Screen *screen = Tk_Screen(tkwin);
 #ifdef IS_LINUX
@@ -327,28 +332,44 @@ FindXDisplay(Tk_Window tkwin)
              color->pixel; \
            break; \
          case 15: \
+           if (xd->visual->red_mask == 0x7c00) { \
            xd->pixels[i] = \
              (((color->red >> (8 + 3)) & 0x1f) << (5 + 5)) | \
              (((color->green >> (8 + 2)) & 0x1f) << (5)) | \
              (((color->blue >> (8 + 3)) & 0x1f) << (0)); \
+           } else { \
+           xd->pixels[i] = \
+             (((color->blue >> (8 + 3)) & 0x1f) << (5 + 5)) | \
+             (((color->green >> (8 + 2)) & 0x1f) << (5)) | \
+             (((color->red >> (8 + 3)) & 0x1f) << (0)); \
+           } \
            break; \
          case 16: \
+           if (xd->visual->red_mask == 0xf800) { \
            xd->pixels[i] = \
              (((color->red >> (8 + 3)) & 0x1f) << (6 + 5)) | \
              (((color->green >> (8 + 2)) & 0x3f) << (5)) | \
              (((color->blue >> (8 + 3)) & 0x1f) << (0)); \
+           } else { \
+           xd->pixels[i] = \
+             (((color->blue >> (8 + 3)) & 0x1f) << (6 + 5)) | \
+             (((color->green >> (8 + 2)) & 0x3f) << (5)) | \
+             (((color->red >> (8 + 3)) & 0x1f) << (0)); \
+           } \
            break; \
          case 24: \
+         case 32: \
+           if (xd->visual->red_mask == 0xff0000) { \
            xd->pixels[i] = \
              ((color->red & 0xff) << 16) | \
              ((color->green & 0xff) << 8) | \
              ((color->blue & 0xff) << 0); \
-           break; \
-         case 32: \
+           } else { \
            xd->pixels[i] = \
-             ((color->red & 0xff) << 16) | \
+             ((color->blue & 0xff) << 16) | \
              ((color->green & 0xff) << 8) | \
-             ((color->blue & 0xff) << 0); \
+             ((color->red & 0xff) << 0); \
+           } \
            break; \
          } \
        } \
@@ -441,9 +462,7 @@ FindXDisplay(Tk_Window tkwin)
        } else {
          fprintf(stderr,
                  "Cool, I found the shared memory extension!\n");
-         fprintf(stderr,
-                 "Disabled SHM, because it is currently broken!\n");
-         xd->shared = 0;
+         xd->shared = 1;
        }
       }
     }
@@ -472,12 +491,14 @@ FindXDisplay(Tk_Window tkwin)
 }
 
 
+void
 IncRefDisplay(XDisplay *xd)
 {
   xd->references++;
 }
 
 
+void
 DecRefDisplay(XDisplay *xd)
 {
   if ((--xd->references) == 0) {
@@ -489,14 +510,8 @@ DecRefDisplay(XDisplay *xd)
 SimView *
 InitNewView(SimView *view, char *title, int class, int w, int h)
 {
-  int type, i;
   int test = 1;
-  int d = 8;
-  unsigned long valuemask = 0;
   char *t;
-  struct XDisplay *xd;
-  XGCValues values;
-  XColor rgb, *color;
 
   t = (char *)ckalloc(strlen(title) + 1);
   strcpy(t, title);
@@ -585,8 +600,8 @@ InitNewView(SimView *view, char *title, int class, int w, int h)
     view->type = X_Mem_View;
   }
 
-  /* XXX: Find cases where transaltion is needed */
-  view->x->needs_swap = 0;
+  view->x->needs_swap = !(*(unsigned char*) (&test));
+  view->x->x_big_endian = (ImageByteOrder(view->x->dpy) == MSBFirst);
 
 
   GetPixmaps(view->x);
@@ -598,12 +613,11 @@ InitNewView(SimView *view, char *title, int class, int w, int h)
   view->pan_x = w / 2; view->pan_y = h / 2;
   DoResizeView(view, w, h);
 
-  GetViewTiles(view);
-
   return (view);
 }
 
 
+void
 DestroyView(SimView *view)
 {
   SimView **vp;
@@ -712,6 +726,7 @@ AllocPixels(int len, unsigned char pixel)
 }
 
 
+void
 DoResizeView(SimView *view, int w, int h)
 {
   int resize = 0;
@@ -891,7 +906,7 @@ DoResizeView(SimView *view, int w, int h)
     }
 
     view->data = (unsigned char *)shmat(view->shminfo->shmid, 0, 0);
-    if ((int)view->data == -1) {
+    if ((char*)view->data == (char*)-1) {
       perror("shmat");
       fprintf(stderr,
              "Darn, Micropolis can't find any memory to share with display \"%s\".\n",
@@ -923,7 +938,7 @@ DoResizeView(SimView *view, int w, int h)
       if (!GotXError) {
        attached = 1;
        view->pixmap = XShmCreatePixmap(view->x->dpy, view->x->root,
-                                       view->data, view->shminfo,
+                                       (char*)view->data, view->shminfo,
                                        view->m_width, view->m_height,
                                        view->x->depth);
        XSync(view->x->dpy, False);
@@ -1145,7 +1160,7 @@ DoResizeView(SimView *view, int w, int h)
          view->pixel_bytes = 2;
          view->depth = 15;
          bitmap_pad = 16;
-         bitmap_depth = 16;
+         bitmap_depth = 15;
          view->line_bytes8 =
            ((view->m_width * view->pixel_bytes) + 3) & (~3);
          break;
@@ -1231,15 +1246,20 @@ DoResizeView(SimView *view, int w, int h)
       }
     }
   }
+
+  GetViewTiles(view);
+
 }
 
 
+void
 DoPanBy(struct SimView *view, int dx, int dy)
 {
   DoPanTo(view, view->pan_x + dx, view->pan_y + dy);
 }
 
 
+void
 DoPanTo(struct SimView *view, int x, int y)
 {
   if (view->class != Editor_Class) {
@@ -1260,12 +1280,12 @@ DoPanTo(struct SimView *view, int x, int y)
 
 /* #define DEBUG_PAN */
 
+void
 DoAdjustPan(struct SimView *view)
 {
   int ww2 = view->w_width >>1, wh2 = view->w_height >>1;
   int px = view->pan_x, py = view->pan_y;
   int last_tile_x = view->tile_x, last_tile_y = view->tile_y;
-  int last_tile_width = view->tile_width, last_tile_height = view->tile_height;
   int total_width = view->m_width >>4, total_height = view->m_height >>4;
 //fprintf(stderr, "DoAdjustPan\n");
 
@@ -1378,6 +1398,7 @@ DoAdjustPan(struct SimView *view)
 }
 
 
+void
 AllocTiles(SimView *view)
 {
   int row, col;
@@ -1409,6 +1430,7 @@ AllocTiles(SimView *view)
 }
 
 
+void
 FreeTiles(SimView *view)
 {
   int col;
@@ -1453,6 +1475,7 @@ NewInk()
 }
 
 
+void
 FreeInk(Ink *ink)
 {
   ink->next = OldInk;
@@ -1460,6 +1483,7 @@ FreeInk(Ink *ink)
 }
 
 
+void
 StartInk(Ink *ink, int x, int y)
 {
   ink->length = 1;
@@ -1468,6 +1492,7 @@ StartInk(Ink *ink, int x, int y)
 }
 
 
+void
 AddInk(Ink *ink, int x, int y)
 {
   int dx = x - ink->last_x;
@@ -1501,7 +1526,7 @@ AddInk(Ink *ink, int x, int y)
     ink->points[ink->length].y = dy;
     ink->length++;
 
-  ADJUST:
+  /* ADJUST: */
     if (x < ink->left)
       ink->left = x;
     if (x > ink->right)
@@ -1539,7 +1564,8 @@ AddInk(Ink *ink, int x, int y)
 }
 
 
-EraseOverlay()
+void
+EraseOverlay(void)
 {
   Ink *ink;
 
Impressum, Datenschutz