summaryrefslogtreecommitdiff
path: root/navit/graphics/sdl/graphics_sdl.c
diff options
context:
space:
mode:
Diffstat (limited to 'navit/graphics/sdl/graphics_sdl.c')
-rw-r--r--navit/graphics/sdl/graphics_sdl.c1654
1 files changed, 751 insertions, 903 deletions
diff --git a/navit/graphics/sdl/graphics_sdl.c b/navit/graphics/sdl/graphics_sdl.c
index b1a9c17b9..4187d4ed6 100644
--- a/navit/graphics/sdl/graphics_sdl.c
+++ b/navit/graphics/sdl/graphics_sdl.c
@@ -34,7 +34,7 @@
#include "callback.h"
#include "font/freetype/font_freetype.h"
-#include <SDL/SDL.h>
+#include "SDL.h"
#include <math.h>
#ifdef USE_WEBOS
@@ -56,7 +56,7 @@
#include "raster.h"
#include <event.h>
-#include <SDL/SDL_image.h>
+#include "SDL_image.h"
#include <alloca.h>
/* TODO: union overlay + non-overlay to reduce size */
@@ -182,23 +182,18 @@ struct graphics_image_priv {
};
-static void
-graphics_destroy(struct graphics_priv *gr)
-{
- dbg(lvl_debug, "graphics_destroy %p %u\n", gr, gr->overlay_mode);
+static void graphics_destroy(struct graphics_priv *gr) {
+ dbg(lvl_debug, "graphics_destroy %p %u", gr, gr->overlay_mode);
- if(gr->overlay_mode)
- {
+ if(gr->overlay_mode) {
SDL_FreeSurface(gr->screen);
gr->overlay_parent->overlay_array[gr->overlay_idx] = NULL;
- }
- else
- {
- g_free (ft_buffer);
- gr->freetype_methods.destroy();
+ } else {
+ g_free (ft_buffer);
+ gr->freetype_methods.destroy();
#ifdef USE_WEBOS_ACCELEROMETER
- SDL_JoystickClose(gr->accelerometer);
+ SDL_JoystickClose(gr->accelerometer);
#endif
#ifdef USE_WEBOS
PDL_Quit();
@@ -211,39 +206,29 @@ graphics_destroy(struct graphics_priv *gr)
/* graphics_gc */
-static void
-gc_destroy(struct graphics_gc_priv *gc)
-{
+static void gc_destroy(struct graphics_gc_priv *gc) {
g_free(gc);
}
-static void
-gc_set_linewidth(struct graphics_gc_priv *gc, int w)
-{
- dbg(lvl_debug, "gc_set_linewidth %p %d\n", gc, w);
+static void gc_set_linewidth(struct graphics_gc_priv *gc, int w) {
+ dbg(lvl_debug, "gc_set_linewidth %p %d", gc, w);
gc->linewidth = w;
}
-static void
-gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n)
-{
+static void gc_set_dashes(struct graphics_gc_priv *gc, int w, int offset, unsigned char *dash_list, int n) {
/* TODO */
}
-static void
-gc_set_foreground(struct graphics_gc_priv *gc, struct color *c)
-{
- dbg(lvl_debug, "gc_set_foreground: %p %d %d %d %d\n", gc, c->a, c->r, c->g, c->b);
+static void gc_set_foreground(struct graphics_gc_priv *gc, struct color *c) {
+ dbg(lvl_debug, "gc_set_foreground: %p %d %d %d %d", gc, c->a, c->r, c->g, c->b);
gc->fore_r = c->r/256;
gc->fore_g = c->g/256;
gc->fore_b = c->b/256;
gc->fore_a = c->a/256;
}
-static void
-gc_set_background(struct graphics_gc_priv *gc, struct color *c)
-{
- dbg(lvl_debug, "gc_set_background: %p %d %d %d %d\n", gc, c->a, c->r, c->g, c->b);
+static void gc_set_background(struct graphics_gc_priv *gc, struct color *c) {
+ dbg(lvl_debug, "gc_set_background: %p %d %d %d %d", gc, c->a, c->r, c->g, c->b);
gc->back_r = c->r/256;
gc->back_g = c->g/256;
gc->back_b = c->b/256;
@@ -258,8 +243,7 @@ static struct graphics_gc_methods gc_methods = {
gc_set_background
};
-static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth)
-{
+static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics_gc_methods *meth) {
struct graphics_gc_priv *gc=g_new0(struct graphics_gc_priv, 1);
*meth=gc_methods;
gc->gr=gr;
@@ -268,18 +252,15 @@ static struct graphics_gc_priv *gc_new(struct graphics_priv *gr, struct graphics
}
-static struct graphics_image_priv *
-image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *name, int *w, int *h,
- struct point *hot, int rotation)
-{
+static struct graphics_image_priv *image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *name,
+ int *w, int *h, struct point *hot, int rotation) {
struct graphics_image_priv *gi;
/* FIXME: meth is not used yet.. so gi leaks. at least xpm is small */
gi = g_new0(struct graphics_image_priv, 1);
gi->img = IMG_Load(name);
- if(gi->img)
- {
+ if(gi->img) {
/* TBD: improves blit performance? */
#if !SDL_VERSION_ATLEAST(1,3,0)
SDL_SetColorKey(gi->img, SDL_RLEACCEL, gi->img->format->colorkey);
@@ -288,11 +269,9 @@ image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *n
*h=gi->img->h;
hot->x=*w/2;
hot->y=*h/2;
- }
- else
- {
+ } else {
/* TODO: debug "colour parse errors" on xpm */
- dbg(lvl_error,"image_new on '%s' failed: %s\n", name, IMG_GetError());
+ dbg(lvl_error,"image_new on '%s' failed: %s", name, IMG_GetError());
g_free(gi);
gi = NULL;
}
@@ -300,19 +279,15 @@ image_new(struct graphics_priv *gr, struct graphics_image_methods *meth, char *n
return gi;
}
-static void
-image_free(struct graphics_priv *gr, struct graphics_image_priv * gi)
-{
+static void image_free(struct graphics_priv *gr, struct graphics_image_priv * gi) {
SDL_FreeSurface(gi->img);
g_free(gi);
}
-static void
-draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count)
-{
- if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) )
- {
- return;
+static void draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) {
+ if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent
+ && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) {
+ return;
}
Sint16 *vx, *vy;
@@ -322,106 +297,90 @@ draw_polygon(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point
vx = alloca(count * sizeof(Sint16));
vy = alloca(count * sizeof(Sint16));
- for(i = 0; i < count; i++)
- {
+ for(i = 0; i < count; i++) {
x = (Sint16)p[i].x;
y = (Sint16)p[i].y;
vx[i] = x;
vy[i] = y;
- dbg(lvl_debug, "draw_polygon: %p %i %d,%d\n", gc, i, p[i].x, p[i].y);
+ dbg(lvl_debug, "draw_polygon: %p %i %d,%d", gc, i, p[i].x, p[i].y);
}
- if(gr->aa)
- {
+ if(gr->aa) {
raster_aapolygon(gr->screen, count, vx, vy,
- SDL_MapRGBA(gr->screen->format,
- gc->fore_r,
- gc->fore_g,
- gc->fore_b,
- gc->fore_a));
- }
- else
- {
+ SDL_MapRGBA(gr->screen->format,
+ gc->fore_r,
+ gc->fore_g,
+ gc->fore_b,
+ gc->fore_a));
+ } else {
raster_polygon(gr->screen, count, vx, vy,
- SDL_MapRGBA(gr->screen->format,
- gc->fore_r,
- gc->fore_g,
- gc->fore_b,
- gc->fore_a));
+ SDL_MapRGBA(gr->screen->format,
+ gc->fore_r,
+ gc->fore_g,
+ gc->fore_b,
+ gc->fore_a));
}
}
-static void
-draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h)
-{
- if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) )
- {
- return;
+static void draw_rectangle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int w, int h) {
+ if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent
+ && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) {
+ return;
}
- dbg(lvl_debug, "draw_rectangle: %d %d %d %d r=%d g=%d b=%d a=%d\n", p->x, p->y, w, h,
- gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a);
- if(w > gr->screen->w)
- {
+ dbg(lvl_debug, "draw_rectangle: %d %d %d %d r=%d g=%d b=%d a=%d", p->x, p->y, w, h,
+ gc->fore_r, gc->fore_g, gc->fore_b, gc->fore_a);
+ if(w > gr->screen->w) {
w = gr->screen->w;
}
- if(h > gr->screen->h)
- {
+ if(h > gr->screen->h) {
h = gr->screen->h;
}
raster_rect(gr->screen, p->x, p->y, w, h,
- SDL_MapRGBA(gr->screen->format,
- gc->fore_r,
- gc->fore_g,
- gc->fore_b,
- gc->fore_a));
+ SDL_MapRGBA(gr->screen->format,
+ gc->fore_r,
+ gc->fore_g,
+ gc->fore_b,
+ gc->fore_a));
}
-static void
-draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r)
-{
- if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) )
- {
- return;
+static void draw_circle(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int r) {
+ if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent
+ && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) {
+ return;
}
/* FIXME: does not quite match gtk */
/* hack for osd compass.. why is this needed!? */
- if(gr->overlay_mode)
- {
+ if(gr->overlay_mode) {
r = r / 2;
}
- if(gr->aa)
- {
+ if(gr->aa) {
raster_aacircle(gr->screen, p->x, p->y, r,
- SDL_MapRGBA(gr->screen->format,
- gc->fore_r,
- gc->fore_g,
- gc->fore_b,
- gc->fore_a));
- }
- else
- {
+ SDL_MapRGBA(gr->screen->format,
+ gc->fore_r,
+ gc->fore_g,
+ gc->fore_b,
+ gc->fore_a));
+ } else {
raster_circle(gr->screen, p->x, p->y, r,
- SDL_MapRGBA(gr->screen->format,
- gc->fore_r,
- gc->fore_g,
- gc->fore_b,
- gc->fore_a));
+ SDL_MapRGBA(gr->screen->format,
+ gc->fore_r,
+ gc->fore_g,
+ gc->fore_b,
+ gc->fore_a));
}
}
-static void
-draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count)
-{
- if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) )
- {
- return;
+static void draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *p, int count) {
+ if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent
+ && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) {
+ return;
}
/* you might expect lines to be simpler than the other shapes.
@@ -439,73 +398,58 @@ draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *
//int lw = 1;
int i;
- for(i = 0; i < count-1; i++)
- {
- float dx=p[i+1].x-p[i].x;
- float dy=p[i+1].y-p[i].y;
+ for(i = 0; i < count-1; i++) {
+ float dx=p[i+1].x-p[i].x;
+ float dy=p[i+1].y-p[i].y;
float angle;
int x_lw_adj, y_lw_adj;
- if(lw == 1)
- {
- if(gr->aa)
- {
+ if(lw == 1) {
+ if(gr->aa) {
raster_aaline(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y,
- SDL_MapRGBA(gr->screen->format,
- gc->fore_r,
- gc->fore_g,
- gc->fore_b,
- gc->fore_a));
- }
- else
- {
+ SDL_MapRGBA(gr->screen->format,
+ gc->fore_r,
+ gc->fore_g,
+ gc->fore_b,
+ gc->fore_a));
+ } else {
raster_line(gr->screen, p[i].x, p[i].y, p[i+1].x, p[i+1].y,
- SDL_MapRGBA(gr->screen->format,
- gc->fore_r,
- gc->fore_g,
- gc->fore_b,
- gc->fore_a));
+ SDL_MapRGBA(gr->screen->format,
+ gc->fore_r,
+ gc->fore_g,
+ gc->fore_b,
+ gc->fore_a));
}
- }
- else
- {
+ } else {
/* there is probably a much simpler way but this works ok */
/* FIXME: float + double mixture */
/* FIXME: lrint(round())? */
- if(dy == 0.0)
- {
+ if(dy == 0.0) {
angle = 0.0;
x_lw_adj = 0;
y_lw_adj = round((float)lw/2.0);
- }
- else if(dx == 0.0)
- {
+ } else if(dx == 0.0) {
angle = 0.0;
x_lw_adj = round((float)lw/2.0);
y_lw_adj = 0;
- }
- else
- {
+ } else {
angle = (M_PI/2.0) - atan(abs(dx)/abs(dy));
x_lw_adj = round(sin(angle)*(float)lw/2.0);
y_lw_adj = round(cos(angle)*(float)lw/2.0);
- if((x_lw_adj < 0) || (y_lw_adj < 0))
- {
- dbg(lvl_debug, "i=%d\n", i);
- dbg(lvl_debug, " %d,%d->%d,%d\n", p[i].x, p[i].y, p[i+1].x, p[i+1].y);
- dbg(lvl_debug, " lw=%d angle=%f\n", lw, 180.0 * angle / M_PI);
- dbg(lvl_debug, " x_lw_adj=%d y_lw_adj=%d\n", x_lw_adj, y_lw_adj);
+ if((x_lw_adj < 0) || (y_lw_adj < 0)) {
+ dbg(lvl_debug, "i=%d", i);
+ dbg(lvl_debug, " %d,%d->%d,%d", p[i].x, p[i].y, p[i+1].x, p[i+1].y);
+ dbg(lvl_debug, " lw=%d angle=%f", lw, 180.0 * angle / M_PI);
+ dbg(lvl_debug, " x_lw_adj=%d y_lw_adj=%d", x_lw_adj, y_lw_adj);
}
}
- if(p[i+1].x > p[i].x)
- {
+ if(p[i+1].x > p[i].x) {
x_lw_adj = -x_lw_adj;
}
- if(p[i+1].y > p[i].y)
- {
+ if(p[i+1].y > p[i].y) {
y_lw_adj = -y_lw_adj;
}
@@ -530,10 +474,8 @@ draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *
/* FIXME: should just draw a half circle */
/* now some circular endcaps, if the width is over 2 */
- if(lw > 2)
- {
- if(i == 0)
- {
+ if(lw > 2) {
+ if(i == 0) {
draw_circle(gr, gc, &p[i], lw/2);
}
/* we truncate on the divide on purpose, so we don't go outside the line */
@@ -544,11 +486,9 @@ draw_lines(struct graphics_priv *gr, struct graphics_gc_priv *gc, struct point *
}
-static void
-set_pixel(SDL_Surface *surface, int x, int y, Uint8 r2, Uint8 g2, Uint8 b2, Uint8 a2)
-{
+static void set_pixel(SDL_Surface *surface, int x, int y, Uint8 r2, Uint8 g2, Uint8 b2, Uint8 a2) {
if(x<0 || y<0 || x>=surface->w || y>=surface->h) {
- return;
+ return;
}
void *target_pixel = ((Uint8*)surface->pixels + y * surface->pitch + x * surface->format->BytesPerPixel);
@@ -556,85 +496,79 @@ set_pixel(SDL_Surface *surface, int x, int y, Uint8 r2, Uint8 g2, Uint8 b2, Uint
Uint8 r1,g1,b1,a1;
switch(surface->format->BytesPerPixel) {
- case 2:
- {
- SDL_GetRGBA(*(Uint16 *)target_pixel, surface->format, &r1, &g1, &b1, &a1);
- *(Uint16 *)target_pixel = SDL_MapRGBA(surface->format,
- (r1*(0xff-a2)/0xff) + (r2*a2/0xff),
- (g1*(0xff-a2)/0xff) + (g2*a2/0xff),
- (b1*(0xff-a2)/0xff) + (b2*a2/0xff),
- a2 + a1*(0xff-a2)/0xff );
- break;
- }
- case 4:
- {
- SDL_GetRGBA(*(Uint32 *)target_pixel, surface->format, &r1, &g1, &b1, &a1);
- *(Uint32 *)target_pixel = SDL_MapRGBA(surface->format,
- (r1*(0xff-a2)/0xff) + (r2*a2/0xff),
- (g1*(0xff-a2)/0xff) + (g2*a2/0xff),
- (b1*(0xff-a2)/0xff) + (b2*a2/0xff),
- a2 + a1*(0xff-a2)/0xff );
- break;
- }
+ case 2: {
+ SDL_GetRGBA(*(Uint16 *)target_pixel, surface->format, &r1, &g1, &b1, &a1);
+ *(Uint16 *)target_pixel = SDL_MapRGBA(surface->format,
+ (r1*(0xff-a2)/0xff) + (r2*a2/0xff),
+ (g1*(0xff-a2)/0xff) + (g2*a2/0xff),
+ (b1*(0xff-a2)/0xff) + (b2*a2/0xff),
+ a2 + a1*(0xff-a2)/0xff );
+ break;
+ }
+ case 4: {
+ SDL_GetRGBA(*(Uint32 *)target_pixel, surface->format, &r1, &g1, &b1, &a1);
+ *(Uint32 *)target_pixel = SDL_MapRGBA(surface->format,
+ (r1*(0xff-a2)/0xff) + (r2*a2/0xff),
+ (g1*(0xff-a2)/0xff) + (g2*a2/0xff),
+ (b1*(0xff-a2)/0xff) + (b2*a2/0xff),
+ a2 + a1*(0xff-a2)/0xff );
+ break;
+ }
}
}
-static void
-resize_ft_buffer (unsigned int new_size)
-{
+static void resize_ft_buffer (unsigned int new_size) {
if (new_size > ft_buffer_size) {
- g_free (ft_buffer);
- ft_buffer = g_malloc (new_size);
- dbg(lvl_debug, "old_size(%u) new_size(%u) ft_buffer(%p)\n", ft_buffer_size, new_size, ft_buffer);
- ft_buffer_size = new_size;
+ g_free (ft_buffer);
+ ft_buffer = g_malloc (new_size);
+ dbg(lvl_debug, "old_size(%u) new_size(%u) ft_buffer(%p)", ft_buffer_size, new_size, ft_buffer);
+ ft_buffer_size = new_size;
}
}
-static void
-display_text_draw(struct font_freetype_text *text,
- struct graphics_priv *gr, struct graphics_gc_priv *fg,
- struct graphics_gc_priv *bg, int color, struct point *p)
-{
+static void display_text_draw(struct font_freetype_text *text, struct graphics_priv *gr, struct graphics_gc_priv *fg,
+ struct graphics_gc_priv *bg, int color, struct point *p) {
int i, x, y, stride;
struct font_freetype_glyph *g, **gp;
struct color transparent = { 0x0000, 0x0000, 0x0000, 0x0000 };
struct color black = { fg->fore_r * 255, fg->fore_g * 255,
- fg->fore_b * 255, fg->fore_a * 255 };
+ fg->fore_b * 255, fg->fore_a * 255
+ };
struct color white = { 0xffff, 0xffff, 0xffff, 0xffff };
if (bg) {
- if (COLOR_IS_WHITE(black) && COLOR_IS_BLACK(white)) {
- black.r = 65535;
- black.g = 65535;
- black.b = 65535;
- black.a = 65535;
-
- white.r = 0;
- white.g = 0;
- white.b = 0;
- white.a = 65535;
- } else if (COLOR_IS_BLACK(black) && COLOR_IS_WHITE(white)) {
- white.r = 65535;
- white.g = 65535;
- white.b = 65535;
- white.a = 65535;
-
- black.r = 0;
- black.g = 0;
- black.b = 0;
- black.a = 65535;
- } else {
- white.r = bg->fore_r * 255;
- white.g = bg->fore_g * 255;
- white.b = bg->fore_b * 255;
- white.a = bg->fore_a * 255;
- }
+ if (COLOR_IS_WHITE(black) && COLOR_IS_BLACK(white)) {
+ black.r = 65535;
+ black.g = 65535;
+ black.b = 65535;
+ black.a = 65535;
+
+ white.r = 0;
+ white.g = 0;
+ white.b = 0;
+ white.a = 65535;
+ } else if (COLOR_IS_BLACK(black) && COLOR_IS_WHITE(white)) {
+ white.r = 65535;
+ white.g = 65535;
+ white.b = 65535;
+ white.a = 65535;
+
+ black.r = 0;
+ black.g = 0;
+ black.b = 0;
+ black.a = 65535;
+ } else {
+ white.r = bg->fore_r * 255;
+ white.g = bg->fore_g * 255;
+ white.b = bg->fore_b * 255;
+ white.a = bg->fore_a * 255;
+ }
} else {
- white.r = 0;
- white.g = 0;
- white.b = 0;
- white.a = 0;
+ white.r = 0;
+ white.g = 0;
+ white.b = 0;
+ white.a = 0;
}
@@ -643,32 +577,32 @@ display_text_draw(struct font_freetype_text *text,
x = p->x << 6;
y = p->y << 6;
while (i-- > 0) {
- g = *gp++;
- if (g->w && g->h && bg) {
- stride = (g->w + 2) * 4;
- if (color) {
- resize_ft_buffer(stride * (g->h + 2));
- gr->freetype_methods.get_shadow(g, ft_buffer, stride, &white, &transparent);
-
- SDL_Surface *glyph_surface =
- SDL_CreateRGBSurfaceFrom(ft_buffer, g->w + 2, g->h + 2,
- 32,
- stride,
- 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
- if (glyph_surface) {
- SDL_Rect r;
- r.x = (x + g->x) >> 6;
- r.y = (y + g->y) >> 6;
- r.w = g->w + 2;
- r.h = g->h + 2;
-
- SDL_BlitSurface(glyph_surface, NULL, gr->screen, &r);
- SDL_FreeSurface(glyph_surface);
- }
- }
- }
- x += g->dx;
- y += g->dy;
+ g = *gp++;
+ if (g->w && g->h && bg) {
+ stride = (g->w + 2) * 4;
+ if (color) {
+ resize_ft_buffer(stride * (g->h + 2));
+ gr->freetype_methods.get_shadow(g, ft_buffer, stride, &white, &transparent);
+
+ SDL_Surface *glyph_surface =
+ SDL_CreateRGBSurfaceFrom(ft_buffer, g->w + 2, g->h + 2,
+ 32,
+ stride,
+ 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
+ if (glyph_surface) {
+ SDL_Rect r;
+ r.x = (x + g->x) >> 6;
+ r.y = (y + g->y) >> 6;
+ r.w = g->w + 2;
+ r.h = g->h + 2;
+
+ SDL_BlitSurface(glyph_surface, NULL, gr->screen, &r);
+ SDL_FreeSurface(glyph_surface);
+ }
+ }
+ }
+ x += g->dx;
+ y += g->dy;
}
gp = text->glyph;
@@ -676,80 +610,75 @@ display_text_draw(struct font_freetype_text *text,
x = p->x << 6;
y = p->y << 6;
while (i-- > 0) {
- g = *gp++;
- if (g->w && g->h) {
- if (color) {
- stride = g->w;
- if (bg) {
- resize_ft_buffer(stride * g->h * 4);
- gr->freetype_methods.get_glyph(g, ft_buffer,
- stride * 4, &black,
- &white, &transparent);
- SDL_Surface *glyph_surface =
- SDL_CreateRGBSurfaceFrom(ft_buffer, g->w, g->h, 32,
- stride * 4,
- 0x000000ff,0x0000ff00, 0x00ff0000,0xff000000);
- if (glyph_surface) {
- SDL_Rect r;
- r.x = (x + g->x) >> 6;
- r.y = (y + g->y) >> 6;
- r.w = g->w;
- r.h = g->h;
-
- SDL_BlitSurface(glyph_surface, NULL, gr->screen,&r);
- SDL_FreeSurface(glyph_surface);
- }
- }
- stride *= 4;
- resize_ft_buffer(stride * g->h);
- gr->freetype_methods.get_glyph(g, ft_buffer, stride,
- &black, &white,
- &transparent);
- int ii, jj;
- unsigned char* pGlyph = ft_buffer;
- for (jj = 0; jj < g->h; ++jj) {
- for (ii = 0; ii < g->w; ++ii) {
- if(*(pGlyph+3) > 0) {
+ g = *gp++;
+ if (g->w && g->h) {
+ if (color) {
+ stride = g->w;
+ if (bg) {
+ resize_ft_buffer(stride * g->h * 4);
+ gr->freetype_methods.get_glyph(g, ft_buffer,
+ stride * 4, &black,
+ &white, &transparent);
+ SDL_Surface *glyph_surface =
+ SDL_CreateRGBSurfaceFrom(ft_buffer, g->w, g->h, 32,
+ stride * 4,
+ 0x000000ff,0x0000ff00, 0x00ff0000,0xff000000);
+ if (glyph_surface) {
+ SDL_Rect r;
+ r.x = (x + g->x) >> 6;
+ r.y = (y + g->y) >> 6;
+ r.w = g->w;
+ r.h = g->h;
+
+ SDL_BlitSurface(glyph_surface, NULL, gr->screen,&r);
+ SDL_FreeSurface(glyph_surface);
+ }
+ }
+ stride *= 4;
+ resize_ft_buffer(stride * g->h);
+ gr->freetype_methods.get_glyph(g, ft_buffer, stride,
+ &black, &white,
+ &transparent);
+ int ii, jj;
+ unsigned char* pGlyph = ft_buffer;
+ for (jj = 0; jj < g->h; ++jj) {
+ for (ii = 0; ii < g->w; ++ii) {
+ if(*(pGlyph+3) > 0) {
set_pixel(gr->screen,
- ii+((x + g->x) >> 6),
- jj+((y + g->y) >> 6),
- *(pGlyph+2), // Pixels are in BGRA format
- *(pGlyph+1),
- *(pGlyph+0),
- *(pGlyph+3)
- );
+ ii+((x + g->x) >> 6),
+ jj+((y + g->y) >> 6),
+ *(pGlyph+2), // Pixels are in BGRA format
+ *(pGlyph+1),
+ *(pGlyph+0),
+ *(pGlyph+3)
+ );
}
pGlyph += 4;
- }
- }
- }
- }
- x += g->dx;
- y += g->dy;
+ }
+ }
+ }
+ }
+ x += g->dx;
+ y += g->dy;
}
}
-static void
-draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg,
- struct graphics_gc_priv *bg, struct graphics_font_priv *font,
- char *text, struct point *p, int dx, int dy)
-{
+static void draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct graphics_gc_priv *bg,
+ struct graphics_font_priv *font, char *text, struct point *p, int dx, int dy) {
if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable)
- || (gr->overlay_parent && gr->overlay_parent->overlay_enable
- && !gr->overlay_enable)) {
- return;
+ || (gr->overlay_parent && gr->overlay_parent->overlay_enable
+ && !gr->overlay_enable)) {
+ return;
}
struct font_freetype_text *t;
int color = 1;
if (!font) {
- dbg(lvl_error, "no font, returning\n");
- return;
+ dbg(lvl_error, "no font, returning");
+ return;
}
- t = gr->freetype_methods.text_new(text,
- (struct font_freetype_font *) font,
- dx, dy);
+ t = gr->freetype_methods.text_new(text, (struct font_freetype_font *) font, dx, dy);
struct point p_eff;
p_eff.x = p->x;
@@ -759,12 +688,11 @@ draw_text(struct graphics_priv *gr, struct graphics_gc_priv *fg,
gr->freetype_methods.text_destroy(t);
}
-static void
-draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p, struct graphics_image_priv *img)
-{
- if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent && gr->overlay_parent->overlay_enable && !gr->overlay_enable) )
- {
- return;
+static void draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *p,
+ struct graphics_image_priv *img) {
+ if ((gr->overlay_parent && !gr->overlay_parent->overlay_enable) || (gr->overlay_parent
+ && gr->overlay_parent->overlay_enable && !gr->overlay_enable) ) {
+ return;
}
SDL_Rect r;
@@ -777,45 +705,33 @@ draw_image(struct graphics_priv *gr, struct graphics_gc_priv *fg, struct point *
SDL_BlitSurface(img->img, NULL, gr->screen, &r);
}
-static void
-background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc)
-{
- dbg(lvl_debug, "background_gc\n");
+static void background_gc(struct graphics_priv *gr, struct graphics_gc_priv *gc) {
+ dbg(lvl_debug, "background_gc");
}
-static void
-draw_mode(struct graphics_priv *gr, enum draw_mode_num mode)
-{
+static void draw_mode(struct graphics_priv *gr, enum draw_mode_num mode) {
struct graphics_priv *ov;
SDL_Rect rect;
int i;
- if(gr->overlay_mode)
- {
+ if(gr->overlay_mode) {
/* will be drawn below */
- }
- else
- {
- dbg(lvl_debug, "draw_mode: %d\n", mode);
-
- if(mode == draw_mode_end)
- {
- if((gr->draw_mode == draw_mode_begin) && gr->overlay_enable)
- {
- for(i = 0; i < OVERLAY_MAX; i++)
- {
+ } else {
+ dbg(lvl_debug, "draw_mode: %d", mode);
+
+ if(mode == draw_mode_end) {
+ if((gr->draw_mode == draw_mode_begin) && gr->overlay_enable) {
+ for(i = 0; i < OVERLAY_MAX; i++) {
ov = gr->overlay_array[i];
- if(ov && ov->overlay_enable)
- {
+ if(ov && ov->overlay_enable) {
rect.x = ov->overlay_x;
if(rect.x<0) rect.x += gr->screen->w;
rect.y = ov->overlay_y;
if(rect.y<0) rect.y += gr->screen->h;
rect.w = ov->screen->w;
rect.h = ov->screen->h;
- SDL_BlitSurface(ov->screen, NULL,
- gr->screen, &rect);
+ SDL_BlitSurface(ov->screen, NULL, gr->screen, &rect);
}
}
}
@@ -827,61 +743,55 @@ draw_mode(struct graphics_priv *gr, enum draw_mode_num mode)
}
}
-static void overlay_disable(struct graphics_priv *gr, int disable)
-{
+static void overlay_disable(struct graphics_priv *gr, int disable) {
gr->overlay_enable = !disable;
struct graphics_priv *curr_gr = gr;
if(gr->overlay_parent) {
- curr_gr = gr->overlay_parent;
+ curr_gr = gr->overlay_parent;
}
draw_mode(curr_gr,draw_mode_end);
}
-static struct graphics_priv *
-overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h, int wraparound);
+static struct graphics_priv *overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p,
+ int w, int h, int wraparound);
-static int window_fullscreen(struct window *win, int on)
-{
+static int window_fullscreen(struct window *win, int on) {
struct graphics_priv *gr=(struct graphics_priv *)win->priv;
/* Update video flags */
if(on) {
- gr->video_flags |= SDL_FULLSCREEN;
+ gr->video_flags |= SDL_FULLSCREEN;
} else {
- gr->video_flags &= ~SDL_FULLSCREEN;
+ gr->video_flags &= ~SDL_FULLSCREEN;
}
/* Update video mode */
gr->screen = SDL_SetVideoMode(gr->screen->w, gr->screen->h, gr->video_bpp, gr->video_flags);
if(gr->screen == NULL) {
- navit_destroy(gr->nav);
- }
- else {
- callback_list_call_attr_2(gr->cbl, attr_resize, GINT_TO_POINTER(gr->screen->w), GINT_TO_POINTER(gr->screen->h));
+ navit_destroy(gr->nav);
+ } else {
+ callback_list_call_attr_2(gr->cbl, attr_resize, GINT_TO_POINTER(gr->screen->w), GINT_TO_POINTER(gr->screen->h));
}
return 1;
}
-static void *
-get_data(struct graphics_priv *this, char const *type)
-{
+static void *get_data(struct graphics_priv *this, char const *type) {
if(strcmp(type, "window") == 0) {
- struct window *win;
- win=g_new(struct window, 1);
- win->priv=this;
- win->fullscreen=window_fullscreen;
- win->disable_suspend=NULL;
- return win;
+ struct window *win;
+ win=g_new(struct window, 1);
+ win->priv=this;
+ win->fullscreen=window_fullscreen;
+ win->disable_suspend=NULL;
+ return win;
} else {
- return NULL;
+ return NULL;
}
}
-static void draw_drag(struct graphics_priv *gr, struct point *p)
-{
+static void draw_drag(struct graphics_priv *gr, struct point *p) {
if(p) {
- gr->overlay_x = p->x;
- gr->overlay_y = p->y;
+ gr->overlay_x = p->x;
+ gr->overlay_y = p->y;
}
}
@@ -907,74 +817,70 @@ static struct graphics_methods graphics_methods = {
overlay_disable,
NULL, /* overlay_resize */
NULL, /* set_attr */
- NULL, /* show_native_keyboard */
- NULL, /* hide_native_keyboard */
+ NULL, /* show_native_keyboard */
+ NULL, /* hide_native_keyboard */
};
-static struct graphics_priv *
-overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p, int w, int h,int wraparound)
-{
+static struct graphics_priv *overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct point *p,
+ int w, int h,int wraparound) {
struct graphics_priv *ov;
Uint32 rmask, gmask, bmask, amask;
int i;
- for(i = 0; i < OVERLAY_MAX; i++)
- {
- if(gr->overlay_array[i] == NULL)
- {
- break;
- }
+ for(i = 0; i < OVERLAY_MAX; i++) {
+ if(gr->overlay_array[i] == NULL) {
+ break;
+ }
}
- if(i == OVERLAY_MAX)
- {
- dbg(lvl_error, "too many overlays! increase OVERLAY_MAX\n");
- return NULL;
+ if(i == OVERLAY_MAX) {
+ dbg(lvl_error, "too many overlays! increase OVERLAY_MAX");
+ return NULL;
}
- dbg(lvl_debug, "overlay_new %d %d %d %u %u (%x, %x, %x ,%x, %d)\n", i,
- p->x,
- p->y,
- w,
- h,
- gr->screen->format->Rmask,
- gr->screen->format->Gmask,
- gr->screen->format->Bmask,
- gr->screen->format->Amask,
- gr->screen->format->BitsPerPixel
+ dbg(lvl_debug, "overlay_new %d %d %d %u %u (%x, %x, %x ,%x, %d)", i,
+ p->x,
+ p->y,
+ w,
+ h,
+ gr->screen->format->Rmask,
+ gr->screen->format->Gmask,
+ gr->screen->format->Bmask,
+ gr->screen->format->Amask,
+ gr->screen->format->BitsPerPixel
);
ov = g_new0(struct graphics_priv, 1);
switch(gr->screen->format->BitsPerPixel) {
- case 8:
- rmask = 0xc0;
- gmask = 0x30;
- bmask = 0x0c;
- amask = 0x03;
- break;
- case 16:
- rmask = 0xf000;
- gmask = 0x0f00;
- bmask = 0x00f0;
- amask = 0x000f;
- break;
- case 32:
- rmask = 0xff000000;
- gmask = 0x00ff0000;
- bmask = 0x0000ff00;
- amask = 0x000000ff;
- break;
- default:
- rmask = gr->screen->format->Rmask;
- gmask = gr->screen->format->Gmask;
- bmask = gr->screen->format->Bmask;
- amask = gr->screen->format->Amask;
+ case 8:
+ rmask = 0xc0;
+ gmask = 0x30;
+ bmask = 0x0c;
+ amask = 0x03;
+ break;
+ case 16:
+ rmask = 0xf000;
+ gmask = 0x0f00;
+ bmask = 0x00f0;
+ amask = 0x000f;
+ break;
+ case 32:
+ rmask = 0xff000000;
+ gmask = 0x00ff0000;
+ bmask = 0x0000ff00;
+ amask = 0x000000ff;
+ break;
+ default:
+ rmask = gr->screen->format->Rmask;
+ gmask = gr->screen->format->Gmask;
+ bmask = gr->screen->format->Bmask;
+ amask = gr->screen->format->Amask;
}
ov->screen = SDL_CreateRGBSurface(SDL_SWSURFACE,
- w, h,
- gr->screen->format->BitsPerPixel,
- rmask, gmask, bmask, amask);
+ w, h,
+ gr->screen->format->BitsPerPixel,
+ rmask, gmask, bmask, amask);
ov->overlay_mode = 1;
ov->overlay_enable = 1;
@@ -988,9 +894,8 @@ overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct poin
struct font_priv *(*font_freetype_new) (void *meth);
font_freetype_new = plugin_get_category_font ("freetype");
- if (!font_freetype_new)
- {
- return NULL;
+ if (!font_freetype_new) {
+ return NULL;
}
@@ -999,9 +904,9 @@ overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct poin
*meth=graphics_methods;
meth->font_new =
- (struct graphics_font_priv *
- (*)(struct graphics_priv *, struct graphics_font_methods *, char *, int,
- int)) ov->freetype_methods.font_new;
+ (struct graphics_font_priv *
+ (*)(struct graphics_priv *, struct graphics_font_methods *, char *, int,
+ int)) ov->freetype_methods.font_new;
meth->get_text_bbox = (void *)ov->freetype_methods.get_text_bbox;
@@ -1010,8 +915,7 @@ overlay_new(struct graphics_priv *gr, struct graphics_methods *meth, struct poin
return ov;
}
-static gboolean graphics_sdl_idle(void *data)
-{
+static gboolean graphics_sdl_idle(void *data) {
struct graphics_priv *gr = (struct graphics_priv *)data;
struct point p;
SDL_Event ev;
@@ -1021,13 +925,12 @@ static gboolean graphics_sdl_idle(void *data)
#ifdef USE_WEBOS
if(data==NULL) {
- if(the_graphics!=NULL) {
- gr = the_graphics;
- }
- else {
- dbg(lvl_error,"graphics_idle: graphics not set!\n");
- return FALSE;
- }
+ if(the_graphics!=NULL) {
+ gr = the_graphics;
+ } else {
+ dbg(lvl_error,"graphics_idle: graphics not set!");
+ return FALSE;
+ }
}
#endif
@@ -1037,9 +940,8 @@ static gboolean graphics_sdl_idle(void *data)
graphics_gtk does it during Configure, but SDL does not have
an equivalent event, so we use our own flag
*/
- if(gr->resize_callback_initial != 0)
- {
- callback_list_call_attr_2(gr->cbl, attr_resize, GINT_TO_POINTER(gr->screen->w), GINT_TO_POINTER(gr->screen->h));
+ if(gr->resize_callback_initial != 0) {
+ callback_list_call_attr_2(gr->cbl, attr_resize, GINT_TO_POINTER(gr->screen->w), GINT_TO_POINTER(gr->screen->h));
gr->resize_callback_initial = 0;
}
@@ -1047,8 +949,8 @@ static gboolean graphics_sdl_idle(void *data)
struct callback* accel_cb = NULL;
struct event_timeout* accel_to = NULL;
if (PDL_GetPDKVersion() > 100) {
- accel_cb = callback_new_1(callback_cast(sdl_accelerometer_handler), gr);
- accel_to = event_add_timeout(200, 1, accel_cb);
+ accel_cb = callback_new_1(callback_cast(sdl_accelerometer_handler), gr);
+ accel_to = event_add_timeout(200, 1, accel_cb);
}
#endif
#ifdef USE_WEBOS
@@ -1062,321 +964,307 @@ static gboolean graphics_sdl_idle(void *data)
#endif
{
#ifdef USE_WEBOS
- ret = 0;
- if(idle_tasks->len > 0)
- {
- while (!(ret = SDL_PollEvent(&ev)) && idle_tasks->len > 0)
- {
- if (idle_tasks_idx >= idle_tasks->len)
- idle_tasks_idx = 0;
-
- dbg(lvl_debug,"idle_tasks_idx(%d)\n",idle_tasks_idx);
- task = (struct idle_task *)g_ptr_array_index(idle_tasks,idle_tasks_idx);
-
- if (idle_tasks_idx == 0) // only execute tasks with lowest priority value
- idle_tasks_cur_priority = task->priority;
- if (task->priority > idle_tasks_cur_priority)
- idle_tasks_idx = 0;
- else
- {
- callback_call_0(task->cb);
- idle_tasks_idx++;
- }
- }
- }
- if (!ret) // If we get here there are no idle_tasks and we have no events pending
- ret = SDL_WaitEvent(&ev);
+ ret = 0;
+ if(idle_tasks->len > 0) {
+ while (!(ret = SDL_PollEvent(&ev)) && idle_tasks->len > 0) {
+ if (idle_tasks_idx >= idle_tasks->len)
+ idle_tasks_idx = 0;
+
+ dbg(lvl_debug,"idle_tasks_idx(%d)",idle_tasks_idx);
+ task = (struct idle_task *)g_ptr_array_index(idle_tasks,idle_tasks_idx);
+
+ if (idle_tasks_idx == 0) // only execute tasks with lowest priority value
+ idle_tasks_cur_priority = task->priority;
+ if (task->priority > idle_tasks_cur_priority)
+ idle_tasks_idx = 0;
+ else {
+ callback_call_0(task->cb);
+ idle_tasks_idx++;
+ }
+ }
+ }
+ if (!ret) // If we get here there are no idle_tasks and we have no events pending
+ ret = SDL_WaitEvent(&ev);
#else
- ret = SDL_PollEvent(&ev);
+ ret = SDL_PollEvent(&ev);
#endif
- if(ret == 0)
- {
- break;
- }
+ if(ret == 0) {
+ break;
+ }
#ifdef USE_WEBOS
- dbg(lvl_debug,"SDL_Event %d\n", ev.type);
+ dbg(lvl_debug,"SDL_Event %d", ev.type);
#endif
- switch(ev.type)
- {
- case SDL_MOUSEMOTION:
- {
- p.x = ev.motion.x;
- p.y = ev.motion.y;
- callback_list_call_attr_1(gr->cbl, attr_motion, (void *)&p);
- break;
- }
-
- case SDL_KEYDOWN:
- {
- memset(keybuf, 0, sizeof(keybuf));
- switch(ev.key.keysym.sym)
- {
- case SDLK_LEFT:
- {
- keybuf[0] = NAVIT_KEY_LEFT;
- break;
- }
- case SDLK_RIGHT:
- {
- keybuf[0] = NAVIT_KEY_RIGHT;
- break;
- }
- case SDLK_BACKSPACE:
- {
- keybuf[0] = NAVIT_KEY_BACKSPACE;
- break;
- }
- case SDLK_RETURN:
- {
- keybuf[0] = NAVIT_KEY_RETURN;
- break;
- }
- case SDLK_DOWN:
- {
- keybuf[0] = NAVIT_KEY_DOWN;
- break;
- }
- case SDLK_PAGEUP:
- {
- keybuf[0] = NAVIT_KEY_ZOOM_OUT;
- break;
- }
- case SDLK_UP:
- {
- keybuf[0] = NAVIT_KEY_UP;
- break;
- }
- case SDLK_PAGEDOWN:
- {
- keybuf[0] = NAVIT_KEY_ZOOM_IN;
- break;
- }
+ switch(ev.type) {
+ case SDL_MOUSEMOTION: {
+ p.x = ev.motion.x;
+ p.y = ev.motion.y;
+ callback_list_call_attr_1(gr->cbl, attr_motion, (void *)&p);
+ break;
+ }
+
+ case SDL_KEYDOWN: {
+ memset(keybuf, 0, sizeof(keybuf));
+ switch(ev.key.keysym.sym) {
+ case SDLK_LEFT: {
+ keybuf[0] = NAVIT_KEY_LEFT;
+ break;
+ }
+ case SDLK_RIGHT: {
+ keybuf[0] = NAVIT_KEY_RIGHT;
+ break;
+ }
+ case SDLK_BACKSPACE: {
+ keybuf[0] = NAVIT_KEY_BACKSPACE;
+ break;
+ }
+ case SDLK_RETURN: {
+ keybuf[0] = NAVIT_KEY_RETURN;
+ break;
+ }
+ case SDLK_DOWN: {
+ keybuf[0] = NAVIT_KEY_DOWN;
+ break;
+ }
+ case SDLK_PAGEUP: {
+ keybuf[0] = NAVIT_KEY_ZOOM_OUT;
+ break;
+ }
+ case SDLK_UP: {
+ keybuf[0] = NAVIT_KEY_UP;
+ break;
+ }
+ case SDLK_PAGEDOWN: {
+ keybuf[0] = NAVIT_KEY_ZOOM_IN;
+ break;
+ }
#ifdef USE_WEBOS
- case WEBOS_KEY_SHIFT:
- {
- if ((key_mod & WEBOS_KEY_MOD_SHIFT_STICKY) == WEBOS_KEY_MOD_SHIFT_STICKY)
- key_mod &= ~(WEBOS_KEY_MOD_SHIFT_STICKY);
- else if ((key_mod & WEBOS_KEY_MOD_SHIFT) == WEBOS_KEY_MOD_SHIFT)
- key_mod |= WEBOS_KEY_MOD_SHIFT_STICKY;
- else
- key_mod |= WEBOS_KEY_MOD_SHIFT;
- break;
- }
- case WEBOS_KEY_ORANGE:
- {
- if ((key_mod & WEBOS_KEY_MOD_ORANGE_STICKY) == WEBOS_KEY_MOD_ORANGE_STICKY)
- key_mod &= ~(WEBOS_KEY_MOD_ORANGE_STICKY);
- else if ((key_mod & WEBOS_KEY_MOD_ORANGE) == WEBOS_KEY_MOD_ORANGE)
- key_mod |= WEBOS_KEY_MOD_ORANGE_STICKY;
- else
- key_mod |= WEBOS_KEY_MOD_ORANGE;
- break;
- }
- case WEBOS_KEY_SYM:
- {
- /* Toggle the on-screen keyboard */
- //callback_list_call_attr_1(gr->cbl, attr_keyboard_toggle); // Not implemented yet
- break;
- }
- case PDLK_GESTURE_BACK:
- {
- keybuf[0] = NAVIT_KEY_BACK;
- break;
- }
- case PDLK_GESTURE_FORWARD:
- case PDLK_GESTURE_AREA:
- {
- break;
- }
+ case WEBOS_KEY_SHIFT: {
+ if ((key_mod & WEBOS_KEY_MOD_SHIFT_STICKY) == WEBOS_KEY_MOD_SHIFT_STICKY)
+ key_mod &= ~(WEBOS_KEY_MOD_SHIFT_STICKY);
+ else if ((key_mod & WEBOS_KEY_MOD_SHIFT) == WEBOS_KEY_MOD_SHIFT)
+ key_mod |= WEBOS_KEY_MOD_SHIFT_STICKY;
+ else
+ key_mod |= WEBOS_KEY_MOD_SHIFT;
+ break;
+ }
+ case WEBOS_KEY_ORANGE: {
+ if ((key_mod & WEBOS_KEY_MOD_ORANGE_STICKY) == WEBOS_KEY_MOD_ORANGE_STICKY)
+ key_mod &= ~(WEBOS_KEY_MOD_ORANGE_STICKY);
+ else if ((key_mod & WEBOS_KEY_MOD_ORANGE) == WEBOS_KEY_MOD_ORANGE)
+ key_mod |= WEBOS_KEY_MOD_ORANGE_STICKY;
+ else
+ key_mod |= WEBOS_KEY_MOD_ORANGE;
+ break;
+ }
+ case WEBOS_KEY_SYM: {
+ /* Toggle the on-screen keyboard */
+ //callback_list_call_attr_1(gr->cbl, attr_keyboard_toggle); // Not implemented yet
+ break;
+ }
+ case PDLK_GESTURE_BACK: {
+ keybuf[0] = NAVIT_KEY_BACK;
+ break;
+ }
+ case PDLK_GESTURE_FORWARD:
+ case PDLK_GESTURE_AREA: {
+ break;
+ }
#endif
- default:
- {
+ default: {
#ifdef USE_WEBOS
- if (ev.key.keysym.unicode < 0x80 && ev.key.keysym.unicode > 0) {
- keybuf[0] = (char)ev.key.keysym.unicode;
- if ((key_mod & WEBOS_KEY_MOD_ORANGE) == WEBOS_KEY_MOD_ORANGE) {
- switch(keybuf[0]) {
- case 'e': keybuf[0] = '1'; break;
- case 'r': keybuf[0] = '2'; break;
- case 't': keybuf[0] = '3'; break;
- case 'd': keybuf[0] = '4'; break;
- case 'f': keybuf[0] = '5'; break;
- case 'g': keybuf[0] = '6'; break;
- case 'x': keybuf[0] = '7'; break;
- case 'c': keybuf[0] = '8'; break;
- case 'v': keybuf[0] = '9'; break;
- case '@': keybuf[0] = '0'; break;
- case ',': keybuf[0] = '-'; break;
- case 'u': strncpy(keybuf, "ü", sizeof(keybuf)); break;
- case 'a': strncpy(keybuf, "ä", sizeof(keybuf)); break;
- case 'o': strncpy(keybuf, "ö", sizeof(keybuf)); break;
- case 's': strncpy(keybuf, "ß", sizeof(keybuf)); break;
- }
-}
- if ((key_mod & WEBOS_KEY_MOD_SHIFT_STICKY) != WEBOS_KEY_MOD_SHIFT_STICKY)
- key_mod &= ~(WEBOS_KEY_MOD_SHIFT_STICKY);
- if ((key_mod & WEBOS_KEY_MOD_ORANGE_STICKY) != WEBOS_KEY_MOD_ORANGE_STICKY)
- key_mod &= ~(WEBOS_KEY_MOD_ORANGE_STICKY);
- }
- else {
- dbg(lvl_error,"Unknown key sym: %x\n", ev.key.keysym.sym);
- }
+ if (ev.key.keysym.unicode < 0x80 && ev.key.keysym.unicode > 0) {
+ keybuf[0] = (char)ev.key.keysym.unicode;
+ if ((key_mod & WEBOS_KEY_MOD_ORANGE) == WEBOS_KEY_MOD_ORANGE) {
+ switch(keybuf[0]) {
+ case 'e':
+ keybuf[0] = '1';
+ break;
+ case 'r':
+ keybuf[0] = '2';
+ break;
+ case 't':
+ keybuf[0] = '3';
+ break;
+ case 'd':
+ keybuf[0] = '4';
+ break;
+ case 'f':
+ keybuf[0] = '5';
+ break;
+ case 'g':
+ keybuf[0] = '6';
+ break;
+ case 'x':
+ keybuf[0] = '7';
+ break;
+ case 'c':
+ keybuf[0] = '8';
+ break;
+ case 'v':
+ keybuf[0] = '9';
+ break;
+ case '@':
+ keybuf[0] = '0';
+ break;
+ case ',':
+ keybuf[0] = '-';
+ break;
+ case 'u':
+ strncpy(keybuf, "ü", sizeof(keybuf));
+ break;
+ case 'a':
+ strncpy(keybuf, "ä", sizeof(keybuf));
+ break;
+ case 'o':
+ strncpy(keybuf, "ö", sizeof(keybuf));
+ break;
+ case 's':
+ strncpy(keybuf, "ß", sizeof(keybuf));
+ break;
+ }
+ }
+ if ((key_mod & WEBOS_KEY_MOD_SHIFT_STICKY) != WEBOS_KEY_MOD_SHIFT_STICKY)
+ key_mod &= ~(WEBOS_KEY_MOD_SHIFT_STICKY);
+ if ((key_mod & WEBOS_KEY_MOD_ORANGE_STICKY) != WEBOS_KEY_MOD_ORANGE_STICKY)
+ key_mod &= ~(WEBOS_KEY_MOD_ORANGE_STICKY);
+ } else {
+ dbg(lvl_error,"Unknown key sym: %x", ev.key.keysym.sym);
+ }
#else
- /* return unicode chars when they can be converted to ascii */
- keybuf[0] = ev.key.keysym.unicode<=127 ? ev.key.keysym.unicode : 0;
+ /* return unicode chars when they can be converted to ascii */
+ keybuf[0] = ev.key.keysym.unicode<=127 ? ev.key.keysym.unicode : 0;
#endif
- break;
- }
- }
-
- dbg(lvl_info,"key mod: 0x%x\n", key_mod);
-
- if (keybuf[0]) {
- callback_list_call_attr_1(gr->cbl, attr_keypress, (void *)keybuf);
- }
- break;
- }
-
- case SDL_KEYUP:
- {
- break;
- }
-
- case SDL_MOUSEBUTTONDOWN:
- {
- dbg(lvl_debug, "SDL_MOUSEBUTTONDOWN %d %d %d %d %d\n",
- ev.button.which,
- ev.button.button,
- ev.button.state,
- ev.button.x,
- ev.button.y);
-
- p.x = ev.button.x;
- p.y = ev.button.y;
- callback_list_call_attr_3(gr->cbl, attr_button, GINT_TO_POINTER(1), GINT_TO_POINTER((int)ev.button.button), (void *)&p);
- break;
- }
-
- case SDL_MOUSEBUTTONUP:
- {
- dbg(lvl_debug, "SDL_MOUSEBUTTONUP %d %d %d %d %d\n",
- ev.button.which,
- ev.button.button,
- ev.button.state,
- ev.button.x,
- ev.button.y);
-
- p.x = ev.button.x;
- p.y = ev.button.y;
- callback_list_call_attr_3(gr->cbl, attr_button, GINT_TO_POINTER(0), GINT_TO_POINTER((int)ev.button.button), (void *)&p);
- break;
- }
-
- case SDL_QUIT:
- {
+ break;
+ }
+ }
+
+ dbg(lvl_info,"key mod: 0x%x", key_mod);
+
+ if (keybuf[0]) {
+ callback_list_call_attr_1(gr->cbl, attr_keypress, (void *)keybuf);
+ }
+ break;
+ }
+
+ case SDL_KEYUP: {
+ break;
+ }
+
+ case SDL_MOUSEBUTTONDOWN: {
+ dbg(lvl_debug, "SDL_MOUSEBUTTONDOWN %d %d %d %d %d",
+ ev.button.which,
+ ev.button.button,
+ ev.button.state,
+ ev.button.x,
+ ev.button.y);
+
+ p.x = ev.button.x;
+ p.y = ev.button.y;
+ callback_list_call_attr_3(gr->cbl, attr_button, GINT_TO_POINTER(1), GINT_TO_POINTER((int)ev.button.button), (void *)&p);
+ break;
+ }
+
+ case SDL_MOUSEBUTTONUP: {
+ dbg(lvl_debug, "SDL_MOUSEBUTTONUP %d %d %d %d %d",
+ ev.button.which,
+ ev.button.button,
+ ev.button.state,
+ ev.button.x,
+ ev.button.y);
+
+ p.x = ev.button.x;
+ p.y = ev.button.y;
+ callback_list_call_attr_3(gr->cbl, attr_button, GINT_TO_POINTER(0), GINT_TO_POINTER((int)ev.button.button), (void *)&p);
+ break;
+ }
+
+ case SDL_QUIT: {
#ifdef USE_WEBOS
- quit_event_loop = 1;
- navit_destroy(gr->nav);
+ quit_event_loop = 1;
+ navit_destroy(gr->nav);
+#else
+ callback_list_call_attr_0(gr->cbl, attr_window_closed);
#endif
- break;
- }
+ break;
+ }
- case SDL_VIDEORESIZE:
- {
+ case SDL_VIDEORESIZE: {
- gr->screen = SDL_SetVideoMode(ev.resize.w, ev.resize.h, gr->video_bpp, gr->video_flags);
- if(gr->screen == NULL)
- {
- navit_destroy(gr->nav);
- }
- else
- {
- callback_list_call_attr_2(gr->cbl, attr_resize, GINT_TO_POINTER(gr->screen->w), GINT_TO_POINTER(gr->screen->h));
- }
+ gr->screen = SDL_SetVideoMode(ev.resize.w, ev.resize.h, gr->video_bpp, gr->video_flags);
+ if(gr->screen == NULL) {
+ navit_destroy(gr->nav);
+ } else {
+ callback_list_call_attr_2(gr->cbl, attr_resize, GINT_TO_POINTER(gr->screen->w), GINT_TO_POINTER(gr->screen->h));
+ }
- break;
- }
+ break;
+ }
#ifdef USE_WEBOS
- case SDL_USEREVENT:
- {
- SDL_UserEvent userevent = ev.user;
- dbg(lvl_info,"received SDL_USEREVENT type(%x) code(%x)\n",userevent.type,userevent.code);
- if (userevent.type != SDL_USEREVENT)
- break;
-
- if (userevent.code == PDL_GPS_UPDATE)
- {
- struct attr vehicle_attr;
- struct vehicle *v;
- navit_get_attr(gr->nav, attr_vehicle, &vehicle_attr, NULL);
- v = vehicle_attr.u.vehicle;
- if (v) {
- struct attr attr;
- attr.type = attr_pdl_gps_update;
- attr.u.data = userevent.data1;
- vehicle_set_attr(v, &attr);
- }
- }
- else if(userevent.code == SDL_USEREVENT_CODE_TIMER)
- {
- struct callback *cb = (struct callback *)userevent.data1;
- dbg(lvl_debug, "SDL_USEREVENT timer received cb(%p)\n", cb);
- callback_call_0(cb);
- }
- else if(userevent.code == SDL_USEREVENT_CODE_WATCH)
- {
- struct callback *cb = (struct callback *)userevent.data1;
- dbg(lvl_debug, "SDL_USEREVENT watch received cb(%p)\n", cb);
- callback_call_0(cb);
- }
- else if(userevent.code == SDL_USEREVENT_CODE_CALL_CALLBACK)
- {
- struct callback_list *cbl = (struct callback_list *)userevent.data1;
- dbg(lvl_debug, "SDL_USEREVENT call_callback received cbl(%p)\n", cbl);
- callback_list_call_0(cbl);
- }
- else if(userevent.code == SDL_USEREVENT_CODE_IDLE_EVENT) {
- dbg(lvl_debug, "SDL_USEREVENT idle_event received\n");
- }
+ case SDL_USEREVENT: {
+ SDL_UserEvent userevent = ev.user;
+ dbg(lvl_info,"received SDL_USEREVENT type(%x) code(%x)",userevent.type,userevent.code);
+ if (userevent.type != SDL_USEREVENT)
+ break;
+
+ if (userevent.code == PDL_GPS_UPDATE) {
+ struct attr vehicle_attr;
+ struct vehicle *v;
+ navit_get_attr(gr->nav, attr_vehicle, &vehicle_attr, NULL);
+ v = vehicle_attr.u.vehicle;
+ if (v) {
+ struct attr attr;
+ attr.type = attr_pdl_gps_update;
+ attr.u.data = userevent.data1;
+ vehicle_set_attr(v, &attr);
+ }
+ } else if(userevent.code == SDL_USEREVENT_CODE_TIMER) {
+ struct callback *cb = (struct callback *)userevent.data1;
+ dbg(lvl_debug, "SDL_USEREVENT timer received cb(%p)", cb);
+ callback_call_0(cb);
+ } else if(userevent.code == SDL_USEREVENT_CODE_WATCH) {
+ struct callback *cb = (struct callback *)userevent.data1;
+ dbg(lvl_debug, "SDL_USEREVENT watch received cb(%p)", cb);
+ callback_call_0(cb);
+ } else if(userevent.code == SDL_USEREVENT_CODE_CALL_CALLBACK) {
+ struct callback_list *cbl = (struct callback_list *)userevent.data1;
+ dbg(lvl_debug, "SDL_USEREVENT call_callback received cbl(%p)", cbl);
+ callback_list_call_0(cbl);
+ } else if(userevent.code == SDL_USEREVENT_CODE_IDLE_EVENT) {
+ dbg(lvl_debug, "SDL_USEREVENT idle_event received");
+ }
#ifdef USE_WEBOS_ACCELEROMETER
- else if(userevent.code == SDL_USEREVENT_CODE_ROTATE)
- {
- dbg(lvl_debug, "SDL_USEREVENT rotate received\n");
- switch(gr->orientation)
- {
- case WEBOS_ORIENTATION_PORTRAIT:
- gr->screen = SDL_SetVideoMode(gr->real_w, gr->real_h, gr->video_bpp, gr->video_flags);
- PDL_SetOrientation(PDL_ORIENTATION_0);
- break;
- case WEBOS_ORIENTATION_LANDSCAPE:
- gr->screen = SDL_SetVideoMode(gr->real_h, gr->real_w, gr->video_bpp, gr->video_flags);
- PDL_SetOrientation(PDL_ORIENTATION_270);
- break;
- }
- if(gr->screen == NULL)
- {
- navit_destroy(gr->nav);
- }
- else
- {
- callback_list_call_attr_2(gr->cbl, attr_resize, (void *)gr->screen->w, (void *)gr->screen->h);
- }
- }
+ else if(userevent.code == SDL_USEREVENT_CODE_ROTATE) {
+ dbg(lvl_debug, "SDL_USEREVENT rotate received");
+ switch(gr->orientation) {
+ case WEBOS_ORIENTATION_PORTRAIT:
+ gr->screen = SDL_SetVideoMode(gr->real_w, gr->real_h, gr->video_bpp, gr->video_flags);
+ PDL_SetOrientation(PDL_ORIENTATION_0);
+ break;
+ case WEBOS_ORIENTATION_LANDSCAPE:
+ gr->screen = SDL_SetVideoMode(gr->real_h, gr->real_w, gr->video_bpp, gr->video_flags);
+ PDL_SetOrientation(PDL_ORIENTATION_270);
+ break;
+ }
+ if(gr->screen == NULL) {
+ navit_destroy(gr->nav);
+ } else {
+ callback_list_call_attr_2(gr->cbl, attr_resize, (void *)gr->screen->w, (void *)gr->screen->h);
+ }
+ }
#endif
- else
- dbg(lvl_warning, "unknown SDL_USEREVENT\n");
+ else
+ dbg(lvl_warning, "unknown SDL_USEREVENT");
- break;
- }
+ break;
+ }
#endif
- default:
- {
- dbg(lvl_debug, "SDL_Event %d\n", ev.type);
- break;
- }
- }
+ default: {
+ dbg(lvl_debug, "SDL_Event %d", ev.type);
+ break;
+ }
+ }
}
#ifdef USE_WEBOS
@@ -1385,8 +1273,8 @@ static gboolean graphics_sdl_idle(void *data)
#ifdef USE_WEBOS_ACCELEROMETER
if (PDL_GetPDKVersion() > 100) {
- event_remove_timeout(accel_to);
- callback_destroy(accel_cb);
+ event_remove_timeout(accel_to);
+ callback_destroy(accel_cb);
}
#endif
@@ -1394,9 +1282,8 @@ static gboolean graphics_sdl_idle(void *data)
}
-static struct graphics_priv *
-graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs, struct callback_list *cbl)
-{
+static struct graphics_priv *graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr **attrs,
+ struct callback_list *cbl) {
struct graphics_priv *this=g_new0(struct graphics_priv, 1);
struct font_priv *(*font_freetype_new) (void *meth);
struct attr *attr;
@@ -1409,21 +1296,21 @@ graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr *
/* initialize fonts */
font_freetype_new = plugin_get_category_font("freetype");
- if (!font_freetype_new) {
- g_free(this);
- return NULL;
- }
+ if (!font_freetype_new) {
+ g_free(this);
+ return NULL;
+ }
- font_freetype_new(&this->freetype_methods);
+ font_freetype_new(&this->freetype_methods);
- *meth = graphics_methods;
+ *meth = graphics_methods;
- meth->font_new = (struct graphics_font_priv *
- (*)(struct graphics_priv *, struct graphics_font_methods *, char *, int,
- int)) this->freetype_methods.font_new;
- meth->get_text_bbox = (void*) this->freetype_methods.get_text_bbox;
+ meth->font_new = (struct graphics_font_priv *
+ (*)(struct graphics_priv *, struct graphics_font_methods *, char *, int,
+ int)) this->freetype_methods.font_new;
+ meth->get_text_bbox = (void*) this->freetype_methods.get_text_bbox;
- dbg(lvl_debug,"Calling SDL_Init\n");
+ dbg(lvl_debug,"Calling SDL_Init");
#ifdef USE_WEBOS
# ifdef USE_WEBOS_ACCELEROMETER
ret = SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_JOYSTICK);
@@ -1433,21 +1320,19 @@ graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr *
#else
ret = SDL_Init(SDL_INIT_VIDEO);
#endif
- if(ret < 0)
- {
- dbg(lvl_error,"SDL_Init failed %d\n", ret);
- this->freetype_methods.destroy();
+ if(ret < 0) {
+ dbg(lvl_error,"SDL_Init failed %d", ret);
+ this->freetype_methods.destroy();
g_free(this);
return NULL;
}
#ifdef USE_WEBOS
- dbg(lvl_debug,"Calling PDL_Init(0)\n");
+ dbg(lvl_debug,"Calling PDL_Init(0)");
ret = PDL_Init(0);
- if(ret < 0)
- {
- dbg(lvl_error,"PDL_Init failed %d\n", ret);
- this->freetype_methods.destroy();
+ if(ret < 0) {
+ dbg(lvl_error,"PDL_Init failed %d", ret);
+ this->freetype_methods.destroy();
g_free(this);
return NULL;
}
@@ -1456,9 +1341,9 @@ graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr *
#else
if (! event_request_system("glib","graphics_sdl_new")) {
#endif
- dbg(lvl_error,"event_request_system failed");
- this->freetype_methods.destroy();
- g_free(this);
+ dbg(lvl_error,"event_request_system failed");
+ this->freetype_methods.destroy();
+ g_free(this);
return NULL;
}
@@ -1477,8 +1362,8 @@ graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr *
if ((attr=attr_search(attrs, NULL, attr_bpp)))
this->video_bpp=attr->u.num;
if ((attr=attr_search(attrs, NULL, attr_flags))) {
- if (attr->u.num & 1)
- this->video_flags = SDL_SWSURFACE;
+ if (attr->u.num & 1)
+ this->video_flags = SDL_SWSURFACE;
}
if ((attr=attr_search(attrs, NULL, attr_frame))) {
if(!attr->u.num)
@@ -1487,10 +1372,9 @@ graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr *
this->screen = SDL_SetVideoMode(w, h, this->video_bpp, this->video_flags);
- if(this->screen == NULL)
- {
- dbg(lvl_error,"SDL_SetVideoMode failed\n");
- this->freetype_methods.destroy();
+ if(this->screen == NULL) {
+ dbg(lvl_error,"SDL_SetVideoMode failed");
+ this->freetype_methods.destroy();
g_free(this);
#ifdef USE_WEBOS
PDL_Quit();
@@ -1503,19 +1387,18 @@ graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr *
w = this->screen->w;
h = this->screen->h;
- dbg(lvl_debug, "using screen %ix%i@%i\n",
- this->screen->w, this->screen->h,
- this->screen->format->BytesPerPixel * 8);
+ dbg(lvl_debug, "using screen %ix%i@%i",
+ this->screen->w, this->screen->h,
+ this->screen->format->BytesPerPixel * 8);
#ifdef USE_WEBOS_ACCELEROMETER
if ( w > h ) {
- this->orientation = WEBOS_ORIENTATION_LANDSCAPE;
- this->real_w = h;
- this->real_h = w;
- }
- else {
- this->orientation = WEBOS_ORIENTATION_PORTRAIT;
- this->real_w = w;
- this->real_h = h;
+ this->orientation = WEBOS_ORIENTATION_LANDSCAPE;
+ this->real_w = h;
+ this->real_h = w;
+ } else {
+ this->orientation = WEBOS_ORIENTATION_PORTRAIT;
+ this->real_w = w;
+ this->real_h = h;
}
this->accelerometer = SDL_JoystickOpen(0);
#endif
@@ -1530,7 +1413,7 @@ graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr *
#ifdef USE_WEBOS
if(the_graphics!=NULL) {
- dbg(lvl_debug,"graphics_sdl_new: graphics struct already set: %d!\n", the_graphics_count);
+ dbg(lvl_debug,"graphics_sdl_new: graphics struct already set: %d!", the_graphics_count);
}
the_graphics = this;
the_graphics_count++;
@@ -1551,12 +1434,10 @@ graphics_sdl_new(struct navit *nav, struct graphics_methods *meth, struct attr *
#ifdef USE_WEBOS
/* ---------- SDL Eventhandling ---------- */
-static Uint32
-sdl_timer_callback(Uint32 interval, void* param)
-{
+static Uint32 sdl_timer_callback(Uint32 interval, void* param) {
struct event_timeout *timeout=(struct event_timeout*)param;
- dbg(lvl_debug,"timer(%p) multi(%d) interval(%d) fired\n", param, timeout->multi, interval);
+ dbg(lvl_debug,"timer(%p) multi(%d) interval(%d) fired", param, timeout->multi, interval);
SDL_Event event;
SDL_UserEvent userevent;
@@ -1572,63 +1453,57 @@ sdl_timer_callback(Uint32 interval, void* param)
SDL_PushEvent (&event);
if (timeout->multi == 0) {
- timeout->id = 0;
- return 0; // cancel timer
+ timeout->id = 0;
+ return 0; // cancel timer
}
return interval; // reactivate timer
}
/* SDL Mainloop */
-static void
-event_sdl_main_loop_run(void)
-{
+static void event_sdl_main_loop_run(void) {
PDL_ScreenTimeoutEnable(PDL_FALSE);
graphics_sdl_idle(NULL);
PDL_ScreenTimeoutEnable(PDL_TRUE);
}
-static void
-event_sdl_main_loop_quit(void)
-{
+static void event_sdl_main_loop_quit(void) {
quit_event_loop = 1;
}
/* Watch */
-static void
-event_sdl_watch_thread (GPtrArray *watch_list)
-{
+static void event_sdl_watch_thread (GPtrArray *watch_list) {
struct pollfd *pfds = g_new0 (struct pollfd, watch_list->len);
struct event_watch *ew;
int ret;
int idx;
for (idx = 0; idx < watch_list->len; idx++ ) {
- ew = g_ptr_array_index (watch_list, idx);
- g_memmove (&pfds[idx], ew->pfd, sizeof(struct pollfd));
+ ew = g_ptr_array_index (watch_list, idx);
+ g_memmove (&pfds[idx], ew->pfd, sizeof(struct pollfd));
}
while ((ret = ppoll(pfds, watch_list->len, NULL, NULL)) > 0) {
- for (idx = 0; idx < watch_list->len; idx++ ) {
- if (pfds[idx].revents == pfds[idx].events) { /* The requested event happened, notify mainloop! */
- ew = g_ptr_array_index (watch_list, idx);
- dbg(lvl_debug,"watch(%p) event(%d) encountered\n", ew, pfds[idx].revents);
+ for (idx = 0; idx < watch_list->len; idx++ ) {
+ if (pfds[idx].revents == pfds[idx].events) { /* The requested event happened, notify mainloop! */
+ ew = g_ptr_array_index (watch_list, idx);
+ dbg(lvl_debug,"watch(%p) event(%d) encountered", ew, pfds[idx].revents);
- SDL_Event event;
- SDL_UserEvent userevent;
+ SDL_Event event;
+ SDL_UserEvent userevent;
- userevent.type = SDL_USEREVENT;
- userevent.code = SDL_USEREVENT_CODE_WATCH;
- userevent.data1 = ew->cb;
- userevent.data2 = NULL;
+ userevent.type = SDL_USEREVENT;
+ userevent.code = SDL_USEREVENT_CODE_WATCH;
+ userevent.data1 = ew->cb;
+ userevent.data2 = NULL;
- event.type = SDL_USEREVENT;
- event.user = userevent;
+ event.type = SDL_USEREVENT;
+ event.user = userevent;
- SDL_PushEvent (&event);
- }
- }
+ SDL_PushEvent (&event);
+ }
+ }
}
g_free(pfds);
@@ -1636,12 +1511,10 @@ event_sdl_watch_thread (GPtrArray *watch_list)
pthread_exit(0);
}
-static void
-event_sdl_watch_startthread(GPtrArray *watch_list)
-{
- dbg(lvl_debug,"enter\n");
+static void event_sdl_watch_startthread(GPtrArray *watch_list) {
+ dbg(lvl_debug,"enter");
if (sdl_watch_thread)
- event_sdl_watch_stopthread();
+ event_sdl_watch_stopthread();
int ret;
ret = pthread_create (&sdl_watch_thread, NULL, (void *)event_sdl_watch_thread, (void *)watch_list);
@@ -1649,27 +1522,23 @@ event_sdl_watch_startthread(GPtrArray *watch_list)
dbg_assert (ret == 0);
}
-static void
-event_sdl_watch_stopthread()
-{
- dbg(lvl_debug,"enter\n");
+static void event_sdl_watch_stopthread() {
+ dbg(lvl_debug,"enter");
if (sdl_watch_thread) {
- /* Notify the watch thread that the list of FDs will change */
- pthread_kill(sdl_watch_thread, SIGUSR1);
- pthread_join(sdl_watch_thread, NULL);
- sdl_watch_thread = 0;
+ /* Notify the watch thread that the list of FDs will change */
+ pthread_kill(sdl_watch_thread, SIGUSR1);
+ pthread_join(sdl_watch_thread, NULL);
+ sdl_watch_thread = 0;
}
}
-static struct event_watch *
-event_sdl_add_watch(int fd, enum event_watch_cond cond, struct callback *cb)
-{
- dbg(lvl_debug,"fd(%d) cond(%x) cb(%x)\n", fd, cond, cb);
+static struct event_watch *event_sdl_add_watch(int fd, enum event_watch_cond cond, struct callback *cb) {
+ dbg(lvl_debug,"fd(%d) cond(%x) cb(%x)", fd, cond, cb);
event_sdl_watch_stopthread();
if (!sdl_watch_list)
- sdl_watch_list = g_ptr_array_new();
+ sdl_watch_list = g_ptr_array_new();
struct event_watch *new_ew = g_new0 (struct event_watch, 1);
struct pollfd *pfd = g_new0 (struct pollfd, 1);
@@ -1678,15 +1547,15 @@ event_sdl_add_watch(int fd, enum event_watch_cond cond, struct callback *cb)
/* Modify watchlist here */
switch (cond) {
- case event_watch_cond_read:
- pfd->events = POLLIN;
- break;
- case event_watch_cond_write:
- pfd->events = POLLOUT;
- break;
- case event_watch_cond_except:
- pfd->events = POLLERR|POLLHUP;
- break;
+ case event_watch_cond_read:
+ pfd->events = POLLIN;
+ break;
+ case event_watch_cond_write:
+ pfd->events = POLLOUT;
+ break;
+ case event_watch_cond_except:
+ pfd->events = POLLERR|POLLHUP;
+ break;
}
new_ew->pfd = (struct pollfd*) pfd;
@@ -1699,10 +1568,8 @@ event_sdl_add_watch(int fd, enum event_watch_cond cond, struct callback *cb)
return new_ew;
}
-static void
-event_sdl_remove_watch(struct event_watch *ew)
-{
- dbg(lvl_debug,"enter %p\n",ew);
+static void event_sdl_remove_watch(struct event_watch *ew) {
+ dbg(lvl_debug,"enter %p",ew);
event_sdl_watch_stopthread();
@@ -1711,20 +1578,18 @@ event_sdl_remove_watch(struct event_watch *ew)
g_free (ew);
if (sdl_watch_list->len > 0)
- event_sdl_watch_startthread(sdl_watch_list);
+ event_sdl_watch_startthread(sdl_watch_list);
}
/* Timeout */
-static struct event_timeout *
-event_sdl_add_timeout(int timeout, int multi, struct callback *cb)
-{
+static struct event_timeout *event_sdl_add_timeout(int timeout, int multi, struct callback *cb) {
struct event_timeout * ret = g_new0(struct event_timeout, 1);
if(!ret) {
- dbg(lvl_error,"g_new0 failed\n");
- return ret;
+ dbg(lvl_error,"g_new0 failed");
+ return ret;
}
- dbg(lvl_debug,"timer(%p) multi(%d) interval(%d) cb(%p) added\n",ret, multi, timeout, cb);
+ dbg(lvl_debug,"timer(%p) multi(%d) interval(%d) cb(%p) added",ret, multi, timeout, cb);
ret->multi = multi;
ret->cb = cb;
ret->id = SDL_AddTimer(timeout, sdl_timer_callback, ret);
@@ -1732,42 +1597,35 @@ event_sdl_add_timeout(int timeout, int multi, struct callback *cb)
return ret;
}
-static void
-event_sdl_remove_timeout(struct event_timeout *to)
-{
- dbg(lvl_info,"enter %p\n", to);
- if(to)
- {
- /* do not SDL_RemoveTimer if oneshot timer has already fired */
- int ret = to->id == 0 ? SDL_TRUE : SDL_RemoveTimer(to->id);
+static void event_sdl_remove_timeout(struct event_timeout *to) {
+ dbg(lvl_info,"enter %p", to);
+ if(to) {
+ /* do not SDL_RemoveTimer if oneshot timer has already fired */
+ int ret = to->id == 0 ? SDL_TRUE : SDL_RemoveTimer(to->id);
if (ret == SDL_FALSE)
- dbg(lvl_error,"SDL_RemoveTimer (%p) failed\n", to->id);
+ dbg(lvl_error,"SDL_RemoveTimer (%p) failed", to->id);
- g_free(to);
- dbg(lvl_debug,"timer(%p) removed\n", to);
+ g_free(to);
+ dbg(lvl_debug,"timer(%p) removed", to);
}
}
/* Idle */
/* sort ptr_array by priority, increasing order */
-static gint
-sdl_sort_idle_tasks(gconstpointer parama, gconstpointer paramb)
-{
+static gint sdl_sort_idle_tasks(gconstpointer parama, gconstpointer paramb) {
struct idle_task *a = (struct idle_task *)parama;
struct idle_task *b = (struct idle_task *)paramb;
if (a->priority < b->priority)
- return -1;
+ return -1;
if (a->priority > b->priority)
- return 1;
+ return 1;
return 0;
}
-static struct event_idle *
-event_sdl_add_idle(int priority, struct callback *cb)
-{
- dbg(lvl_debug,"add idle priority(%d) cb(%p)\n", priority, cb);
+static struct event_idle *event_sdl_add_idle(int priority, struct callback *cb) {
+ dbg(lvl_debug,"add idle priority(%d) cb(%p)", priority, cb);
struct idle_task *task = g_new0(struct idle_task, 1);
task->priority = priority;
@@ -1775,42 +1633,36 @@ event_sdl_add_idle(int priority, struct callback *cb)
g_ptr_array_add(idle_tasks, (gpointer)task);
- if (idle_tasks->len < 2)
- {
- SDL_Event event;
- SDL_UserEvent userevent;
+ if (idle_tasks->len < 2) {
+ SDL_Event event;
+ SDL_UserEvent userevent;
- dbg(lvl_debug,"poking eventloop because of new idle_events\n");
+ dbg(lvl_debug,"poking eventloop because of new idle_events");
- userevent.type = SDL_USEREVENT;
- userevent.code = SDL_USEREVENT_CODE_IDLE_EVENT;
- userevent.data1 = NULL;
- userevent.data2 = NULL;
+ userevent.type = SDL_USEREVENT;
+ userevent.code = SDL_USEREVENT_CODE_IDLE_EVENT;
+ userevent.data1 = NULL;
+ userevent.data2 = NULL;
- event.type = SDL_USEREVENT;
- event.user = userevent;
+ event.type = SDL_USEREVENT;
+ event.user = userevent;
- SDL_PushEvent (&event);
- }
- else // more than one entry => sort the list
- g_ptr_array_sort(idle_tasks, sdl_sort_idle_tasks);
+ SDL_PushEvent (&event);
+ } else // more than one entry => sort the list
+ g_ptr_array_sort(idle_tasks, sdl_sort_idle_tasks);
return (struct event_idle *)task;
}
-static void
-event_sdl_remove_idle(struct event_idle *task)
-{
- dbg(lvl_debug,"remove task(%p)\n", task);
+static void event_sdl_remove_idle(struct event_idle *task) {
+ dbg(lvl_debug,"remove task(%p)", task);
g_ptr_array_remove(idle_tasks, (gpointer)task);
}
/* callback */
-static void
-event_sdl_call_callback(struct callback_list *cbl)
-{
- dbg(lvl_debug,"call_callback cbl(%p)\n",cbl);
+static void event_sdl_call_callback(struct callback_list *cbl) {
+ dbg(lvl_debug,"call_callback cbl(%p)",cbl);
SDL_Event event;
SDL_UserEvent userevent;
@@ -1837,9 +1689,7 @@ static struct event_methods event_sdl_methods = {
event_sdl_call_callback,
};
-static struct event_priv *
-event_sdl_new(struct event_methods* methods)
-{
+static struct event_priv *event_sdl_new(struct event_methods* methods) {
idle_tasks = g_ptr_array_new();
*methods = event_sdl_methods;
return NULL;
@@ -1848,9 +1698,7 @@ event_sdl_new(struct event_methods* methods)
/* ---------- SDL Eventhandling ---------- */
#endif
-void
-plugin_init(void)
-{
+void plugin_init(void) {
#ifdef USE_WEBOS
plugin_register_category_event("sdl", event_sdl_new);
#endif