summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/frontend.h5
-rw-r--r--include/libnsfb.h11
-rw-r--r--include/libnsfb_event.h183
-rw-r--r--src/Makefile3
-rw-r--r--src/frontend.c10
-rw-r--r--src/frontend_able.c58
-rw-r--r--src/frontend_linux.c51
-rw-r--r--src/frontend_ram.c58
-rw-r--r--src/frontend_sdl.c473
-rw-r--r--src/frontend_vnc.c58
-rw-r--r--src/libnsfb.c17
-rw-r--r--test/frontend.c12
-rw-r--r--test/plottest.c14
13 files changed, 915 insertions, 38 deletions
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 <vince@simtec.co.uk>
+ *
+ * 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 <stdbool.h>
#include <stdio.h>
#include <unistd.h>
@@ -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 <vince@simtec.co.uk>
+ *
+ * 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 <stdbool.h>
+#include <stdio.h>
+
+#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 <vince@simtec.co.uk>
+ *
+ * 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 <stdbool.h>
+#include <stdio.h>
+
#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 <vince@simtec.co.uk>
+ *
+ * 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 <stdbool.h>
+#include <stdio.h>
+
+#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 <vince@simtec.co.uk>
+ *
+ * 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 <stdbool.h>
#include <SDL/SDL.h>
#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 <vince@simtec.co.uk>
+ *
+ * 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 <stdbool.h>
+#include <stdio.h>
+
+#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 <vince@simtec.co.uk>
+ *
+ * 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 <stdbool.h>
#include <stdio.h>
#include <malloc.h>
#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 <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
+#include <unistd.h>
#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;
}