From c23b97451192e0c86cf97ed498642ea82b7ca9d6 Mon Sep 17 00:00:00 2001 From: michux Date: Wed, 25 Mar 2009 21:45:06 +0000 Subject: add vnc driver git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@997 3ae390bd-cb1e-0410-b409-cd5a39f66f1f --- drv_vnc.c | 268 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 268 insertions(+) create mode 100644 drv_vnc.c (limited to 'drv_vnc.c') diff --git a/drv_vnc.c b/drv_vnc.c new file mode 100644 index 0000000..a8bbbc8 --- /dev/null +++ b/drv_vnc.c @@ -0,0 +1,268 @@ +/* $Id$ + * $URL$ + * + * Libvncserver driver + * + * Copyright (C) 2009 Michael Vogt + * Modified from sample code by: + * Copyright (C) 2005 Michael Reinelt + * Copyright (C) 2005, 2006, 2007, 2008, 2009 The LCD4Linux Team + * + * This file is part of LCD4Linux. + * + * LCD4Linux 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, or (at your option) + * any later version. + * + * LCD4Linux 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 this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +/* + * + * exported fuctions: + * + * struct DRIVER drv_vnc + * + */ + +#include "config.h" + +#include +#include +#include +#include +#include + +#include + +#include "debug.h" +#include "cfg.h" +#include "qprintf.h" +#include "udelay.h" +#include "plugin.h" +#include "widget.h" +#include "widget_text.h" +#include "widget_icon.h" +#include "widget_bar.h" +#include "drv.h" + +#include "drv_generic_graphic.h" + + + +/* 15 frames per second (if we can) */ +#define PICTURE_TIMEOUT (1.0/15.0) + +static char Name[] = "VNC"; + +static rfbScreenInfoPtr server; +static int xres = 320; +static int yres = 200; +static int BPP = 4; + + +static int drv_vnc_open(const char *Section) +{ + if (cfg_number(Section, "xres", 320, 32, 2048, &xres) < 1) { + info("[DRV_VNC] no '%s.xres' entry from %s using default %d", Section, cfg_source(), xres); + } + if (cfg_number(Section, "yres", 200, 32, 2048, &yres) < 1) { + info("[DRV_VNC] no '%s.yres' entry from %s using default %d", Section, cfg_source(), yres); + } + if (cfg_number(Section, "bpp", 4, 1, 4, &BPP) < 1) { + info("[DRV_VNC] no '%s.bpp' entry from %s using default %d", Section, cfg_source(), BPP); + } + return 0; +} + + +static int drv_vnc_close(void) +{ + rfbShutdownServer(server, TRUE); + free(server->frameBuffer); + return 0; +} + +static void drv_vnc_blit_it(const int row, const int col, const int height, const int width, unsigned char* buffer) +{ + int r, c, ofs; + RGBA p; + + for (r = row; r < row + height; r++) { + for (c = col; c < col + width; c++) { + p = drv_generic_graphic_rgb(r, c); + ofs = (r * xres + c) * BPP; + buffer[ofs++] = p.R; + buffer[ofs++] = p.G; + buffer[ofs++] = p.B; + buffer[ofs ] = 255; + } + } +} + +static void drv_vnc_blit(const int row, const int col, const int height, const int width) +{ + if (rfbIsActive(server)) { + //todo blit only if client are connected... + drv_vnc_blit_it(row, col, height, width, (unsigned char *)server->frameBuffer); + rfbMarkRectAsModified(server, 0, 0, xres, yres); + rfbProcessEvents(server, server->deferUpdateTime*1000); + } +} + +static void doptr(int buttonMask,int x,int y,rfbClientPtr cl) +{ + //printf("doptr\n"); +// ClientData* cd=cl->clientData; + + if(x>=0 && y>=0 && xdesktopName = "LCD4Linux VNC Driver"; + server->frameBuffer=(char*)malloc(xres*yres*BPP); + server->alwaysShared=(1==1); + server->ptrAddEvent = doptr; +// server->kbdAddEvent = dokey; + + /* Initialize the server */ + rfbInitServer(server); + + /* set width/height */ + DROWS = yres; + DCOLS = xres; + + return 0; +} + +/****************************************/ +/*** widget callbacks ***/ +/****************************************/ + + +/* using drv_generic_text_draw(W) */ +/* using drv_generic_text_icon_draw(W) */ +/* using drv_generic_text_bar_draw(W) */ +/* using drv_generic_gpio_draw(W) */ + + +/****************************************/ +/*** exported functions ***/ +/****************************************/ + + +/* list models */ +int drv_vnc_list(void) +{ + printf("vnc server"); + return 0; +} + + +/* initialize driver & display */ +int drv_vnc_init(const char *section, const int quiet) +{ + int ret; + + /* real worker functions */ + drv_generic_graphic_real_blit = drv_vnc_blit; + + /* start display */ + if ((ret = drv_vnc_start(section)) != 0) + return ret; + + /* initialize generic graphic driver */ + if ((ret = drv_generic_graphic_init(section, Name)) != 0) + return ret; + + if (!quiet) { + char buffer[40]; + qprintf(buffer, sizeof(buffer), "%s %dx%d", Name, DCOLS, DROWS); + if (drv_generic_graphic_greet(buffer, NULL)) { + sleep(3); + drv_generic_graphic_clear(); + } + } + + return 0; +} + + +/* close driver & display */ +int drv_vnc_quit(const int quiet) +{ + info("%s: shutting down.", Name); + + /* clear display */ + drv_generic_graphic_clear(); + + /* say goodbye... */ + if (!quiet) { + drv_generic_graphic_greet("goodbye!", NULL); + } + + drv_generic_graphic_quit(); + + debug("closing connection"); + drv_vnc_close(); + + return (0); +} + + +DRIVER drv_vnc = { + .name = Name, + .list = drv_vnc_list, + .init = drv_vnc_init, + .quit = drv_vnc_quit, +}; -- cgit v1.2.3