summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2009-10-11 20:11:48 +0000
committerThomas Martitz <kugel@rockbox.org>2009-10-11 20:11:48 +0000
commit891c446302d341d2e8f6f2da54343589bf46d0e4 (patch)
treebb5cf557c25f5a508430937f5c42d80c622dec6e
parent6cea8c1e1aa9a7888ceec0cf35181632b5b0eb29 (diff)
downloadrockbox-891c446302d341d2e8f6f2da54343589bf46d0e4.tar.gz
rockbox-891c446302d341d2e8f6f2da54343589bf46d0e4.zip
Add a action helper for touchscreen targets to only receive the touchpress coordinates if they're in the passed viewport. Also, fixes the coordinates to be relaitve to the viewport.
Use it in the color picker screen. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23116 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/action.c19
-rw-r--r--apps/action.h24
-rw-r--r--apps/gui/color_picker.c20
3 files changed, 49 insertions, 14 deletions
diff --git a/apps/action.c b/apps/action.c
index fc10c927e5..2eef7d9d7b 100644
--- a/apps/action.c
+++ b/apps/action.c
@@ -37,6 +37,7 @@
37#if defined(HAVE_LCD_BITMAP) && !defined(BOOTLOADER) 37#if defined(HAVE_LCD_BITMAP) && !defined(BOOTLOADER)
38#include "language.h" 38#include "language.h"
39#endif 39#endif
40#include "viewport.h"
40 41
41static int last_button = BUTTON_NONE|BUTTON_REL; /* allow the ipod wheel to 42static int last_button = BUTTON_NONE|BUTTON_REL; /* allow the ipod wheel to
42 work on startup */ 43 work on startup */
@@ -386,6 +387,24 @@ int action_get_touchscreen_press(short *x, short *y)
386 return BUTTON_REPEAT|BUTTON_REL; 387 return BUTTON_REPEAT|BUTTON_REL;
387 return BUTTON_TOUCHSCREEN; 388 return BUTTON_TOUCHSCREEN;
388} 389}
390
391int action_get_touchscreen_press_in_vp(short *x1, short *y1, struct viewport *vp)
392{
393 short x, y;
394 int ret;
395
396 ret = action_get_touchscreen_press(&x, &y);
397
398 if (ret != BUTTON_NONE && viewport_point_within_vp(vp, x, y))
399 {
400 *x1 = x - vp->x;
401 *y1 = y - vp->y;
402 return ret;
403 }
404 if (ret & BUTTON_TOUCHSCREEN)
405 return ACTION_UNKNOWN;
406 return BUTTON_NONE;
407}
389#endif 408#endif
390 409
391/* Don't let get_action*() return any ACTION_* values untill the current buttons 410/* Don't let get_action*() return any ACTION_* values untill the current buttons
diff --git a/apps/action.h b/apps/action.h
index 24250ef869..8d8e8f50fd 100644
--- a/apps/action.h
+++ b/apps/action.h
@@ -22,6 +22,7 @@
22 22
23#include "stdbool.h" 23#include "stdbool.h"
24#include "button.h" 24#include "button.h"
25#include "viewport.h"
25 26
26#define TIMEOUT_BLOCK -1 27#define TIMEOUT_BLOCK -1
27#define TIMEOUT_NOBLOCK 0 28#define TIMEOUT_NOBLOCK 0
@@ -327,12 +328,25 @@ int get_action_statuscode(int *button);
327intptr_t get_action_data(void); 328intptr_t get_action_data(void);
328 329
329#ifdef HAVE_TOUCHSCREEN 330#ifdef HAVE_TOUCHSCREEN
330/* return BUTTON_NONE on error 331/* return BUTTON_NONE on error
331 BUTTON_REPEAT if repeated press 332 * BUTTON_REPEAT if repeated press
332 BUTTON_REL if its a short press 333 * BUTTON_REPEAT|BUTTON_REL if release after repeated press
333 BUTTON_TOUCHSCREEN otherwise 334 * BUTTON_REL if its a short press = release after press
334*/ 335 * BUTTON_TOUCHSCREEN if press
336 */
335int action_get_touchscreen_press(short *x, short *y); 337int action_get_touchscreen_press(short *x, short *y);
338
339/*
340 * wrapper action_get_touchscreen_press()
341 * to filter the touchscreen coordinates through a viewport
342 *
343 * returns the action and x1, y1 relative to the viewport if
344 * the press was within the viewport,
345 * ACTION_UNKNOWN (and x1, y1 untouched) if the press was outside
346 * BUTTON_NONE else
347 *
348 **/
349int action_get_touchscreen_press_in_vp(short *x1, short *y1, struct viewport *vp);
336#endif 350#endif
337 351
338/* Don't let get_action*() return any ACTION_* values untill the current buttons 352/* Don't let get_action*() return any ACTION_* values untill the current buttons
diff --git a/apps/gui/color_picker.c b/apps/gui/color_picker.c
index d70b98c198..75c0612292 100644
--- a/apps/gui/color_picker.c
+++ b/apps/gui/color_picker.c
@@ -335,7 +335,7 @@ static int touchscreen_slider(struct screen *display,
335{ 335{
336 short x,y; 336 short x,y;
337 int text_top, slider_x, slider_width, title_height; 337 int text_top, slider_x, slider_width, title_height;
338 unsigned button = action_get_touchscreen_press(&x, &y); 338 int button;
339 bool display_three_rows; 339 bool display_three_rows;
340 int max_label_width; 340 int max_label_width;
341 int pressed_slider; 341 int pressed_slider;
@@ -344,16 +344,15 @@ static int touchscreen_slider(struct screen *display,
344 344
345 viewport_set_defaults(&vp, display->screen_type); 345 viewport_set_defaults(&vp, display->screen_type);
346 346
347 if (button == BUTTON_NONE)
348 return ACTION_NONE;
349
350 max_label_width = label_get_max_width(display); 347 max_label_width = label_get_max_width(display);
351 display->getstringsize(title, NULL, &title_height); 348 display->getstringsize(title, NULL, &title_height);
352 349 button = action_get_touchscreen_press_in_vp(&x, &y, &vp);
350 if (button == ACTION_UNKNOWN || button == BUTTON_NONE)
351 return ACTION_NONE;
353 /* Get slider positions and top starting position 352 /* Get slider positions and top starting position
354 * need vp.y here, because of the statusbar, since touchscreen 353 * need vp.y here, because of the statusbar, since touchscreen
355 * coordinates are absolute */ 354 * coordinates are absolute */
356 text_top = vp.y + MARGIN_TOP + title_height + TITLE_MARGIN_BOTTOM + 355 text_top = MARGIN_TOP + title_height + TITLE_MARGIN_BOTTOM +
357 SELECTOR_TB_MARGIN; 356 SELECTOR_TB_MARGIN;
358 slider_x = SELECTOR_WIDTH + max_label_width + SLIDER_TEXT_MARGIN; 357 slider_x = SELECTOR_WIDTH + max_label_width + SLIDER_TEXT_MARGIN;
359 slider_width = vp.width - slider_x*2 - max_label_width; 358 slider_width = vp.width - slider_x*2 - max_label_width;
@@ -376,12 +375,15 @@ static int touchscreen_slider(struct screen *display,
376 return ACTION_STD_CANCEL; 375 return ACTION_STD_CANCEL;
377 } 376 }
378 377
379 pressed_slider = (y - text_top)/line_height; 378 vp.y += text_top;
380 if (pressed_slider > (display_three_rows?2:0)) 379 vp.height = line_height * (display_three_rows ? 3:1);
381 { 380 if (!viewport_point_within_vp(&vp, x, y))
381 { /* touching the color area means accept */
382 if (button == BUTTON_REL) 382 if (button == BUTTON_REL)
383 return ACTION_STD_OK; 383 return ACTION_STD_OK;
384 } 384 }
385 /* y is relative to the original viewport */
386 pressed_slider = (y - text_top)/line_height;
385 if (pressed_slider != *selected_slider) 387 if (pressed_slider != *selected_slider)
386 *selected_slider = pressed_slider; 388 *selected_slider = pressed_slider;
387 /* add max_label_width to overcome integer division limits, 389 /* add max_label_width to overcome integer division limits,