From 080ad356d38dcb2acf3cdc4e1c30b9ee12251ba0 Mon Sep 17 00:00:00 2001
From: dscho <dscho>
Date: Thu, 27 Sep 2001 11:29:05 +0000
Subject: try to make OSXvnc run again.

---
 Makefile |   2 +-
 mac.c    | 151 +++++++++++++++------------------------------------------------
 rfb.h    |   6 +++
 3 files changed, 42 insertions(+), 117 deletions(-)

diff --git a/Makefile b/Makefile
index 26a3422..f1d70bb 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-CC=gcc
+CC=cc
 CFLAGS=-g -Wall
 #CFLAGS=-O2 -Wall
 RANLIB=ranlib
diff --git a/mac.c b/mac.c
index 8376f32..16487b1 100644
--- a/mac.c
+++ b/mac.c
@@ -9,15 +9,7 @@
  * 
  * This file implements every system specific function for Mac OS X.
  * 
- *  It includes the init function:
- * 
-     void rfbScreenInit(void)
- * 
- * the function to get the address of the framebuffer:
- * 
-     char *rfbGetFramebuffer(void)
- *
- *  keyboard functions:
+ *  It includes the keyboard functions:
  * 
      void KbdAddEvent(down, keySym, cl)
         Bool down;
@@ -33,85 +25,17 @@
         int y;
         rfbClientPtr cl;
  * 
- *  and the EventLoop:
- * 
-     void runEventLoop()
- * 
- * These six functions have to be defined by every VNC server using
- * libvncserver.
- *
- * The main function just calls runVNCServer. This is different
- * for more complex users of libvncserver.
- * 
  */
 
-#include "rfb.h"
 #include <ApplicationServices/ApplicationServices.h>
 #include <Carbon/Carbon.h>
-#include <X11/keysym.h>
-
-void 
-rfbScreenInit(void)
-{
-    int bitsPerSample;
-    int samplesPerPixel;
-
-    rfbScreen.width = CGDisplayPixelsWide(kCGDirectMainDisplay);
-    rfbScreen.height = CGDisplayPixelsHigh(kCGDirectMainDisplay);
-    rfbScreen.bitsPerPixel = rfbScreen.depth = 
-        CGDisplayBitsPerPixel(kCGDirectMainDisplay);
-    gethostname(rfbThisHost, 255);
-    rfbScreen.paddedWidthInBytes = CGDisplayBytesPerRow(kCGDirectMainDisplay);
-    rfbServerFormat.bitsPerPixel = rfbScreen.bitsPerPixel;
-    rfbServerFormat.depth = rfbScreen.depth;
-    rfbServerFormat.bigEndian = !(*(char *)&rfbEndianTest);
-    rfbServerFormat.trueColour = TRUE;
-
-    bitsPerSample = CGDisplayBitsPerSample(kCGDirectMainDisplay);
-    samplesPerPixel = CGDisplaySamplesPerPixel(kCGDirectMainDisplay);
-    if (samplesPerPixel != 3) {
-        rfbLog("screen format not supported.  exiting.\n");
-        exit(1);
-    }
-
-    /* This works for 16 and 32-bit, but not for 8-bit.
-       What should it be for 8-bit?  (Shouldn't 8-bit use a colormap?) */
-    rfbServerFormat.redMax = (1 << bitsPerSample) - 1;
-    rfbServerFormat.greenMax = (1 << bitsPerSample) - 1;
-    rfbServerFormat.blueMax = (1 << bitsPerSample) - 1;
-    rfbServerFormat.redShift = bitsPerSample * 2;
-    rfbServerFormat.greenShift = bitsPerSample;
-    rfbServerFormat.blueShift = 0;
-
-    /* We want to use the X11 REGION_* macros without having an actual
-       X11 ScreenPtr, so we do this.  Pretty ugly, but at least it lets us
-       avoid hacking up regionstr.h, or changing every call to REGION_*
-       (which actually I should probably do eventually). */
-    hackScreen.RegionCreate = miRegionCreate;
-    hackScreen.RegionInit = miRegionInit;
-    hackScreen.RegionCopy = miRegionCopy;
-    hackScreen.RegionDestroy = miRegionDestroy;
-    hackScreen.RegionUninit = miRegionUninit;
-    hackScreen.Intersect = miIntersect;
-    hackScreen.Union = miUnion;
-    hackScreen.Subtract = miSubtract;
-    hackScreen.Inverse = miInverse;
-    hackScreen.RegionReset = miRegionReset;
-    hackScreen.TranslateRegion = miTranslateRegion;
-    hackScreen.RectIn = miRectIn;
-    hackScreen.PointInRegion = miPointInRegion;
-    hackScreen.RegionNotEmpty = miRegionNotEmpty;
-    hackScreen.RegionEmpty = miRegionEmpty;
-    hackScreen.RegionExtents = miRegionExtents;
-    hackScreen.RegionAppend = miRegionAppend;
-    hackScreen.RegionValidate = miRegionValidate;
-}
+/* zlib doesn't like Byte already defined */
+#undef Byte
+#undef TRUE
+#include "rfb.h"
+#include "keysym.h"
 
-char *
-rfbGetFramebuffer(void)
-{
-    return (char *)CGDisplayBaseAddress(kCGDirectMainDisplay);
-}
+rfbScreenInfoPtr rfbScreen;
 
 /* Where do I get the "official" list of Mac key codes?
    Ripped these out of a Mac II emulator called Basilisk II
@@ -339,50 +263,45 @@ PtrAddEvent(buttonMask, x, y, cl)
                      (buttonMask & (1 << 7)) ? TRUE : FALSE);
 }
 
-void
-KbdReleaseAllKeys()
+void 
+ScreenInit(int argc, char**argv)
 {
-    /* Doesn't seem to be possible. */
+  rfbScreen = rfbGetScreen(argc,argv,
+			   CGDisplayPixelsWide(kCGDirectMainDisplay),
+			   CGDisplayPixelsHigh(kCGDirectMainDisplay),
+			   CGDisplayBitsPerSample(kCGDirectMainDisplay),
+			   CGDisplaySamplesPerPixel(kCGDirectMainDisplay),4);
+  gethostname(rfbScreen->rfbThisHost, 255);
+  rfbScreen->paddedWidthInBytes = CGDisplayBytesPerRow(kCGDirectMainDisplay);
+  rfbScreen->frameBuffer =
+    (char *)CGDisplayBaseAddress(kCGDirectMainDisplay);
+  rfbScreen->ptrAddEvent = PtrAddEvent;
+  rfbScreen->kbdAddEvent = KbdAddEvent;
+  rfbInitServer(rfbScreen);
 }
 
 static void 
 refreshCallback(CGRectCount count, const CGRect *rectArray, void *ignore)
 {
-    BoxRec box;
-    RegionRec region;
-    rfbClientIteratorPtr iterator;
-    rfbClientPtr cl;                                                          
     int i;
 
-    for (i = 0; i < count; i++) {
-        box.x1 = rectArray[i].origin.x;
-        box.y1 = rectArray[i].origin.y;
-        box.x2 = box.x1 + rectArray[i].size.width;
-        box.y2 = box.y1 + rectArray[i].size.height;
-
-        SAFE_REGION_INIT(&hackScreen, &region, &box, 0);
-
-        iterator = rfbGetClientIterator();
-        while ((cl = rfbClientIteratorNext(iterator)) != NULL) {
-            pthread_mutex_lock(&cl->updateMutex);
-            REGION_UNION(&hackScreen,&cl->modifiedRegion,&cl->modifiedRegion,&region);
-            pthread_cond_signal(&cl->updateCond);
-            pthread_mutex_unlock(&cl->updateMutex);
-        }
-        rfbReleaseClientIterator(iterator);
-
-        REGION_UNINIT(&hackScreen, &region);
-    }
+    for (i = 0; i < count; i++)
+      rfbMarkRectAsModified(rfbScreen,
+			    rectArray[i].origin.x,rectArray[i].origin.y,
+			    rectArray[i].origin.x + rectArray[i].size.width,
+			    rectArray[i].origin.y + rectArray[i].size.height);
 }
 
-void runEventLoop()
+int main(int argc,char *argv[])
 {
-    CGRegisterScreenRefreshCallback(refreshCallback, NULL);
+  ScreenInit(argc,argv);
+  /* enter background event loop */
+  rfbRunEventLoop(rfbScreen,40,TRUE);
 
-    RunApplicationEventLoop();
-}
+  /* enter OS X loop */
+  CGRegisterScreenRefreshCallback(refreshCallback, NULL);
+  RunApplicationEventLoop();
 
-int main(int argc,char *argv[])
-{
-  runVNCServer(argc,argv);
+  return(0); /* never ... */
 }
+
diff --git a/rfb.h b/rfb.h
index c7eaae8..207f7e1 100644
--- a/rfb.h
+++ b/rfb.h
@@ -56,8 +56,14 @@ int max(int,int);
 #ifdef __linux__
 #include <endian.h>
 #else
+#ifdef __APPLE__
+#include <machine/endian.h>
+#define _BYTE_ORDER BYTE_ORDER
+#define _LITTLE_ENDIAN LITTLE_ENDIAN
+#else
 #include <sys/endian.h>
 #endif
+#endif
 
 #ifndef _BYTE_ORDER
 #define _BYTE_ORDER __BYTE_ORDER
-- 
cgit v1.2.3

