summaryrefslogtreecommitdiffstats
path: root/x11vnc/macosx.c
diff options
context:
space:
mode:
Diffstat (limited to 'x11vnc/macosx.c')
-rw-r--r--x11vnc/macosx.c752
1 files changed, 0 insertions, 752 deletions
diff --git a/x11vnc/macosx.c b/x11vnc/macosx.c
deleted file mode 100644
index 34126f4..0000000
--- a/x11vnc/macosx.c
+++ /dev/null
@@ -1,752 +0,0 @@
-/*
- Copyright (C) 2002-2010 Karl J. Runge <runge@karlrunge.com>
- All rights reserved.
-
-This file is part of x11vnc.
-
-x11vnc is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or (at
-your option) any later version.
-
-x11vnc is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with x11vnc; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA
-or see <http://www.gnu.org/licenses/>.
-
-In addition, as a special exception, Karl J. Runge
-gives permission to link the code of its release of x11vnc with the
-OpenSSL project's "OpenSSL" library (or with modified versions of it
-that use the same license as the "OpenSSL" library), and distribute
-the linked executables. You must obey the GNU General Public License
-in all respects for all of the code used other than "OpenSSL". If you
-modify this file, you may extend this exception to your version of the
-file, but you are not obligated to do so. If you do not wish to do
-so, delete this exception statement from your version.
-*/
-
-/* -- macosx.c -- */
-
-#include "rfb/rfbconfig.h"
-#if (defined(__MACH__) && defined(__APPLE__) && defined(LIBVNCSERVER_HAVE_MACOSX_NATIVE_DISPLAY))
-
-#define DOMAC 1
-
-#else
-
-#define DOMAC 0
-
-#endif
-
-#include "x11vnc.h"
-#include "cleanup.h"
-#include "scan.h"
-#include "screen.h"
-#include "pointer.h"
-#include "allowed_input_t.h"
-#include "keyboard.h"
-#include "cursor.h"
-#include "connections.h"
-#include "macosxCG.h"
-#include "macosxCGP.h"
-#include "macosxCGS.h"
-
-void macosx_log(char *);
-char *macosx_console_guess(char *str, int *fd);
-void macosx_key_command(rfbBool down, rfbKeySym keysym, rfbClientPtr client);
-void macosx_pointer_command(int mask, int x, int y, rfbClientPtr client);
-char *macosx_get_fb_addr(void);
-int macosx_get_cursor(void);
-int macosx_get_cursor_pos(int *, int *);
-void macosx_send_sel(char *, int);
-void macosx_set_sel(char *, int);
-int macosx_valid_window(Window, XWindowAttributes*);
-
-Status macosx_xquerytree(Window w, Window *root_return, Window *parent_return,
- Window **children_return, unsigned int *nchildren_return);
-int macosx_get_wm_frame_pos(int *px, int *py, int *x, int *y, int *w, int *h,
- Window *frame, Window *win);
-
-void macosx_add_mapnotify(Window win, int level, int map);
-void macosx_add_create(Window win, int level);
-void macosx_add_destroy(Window win, int level);
-void macosx_add_visnotify(Window win, int level, int obscured);
-int macosx_checkevent(XEvent *ev);
-
-void macosx_log(char *str) {
- rfbLog(str);
-}
-
-#if (! DOMAC)
-
-void macosx_event_loop(void) {
- return;
-}
-char *macosx_console_guess(char *str, int *fd) {
- if (!str || !fd) {}
- return NULL;
-}
-void macosx_key_command(rfbBool down, rfbKeySym keysym, rfbClientPtr client) {
- if (!down || !keysym || !client) {}
- return;
-}
-void macosx_pointer_command(int mask, int x, int y, rfbClientPtr client) {
- if (!mask || !x || !y || !client) {}
- return;
-}
-char *macosx_get_fb_addr(void) {
- return NULL;
-}
-int macosx_get_cursor(void) {
- return 0;
-}
-int macosx_get_cursor_pos(int *x, int *y) {
- if (!x || !y) {}
- return 0;
-}
-void macosx_send_sel(char * str, int len) {
- if (!str || !len) {}
- return;
-}
-void macosx_set_sel(char * str, int len) {
- if (!str || !len) {}
- return;
-}
-int macosx_valid_window(Window w, XWindowAttributes* a) {
- if (!w || !a) {}
- return 0;
-}
-Status macosx_xquerytree(Window w, Window *root_return, Window *parent_return,
- Window **children_return, unsigned int *nchildren_return) {
- if (!w || !root_return || !parent_return || !children_return || !nchildren_return) {}
- return (Status) 0;
-}
-void macosx_add_mapnotify(Window win, int level, int map) {
- if (!win || !level || !map) {}
- return;
-}
-void macosx_add_create(Window win, int level) {
- if (!win || !level) {}
- return;
-}
-void macosx_add_destroy(Window win, int level) {
- if (!win || !level) {}
- return;
-}
-void macosx_add_visnotify(Window win, int level, int obscured) {
- if (!win || !level || !obscured) {}
- return;
-}
-
-int macosx_checkevent(XEvent *ev) {
- if (!ev) {}
- return 0;
-}
-
-
-#else
-
-void macosx_event_loop(void) {
- macosxCG_event_loop();
-}
-
-char *macosx_get_fb_addr(void) {
- macosxCG_init();
- return macosxCG_get_fb_addr();
-}
-
-int macosx_opengl_get_width(void);
-int macosx_opengl_get_height(void);
-int macosx_opengl_get_bpp(void);
-int macosx_opengl_get_bps(void);
-int macosx_opengl_get_spp(void);
-
-char *macosx_console_guess(char *str, int *fd) {
- char *q, *in = strdup(str);
- char *atparms = NULL, *file = NULL;
-
- macosxCG_init();
-
- if (strstr(in, "console") != in) {
- rfbLog("console_guess: unrecognized console/fb format: %s\n", str);
- free(in);
- return NULL;
- }
-
- *fd = -1;
-
- q = strrchr(in, '@');
- if (q) {
- atparms = strdup(q+1);
- *q = '\0';
- }
- q = strrchr(in, ':');
- if (q) {
- file = strdup(q+1);
- *q = '\0';
- }
- if (! file || file[0] == '\0') {
- file = strdup("/dev/null");
- }
- rfbLog("console_guess: file is %s\n", file);
-
- if (! pipeinput_str) {
- pipeinput_str = strdup("MACOSX");
- initialize_pipeinput();
- }
-
- if (! atparms) {
- int w, h, b, bps, dep;
- unsigned long rm = 0, gm = 0, bm = 0;
-
- if (macosx_read_opengl) {
- w = macosx_opengl_get_width();
- h = macosx_opengl_get_height();
- b = macosx_opengl_get_bpp();
-
- bps = macosx_opengl_get_bps();
- dep = macosx_opengl_get_spp() * bps;
-
- } else {
- w = macosxCG_CGDisplayPixelsWide();
- h = macosxCG_CGDisplayPixelsHigh();
- b = macosxCG_CGDisplayBitsPerPixel();
-
- bps = macosxCG_CGDisplayBitsPerSample();
- dep = macosxCG_CGDisplaySamplesPerPixel() * bps;
- }
-
- rm = (1 << bps) - 1;
- gm = (1 << bps) - 1;
- bm = (1 << bps) - 1;
- rm = rm << 2 * bps;
- gm = gm << 1 * bps;
- bm = bm << 0 * bps;
-
- if (b == 8 && rm == 0xff && gm == 0xff && bm == 0xff) {
- /* I don't believe it... */
- rm = 0x07;
- gm = 0x38;
- bm = 0xc0;
- }
-
- /* @66666x66666x32:0xffffffff:... */
- atparms = (char *) malloc(200);
- sprintf(atparms, "%dx%dx%d:%lx/%lx/%lx", w, h, b, rm, gm, bm);
- }
- if (atparms) {
- int gw, gh, gb;
- if (sscanf(atparms, "%dx%dx%d", &gw, &gh, &gb) == 3) {
- fb_x = gw;
- fb_y = gh;
- fb_b = gb;
- }
- }
- if (! atparms) {
- rfbLog("console_guess: could not get @ parameters.\n");
- return NULL;
- }
-
- q = (char *) malloc(strlen("map:macosx:") + strlen(file) + 1 + strlen(atparms) + 1);
- sprintf(q, "map:macosx:%s@%s", file, atparms);
- free(atparms);
- return q;
-}
-
-Window macosx_click_frame = None;
-
-void macosx_pointer_command(int mask, int x, int y, rfbClientPtr client) {
- allowed_input_t input;
- static int last_mask = 0;
- int rc;
-
- if (0) fprintf(stderr, "macosx_pointer_command: %d %d - %d\n", x, y, mask);
-
- if (mask >= 0) {
- got_pointer_calls++;
- }
-
- if (view_only) {
- return;
- }
-
- get_allowed_input(client, &input);
-
- if (! input.motion || ! input.button) {
- /* XXX fix me with last_x, last_y, etc. */
- return;
- }
-
- if (mask >= 0) {
- got_user_input++;
- got_pointer_input++;
- last_pointer_client = client;
- last_pointer_time = time(NULL);
- }
- if (last_mask != mask) {
- if (0) fprintf(stderr, "about to inject mask change %d -> %d: %.4f\n", last_mask, mask, dnowx());
- if (mask) {
- int px, py, x, y, w, h;
- macosx_click_frame = None;
- if (!macosx_get_wm_frame_pos(&px, &py, &x, &y, &w, &h, &macosx_click_frame, NULL)) {
- macosx_click_frame = None;
- }
- }
- }
-
- macosxCG_pointer_inject(mask, x, y);
-
- if (cursor_x != x || cursor_y != y) {
- last_pointer_motion_time = dnow();
- }
-
- cursor_x = x;
- cursor_y = y;
-
- if (last_mask != mask) {
- last_pointer_click_time = dnow();
- if (ncache > 0) {
- /* XXX Y */
- int i;
-if (0) fprintf(stderr, "about to get all windows: %.4f\n", dnowx());
- for (i=0; i < 2; i++) {
- macosxCGS_get_all_windows();
- if (0) fprintf(stderr, "!");
- if (macosx_checkevent(NULL)) {
- break;
- }
- }
-if (0) fprintf(stderr, "\ndone: %.4f\n", dnowx());
- }
- }
- last_mask = mask;
-
- /* record the x, y position for the rfb screen as well. */
- cursor_position(x, y);
-
- /* change the cursor shape if necessary */
- rc = set_cursor(x, y, get_which_cursor());
- cursor_changes += rc;
-
- last_event = last_input = last_pointer_input = time(NULL);
-}
-
-void init_key_table(void) {
- macosxCG_init_key_table();
-}
-
-void macosx_key_command(rfbBool down, rfbKeySym keysym, rfbClientPtr client) {
- allowed_input_t input;
- if (debug_keyboard) fprintf(stderr, "macosx_key_command: %d %s\n", (int) keysym, down ? "down" : "up");
-
- if (view_only) {
- return;
- }
- get_allowed_input(client, &input);
- if (! input.keystroke) {
- return;
- }
-
- init_key_table();
- macosxCG_keysym_inject((int) down, (unsigned int) keysym);
-}
-
-extern void macosxGCS_poll_pb(void);
-
-int macosx_get_cursor_pos(int *x, int *y) {
- macosxCG_get_cursor_pos(x, y);
- if (nofb) {
- /* good time to poll the pasteboard */
- macosxGCS_poll_pb();
- }
- return 1;
-}
-
-static char *cuttext = NULL;
-static int cutlen = 0;
-
-void macosx_send_sel(char *str, int len) {
- if (screen && all_clients_initialized()) {
- if (cuttext) {
- int n = cutlen;
- if (len < n) {
- n = len;
- }
- if (!memcmp(str, cuttext, (size_t) n)) {
- /* the same text we set pasteboard to ... */
- return;
- }
- }
- if (debug_sel) {
- rfbLog("macosx_send_sel: %d\n", len);
- }
- rfbSendServerCutText(screen, str, len);
- }
-}
-
-void macosx_set_sel(char *str, int len) {
- if (screen && all_clients_initialized()) {
- if (cutlen <= len) {
- if (cuttext) {
- free(cuttext);
- }
- cutlen = 2*(len+1);
- cuttext = (char *) calloc(cutlen, 1);
- }
- memcpy(cuttext, str, (size_t) len);
- cuttext[len] = '\0';
- if (debug_sel) {
- rfbLog("macosx_set_sel: %d\n", len);
- }
- macosxGCS_set_pasteboard(str, len);
- }
-}
-
-int macosx_get_cursor(void) {
- return macosxCG_get_cursor();
-}
-
-typedef struct evdat {
- int win;
- int map;
- int level;
- int vis;
- int type;
-} evdat_t;
-
-#define MAX_EVENTS 1024
-evdat_t mac_events[MAX_EVENTS];
-int mac_events_ptr = 0;
-int mac_events_last = 0;
-
-void macosx_add_mapnotify(Window win, int level, int map) {
- int i = mac_events_last++;
- mac_events[i].win = win;
- mac_events[i].level = level;
-
- if (map) {
- mac_events[i].type = MapNotify;
- } else {
- mac_events[i].type = UnmapNotify;
- }
- mac_events[i].map = map;
- mac_events[i].vis = -1;
-
- mac_events_last = mac_events_last % MAX_EVENTS;
-
- return;
-}
-
-void macosx_add_create(Window win, int level) {
- int i = mac_events_last++;
- mac_events[i].win = win;
- mac_events[i].level = level;
-
- mac_events[i].type = CreateNotify;
- mac_events[i].map = -1;
- mac_events[i].vis = -1;
-
- mac_events_last = mac_events_last % MAX_EVENTS;
-
- return;
-}
-
-void macosx_add_destroy(Window win, int level) {
- int i = mac_events_last++;
- mac_events[i].win = win;
- mac_events[i].level = level;
-
- mac_events[i].type = DestroyNotify;
- mac_events[i].map = -1;
- mac_events[i].vis = -1;
-
- mac_events_last = mac_events_last % MAX_EVENTS;
-
- return;
-}
-
-void macosx_add_visnotify(Window win, int level, int obscured) {
- int i = mac_events_last++;
- mac_events[i].win = win;
- mac_events[i].level = level;
-
- mac_events[i].type = VisibilityNotify;
- mac_events[i].map = -1;
-
- mac_events[i].vis = 1;
- if (obscured == 0) {
- mac_events[i].vis = VisibilityUnobscured;
- } else if (obscured == 1) {
- mac_events[i].vis = VisibilityPartiallyObscured;
- } else if (obscured == 2) {
- mac_events[i].vis = VisibilityFullyObscured; /* NI */
- }
-
- mac_events_last = mac_events_last % MAX_EVENTS;
-
- return;
-}
-
-int macosx_checkevent(XEvent *ev) {
- int i = mac_events_ptr;
-
- if (mac_events_ptr == mac_events_last) {
- return 0;
- }
- if (ev == NULL) {
- return mac_events[i].type;
- }
-
- ev->xany.window = mac_events[i].win;
-
- if (mac_events[i].type == CreateNotify) {
- ev->type = CreateNotify;
- ev->xany.window = rootwin;
- ev->xcreatewindow.window = mac_events[i].win;
- } else if (mac_events[i].type == DestroyNotify) {
- ev->type = DestroyNotify;
- ev->xdestroywindow.window = mac_events[i].win;
- } else if (mac_events[i].type == VisibilityNotify) {
- ev->type = VisibilityNotify;
- ev->xvisibility.state = mac_events[i].vis;
- } else if (mac_events[i].type == MapNotify) {
- ev->type = MapNotify;
- } else if (mac_events[i].type == UnmapNotify) {
- ev->type = UnmapNotify;
- } else {
- fprintf(stderr, "unknown macosx_checkevent: %d\n", mac_events[i].type);
- }
- mac_events_ptr++;
- mac_events_ptr = mac_events_ptr % MAX_EVENTS;
-
- return mac_events[i].type;
-}
-
-typedef struct windat {
- int win;
- int x, y;
- int width, height;
- int level;
- int mapped;
- int clipped;
- int ncache_only;
-} windat_t;
-
-extern int macwinmax;
-extern windat_t macwins[];
-
-int macosx_get_wm_frame_pos(int *px, int *py, int *x, int *y, int *w, int *h,
- Window *frame, Window *win) {
- static int last_idx = -1;
- int x1, x2, y1, y2;
- int idx = -1, k;
- macosxCGS_get_all_windows();
- macosxCG_get_cursor_pos(px, py);
-
- for (k = 0; k<macwinmax; k++) {
- if (! macwins[k].mapped) {
- continue;
- }
- x1 = macwins[k].x;
- x2 = macwins[k].x + macwins[k].width;
- y1 = macwins[k].y;
- y2 = macwins[k].y + macwins[k].height;
-if (debug_wireframe) fprintf(stderr, "%d/%d: %d %d %d - %d %d %d\n", k, macwins[k].win, x1, *px, x2, y1, *py, y2);
- if (x1 <= *px && *px < x2) {
- if (y1 <= *py && *py < y2) {
- idx = k;
- break;
- }
- }
- }
- if (idx < 0) {
- return 0;
- }
-
- *x = macwins[idx].x;
- *y = macwins[idx].y;
- *w = macwins[idx].width;
- *h = macwins[idx].height;
- *frame = (Window) macwins[idx].win;
- if (win != NULL) {
- *win = *frame;
- }
-
- last_idx = idx;
-
- return 1;
-}
-
-int macosx_valid_window(Window w, XWindowAttributes* a) {
- static int last_idx = -1;
- int win = (int) w;
- int i, k, idx = -1;
-
- if (last_idx >= 0 && last_idx < macwinmax) {
- if (macwins[last_idx].win == win) {
- idx = last_idx;
- }
- }
-
- if (idx < 0) {
- idx = macosxCGS_get_qlook(w);
- if (idx >= 0 && idx < macwinmax) {
- if (macwins[idx].win != win) {
- idx = -1;
- }
- } else {
- idx = -1;
- }
- }
-
- if (idx < 0) {
- for (i = 0; i<macwinmax; i++) {
- k = i;
- if (i == -1) {
- if (last_idx >= 0 && last_idx < macwinmax) {
- k = last_idx;
- } else {
- last_idx = -1;
- continue;
- }
- }
- if (macwins[k].win == win) {
- idx = k;
- break;
- }
- }
- }
- if (idx < 0) {
- return 0;
- }
-
- a->x = macwins[idx].x;
- a->y = macwins[idx].y;
- a->width = macwins[idx].width;
- a->height = macwins[idx].height;
- a->depth = depth;
- a->border_width = 0;
- a->backing_store = 0;
- if (macwins[idx].mapped) {
- a->map_state = IsViewable;
- } else {
- a->map_state = IsUnmapped;
- }
-
- last_idx = idx;
-
- return 1;
-}
-
-#define QTMAX 2048
-static Window cret[QTMAX];
-
-extern int CGS_levelmax;
-extern int CGS_levels[];
-
-Status macosx_xquerytree(Window w, Window *root_return, Window *parent_return,
- Window **children_return, unsigned int *nchildren_return) {
-
- int i, n, k;
-
- *root_return = (Window) 0;
- *parent_return = (Window) 0;
- if (!w) {}
-
- macosxCGS_get_all_windows();
-
- n = 0;
- for (k = CGS_levelmax - 1; k >= 0; k--) {
- for (i = macwinmax - 1; i >= 0; i--) {
- if (n >= QTMAX) break;
- if (macwins[i].level == CGS_levels[k]) {
-if (0) fprintf(stderr, "k=%d i=%d n=%d\n", k, i, n);
- cret[n++] = (Window) macwins[i].win;
- }
- }
- }
- *children_return = cret;
- *nchildren_return = (unsigned int) macwinmax;
-
- return (Status) 1;
-}
-
-int macosx_check_offscreen(int win) {
- sraRegionPtr r0, r1;
- int x1, y1, x2, y2;
- int ret;
- int i = macosxCGS_find_index(win);
-
- if (i < 0) {
- return 0;
- }
-
- x1 = macwins[i].x;
- y1 = macwins[i].y;
- x2 = macwins[i].x + macwins[i].width;
- y2 = macwins[i].y + macwins[i].height;
-
- r0 = sraRgnCreateRect(0, 0, dpy_x, dpy_y);
- r1 = sraRgnCreateRect(x1, y1, x2, y2);
-
- if (sraRgnAnd(r1, r0)) {
- ret = 0;
- } else {
- ret = 1;
- }
- sraRgnDestroy(r0);
- sraRgnDestroy(r1);
-
- return ret;
-}
-
-int macosx_check_clipped(int win, int *list, int n) {
- sraRegionPtr r0, r1, r2;
- int x1, y1, x2, y2;
- int ret = 0;
- int k, j, i = macosxCGS_find_index(win);
-
- if (i < 0) {
- return 0;
- }
-
- x1 = macwins[i].x;
- y1 = macwins[i].y;
- x2 = macwins[i].x + macwins[i].width;
- y2 = macwins[i].y + macwins[i].height;
-
- r0 = sraRgnCreateRect(0, 0, dpy_x, dpy_y);
- r1 = sraRgnCreateRect(x1, y1, x2, y2);
- sraRgnAnd(r1, r0);
-
- for (k = 0; k < n; k++) {
- j = macosxCGS_find_index(list[k]); /* XXX slow? */
- if (j < 0) {
- continue;
- }
- x1 = macwins[j].x;
- y1 = macwins[j].y;
- x2 = macwins[j].x + macwins[j].width;
- y2 = macwins[j].y + macwins[j].height;
- r2 = sraRgnCreateRect(x1, y1, x2, y2);
- if (sraRgnAnd(r2, r1)) {
- ret = 1;
- sraRgnDestroy(r2);
- break;
- }
- sraRgnDestroy(r2);
- }
- sraRgnDestroy(r0);
- sraRgnDestroy(r1);
-
- return ret;
-}
-
-
-#endif /* LIBVNCSERVER_HAVE_MACOSX_NATIVE_DISPLAY */
-
OpenPOWER on IntegriCloud