From 2b23052622dc6d4effbeee4f079561343347ebf7 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Wed, 15 Apr 2009 11:33:03 +0000 Subject: add event interface svn path=/trunk/libnsfb/; revision=7088 --- include/frontend.h | 5 +- include/libnsfb.h | 11 +- include/libnsfb_event.h | 183 +++++++++++++++++++ src/Makefile | 3 +- src/frontend.c | 10 +- src/frontend_able.c | 58 ++++++ src/frontend_linux.c | 51 +++++- src/frontend_ram.c | 58 ++++++ src/frontend_sdl.c | 473 ++++++++++++++++++++++++++++++++++++++++++++++-- src/frontend_vnc.c | 58 ++++++ src/libnsfb.c | 17 +- test/frontend.c | 12 +- test/plottest.c | 14 +- 13 files changed, 915 insertions(+), 38 deletions(-) create mode 100644 include/libnsfb_event.h create mode 100644 src/frontend_able.c create mode 100644 src/frontend_ram.c create mode 100644 src/frontend_vnc.c diff --git a/include/frontend.h b/include/frontend.h index 5590543..9e5bedf 100644 --- a/include/frontend.h +++ b/include/frontend.h @@ -9,8 +9,10 @@ typedef int (nsfb_fendfn_defaults_t)(nsfb_t *nsfb); typedef int (nsfb_fendfn_init_t)(nsfb_t *nsfb); /* frontend finalise */ typedef int (nsfb_fendfn_fini_t)(nsfb_t *nsfb); +/* frontend set geometry */ +typedef int (nsfb_fendfn_geometry_t)(nsfb_t *nsfb, int width, int height, int bpp); /* frontend input */ -typedef int (nsfb_fendfn_input_t)(nsfb_t *nsfb); +typedef bool (nsfb_fendfn_input_t)(nsfb_t *nsfb, nsfb_event_t *event, int timeout); /* frontend area claim */ typedef int (nsfb_fendfn_claim_t)(nsfb_t *nsfb, nsfb_bbox_t *box); /* frontend area release */ @@ -20,6 +22,7 @@ typedef struct nsfb_frontend_rtns_s { nsfb_fendfn_defaults_t *defaults; nsfb_fendfn_init_t *initialise; nsfb_fendfn_fini_t *finalise; + nsfb_fendfn_geometry_t *geometry; nsfb_fendfn_input_t *input; nsfb_fendfn_claim_t *claim; nsfb_fendfn_release_t *release; diff --git a/include/libnsfb.h b/include/libnsfb.h index 8e07c7c..3236ea5 100644 --- a/include/libnsfb.h +++ b/include/libnsfb.h @@ -6,6 +6,7 @@ typedef struct nsfb_cursor_s nsfb_cursor_t; typedef struct nsfb_s nsfb_t; typedef uint32_t nsfb_colour_t; +typedef struct nsfb_event_s nsfb_event_t; /** bounding box for plotting operations */ typedef struct nsfb_bbox_s { @@ -19,10 +20,10 @@ typedef struct nsfb_bbox_s { enum nsfb_frontend_e { NSFB_FRONTEND_NONE = 0, /**< Empty frontend. */ NSFB_FRONTEND_SDL, /**< SDL frontend */ - NSFB_FRONTEND_LINUX, - NSFB_FRONTEND_VNC, - NSFB_FRONTEND_ABLE, - NSFB_FRONTEND_RAM, + NSFB_FRONTEND_LINUX, /**< Linux frontend */ + NSFB_FRONTEND_VNC, /**< VNC frontend */ + NSFB_FRONTEND_ABLE, /**< ABLE frontend */ + NSFB_FRONTEND_RAM, /**< RAM frontend */ }; /** Initialise nsfb context. @@ -57,7 +58,7 @@ enum nsfb_frontend_e nsfb_frontend_from_name(const char *name); /** Process input from a frontend. */ -int nsfb_input(nsfb_t *nsfb); +bool nsfb_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout); /** Claim an area of screen to be redrawn. * diff --git a/include/libnsfb_event.h b/include/libnsfb_event.h new file mode 100644 index 0000000..179f24b --- /dev/null +++ b/include/libnsfb_event.h @@ -0,0 +1,183 @@ +enum nsfb_event_type_e { + NSFB_EVENT_NONE, + NSFB_EVENT_CONTROL, + NSFB_EVENT_KEY_DOWN, + NSFB_EVENT_KEY_UP, + NSFB_EVENT_MOVE_RELATIVE, + NSFB_EVENT_MOVE_ABSOLUTE, +}; + + +enum nsfb_key_code_e { + /* keycodes which map to ascii chars */ + NSFB_KEY_UNKNOWN = 0, + NSFB_KEY_BACKSPACE = 8, + NSFB_KEY_TAB = 9, + NSFB_KEY_CLEAR = 12, + NSFB_KEY_RETURN = 13, + NSFB_KEY_PAUSE = 19, + NSFB_KEY_ESCAPE = 27, + NSFB_KEY_SPACE = 32, + NSFB_KEY_EXCLAIM = 33, + NSFB_KEY_QUOTEDBL = 34, + NSFB_KEY_HASH = 35, + NSFB_KEY_DOLLAR = 36, + NSFB_KEY_AMPERSAND = 38, + NSFB_KEY_QUOTE = 39, + NSFB_KEY_LEFTPAREN = 40, + NSFB_KEY_RIGHTPAREN = 41, + NSFB_KEY_ASTERISK = 42, + NSFB_KEY_PLUS = 43, + NSFB_KEY_COMMA = 44, + NSFB_KEY_MINUS = 45, + NSFB_KEY_PERIOD = 46, + NSFB_KEY_SLASH = 47, + NSFB_KEY_0 = 48, + NSFB_KEY_1 = 49, + NSFB_KEY_2 = 50, + NSFB_KEY_3 = 51, + NSFB_KEY_4 = 52, + NSFB_KEY_5 = 53, + NSFB_KEY_6 = 54, + NSFB_KEY_7 = 55, + NSFB_KEY_8 = 56, + NSFB_KEY_9 = 57, + NSFB_KEY_COLON = 58, + NSFB_KEY_SEMICOLON = 59, + NSFB_KEY_LESS = 60, + NSFB_KEY_EQUALS = 61, + NSFB_KEY_GREATER = 62, + NSFB_KEY_QUESTION = 63, + NSFB_KEY_AT = 64, + NSFB_KEY_LEFTBRACKET = 91, + NSFB_KEY_BACKSLASH = 92, + NSFB_KEY_RIGHTBRACKET = 93, + NSFB_KEY_CARET = 94, + NSFB_KEY_UNDERSCORE = 95, + NSFB_KEY_BACKQUOTE = 96, + NSFB_KEY_a = 97, + NSFB_KEY_b = 98, + NSFB_KEY_c = 99, + NSFB_KEY_d = 100, + NSFB_KEY_e = 101, + NSFB_KEY_f = 102, + NSFB_KEY_g = 103, + NSFB_KEY_h = 104, + NSFB_KEY_i = 105, + NSFB_KEY_j = 106, + NSFB_KEY_k = 107, + NSFB_KEY_l = 108, + NSFB_KEY_m = 109, + NSFB_KEY_n = 110, + NSFB_KEY_o = 111, + NSFB_KEY_p = 112, + NSFB_KEY_q = 113, + NSFB_KEY_r = 114, + NSFB_KEY_s = 115, + NSFB_KEY_t = 116, + NSFB_KEY_u = 117, + NSFB_KEY_v = 118, + NSFB_KEY_w = 119, + NSFB_KEY_x = 120, + NSFB_KEY_y = 121, + NSFB_KEY_z = 122, + NSFB_KEY_DELETE = 127, + + NSFB_KEY_KP0 = 256, + NSFB_KEY_KP1 = 257, + NSFB_KEY_KP2 = 258, + NSFB_KEY_KP3 = 259, + NSFB_KEY_KP4 = 260, + NSFB_KEY_KP5 = 261, + NSFB_KEY_KP6 = 262, + NSFB_KEY_KP7 = 263, + NSFB_KEY_KP8 = 264, + NSFB_KEY_KP9 = 265, + NSFB_KEY_KP_PERIOD = 266, + NSFB_KEY_KP_DIVIDE = 267, + NSFB_KEY_KP_MULTIPLY = 268, + NSFB_KEY_KP_MINUS = 269, + NSFB_KEY_KP_PLUS = 270, + NSFB_KEY_KP_ENTER = 271, + NSFB_KEY_KP_EQUALS = 272, + + NSFB_KEY_UP = 273, + NSFB_KEY_DOWN = 274, + NSFB_KEY_RIGHT = 275, + NSFB_KEY_LEFT = 276, + NSFB_KEY_INSERT = 277, + NSFB_KEY_HOME = 278, + NSFB_KEY_END = 279, + NSFB_KEY_PAGEUP = 280, + NSFB_KEY_PAGEDOWN = 281, + + /* Function keys */ + NSFB_KEY_F1 = 282, + NSFB_KEY_F2 = 283, + NSFB_KEY_F3 = 284, + NSFB_KEY_F4 = 285, + NSFB_KEY_F5 = 286, + NSFB_KEY_F6 = 287, + NSFB_KEY_F7 = 288, + NSFB_KEY_F8 = 289, + NSFB_KEY_F9 = 290, + NSFB_KEY_F10 = 291, + NSFB_KEY_F11 = 292, + NSFB_KEY_F12 = 293, + NSFB_KEY_F13 = 294, + NSFB_KEY_F14 = 295, + NSFB_KEY_F15 = 296, + + /* Key state modifier keys */ + NSFB_KEY_NUMLOCK = 300, + NSFB_KEY_CAPSLOCK = 301, + NSFB_KEY_SCROLLOCK = 302, + NSFB_KEY_RSHIFT = 303, + NSFB_KEY_LSHIFT = 304, + NSFB_KEY_RCTRL = 305, + NSFB_KEY_LCTRL = 306, + NSFB_KEY_RALT = 307, + NSFB_KEY_LALT = 308, + NSFB_KEY_RMETA = 309, + NSFB_KEY_LMETA = 310, + NSFB_KEY_LSUPER = 311, + NSFB_KEY_RSUPER = 312, + NSFB_KEY_MODE = 313, + NSFB_KEY_COMPOSE = 314, + + /* Miscellaneous function keys */ + NSFB_KEY_HELP = 315, + NSFB_KEY_PRINT = 316, + NSFB_KEY_SYSREQ = 317, + NSFB_KEY_BREAK = 318, + NSFB_KEY_MENU = 319, + NSFB_KEY_POWER = 320, + NSFB_KEY_EURO = 321, + NSFB_KEY_UNDO = 322, + + /* mouse keys */ + NSFB_KEY_MOUSE_1 = 401, + NSFB_KEY_MOUSE_2 = 402, + NSFB_KEY_MOUSE_3 = 403, + NSFB_KEY_MOUSE_4 = 404, + NSFB_KEY_MOUSE_5 = 405, + +}; + +enum nsfb_control_e { + NSFB_CONTROL_NONE, + NSFB_CONTROL_QUIT, +}; + +struct nsfb_event_s { + enum nsfb_event_type_e type; + union { + enum nsfb_key_code_e keycode; + enum nsfb_control_e controlcode; + struct { + int x; + int y; + int z; + } vector; + } value; +}; diff --git a/src/Makefile b/src/Makefile index ebf9996..bb142d0 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,6 +1,5 @@ # Sources -DIR_SOURCES := libnsfb.c frontend.c frontend_sdl.c plot.c plot_util.c plotters.c 32bpp_plotters.c 16bpp_plotters.c 8bpp_plotters.c +DIR_SOURCES := libnsfb.c frontend.c frontend_sdl.c frontend_linux.c frontend_vnc.c frontend_able.c frontend_ram.c plot.c plot_util.c plotters.c 32bpp_plotters.c 16bpp_plotters.c 8bpp_plotters.c -#frontend_linux.c include build/makefiles/Makefile.subdir diff --git a/src/frontend.c b/src/frontend.c index efc1d58..68edb9e 100644 --- a/src/frontend.c +++ b/src/frontend.c @@ -1,3 +1,11 @@ +/* + * Copyright 2009 Vincent Sanders + * + * This file is part of libnsfb, http://www.netsurf-browser.org/ + * Licenced under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + */ + #include #include #include @@ -37,7 +45,7 @@ static int frontend_defaults(nsfb_t *nsfb) { nsfb->width = 800; nsfb->height = 600; - nsfb->bpp = 8; + nsfb->bpp = 16; /* select plotters for bpp */ select_plotters(nsfb); diff --git a/src/frontend_able.c b/src/frontend_able.c new file mode 100644 index 0000000..0e92104 --- /dev/null +++ b/src/frontend_able.c @@ -0,0 +1,58 @@ +/* + * Copyright 2009 Vincent Sanders + * + * This file is part of libnsfb, http://www.netsurf-browser.org/ + * Licenced under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + */ + +#include +#include + +#include "libnsfb.h" +#include "libnsfb_event.h" +#include "nsfb.h" +#include "frontend.h" + +#define UNUSED(x) ((x) = (x)) + +static int able_set_geometry(nsfb_t *nsfb, int width, int height, int bpp) +{ + if (nsfb->frontend_priv != NULL) + return -1; /* if were already initialised fail */ + + nsfb->width = width; + nsfb->height = height; + nsfb->bpp = bpp; + + return 0; +} + +static int able_initialise(nsfb_t *nsfb) +{ + UNUSED(nsfb); + return 0; +} + +static int able_finalise(nsfb_t *nsfb) +{ + UNUSED(nsfb); + return 0; +} + +static bool able_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout) +{ + UNUSED(nsfb); + UNUSED(event); + UNUSED(timeout); + return false; +} + +const nsfb_frontend_rtns_t able_rtns = { + .initialise = able_initialise, + .finalise = able_finalise, + .input = able_input, + .geometry = able_set_geometry, +}; + +NSFB_FRONTEND_DEF(able, NSFB_FRONTEND_ABLE, &able_rtns) diff --git a/src/frontend_linux.c b/src/frontend_linux.c index ad95542..3790a76 100644 --- a/src/frontend_linux.c +++ b/src/frontend_linux.c @@ -1,9 +1,58 @@ +/* + * Copyright 2009 Vincent Sanders + * + * This file is part of libnsfb, http://www.netsurf-browser.org/ + * Licenced under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + */ + +#include +#include + #include "libnsfb.h" +#include "libnsfb_event.h" #include "nsfb.h" #include "frontend.h" +#define UNUSED(x) ((x) = (x)) + +static int linux_set_geometry(nsfb_t *nsfb, int width, int height, int bpp) +{ + if (nsfb->frontend_priv != NULL) + return -1; /* if were already initialised fail */ + + nsfb->width = width; + nsfb->height = height; + nsfb->bpp = bpp; + + return 0; +} + +static int linux_initialise(nsfb_t *nsfb) +{ + UNUSED(nsfb); + return 0; +} + +static int linux_finalise(nsfb_t *nsfb) +{ + UNUSED(nsfb); + return 0; +} + +static bool linux_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout) +{ + UNUSED(nsfb); + UNUSED(event); + UNUSED(timeout); + return false; +} + const nsfb_frontend_rtns_t linux_rtns = { - .foo = 2, + .initialise = linux_initialise, + .finalise = linux_finalise, + .input = linux_input, + .geometry = linux_set_geometry, }; NSFB_FRONTEND_DEF(linux, NSFB_FRONTEND_LINUX, &linux_rtns) diff --git a/src/frontend_ram.c b/src/frontend_ram.c new file mode 100644 index 0000000..82cb29b --- /dev/null +++ b/src/frontend_ram.c @@ -0,0 +1,58 @@ +/* + * Copyright 2009 Vincent Sanders + * + * This file is part of libnsfb, http://www.netsurf-browser.org/ + * Licenced under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + */ + +#include +#include + +#include "libnsfb.h" +#include "libnsfb_event.h" +#include "nsfb.h" +#include "frontend.h" + +#define UNUSED(x) ((x) = (x)) + +static int ram_set_geometry(nsfb_t *nsfb, int width, int height, int bpp) +{ + if (nsfb->frontend_priv != NULL) + return -1; /* if were already initialised fail */ + + nsfb->width = width; + nsfb->height = height; + nsfb->bpp = bpp; + + return 0; +} + +static int ram_initialise(nsfb_t *nsfb) +{ + UNUSED(nsfb); + return 0; +} + +static int ram_finalise(nsfb_t *nsfb) +{ + UNUSED(nsfb); + return 0; +} + +static bool ram_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout) +{ + UNUSED(nsfb); + UNUSED(event); + UNUSED(timeout); + return false; +} + +const nsfb_frontend_rtns_t ram_rtns = { + .initialise = ram_initialise, + .finalise = ram_finalise, + .input = ram_input, + .geometry = ram_set_geometry, +}; + +NSFB_FRONTEND_DEF(ram, NSFB_FRONTEND_RAM, &ram_rtns) diff --git a/src/frontend_sdl.c b/src/frontend_sdl.c index e082e56..82342d3 100644 --- a/src/frontend_sdl.c +++ b/src/frontend_sdl.c @@ -1,10 +1,346 @@ +/* + * Copyright 2009 Vincent Sanders + * + * This file is part of libnsfb, http://www.netsurf-browser.org/ + * Licenced under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + */ +#include #include #include "libnsfb.h" +#include "libnsfb_event.h" #include "nsfb.h" #include "frontend.h" +enum nsfb_key_code_e sdl_nsfb_map[] = { + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_BACKSPACE, + NSFB_KEY_TAB, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_CLEAR, + NSFB_KEY_RETURN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_PAUSE, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_ESCAPE, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_SPACE, + NSFB_KEY_EXCLAIM, + NSFB_KEY_QUOTEDBL, + NSFB_KEY_HASH, + NSFB_KEY_DOLLAR, + NSFB_KEY_UNKNOWN, + NSFB_KEY_AMPERSAND, + NSFB_KEY_QUOTE, + NSFB_KEY_LEFTPAREN, + NSFB_KEY_RIGHTPAREN, + NSFB_KEY_ASTERISK, + NSFB_KEY_PLUS, + NSFB_KEY_COMMA, + NSFB_KEY_MINUS, + NSFB_KEY_PERIOD, + NSFB_KEY_SLASH, + NSFB_KEY_0, + NSFB_KEY_1, + NSFB_KEY_2, + NSFB_KEY_3, + NSFB_KEY_4, + NSFB_KEY_5, + NSFB_KEY_6, + NSFB_KEY_7, + NSFB_KEY_8, + NSFB_KEY_9, + NSFB_KEY_COLON, + NSFB_KEY_SEMICOLON, + NSFB_KEY_LESS, + NSFB_KEY_EQUALS, + NSFB_KEY_GREATER, + NSFB_KEY_QUESTION, + NSFB_KEY_AT, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_LEFTBRACKET, + NSFB_KEY_BACKSLASH, + NSFB_KEY_RIGHTBRACKET, + NSFB_KEY_CARET, + NSFB_KEY_UNDERSCORE, + NSFB_KEY_BACKQUOTE, + NSFB_KEY_a, + NSFB_KEY_b, + NSFB_KEY_c, + NSFB_KEY_d, + NSFB_KEY_e, + NSFB_KEY_f, + NSFB_KEY_g, + NSFB_KEY_h, + NSFB_KEY_i, + NSFB_KEY_j, + NSFB_KEY_k, + NSFB_KEY_l, + NSFB_KEY_m, + NSFB_KEY_n, + NSFB_KEY_o, + NSFB_KEY_p, + NSFB_KEY_q, + NSFB_KEY_r, + NSFB_KEY_s, + NSFB_KEY_t, + NSFB_KEY_u, + NSFB_KEY_v, + NSFB_KEY_w, + NSFB_KEY_x, + NSFB_KEY_y, + NSFB_KEY_z, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_DELETE, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_KP0, + NSFB_KEY_KP1, + NSFB_KEY_KP2, + NSFB_KEY_KP3, + NSFB_KEY_KP4, + NSFB_KEY_KP5, + NSFB_KEY_KP6, + NSFB_KEY_KP7, + NSFB_KEY_KP8, + NSFB_KEY_KP9, + NSFB_KEY_KP_PERIOD, + NSFB_KEY_KP_DIVIDE, + NSFB_KEY_KP_MULTIPLY, + NSFB_KEY_KP_MINUS, + NSFB_KEY_KP_PLUS, + NSFB_KEY_KP_ENTER, + NSFB_KEY_KP_EQUALS, + NSFB_KEY_UP, + NSFB_KEY_DOWN, + NSFB_KEY_RIGHT, + NSFB_KEY_LEFT, + NSFB_KEY_INSERT, + NSFB_KEY_HOME, + NSFB_KEY_END, + NSFB_KEY_PAGEUP, + NSFB_KEY_PAGEDOWN, + NSFB_KEY_F1, + NSFB_KEY_F2, + NSFB_KEY_F3, + NSFB_KEY_F4, + NSFB_KEY_F5, + NSFB_KEY_F6, + NSFB_KEY_F7, + NSFB_KEY_F8, + NSFB_KEY_F9, + NSFB_KEY_F10, + NSFB_KEY_F11, + NSFB_KEY_F12, + NSFB_KEY_F13, + NSFB_KEY_F14, + NSFB_KEY_F15, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_UNKNOWN, + NSFB_KEY_NUMLOCK, + NSFB_KEY_CAPSLOCK, + NSFB_KEY_SCROLLOCK, + NSFB_KEY_RSHIFT, + NSFB_KEY_LSHIFT, + NSFB_KEY_RCTRL, + NSFB_KEY_LCTRL, + NSFB_KEY_RALT, + NSFB_KEY_LALT, + NSFB_KEY_RMETA, + NSFB_KEY_LMETA, + NSFB_KEY_LSUPER, + NSFB_KEY_RSUPER, + NSFB_KEY_MODE, + NSFB_KEY_COMPOSE, + NSFB_KEY_HELP, + NSFB_KEY_PRINT, + NSFB_KEY_SYSREQ, + NSFB_KEY_BREAK, + NSFB_KEY_MENU, + NSFB_KEY_POWER, + NSFB_KEY_EURO, + NSFB_KEY_UNDO, +}; + + static void set_palette(nsfb_t *nsfb) { @@ -20,8 +356,8 @@ set_palette(nsfb_t *nsfb) palette[loop].r = (rloop << 5) | (rloop << 2) | (rloop >> 1); palette[loop].g = (gloop << 5) | (gloop << 2) | (gloop >> 1); palette[loop].b = (bloop << 6) | (bloop << 4) | (bloop << 2) | (bloop); - nsfb->palette[loop] = palette[loop].r | - palette[loop].g << 8 | + nsfb->palette[loop] = palette[loop].r | + palette[loop].g << 8 | palette[loop].b << 16; loop++; } @@ -33,6 +369,18 @@ set_palette(nsfb_t *nsfb) } +static int sdl_set_geometry(nsfb_t *nsfb, int width, int height, int bpp) +{ + if (nsfb->frontend_priv != NULL) + return -1; /* if were already initialised fail */ + + nsfb->width = width; + nsfb->height = height; + nsfb->bpp = bpp; + + return 0; +} + static int sdl_initialise(nsfb_t *nsfb) { SDL_Surface *sdl_screen; @@ -42,7 +390,7 @@ static int sdl_initialise(nsfb_t *nsfb) /* sanity checked depth. */ if ((nsfb->bpp != 32) && (nsfb->bpp != 16) && (nsfb->bpp != 8)) - nsfb->bpp = 16; + nsfb->bpp = 16; /* initialise SDL library */ if (SDL_Init(SDL_INIT_VIDEO) < 0 ) { @@ -51,9 +399,9 @@ static int sdl_initialise(nsfb_t *nsfb) } atexit(SDL_Quit); - sdl_screen = SDL_SetVideoMode(nsfb->width, - nsfb->height, - nsfb->bpp, + sdl_screen = SDL_SetVideoMode(nsfb->width, + nsfb->height, + nsfb->bpp, SDL_SWSURFACE); if (sdl_screen == NULL ) { @@ -68,7 +416,7 @@ static int sdl_initialise(nsfb_t *nsfb) nsfb->ptr = sdl_screen->pixels; nsfb->linelen = sdl_screen->pitch; - + SDL_ShowCursor(SDL_DISABLE); return 0; @@ -80,26 +428,114 @@ static int sdl_finalise(nsfb_t *nsfb) return 0; } -static int sdl_input(nsfb_t *nsfb) +static bool sdl_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout) { int got_event; - SDL_Event event; + SDL_Event sdlevent; - got_event = SDL_WaitEvent(&event); - if (event.type == SDL_QUIT) - exit(0); - nsfb=nsfb; - return 1; + nsfb=nsfb; /* unused */ + + if (timeout < 0) + got_event = SDL_WaitEvent(&sdlevent); + else + got_event = SDL_PollEvent(&sdlevent); + + /* Do nothing if there was no event */ + if (got_event == 0) + return false; + + event->type = NSFB_EVENT_NONE; + + switch (sdlevent.type) { + case SDL_KEYDOWN: + event->type = NSFB_EVENT_KEY_DOWN; + event->value.keycode = sdl_nsfb_map[sdlevent.key.keysym.sym]; + break; + + case SDL_KEYUP: + event->type = NSFB_EVENT_KEY_UP; + event->value.keycode = sdl_nsfb_map[sdlevent.key.keysym.sym]; + break; + + case SDL_MOUSEBUTTONDOWN: + event->type = NSFB_EVENT_KEY_DOWN; + + switch (sdlevent.button.button) { + + case SDL_BUTTON_LEFT: + event->value.keycode = NSFB_KEY_MOUSE_1; + break; + + case SDL_BUTTON_MIDDLE: + event->value.keycode = NSFB_KEY_MOUSE_2; + break; + + case SDL_BUTTON_RIGHT: + event->value.keycode = NSFB_KEY_MOUSE_3; + break; + + case SDL_BUTTON_WHEELUP: + event->value.keycode = NSFB_KEY_MOUSE_4; + break; + + case SDL_BUTTON_WHEELDOWN: + event->value.keycode = NSFB_KEY_MOUSE_5; + break; + } + break; + + case SDL_MOUSEBUTTONUP: + event->type = NSFB_EVENT_KEY_UP; + + switch (sdlevent.button.button) { + + case SDL_BUTTON_LEFT: + event->value.keycode = NSFB_KEY_MOUSE_1; + break; + + case SDL_BUTTON_MIDDLE: + event->value.keycode = NSFB_KEY_MOUSE_2; + break; + + case SDL_BUTTON_RIGHT: + event->value.keycode = NSFB_KEY_MOUSE_3; + break; + + case SDL_BUTTON_WHEELUP: + event->value.keycode = NSFB_KEY_MOUSE_4; + break; + + case SDL_BUTTON_WHEELDOWN: + event->value.keycode = NSFB_KEY_MOUSE_5; + break; + } + break; + + case SDL_MOUSEMOTION: + event->type = NSFB_EVENT_MOVE_ABSOLUTE; + event->value.vector.x = sdlevent.motion.x; + event->value.vector.y = sdlevent.motion.y; + event->value.vector.z = 0; + break; + + case SDL_QUIT: + event->type = NSFB_EVENT_CONTROL; + event->value.controlcode = NSFB_CONTROL_QUIT; + break; + + } + + return true; } static int sdl_release(nsfb_t *nsfb, nsfb_bbox_t *box) { SDL_Surface *sdl_screen = nsfb->frontend_priv; - SDL_UpdateRect(sdl_screen, - box->x0, - box->y0, - box->x1 - box->x0, + SDL_UpdateRect(sdl_screen, + box->x0, + box->y0, + box->x1 - box->x0, box->y1 - box->y0); return 0; @@ -110,6 +546,7 @@ const nsfb_frontend_rtns_t sdl_rtns = { .finalise = sdl_finalise, .input = sdl_input, .release = sdl_release, + .geometry = sdl_set_geometry, }; NSFB_FRONTEND_DEF(sdl, NSFB_FRONTEND_SDL, &sdl_rtns) diff --git a/src/frontend_vnc.c b/src/frontend_vnc.c new file mode 100644 index 0000000..46040b2 --- /dev/null +++ b/src/frontend_vnc.c @@ -0,0 +1,58 @@ +/* + * Copyright 2009 Vincent Sanders + * + * This file is part of libnsfb, http://www.netsurf-browser.org/ + * Licenced under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + */ + +#include +#include + +#include "libnsfb.h" +#include "libnsfb_event.h" +#include "nsfb.h" +#include "frontend.h" + +#define UNUSED(x) ((x) = (x)) + +static int vnc_set_geometry(nsfb_t *nsfb, int width, int height, int bpp) +{ + if (nsfb->frontend_priv != NULL) + return -1; /* if were already initialised fail */ + + nsfb->width = width; + nsfb->height = height; + nsfb->bpp = bpp; + + return 0; +} + +static int vnc_initialise(nsfb_t *nsfb) +{ + UNUSED(nsfb); + return 0; +} + +static int vnc_finalise(nsfb_t *nsfb) +{ + UNUSED(nsfb); + return 0; +} + +static bool vnc_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout) +{ + UNUSED(nsfb); + UNUSED(event); + UNUSED(timeout); + return false; +} + +const nsfb_frontend_rtns_t vnc_rtns = { + .initialise = vnc_initialise, + .finalise = vnc_finalise, + .input = vnc_input, + .geometry = vnc_set_geometry, +}; + +NSFB_FRONTEND_DEF(vnc, NSFB_FRONTEND_VNC, &vnc_rtns) diff --git a/src/libnsfb.c b/src/libnsfb.c index d54c787..172b554 100644 --- a/src/libnsfb.c +++ b/src/libnsfb.c @@ -1,11 +1,20 @@ +/* + * Copyright 2009 Vincent Sanders + * + * This file is part of libnsfb, http://www.netsurf-browser.org/ + * Licenced under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + */ + +#include #include #include #include "libnsfb.h" +#include "libnsfb_event.h" #include "nsfb.h" #include "frontend.h" - /* documented in libnsfb.h */ nsfb_t* nsfb_init(const enum nsfb_frontend_e frontend_type) @@ -42,9 +51,9 @@ nsfb_init_frontend(nsfb_t *nsfb) return nsfb->frontend_rtns->initialise(nsfb); } -int nsfb_input(nsfb_t *nsfb) +bool nsfb_input(nsfb_t *nsfb, nsfb_event_t *event, int timeout) { - return nsfb->frontend_rtns->input(nsfb); + return nsfb->frontend_rtns->input(nsfb, event, timeout); } int nsfb_claim(nsfb_t *nsfb, nsfb_bbox_t *box) @@ -67,6 +76,8 @@ int nsfb_set_geometry(nsfb_t *nsfb, int width, int height, int bpp) if ((bpp != 32) && (bpp != 16) && (bpp != 8)) bpp = nsfb->bpp; + + return nsfb->frontend_rtns->geometry(nsfb, width, height, bpp); } int nsfb_get_geometry(nsfb_t *nsfb, int *width, int *height, int *bpp) diff --git a/test/frontend.c b/test/frontend.c index bdc8d67..3d72229 100644 --- a/test/frontend.c +++ b/test/frontend.c @@ -1,8 +1,10 @@ #include #include #include +#include #include "libnsfb.h" + int main(int argc, char **argv) { nsfb_t *nsfb; @@ -27,12 +29,20 @@ int main(int argc, char **argv) return 2; } + if (nsfb_set_geometry(nsfb, 0, 0, 32) == -1) { + fprintf(stderr, "Unable to set geometry\n"); + nsfb_finalise(nsfb); + return 3; + } + if (nsfb_init_frontend(nsfb) == -1) { fprintf(stderr, "Unable to initialise nsfb frontend\n"); nsfb_finalise(nsfb); - return 3; + return 4; } + sleep(2); + nsfb_finalise(nsfb); return 0; } diff --git a/test/plottest.c b/test/plottest.c index dc469f6..522cf82 100644 --- a/test/plottest.c +++ b/test/plottest.c @@ -4,14 +4,15 @@ #include "libnsfb.h" #include "libnsfb_plot.h" +#include "libnsfb_event.h" #define UNUSED(x) ((x) = (x)) extern const struct { - unsigned int width; - unsigned int height; - unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */ - unsigned char pixel_data[132 * 135 * 4 + 1]; + unsigned int width; + unsigned int height; + unsigned int bytes_per_pixel; /* 3:RGB, 4:RGBA */ + unsigned char pixel_data[132 * 135 * 4 + 1]; } nsglobe; const struct { @@ -67,6 +68,7 @@ const struct { int main(int argc, char **argv) { nsfb_t *nsfb; + nsfb_event_t event; nsfb_bbox_t box; nsfb_bbox_t box2; nsfb_bbox_t box3; @@ -240,8 +242,8 @@ int main(int argc, char **argv) } - while (true ) - nsfb_input(nsfb); + while (event.type != NSFB_EVENT_CONTROL) + nsfb_input(nsfb, &event, -1); return 0; } -- cgit v1.2.3