From 81c0d52317d1180b2ecbe08b3229cc48d5256525 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Sat, 14 Feb 2009 16:39:27 +0000 Subject: Add VNC server framebuffer frontend svn path=/trunk/netsurf/; revision=6501 --- Makefile | 20 +++ Makefile.config | 1 + Makefile.sources | 3 + framebuffer/fb_frontend_vnc.c | 335 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 359 insertions(+) create mode 100644 framebuffer/fb_frontend_vnc.c diff --git a/Makefile b/Makefile index 79f8d7d9e..97ee478e4 100644 --- a/Makefile +++ b/Makefile @@ -534,6 +534,26 @@ ifeq ($(TARGET),framebuffer) LDFLAGS += $(shell $(PKG_CONFIG) --libs libxml-2.0 libcurl openssl) SUBTARGET := -sdl endif + + ifeq ($(NETSURF_FB_FRONTEND),vnc) + $(eval $(call pkg_config_find_and_add,RSVG,librsvg-2.0,SVG rendering)) + $(eval $(call pkg_config_find_and_add,ROSPRITE,librosprite,RISC OS sprite rendering)) + $(eval $(call pkg_config_find_and_add,HUBBUB,libhubbub,Hubbub HTML parser)) + $(eval $(call pkg_config_find_and_add,BMP,libnsbmp,NetSurf BMP decoder)) + $(eval $(call pkg_config_find_and_add,GIF,libnsgif,NetSurf GIF decoder)) +# $(eval $(call pkg_config_find_and_add,VNCSERVER,libvncserver,VNC server)) + + + CFLAGS += -std=c99 -g -I. $(WARNFLAGS) \ + $(shell xml2-config --cflags) \ + -D_BSD_SOURCE \ + -D_XOPEN_SOURCE=600 \ + -D_POSIX_C_SOURCE=200112L + + LDFLAGS += -lxml2 -lz -ljpeg -lcurl -lm -lvncserver + LDFLAGS += $(shell $(PKG_CONFIG) --libs libxml-2.0 libcurl openssl) + SUBTARGET := -vnc + endif endif # ---------------------------------------------------------------------------- diff --git a/Makefile.config b/Makefile.config index 0a17205f7..2bb64d974 100644 --- a/Makefile.config +++ b/Makefile.config @@ -218,6 +218,7 @@ ifeq ($(TARGET),framebuffer) NETSURF_FB_RESPATH_able := (tftpboot)/ NETSURF_FB_RESPATH_dummy := ./ NETSURF_FB_RESPATH_sdl := ./ + NETSURF_FB_RESPATH_vnc := /usr/share/netsurf/ endif diff --git a/Makefile.sources b/Makefile.sources index de730f785..9eeb767a5 100644 --- a/Makefile.sources +++ b/Makefile.sources @@ -114,6 +114,9 @@ endif ifeq ($(NETSURF_FB_FRONTEND),sdl) S_FRAMEBUFFER += fb_frontend_sdl.c endif +ifeq ($(NETSURF_FB_FRONTEND),vnc) +S_FRAMEBUFFER += fb_frontend_vnc.c +endif S_FRAMEBUFFER := $(addprefix framebuffer/,$(S_FRAMEBUFFER)) diff --git a/framebuffer/fb_frontend_vnc.c b/framebuffer/fb_frontend_vnc.c new file mode 100644 index 000000000..339439d55 --- /dev/null +++ b/framebuffer/fb_frontend_vnc.c @@ -0,0 +1,335 @@ +/* + * Copyright 2008 Vincent Sanders + * + * This file is part of NetSurf, http://www.netsurf-browser.org/ + * + * NetSurf 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; version 2 of the License. + * + * NetSurf 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, see . + */ + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "css/css.h" +#include "desktop/options.h" +#include "desktop/gui.h" +#include "desktop/options.h" +#include "utils/messages.h" +#include "desktop/history_core.h" + +#include "framebuffer/fb_gui.h" +#include "framebuffer/fb_plotters.h" +#include "framebuffer/fb_frontend.h" +#include "framebuffer/fb_cursor.h" +#include "framebuffer/fb_rootwindow.h" + +#include "utils/log.h" + +static rfbScreenInfoPtr vnc_screen; +static struct gui_window *cur_window; + +static void fb_vnc_doptr(int buttonMask,int x,int y,rfbClientPtr cl) +{ + struct gui_window *g = cur_window; + if (buttonMask == 0) { + fb_rootwindow_move(framebuffer, g, x, y, false); + } else { + + /* left button */ + /* if (buttonMask && 0x1) { + fb_rootwindow_click(g, BROWSER_MOUSE_PRESS_1, + fb_cursor_x(framebuffer), + fb_cursor_y(framebuffer)); + }*/ + if (buttonMask && 0x1) { + fb_rootwindow_click(g, BROWSER_MOUSE_CLICK_1, + fb_cursor_x(framebuffer), + fb_cursor_y(framebuffer)); + } + + /* right button */ + /*if (buttonMask && 0x4) { + fb_rootwindow_click(g, BROWSER_MOUSE_PRESS_2, + fb_cursor_x(framebuffer), + fb_cursor_y(framebuffer)); + }*/ + if (buttonMask && 0x4) { + fb_rootwindow_click(g, BROWSER_MOUSE_CLICK_2, + fb_cursor_x(framebuffer), + fb_cursor_y(framebuffer)); + } + + if (buttonMask && 0x8) { + /* wheelup */ + fb_window_scroll(g, 0, -100); + } + + if (buttonMask && 0x10) { + /* wheeldown */ + fb_window_scroll(g, 0, 100); + } + + + + /* + case SDL_MOUSEBUTTONUP: + switch (event.button.button) { + + case SDL_BUTTON_LEFT: + fb_rootwindow_click(g, BROWSER_MOUSE_CLICK_1, + fb_cursor_x(framebuffer), + fb_cursor_y(framebuffer)); + break; + + case SDL_BUTTON_RIGHT: + fb_rootwindow_click(g, BROWSER_MOUSE_CLICK_2, + fb_cursor_x(framebuffer), + fb_cursor_y(framebuffer)); + break; + + default: + printf("Mouse button %d pressed at (%d,%d)\n", + event.button.button, event.button.x, event.button.y); + + } + break; + */ + } +} + +static void fb_vnc_dokey(rfbBool down,rfbKeySym key,rfbClientPtr cl) +{ + struct gui_window *g = cur_window; + + LOG(("Processing keycode %d",key)); + if(down) { + switch (key) { + + case XK_Page_Down: + fb_window_scroll(g, 0, g->height); + break; + + case XK_Page_Up: + fb_window_scroll(g, 0, -g->height); + break; + + case XK_Down: + fb_window_scroll(g, 0, 100); + break; + + case XK_Up: + fb_window_scroll(g, 0, -100); + break; + + case XK_Escape: + browser_window_destroy(g->bw); + break; + + case XK_Left: + if (history_back_available(g->bw->history)) + history_back(g->bw, g->bw->history); + break; + + case XK_Right: + if (history_forward_available(g->bw->history)) + history_forward(g->bw, g->bw->history); + break; + + default: + fb_rootwindow_input(g, key); + break; + } + } +} + +framebuffer_t *fb_os_init(int argc, char** argv) +{ + framebuffer_t *newfb; + + newfb = calloc(1, sizeof(framebuffer_t)); + if (newfb == NULL) + return NULL; + + newfb->width = 800; + newfb->height = 600; + newfb->bpp = 32; + + vnc_screen = rfbGetScreen(&argc, argv, + newfb->width, newfb->height, + 8, 3, 4); + + vnc_screen->frameBuffer = malloc(newfb->width * newfb->height * 4); + + vnc_screen->serverFormat.trueColour=TRUE; + vnc_screen->serverFormat.redShift = 16; + vnc_screen->serverFormat.greenShift = 8; + vnc_screen->serverFormat.blueShift = 0; + + vnc_screen->alwaysShared = TRUE; + vnc_screen->ptrAddEvent = fb_vnc_doptr; + vnc_screen->kbdAddEvent = fb_vnc_dokey; + + rfbInitServer(vnc_screen); + + newfb->ptr = vnc_screen->frameBuffer; + newfb->linelen = newfb->width * 4; + + //rfbUndrawCursor(vnc_screen); + + return newfb; +} + +void fb_os_quit(framebuffer_t *fb) +{ +} + +void fb_os_input(struct gui_window *g, bool active) +{ + //SDL_Event event; + cur_window = g; + + if (active) + rfbProcessEvents(vnc_screen, 10000); + else + rfbProcessEvents(vnc_screen, 100000); + /* + switch (event.type) { + case SDL_KEYDOWN: + + switch (event.key.keysym.sym) { + + case SDLK_PAGEDOWN: + fb_window_scroll(g, 0, g->height); + break; + + case SDLK_PAGEUP: + fb_window_scroll(g, 0, -g->height); + break; + + case SDLK_DOWN: + fb_window_scroll(g, 0, 100); + break; + + case SDLK_UP: + fb_window_scroll(g, 0, -100); + break; + + case SDLK_ESCAPE: + browser_window_destroy(g->bw); + break; + + case SDLK_LEFT: + if (history_back_available(g->bw->history)) + history_back(g->bw, g->bw->history); + break; + + case SDLK_RIGHT: + if (history_forward_available(g->bw->history)) + history_forward(g->bw, g->bw->history); + break; + + default: + printf("The %s key was pressed!\n", + SDL_GetKeyName(event.key.keysym.sym)); + fb_rootwindow_input(g, event.key.keysym.sym); + break; + } + break; + + case SDL_MOUSEMOTION: + fb_rootwindow_move(framebuffer, g, event.motion.x, event.motion.y, false); + break; + + case SDL_MOUSEBUTTONDOWN: + switch (event.button.button) { + + case SDL_BUTTON_LEFT: + fb_rootwindow_click(g, BROWSER_MOUSE_PRESS_1, + fb_cursor_x(framebuffer), + fb_cursor_y(framebuffer)); + break; + + case SDL_BUTTON_RIGHT: + fb_rootwindow_click(g, BROWSER_MOUSE_PRESS_2, + fb_cursor_x(framebuffer), + fb_cursor_y(framebuffer)); + break; + + case SDL_BUTTON_WHEELUP: + fb_window_scroll(g, 0, -100); + break; + + case SDL_BUTTON_WHEELDOWN: + fb_window_scroll(g, 0, 100); + break; + + case SDL_BUTTON_MIDDLE: + default: + printf("Mouse button %d pressed at (%d,%d)\n", + event.button.button, event.button.x, event.button.y); + + } + break; + + case SDL_MOUSEBUTTONUP: + switch (event.button.button) { + + case SDL_BUTTON_LEFT: + fb_rootwindow_click(g, BROWSER_MOUSE_CLICK_1, + fb_cursor_x(framebuffer), + fb_cursor_y(framebuffer)); + break; + + case SDL_BUTTON_RIGHT: + fb_rootwindow_click(g, BROWSER_MOUSE_CLICK_2, + fb_cursor_x(framebuffer), + fb_cursor_y(framebuffer)); + break; + + default: + printf("Mouse button %d pressed at (%d,%d)\n", + event.button.button, event.button.x, event.button.y); + + } + break; + + case SDL_QUIT: + browser_window_destroy(g->bw); + } + */ +} + +void +fb_os_option_override(void) +{ +} + +/* called by generic code to inform os code of screen update */ +void +fb_os_redraw(struct bbox_s *box) +{ + rfbMarkRectAsModified(vnc_screen, box->x0, box->y0, box->x1, box->y1); +} + +/* + * Local Variables: + * c-basic-offset:8 + * End: + */ + -- cgit v1.2.3