summaryrefslogtreecommitdiffstats
path: root/x11vnc/linuxfb.c
diff options
context:
space:
mode:
Diffstat (limited to 'x11vnc/linuxfb.c')
-rw-r--r--x11vnc/linuxfb.c394
1 files changed, 0 insertions, 394 deletions
diff --git a/x11vnc/linuxfb.c b/x11vnc/linuxfb.c
deleted file mode 100644
index 1831c5f..0000000
--- a/x11vnc/linuxfb.c
+++ /dev/null
@@ -1,394 +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.
-*/
-
-/* -- linuxfb.c -- */
-
-#include "x11vnc.h"
-#include "cleanup.h"
-#include "scan.h"
-#include "xinerama.h"
-#include "screen.h"
-#include "pointer.h"
-#include "allowed_input_t.h"
-#include "uinput.h"
-#include "keyboard.h"
-#include "macosx.h"
-
-#if LIBVNCSERVER_HAVE_SYS_IOCTL_H
-#include <sys/ioctl.h>
-#endif
-#if LIBVNCSERVER_HAVE_LINUX_FB_H
-#include <linux/fb.h>
-#endif
-
-char *console_guess(char *str, int *fd);
-void console_key_command(rfbBool down, rfbKeySym keysym, rfbClientPtr client);
-void console_pointer_command(int mask, int x, int y, rfbClientPtr client);
-
-
-void linux_dev_fb_msg(char *);
-
-char *console_guess(char *str, int *fd) {
- char *q, *in = strdup(str);
- char *atparms = NULL, *file = NULL;
- int do_input, have_uinput, tty = -1;
-
-#ifdef MACOSX
- return macosx_console_guess(str, fd);
-#endif
-
-
- if (strstr(in, "/dev/fb") == in) {
- free(in);
- in = (char *) malloc(strlen("console:") + strlen(str) + 1);
- sprintf(in, "console:%s", str);
- } else if (strstr(in, "fb") == in) {
- free(in);
- in = (char *) malloc(strlen("console:/dev/") + strlen(str) + 1);
- sprintf(in, "console:/dev/%s", str);
- } else if (strstr(in, "vt") == in) {
- free(in);
- in = (char *) malloc(strlen("console_") + strlen(str) + 1);
- sprintf(in, "console_%s", str);
- }
-
- if (strstr(in, "console") != in) {
- rfbLog("console_guess: unrecognized console/fb format: %s\n", str);
- free(in);
- return NULL;
- }
-
- 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/fb");
- }
- if (strstr(file, "fb") == file) {
- q = (char *) malloc(strlen("/dev/") + strlen(file) + 1);
- sprintf(q, "/dev/%s", file);
- free(file);
- file = q;
- }
- if (!strcmp(file, "/dev/fb")) {
- /* sometimes no sylink fb -> fb0 */
- struct stat sbuf;
- if (stat(file, &sbuf) != 0) {
- free(file);
- file = strdup("/dev/fb0");
- }
- }
-
- do_input = 1;
- if (pipeinput_str) {
- have_uinput = 0;
- do_input = 0;
- } else {
- have_uinput = check_uinput();
- }
- if (strstr(in, "console_vt")) {
- have_uinput = 0;
- }
-
- if (!strcmp(in, "consolex")) {
- do_input = 0;
- } else if (strstr(in, "console_vtx")) {
- have_uinput = 0;
- do_input = 0;
- } else if (!strcmp(in, "console")) {
- /* current active VT: */
- if (! have_uinput) {
- tty = 0;
- }
- } else {
- int n;
- if (sscanf(in, "console%d", &n) == 1) {
- tty = n;
- have_uinput = 0;
- } else if (sscanf(in, "console_vt%d", &n) == 1) {
- tty = n;
- have_uinput = 0;
- }
- }
- if (strstr(in, "console_vt") == in) {
- char tmp[100];
- int fd, rows = 30, cols = 80, w, h;
- sprintf(tmp, "/dev/vcsa%d", tty);
- file = strdup(tmp);
- fd = open(file, O_RDWR);
- if (fd >= 0) {
- read(fd, tmp, 4);
- rows = (unsigned char) tmp[0];
- cols = (unsigned char) tmp[1];
- close(fd);
- }
- w = cols * 8;
- h = rows * 16;
- rfbLog("%s %dx%d\n", file, cols, rows);
- if (getenv("RAWFB_VCSA_BPP")) {
- /* 8bpp, etc */
- int bt = atoi(getenv("RAWFB_VCSA_BPP"));
- if (bt > 0 && bt <=32) {
- sprintf(tmp, "%dx%dx%d", w, h, bt);
- } else {
- sprintf(tmp, "%dx%dx16", w, h);
- }
- } else {
- /* default 16bpp */
- sprintf(tmp, "%dx%dx16", w, h);
- }
- atparms = strdup(tmp);
- }
- rfbLog("console_guess: file is %s\n", file);
-
- if (! atparms) {
-#if LIBVNCSERVER_HAVE_LINUX_FB_H
-#if LIBVNCSERVER_HAVE_SYS_IOCTL_H
- struct fb_var_screeninfo var_info;
- int d = open(file, O_RDWR);
- if (d >= 0) {
- int w, h, b;
- unsigned long rm = 0, gm = 0, bm = 0;
- if (ioctl(d, FBIOGET_VSCREENINFO, &var_info) != -1) {
- w = (int) var_info.xres;
- h = (int) var_info.yres;
- b = (int) var_info.bits_per_pixel;
-
- rm = (1 << var_info.red.length) - 1;
- gm = (1 << var_info.green.length) - 1;
- bm = (1 << var_info.blue.length) - 1;
- rm = rm << var_info.red.offset;
- gm = gm << var_info.green.offset;
- bm = bm << var_info.blue.offset;
-
- if (b == 8 && rm == 0xff && gm == 0xff && bm == 0xff) {
- /* I don't believe it... */
- rm = 0x07;
- gm = 0x38;
- bm = 0xc0;
- }
- if (b <= 8 && (rm == gm && gm == bm)) {
- if (b == 4) {
- 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);
- *fd = d;
- } else {
- perror("ioctl");
- close(d);
- }
- } else {
- rfbLog("could not open: %s\n", file);
- rfbLogPerror("open");
- linux_dev_fb_msg(file);
- close(d);
- }
-#endif
-#endif
- }
-
- 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 (do_input) {
- if (tty >=0 && tty < 64) {
- pipeinput_str = (char *) malloc(10);
- sprintf(pipeinput_str, "CONSOLE%d", tty);
- rfbLog("console_guess: file pipeinput %s\n",
- pipeinput_str);
- initialize_pipeinput();
- } else if (have_uinput) {
- pipeinput_str = strdup("UINPUT");
- rfbLog("console_guess: file pipeinput %s\n",
- pipeinput_str);
- initialize_pipeinput();
- }
- }
-
- if (! atparms) {
- rfbLog("console_guess: could not get @ parameters.\n");
- return NULL;
- }
-
- q = (char *) malloc(strlen("mmap:") + strlen(file) + 1 + strlen(atparms) + 1);
- if (strstr(in, "console_vt")) {
- sprintf(q, "snap:%s@%s", file, atparms);
- } else {
- sprintf(q, "map:%s@%s", file, atparms);
- }
- free(atparms);
- return q;
-}
-
-void console_key_command(rfbBool down, rfbKeySym keysym, rfbClientPtr client) {
- static int control = 0, alt = 0;
- allowed_input_t input;
-
- if (debug_keyboard) fprintf(stderr, "console_key_command: %d %s\n", (int) keysym, down ? "down" : "up");
-
- if (pipeinput_cons_fd < 0) {
- return;
- }
- if (view_only) {
- return;
- }
- get_allowed_input(client, &input);
- if (! input.keystroke) {
- return;
- }
-
- /* From LinuxVNC.c: */
- if (keysym == XK_Control_L || keysym == XK_Control_R) {
- if (! down) {
- if (control > 0) {
- control--;
- }
- } else {
- control++;
- }
- return;
- }
- if (keysym == XK_Alt_L || keysym == XK_Alt_R) {
- if (! down) {
- if (alt > 0) {
- alt--;
- }
- } else {
- alt++;
- }
- return;
- }
- if (!down) {
- return;
- }
- if (keysym == XK_Escape) {
- keysym = 27;
- }
- if (control) {
- /* shift down to the "control" zone */
- if (keysym >= 'a' && keysym <= 'z') {
- keysym -= ('a' - 1);
- } else if (keysym >= 'A' && keysym <= 'Z') {
- keysym -= ('A' - 1);
- } else {
- keysym = 0xffff;
- }
- } else if (alt) {
- /* shift up to the upper half Latin zone */
- if (keysym >= '!' && keysym <= '~') {
- keysym += 128;
- }
- }
- if (debug_keyboard) fprintf(stderr, "keysym now: %d\n", (int) keysym);
- if (keysym == XK_Tab) {
- keysym = '\t';
- } else if (keysym == XK_Return || keysym == XK_KP_Enter) {
- keysym = '\r';
- } else if (keysym == XK_BackSpace) {
- keysym = 8;
- } else if (keysym == XK_Home || keysym == XK_KP_Home) {
- keysym = 1;
- } else if (keysym == XK_End || keysym == XK_KP_End) {
- keysym = 5;
- } else if (keysym == XK_Up || keysym == XK_KP_Up) {
- keysym = 16;
- } else if (keysym == XK_Down || keysym == XK_KP_Down) {
- keysym = 14;
- } else if (keysym == XK_Right || keysym == XK_KP_Right) {
- keysym = 6;
- } else if (keysym == XK_Next || keysym == XK_KP_Next) {
- keysym = 6;
- } else if (keysym == XK_Left || keysym == XK_KP_Left) {
- keysym = 2;
- } else if (keysym == XK_Prior || keysym == XK_KP_Prior) {
- keysym = 2;
- } else {
- if (keysym >= XK_KP_Multiply && keysym <= XK_KP_Equal) {
- keysym -= 0xFF80;
- }
- }
-#if LIBVNCSERVER_HAVE_SYS_IOCTL_H && defined(TIOCSTI)
- if (keysym < 0x100) {
- if (ioctl(pipeinput_cons_fd, TIOCSTI, &keysym) != -1) {
- return;
- }
- perror("ioctl");
- close(pipeinput_cons_fd);
- pipeinput_cons_fd = -1;
- if (! pipeinput_cons_dev) {
- return;
- }
- pipeinput_cons_fd = open(pipeinput_cons_dev, O_WRONLY);
- if (pipeinput_cons_fd < 0) {
- rfbLog("pipeinput: could not reopen %s\n",
- pipeinput_cons_dev);
- perror("open");
- return;
- }
- if (ioctl(pipeinput_cons_fd, TIOCSTI, &keysym) == -1) {
- perror("ioctl");
- close(pipeinput_cons_fd);
- pipeinput_cons_fd = -1;
- rfbLog("pipeinput: could not reopen %s\n",
- pipeinput_cons_dev);
- }
- }
-#endif
-
- if (client) {}
-}
-
-void console_pointer_command(int mask, int x, int y, rfbClientPtr client) {
- /* do not forget viewonly perms */
- if (mask || x || y || client) {}
-}
-