diff --git a/mac.c b/mac.c index ff37f01..2bb10eb 100644 --- a/mac.c +++ b/mac.c @@ -27,6 +27,12 @@ * */ +#define LOCAL_CONTROL + +#ifdef LOCAL_CONTROL +#include "1instance.c" +#endif + #include #include #include @@ -225,6 +231,8 @@ KbdAddEvent(Bool down, KeySym keySym, struct rfbClientRec* cl) CGKeyCode keyCode = -1; int found = 0; + if(((int)cl->clientData)==-1) return; /* viewOnly */ + for (i = 0; i < (sizeof(keyTable) / sizeof(int)); i += 2) { if (keyTable[i] == keySym) { keyCode = keyTable[i+1]; @@ -252,6 +260,8 @@ PtrAddEvent(buttonMask, x, y, cl) { CGPoint position; + if(((int)cl->clientData)==-1) return; /* viewOnly */ + position.x = x; position.y = y; @@ -281,10 +291,9 @@ ScreenInit(int argc, char**argv) rfbScreen->frameBuffer = (char *)CGDisplayBaseAddress(kCGDirectMainDisplay); - if(!viewOnly) { - rfbScreen->ptrAddEvent = PtrAddEvent; - rfbScreen->kbdAddEvent = KbdAddEvent; - } + rfbScreen->ptrAddEvent = PtrAddEvent; + rfbScreen->kbdAddEvent = KbdAddEvent; + if(sharedMode) { rfbScreen->rfbAlwaysShared = TRUE; } @@ -292,11 +301,33 @@ ScreenInit(int argc, char**argv) rfbInitServer(rfbScreen); } +#ifdef LOCAL_CONTROL +single_instance_struct single_instance = { "/tmp/OSXvnc_control" }; +#endif + static void refreshCallback(CGRectCount count, const CGRect *rectArray, void *ignore) { int i; +#ifdef LOCAL_CONTROL + if(get_next_message(message,1024,&single_instance,50)) { + if(message[0]=='l' && message[1]==0) { + rfbClientPtr cl; + int i; + for(i=0,cl=rfbScreen->rfbClientHead;cl;cl=cl->next,i++) + fprintf(stderr,"%02d: %s\n",i,cl->host); + } else if(message[0]=='t') { + rfbClientPtr cl; + for(cl=rfbScreen->rfbClientHead;cl;cl=cl->next) + if(!strcmp(message+1,cl->host)) { + cl->clientData=(cl->clientData==0)?-1:0; + break; + } + } + } +#endif + if(startTime>0 && time(0)>startTime+maxSecsToConnect) exit(0); @@ -319,12 +350,32 @@ void newClient(rfbClientPtr cl) if(disconnectAfterFirstClient) cl->clientGoneHook = clientGone; + + cl->clientData=(void*)((viewOnly)?-1:0); } int main(int argc,char *argv[]) { int i; + +#ifdef LOCAL_CONTROL + char message[1024]; + + open_control_file(&single_instance); +#endif + for(i=argc-1;i>0;i--) +#ifdef LOCAL_CONTROL + if(i