summaryrefslogtreecommitdiffstats
path: root/x11vnc/xrandr.c
diff options
context:
space:
mode:
Diffstat (limited to 'x11vnc/xrandr.c')
-rw-r--r--x11vnc/xrandr.c307
1 files changed, 0 insertions, 307 deletions
diff --git a/x11vnc/xrandr.c b/x11vnc/xrandr.c
deleted file mode 100644
index f2fb5ea..0000000
--- a/x11vnc/xrandr.c
+++ /dev/null
@@ -1,307 +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.
-*/
-
-/* -- xrandr.c -- */
-
-#include "x11vnc.h"
-#include "cleanup.h"
-#include "connections.h"
-#include "remote.h"
-#include "screen.h"
-#include "win_utils.h"
-
-time_t last_subwin_trap = 0;
-int subwin_trap_count = 0;
-XErrorHandler old_getimage_handler;
-
-int xrandr_present = 0;
-int xrandr_width = -1;
-int xrandr_height = -1;
-int xrandr_rotation = -1;
-Time xrandr_timestamp = 0;
-Time xrandr_cfg_time = 0;
-
-void initialize_xrandr(void);
-int check_xrandr_event(char *msg);
-int known_xrandr_mode(char *s);
-
-static int handle_subwin_resize(char *msg);
-static void handle_xrandr_change(int new_x, int new_y);
-
-
-void initialize_xrandr(void) {
- if (xrandr_present && dpy) {
-#if LIBVNCSERVER_HAVE_LIBXRANDR
- Rotation rot;
-
- X_LOCK;
- xrandr_width = XDisplayWidth(dpy, scr);
- xrandr_height = XDisplayHeight(dpy, scr);
- XRRRotations(dpy, scr, &rot);
- xrandr_rotation = (int) rot;
- if (xrandr || xrandr_maybe) {
- XRRSelectInput(dpy, rootwin, RRScreenChangeNotifyMask);
- } else {
- XRRSelectInput(dpy, rootwin, 0);
- }
- X_UNLOCK;
-#endif
- } else if (xrandr) {
- rfbLog("-xrandr mode specified, but no RANDR support on\n");
- rfbLog(" display or in client library. Disabling -xrandr "
- "mode.\n");
- xrandr = 0;
- }
-}
-
-static int handle_subwin_resize(char *msg) {
- int new_x, new_y;
- int i, check = 10, ms = 250; /* 2.5 secs total... */
-
- if (msg) {} /* unused vars warning: */
- if (! subwin) {
- return 0; /* hmmm... */
- }
- if (! valid_window(subwin, NULL, 0)) {
- rfbLogEnable(1);
- rfbLog("subwin 0x%lx went away!\n", subwin);
- X_UNLOCK;
- clean_up_exit(1);
- }
- if (! get_window_size(subwin, &new_x, &new_y)) {
- rfbLogEnable(1);
- rfbLog("could not get size of subwin 0x%lx\n", subwin);
- X_UNLOCK;
- clean_up_exit(1);
- }
- if (wdpy_x == new_x && wdpy_y == new_y) {
- /* no change */
- return 0;
- }
-
- /* window may still be changing (e.g. drag resize) */
- for (i=0; i < check; i++) {
- int newer_x, newer_y;
- usleep(ms * 1000);
-
- if (! get_window_size(subwin, &newer_x, &newer_y)) {
- rfbLogEnable(1);
- rfbLog("could not get size of subwin 0x%lx\n", subwin);
- clean_up_exit(1);
- }
- if (new_x == newer_x && new_y == newer_y) {
- /* go for it... */
- break;
- } else {
- rfbLog("subwin 0x%lx still changing size...\n", subwin);
- new_x = newer_x;
- new_y = newer_y;
- }
- }
-
- rfbLog("subwin 0x%lx new size: x: %d -> %d, y: %d -> %d\n",
- subwin, wdpy_x, new_x, wdpy_y, new_y);
- rfbLog("calling handle_xrandr_change() for resizing\n");
-
- X_UNLOCK;
- handle_xrandr_change(new_x, new_y);
- return 1;
-}
-
-static void handle_xrandr_change(int new_x, int new_y) {
- rfbClientIteratorPtr iter;
- rfbClientPtr cl;
-
- RAWFB_RET_VOID
-
- /* assumes no X_LOCK */
-
- /* sanity check xrandr_mode */
- if (! xrandr_mode) {
- xrandr_mode = strdup("default");
- } else if (! known_xrandr_mode(xrandr_mode)) {
- free(xrandr_mode);
- xrandr_mode = strdup("default");
- }
- rfbLog("xrandr_mode: %s\n", xrandr_mode);
- if (!strcmp(xrandr_mode, "exit")) {
- close_all_clients();
- rfbLog(" shutting down due to XRANDR event.\n");
- clean_up_exit(0);
- }
- if (!strcmp(xrandr_mode, "newfbsize") && screen) {
- iter = rfbGetClientIterator(screen);
- while( (cl = rfbClientIteratorNext(iter)) ) {
- if (cl->useNewFBSize) {
- continue;
- }
- rfbLog(" closing client %s (no useNewFBSize"
- " support).\n", cl->host);
- rfbCloseClient(cl);
- rfbClientConnectionGone(cl);
- }
- rfbReleaseClientIterator(iter);
- }
-
- /* default, resize, and newfbsize create a new fb: */
- rfbLog("check_xrandr_event: trying to create new framebuffer...\n");
- if (new_x < wdpy_x || new_y < wdpy_y) {
- check_black_fb();
- }
- do_new_fb(1);
- rfbLog("check_xrandr_event: fb WxH: %dx%d\n", wdpy_x, wdpy_y);
-}
-
-int check_xrandr_event(char *msg) {
- XEvent xev;
-
- RAWFB_RET(0)
-
- /* it is assumed that X_LOCK is on at this point. */
-
- if (subwin) {
- return handle_subwin_resize(msg);
- }
-#if LIBVNCSERVER_HAVE_LIBXRANDR
- if (! xrandr_present) {
- return 0;
- }
- if (! xrandr && ! xrandr_maybe) {
- return 0;
- }
-
-
- if (xrandr_base_event_type && XCheckTypedEvent(dpy,
- xrandr_base_event_type + RRScreenChangeNotify, &xev)) {
- int do_change, qout = 0;
- static int first = 1;
- XRRScreenChangeNotifyEvent *rev;
-
- rev = (XRRScreenChangeNotifyEvent *) &xev;
-
- if (first && ! xrandr) {
- fprintf(stderr, "\n");
- if (getenv("X11VNC_DEBUG_XRANDR") == NULL) {
- qout = 1;
- }
- }
- first = 0;
-
- rfbLog("check_xrandr_event():\n");
- rfbLog("Detected XRANDR event at location '%s':\n", msg);
-
- if (qout) {
- ;
- } else {
- rfbLog(" serial: %d\n", (int) rev->serial);
- rfbLog(" timestamp: %d\n", (int) rev->timestamp);
- rfbLog(" cfg_timestamp: %d\n", (int) rev->config_timestamp);
- rfbLog(" size_id: %d\n", (int) rev->size_index);
- rfbLog(" sub_pixel: %d\n", (int) rev->subpixel_order);
- rfbLog(" rotation: %d\n", (int) rev->rotation);
- rfbLog(" width: %d\n", (int) rev->width);
- rfbLog(" height: %d\n", (int) rev->height);
- rfbLog(" mwidth: %d mm\n", (int) rev->mwidth);
- rfbLog(" mheight: %d mm\n", (int) rev->mheight);
- rfbLog("\n");
- rfbLog("check_xrandr_event: previous WxH: %dx%d\n",
- wdpy_x, wdpy_y);
- }
-
- if (wdpy_x == rev->width && wdpy_y == rev->height &&
- xrandr_rotation == (int) rev->rotation) {
- rfbLog("check_xrandr_event: no change detected.\n");
- do_change = 0;
- if (! xrandr) {
- rfbLog("check_xrandr_event: "
- "enabling full XRANDR trapping anyway.\n");
- xrandr = 1;
- }
- } else {
- do_change = 1;
- if (! xrandr) {
- rfbLog("check_xrandr_event: Resize; "
- "enabling full XRANDR trapping.\n");
- xrandr = 1;
- }
- }
-
- xrandr_width = rev->width;
- xrandr_height = rev->height;
- xrandr_timestamp = rev->timestamp;
- xrandr_cfg_time = rev->config_timestamp;
- xrandr_rotation = (int) rev->rotation;
-
- if (! qout) rfbLog("check_xrandr_event: updating config...\n");
- XRRUpdateConfiguration(&xev);
-
- if (do_change) {
- /* under do_change caller normally returns before its X_UNLOCK */
- X_UNLOCK;
- handle_xrandr_change(rev->width, rev->height);
- X_LOCK;
- }
- if (qout) {
- return do_change;
- }
- rfbLog("check_xrandr_event: current WxH: %dx%d\n",
- XDisplayWidth(dpy, scr), XDisplayHeight(dpy, scr));
- rfbLog("check_xrandr_event(): returning control to"
- " caller...\n");
-
-
- return do_change;
- }
-#else
- xev.type = 0;
-#endif
-
-
- return 0;
-}
-
-int known_xrandr_mode(char *s) {
-/*
- * default:
- * resize: the default
- * exit: shutdown clients and exit.
- * newfbsize: shutdown clients that do not support NewFBSize encoding.
- */
- if (strcmp(s, "default") && strcmp(s, "resize") &&
- strcmp(s, "exit") && strcmp(s, "newfbsize")) {
- return 0;
- } else {
- return 1;
- }
-}
-
-