Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorperepujal <perepujal>2011-07-29 21:27:39 (GMT)
committer perepujal <perepujal>2011-07-29 21:27:39 (GMT)
commite81339353b6af674b4dccd3e7996954ae8b2d717 (patch)
tree768a95e82517e1e47d7a84317a688d2a6b380e08
parent258031e6b3ea12c7c56cdab0cc05d0d88670b464 (diff)
More improvements on joystick, now Hat can move continuos and there are some shortcurts that can be associated to buttons.
-rw-r--r--src/tuxpaint.c544
1 files changed, 458 insertions, 86 deletions
diff --git a/src/tuxpaint.c b/src/tuxpaint.c
index 2a11a23..32caddb 100644
--- a/src/tuxpaint.c
+++ b/src/tuxpaint.c
@@ -977,6 +977,25 @@ static int onscreen_keyboard = 0;
static int joystick_low_threshold = 3200;
static int joystick_slowness = 15;
static int joystick_maxsteps = 7;
+static int joystick_hat_slowness = 15;
+static Uint32 joystick_hat_timeout = 1000;
+static int joystick_button_escape = 255;
+static int joystick_button_selectbrushtool = 255;
+static int joystick_button_selectstamptool = 255;
+static int joystick_button_selectlinestool = 255;
+static int joystick_button_selectshapestool = 255;
+static int joystick_button_selecttexttool = 255;
+static int joystick_button_selectlabeltool = 255;
+static int joystick_button_selectmagictool = 255;
+static int joystick_button_undo = 255;
+static int joystick_button_redo = 255;
+static int joystick_button_selecterasertool = 255;
+static int joystick_button_new = 255;
+static int joystick_button_open = 255;
+static int joystick_button_save = 255;
+static int joystick_button_pagesetup = 255;
+static int joystick_button_print = 255;
+static Uint32 old_hat_ticks = 0;
static int oldpos_x;
static int oldpos_y;
static int disable_screensaver;
@@ -1115,9 +1134,13 @@ static void tmp_apply_uncommited_text(void);
static void undo_tmp_applied_text(void);
static void handle_joyaxismotion(SDL_Event event, int *motioner, int *val_x, int *val_y);
-static void handle_joyhatmotion(SDL_Event event, int oldpos_x, int oldpos_y);
+static void handle_joyhatmotion(SDL_Event event, int oldpos_x, int oldpos_y, int *valhat_x, int *valhat_y, int *hat_motioner, Uint32 *old_hat_ticks);
static void handle_joyballmotion(SDL_Event event, int oldpos_x, int oldpos_y);
static void handle_joybuttonupdown(SDL_Event event, int oldpos_x, int oldpos_y);
+static void handle_motioners(int oldpos_x, int oldpos_y, int motioner, int hatmotioner, int old_hat_ticks, int val_x, int val_y, int valhat_x, int valhat_y);
+
+static void handle_joybuttonupdownscl(SDL_Event event, int oldpos_x, int oldpos_y, SDL_Rect real_r_tools);
+
/* Magic tools API and tool handles: */
@@ -2018,7 +2041,7 @@ SDL_Surface *messager = NULL;
TTF_Font *fonty = NULL;
-SDL_Color textcolory = { 0, 0, 0 };
+SDL_Color textcolory = { 0, 0, 0, 0};
const char *keybd_array[] = {"","Esc", " `", " 1"," 2"," 3"," 4"," 5"," 6"," 7"," 8"," 9"," 0"," -"," =","Back",
"Caps"," a"," b"," c"," d"," e"," f"," g"," h"," i"," j"," k"," l"," m"," n"," [", " ]"," \\","Ret",
@@ -2042,7 +2065,7 @@ int cur_thing, shift_flag, caps_flag, enter_flag;
static void mainloop(void)
{
- int done, tool_flag, canvas_flag,text_flag, val_x, val_y, new_x, new_y,
+ int done, tool_flag, canvas_flag,text_flag, val_x, val_y, valhat_x, valhat_y, new_x, new_y,
shape_tool_mode,
shape_ctr_x, shape_ctr_y, shape_outer_x, shape_outer_y, color_flag,
old_stamp_group, which;
@@ -2051,6 +2074,7 @@ static void mainloop(void)
int do_draw, max;
int ignoring_motion;
int motioner = 0;
+ int hatmotioner = 0;
int whichc = 0;
int whicht = 0;
int test_x = 0;
@@ -2066,6 +2090,7 @@ static void mainloop(void)
Uint32 last_cursor_blink, cur_cursor_blink,
pre_event_time, current_event_time;
SDL_Rect update_rect;
+ SDL_Rect real_r_tools = r_tools;
#ifdef DEBUG
Uint16 key_unicode;
SDLKey key_down;
@@ -2093,6 +2118,8 @@ static void mainloop(void)
text_flag = 0;
val_x = 0;
val_y = 0;
+ valhat_x = 0;
+ valhat_y = 0;
done = 0;
color_flag = 0;
keyglobal = 0;
@@ -2599,6 +2626,8 @@ static void mainloop(void)
#ifndef NOSOUND
if (use_sound)
{
+ printf("modstate at mainloop %d, mod %d\n", SDL_GetModState(), mod);
+
mute = !mute;
Mix_HaltChannel(-1);
@@ -3145,13 +3174,13 @@ static void mainloop(void)
handle_joyaxismotion(event, &motioner, &val_x, &val_y);
else if (event.type == SDL_JOYHATMOTION)
- handle_joyhatmotion(event, oldpos_x, oldpos_y);
+ handle_joyhatmotion(event, oldpos_x, oldpos_y, &valhat_x, &valhat_y, &hatmotioner, &old_hat_ticks);
else if (event.type == SDL_JOYBALLMOTION)
handle_joyballmotion(event, oldpos_x, oldpos_y);
else if (event.type == SDL_JOYBUTTONDOWN || event.type == SDL_JOYBUTTONUP)
- handle_joybuttonupdown(event, oldpos_x, oldpos_y);
+ handle_joybuttonupdownscl(event, oldpos_x, oldpos_y, real_r_tools);
else if (event.type == SDL_MOUSEBUTTONDOWN &&
event.button.button >= 2 &&
@@ -3192,7 +3221,7 @@ static void mainloop(void)
if (HIT(r_tools))
{
- SDL_Rect real_r_tools = r_tools;
+ real_r_tools = r_tools;
if (NUM_TOOLS > 14 + TOOLOFFSET)
{
@@ -5464,12 +5493,9 @@ static void mainloop(void)
}
}
- if (motioner)
- {
- SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
- if (joystick_slowness)
- SDL_Delay(joystick_slowness);
- }
+ if (motioner | hatmotioner)
+ handle_motioners(oldpos_x, oldpos_y,motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y);
+
SDL_Delay(1);
}
@@ -11643,8 +11669,10 @@ static int do_prompt_image_flash_snd(const char *const text,
int free_img1b;
int txt_left, txt_right, img_left, btn_left, txt_btn_left, txt_btn_right;
int val_x, val_y, motioner;
+ int valhat_x, valhat_y, hatmotioner;
val_x = val_y = motioner = 0;
+ valhat_x = valhat_y = hatmotioner = 0;
emulate_button_pressed = 0;
hide_blinking_cursor();
@@ -11994,7 +12022,8 @@ static int do_prompt_image_flash_snd(const char *const text,
handle_joyaxismotion(event, &motioner, &val_x, &val_y);
else if (event.type == SDL_JOYHATMOTION)
- handle_joyhatmotion(event, oldpos_x, oldpos_y);
+ handle_joyhatmotion(event, oldpos_x, oldpos_y, &valhat_x, &valhat_y, &hatmotioner, &old_hat_ticks);
+
else if (event.type == SDL_JOYBALLMOTION)
handle_joyballmotion(event, oldpos_x, oldpos_y);
@@ -12003,12 +12032,9 @@ static int do_prompt_image_flash_snd(const char *const text,
handle_joybuttonupdown(event, oldpos_x, oldpos_y);
}
- if (motioner)
- {
- if (joystick_slowness)
- SDL_Delay(joystick_slowness);
- SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
- }
+ if (motioner | hatmotioner)
+ handle_motioners(oldpos_x, oldpos_y,motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y);
+
SDL_Delay(10);
@@ -13580,9 +13606,10 @@ static int do_open(void)
int places_to_look;
int opened_something;
int val_x, val_y, motioner;
+ int valhat_x, valhat_y, hatmotioner;
val_x = val_y = motioner = 0;
-
+ valhat_x = valhat_y = hatmotioner = 0;
opened_something = 0;
do
@@ -14381,7 +14408,7 @@ static int do_open(void)
handle_joyaxismotion(event, &motioner, &val_x, &val_y);
else if (event.type == SDL_JOYHATMOTION)
- handle_joyhatmotion(event, oldpos_x, oldpos_y);
+ handle_joyhatmotion(event, oldpos_x, oldpos_y, &valhat_x, &valhat_y, &hatmotioner, &old_hat_ticks);
else if (event.type == SDL_JOYBALLMOTION)
handle_joyballmotion(event, oldpos_x, oldpos_y);
@@ -14390,12 +14417,10 @@ static int do_open(void)
handle_joybuttonupdown(event, oldpos_x, oldpos_y);
}
- if (motioner)
- {
- SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
- if (joystick_slowness)
- SDL_Delay(joystick_slowness);
- }
+ if (motioner | hatmotioner)
+ handle_motioners(oldpos_x, oldpos_y,motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y);
+
+
SDL_Delay(10);
if (want_erase)
@@ -14691,9 +14716,10 @@ static int do_slideshow(void)
int xx, yy;
SDL_Surface *btn, *blnk;
int val_x, val_y, motioner;
+ int valhat_x, valhat_y, hatmotioner;
val_x = val_y = motioner = 0;
-
+ valhat_x = valhat_y = hatmotioner = 0;
do_setcursor(cursor_watch);
/* Allocate some space: */
@@ -15396,7 +15422,7 @@ static int do_slideshow(void)
handle_joyaxismotion(event, &motioner, &val_x, &val_y);
else if (event.type == SDL_JOYHATMOTION)
- handle_joyhatmotion(event, oldpos_x, oldpos_y);
+ handle_joyhatmotion(event, oldpos_x, oldpos_y, &valhat_x, &valhat_y, &hatmotioner, &old_hat_ticks);
else if (event.type == SDL_JOYBALLMOTION)
handle_joyballmotion(event, oldpos_x, oldpos_y);
@@ -15405,12 +15431,9 @@ static int do_slideshow(void)
handle_joybuttonupdown(event, oldpos_x, oldpos_y);
}
- if (motioner)
- {
- if (joystick_slowness)
- SDL_Delay(joystick_slowness);
- SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
- }
+ if (motioner | hatmotioner)
+ handle_motioners(oldpos_x, oldpos_y,motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y);
+
SDL_Delay(10);
}
while (!done);
@@ -15444,6 +15467,8 @@ static void play_slideshow(int * selected, int num_selected, char * dirname,
{
int i, which, next, done;
int val_x, val_y, motioner;
+ int valhat_x, valhat_y, hatmotioner;
+
SDL_Surface * img;
char * tmp_starter_id, * tmp_template_id, * tmp_file_id;
int tmp_starter_mirrored, tmp_starter_flipped, tmp_starter_personal;
@@ -15454,7 +15479,7 @@ static void play_slideshow(int * selected, int num_selected, char * dirname,
Uint32 last_ticks;
val_x = val_y = motioner = 0;
-
+ valhat_x = valhat_y = hatmotioner = 0;
/* Back up the current image's IDs, because they will get
clobbered below! */
@@ -15637,7 +15662,7 @@ static void play_slideshow(int * selected, int num_selected, char * dirname,
handle_joyaxismotion(event, &motioner, &val_x, &val_y);
else if (event.type == SDL_JOYHATMOTION)
- handle_joyhatmotion(event, oldpos_x, oldpos_y);
+ handle_joyhatmotion(event, oldpos_x, oldpos_y, &valhat_x, &valhat_y, &hatmotioner, &old_hat_ticks);
else if (event.type == SDL_JOYBALLMOTION)
handle_joyballmotion(event, oldpos_x, oldpos_y);
@@ -15647,12 +15672,8 @@ static void play_slideshow(int * selected, int num_selected, char * dirname,
}
- if (motioner)
- {
- SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
- if (joystick_slowness)
- SDL_Delay(joystick_slowness);
- }
+ if (motioner | hatmotioner)
+ handle_motioners(oldpos_x, oldpos_y,motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y);
SDL_Delay(10);
@@ -18021,9 +18042,11 @@ static int do_new_dialog(void)
Uint8 r, g, b;
int white_in_palette;
int val_x, val_y, motioner;
+ int valhat_x, valhat_y, hatmotioner;
+
val_x = val_y = motioner = 0;
-
+ valhat_x = valhat_y = hatmotioner = 0;
do_setcursor(cursor_watch);
/* Allocate some space: */
@@ -18898,7 +18921,7 @@ static int do_new_dialog(void)
handle_joyaxismotion(event, &motioner, &val_x, &val_y);
else if (event.type == SDL_JOYHATMOTION)
- handle_joyhatmotion(event, oldpos_x, oldpos_y);
+ handle_joyhatmotion(event, oldpos_x, oldpos_y, &valhat_x, &valhat_y, &hatmotioner, &old_hat_ticks);
else if (event.type == SDL_JOYBALLMOTION)
handle_joyballmotion(event, oldpos_x, oldpos_y);
@@ -18907,12 +18930,9 @@ static int do_new_dialog(void)
handle_joybuttonupdown(event, oldpos_x, oldpos_y);
}
- if (motioner)
- {
- SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
- if (joystick_slowness)
- SDL_Delay(joystick_slowness);
- }
+ if (motioner | hatmotioner)
+ handle_motioners(oldpos_x, oldpos_y,motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y);
+
SDL_Delay(10);
}
while (!done);
@@ -19195,6 +19215,7 @@ static int do_color_picker(void)
int x, y, w;
int ox, oy, oox, ooy, nx, ny;
int val_x, val_y, motioner;
+ int valhat_x, valhat_y, hatmotioner;
SDL_Surface * tmp_btn_up, * tmp_btn_down;
Uint32(*getpixel_tmp_btn_up) (SDL_Surface *, int, int);
Uint32(*getpixel_tmp_btn_down) (SDL_Surface *, int, int);
@@ -19211,7 +19232,7 @@ static int do_color_picker(void)
SDL_Surface * backup;
val_x = val_y = motioner = 0;
-
+ valhat_x = valhat_y = hatmotioner = 0;
hide_blinking_cursor();
do_setcursor(cursor_hand);
@@ -19525,7 +19546,7 @@ static int do_color_picker(void)
handle_joyaxismotion(event, &motioner, &val_x, &val_y);
else if (event.type == SDL_JOYHATMOTION)
- handle_joyhatmotion(event, oldpos_x, oldpos_y);
+ handle_joyhatmotion(event, oldpos_x, oldpos_y, &valhat_x, &valhat_y, &hatmotioner, &old_hat_ticks);
else if (event.type == SDL_JOYBALLMOTION)
handle_joyballmotion(event, oldpos_x, oldpos_y);
@@ -19534,12 +19555,8 @@ static int do_color_picker(void)
handle_joybuttonupdown(event, oldpos_x, oldpos_y);
}
- if (motioner)
- {
- if (joystick_slowness)
- SDL_Delay(joystick_slowness);
- SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
- }
+ if (motioner | hatmotioner)
+ handle_motioners(oldpos_x, oldpos_y,motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y);
SDL_Delay(10);
}
@@ -21484,12 +21501,190 @@ static void setup_config(char *argv[])
if (strtof(tmpcfg.joystick_maxsteps, NULL) < 1 || strtof(tmpcfg.joystick_maxsteps, NULL) > 7)
{
/* FIXME: Find better exit code */
- printf("Joystick lower threshold (now %s) must be between 1 and 7", tmpcfg.joystick_maxsteps);
+ printf("Joystick max steps (now %s) must be between 1 and 7", tmpcfg.joystick_maxsteps);
exit(1);
}
joystick_maxsteps = strtof(tmpcfg.joystick_maxsteps, NULL);
}
-
+ if(tmpcfg.joystick_hat_slowness)
+ {
+ if(strtof(tmpcfg.joystick_hat_slowness, NULL) < 0 || strtof(tmpcfg.joystick_hat_slowness, NULL) > 500)
+ {
+ printf("Joystick hat slowness (now %s) must be between 0 and 500.\n", tmpcfg.joystick_hat_slowness);
+ exit(1);
+ }
+ joystick_hat_slowness = strtof(tmpcfg.joystick_hat_slowness, NULL);
+ }
+ if(tmpcfg.joystick_hat_timeout)
+ {
+ if (strtof(tmpcfg.joystick_hat_timeout, NULL) < 0 || strtof(tmpcfg.joystick_hat_timeout, NULL) > 3000)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick hat timeout (now %s) must be between 0 and 3000", tmpcfg.joystick_hat_timeout);
+ exit(1);
+ }
+ joystick_hat_timeout = strtof(tmpcfg.joystick_hat_timeout, NULL);
+ }
+ if(tmpcfg.joystick_button_escape)
+ {
+ if (strtof(tmpcfg.joystick_button_escape, NULL) < 0 || strtof(tmpcfg.joystick_button_escape, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button escape shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_escape);
+ exit(1);
+ }
+ joystick_button_escape = strtof(tmpcfg.joystick_button_escape, NULL);
+ }
+ if(tmpcfg.joystick_button_selectbrushtool)
+ {
+ if (strtof(tmpcfg.joystick_button_selectbrushtool, NULL) < 0 || strtof(tmpcfg.joystick_button_selectbrushtool, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button brush tool shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_selectbrushtool);
+ exit(1);
+ }
+ joystick_button_selectbrushtool = strtof(tmpcfg.joystick_button_selectbrushtool, NULL);
+ }
+ if(tmpcfg.joystick_button_selectstamptool)
+ {
+ if (strtof(tmpcfg.joystick_button_selectstamptool, NULL) < 0 || strtof(tmpcfg.joystick_button_selectstamptool, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button stamp tool shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_selectstamptool);
+ exit(1);
+ }
+ joystick_button_selectstamptool = strtof(tmpcfg.joystick_button_selectstamptool, NULL);
+ }
+ if(tmpcfg.joystick_button_selectlinestool)
+ {
+ if (strtof(tmpcfg.joystick_button_selectlinestool, NULL) < 0 || strtof(tmpcfg.joystick_button_selectlinestool, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button lines tool shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_selectlinestool);
+ exit(1);
+ }
+ joystick_button_selectlinestool = strtof(tmpcfg.joystick_button_selectlinestool, NULL);
+ }
+ if(tmpcfg.joystick_button_selectshapestool)
+ {
+ if (strtof(tmpcfg.joystick_button_selectshapestool, NULL) < 0 || strtof(tmpcfg.joystick_button_selectshapestool, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button shapes tool shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_selectshapestool);
+ exit(1);
+ }
+ joystick_button_selectshapestool = strtof(tmpcfg.joystick_button_selectshapestool, NULL);
+ }
+ if(tmpcfg.joystick_button_selecttexttool)
+ {
+ if (strtof(tmpcfg.joystick_button_selecttexttool, NULL) < 0 || strtof(tmpcfg.joystick_button_selecttexttool, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button text tool shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_selecttexttool);
+ exit(1);
+ }
+ joystick_button_selecttexttool = strtof(tmpcfg.joystick_button_selecttexttool, NULL);
+ }
+ if(tmpcfg.joystick_button_selectlabeltool)
+ {
+ if (strtof(tmpcfg.joystick_button_selectlabeltool, NULL) < 0 || strtof(tmpcfg.joystick_button_selectlabeltool, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button label tool shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_selectlabeltool);
+ exit(1);
+ }
+ joystick_button_selectlabeltool = strtof(tmpcfg.joystick_button_selectlabeltool, NULL);
+ }
+ if(tmpcfg.joystick_button_selectmagictool)
+ {
+ if (strtof(tmpcfg.joystick_button_selectmagictool, NULL) < 0 || strtof(tmpcfg.joystick_button_selectmagictool, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button magic tool shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_selectmagictool);
+ exit(1);
+ }
+ joystick_button_selectmagictool = strtof(tmpcfg.joystick_button_selectmagictool, NULL);
+ }
+ if(tmpcfg.joystick_button_undo)
+ {
+ if (strtof(tmpcfg.joystick_button_undo, NULL) < 0 || strtof(tmpcfg.joystick_button_undo, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button undo shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_undo);
+ exit(1);
+ }
+ joystick_button_undo = strtof(tmpcfg.joystick_button_undo, NULL);
+ }
+ if(tmpcfg.joystick_button_redo)
+ {
+ if (strtof(tmpcfg.joystick_button_redo, NULL) < 0 || strtof(tmpcfg.joystick_button_redo, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button redo shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_redo);
+ exit(1);
+ }
+ joystick_button_redo = strtof(tmpcfg.joystick_button_redo, NULL);
+ }
+ if(tmpcfg.joystick_button_selecterasertool)
+ {
+ if (strtof(tmpcfg.joystick_button_selecterasertool, NULL) < 0 || strtof(tmpcfg.joystick_button_selecterasertool, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button eraser tool shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_selecterasertool);
+ exit(1);
+ }
+ joystick_button_selecterasertool = strtof(tmpcfg.joystick_button_selecterasertool, NULL);
+ }
+ if(tmpcfg.joystick_button_new)
+ {
+ if (strtof(tmpcfg.joystick_button_new, NULL) < 0 || strtof(tmpcfg.joystick_button_new, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button new shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_new);
+ exit(1);
+ }
+ joystick_button_new = strtof(tmpcfg.joystick_button_new, NULL);
+ }
+ if(tmpcfg.joystick_button_open)
+ {
+ if (strtof(tmpcfg.joystick_button_open, NULL) < 0 || strtof(tmpcfg.joystick_button_open, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button open shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_open);
+ exit(1);
+ }
+ joystick_button_open = strtof(tmpcfg.joystick_button_open, NULL);
+ }
+ if(tmpcfg.joystick_button_save)
+ {
+ if (strtof(tmpcfg.joystick_button_save, NULL) < 0 || strtof(tmpcfg.joystick_button_save, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button save shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_save);
+ exit(1);
+ }
+ joystick_button_save = strtof(tmpcfg.joystick_button_save, NULL);
+ }
+ if(tmpcfg.joystick_button_pagesetup)
+ {
+ if (strtof(tmpcfg.joystick_button_pagesetup, NULL) < 0 || strtof(tmpcfg.joystick_button_pagesetup, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button page setup shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_pagesetup);
+ exit(1);
+ }
+ joystick_button_pagesetup = strtof(tmpcfg.joystick_button_pagesetup, NULL);
+ }
+ if(tmpcfg.joystick_button_print)
+ {
+ if (strtof(tmpcfg.joystick_button_print, NULL) < 0 || strtof(tmpcfg.joystick_button_print, NULL) > 254)
+ {
+ /* FIXME: Find better exit code */
+ printf("Joystick button print shortcurt (now %s) must be between 0 and 254", tmpcfg.joystick_button_print);
+ exit(1);
+ }
+ joystick_button_print = strtof(tmpcfg.joystick_button_print, NULL);
+ }
printf("\n\nPromptless save:\nask: %d\nnew: %d\nover: %d\n\n", _promptless_save_over_ask, _promptless_save_over_new, _promptless_save_over);
@@ -24148,7 +24343,11 @@ static void handle_joyaxismotion(SDL_Event event, int *motioner, int *val_x, int
j = SDL_JoystickGetAxis(joystick, 1);
step = 5000;
if (abs(i) < joystick_low_threshold && abs(j) < joystick_low_threshold)
+ {
*motioner = FALSE;
+ *val_x = 0;
+ *val_y = 0;
+ }
else
{
if (i > joystick_low_threshold)
@@ -24175,50 +24374,52 @@ static void handle_joyaxismotion(SDL_Event event, int *motioner, int *val_x, int
}
}
-static void handle_joyhatmotion(SDL_Event event, int oldpos_x, int oldpos_y) {
- int val_x, val_y;
- val_x = val_y = 0;
+static void handle_joyhatmotion(SDL_Event event, int oldpos_x, int oldpos_y, int *valhat_x, int *valhat_y, int *hatmotioner, Uint32 *old_hat_ticks) {
+ *hatmotioner = 1;
switch (event.jhat.value) {
case SDL_HAT_CENTERED:
- val_x = 0;
- val_y = 0;
+ *valhat_x = 0;
+ *valhat_y = 0;
+ *hatmotioner = 0;
break;
case SDL_HAT_UP:
- val_x = 0;
- val_y = -1;
+ *valhat_x = 0;
+ *valhat_y = -1;
break;
case SDL_HAT_RIGHTUP:
- val_x = 1;
- val_y = -1;
+ *valhat_x = 1;
+ *valhat_y = -1;
break;
case SDL_HAT_RIGHT:
- val_x = 1;
- val_y = 0;
+ *valhat_x = 1;
+ *valhat_y = 0;
break;
case SDL_HAT_RIGHTDOWN:
- val_x = 1;
- val_y = 1;
+ *valhat_x = 1;
+ *valhat_y = 1;
break;
case SDL_HAT_DOWN:
- val_x = 0;
- val_y = 1;
+ *valhat_x = 0;
+ *valhat_y = 1;
break;
case SDL_HAT_LEFTDOWN:
- val_x = -1;
- val_y = 1;
+ *valhat_x = -1;
+ *valhat_y = 1;
break;
case SDL_HAT_LEFT:
- val_x = -1;
- val_y = 0;
+ *valhat_x = -1;
+ *valhat_y = 0;
break;
case SDL_HAT_LEFTUP:
- val_x = -1;
- val_y = -1;
+ *valhat_x = -1;
+ *valhat_y = -1;
break;
}
- if(val_x || val_y)
- SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
+ if(*valhat_x || *valhat_y)
+ SDL_WarpMouse(oldpos_x + *valhat_x, oldpos_y + *valhat_y);
+
+ *old_hat_ticks = SDL_GetTicks();
}
static void handle_joyballmotion(SDL_Event event, int oldpos_x, int oldpos_y) {
@@ -24231,17 +24432,188 @@ static void handle_joyballmotion(SDL_Event event, int oldpos_x, int oldpos_y) {
SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
}
+
+static void handle_motioners(int oldpos_x, int oldpos_y, int motioner, int hatmotioner, int old_hat_ticks, int val_x, int val_y, int valhat_x, int valhat_y)
+{
+ int vx, vy, ticks;
+
+ ticks = SDL_GetTicks();
+ vx = vy = 0;
+
+ vx = oldpos_x + val_x;
+ vy = oldpos_y + val_y;
+
+
+if (ticks - old_hat_ticks > joystick_hat_timeout)
+ {
+ vx += valhat_x;
+ vy += valhat_y;
+ }
+SDL_WarpMouse(vx, vy);
+
+if (motioner && joystick_slowness)
+ SDL_Delay(joystick_slowness);
+
+if (hatmotioner && joystick_hat_slowness)
+ SDL_Delay(joystick_hat_slowness);
+
+}
+
static void handle_joybuttonupdown(SDL_Event event, int oldpos_x, int oldpos_y) {
+ handle_joybuttonupdownscl(event, oldpos_x, oldpos_y, r_tools);
+}
+
+static void handle_joybuttonupdownscl(SDL_Event event, int oldpos_x, int oldpos_y, SDL_Rect real_r_tools) {
+ int eby, ts;
SDL_Event ev;
ev.button.x = oldpos_x;
ev.button.y = oldpos_y;
ev.button.button = SDL_BUTTON_LEFT;
+ ev.button.type = SDL_MOUSEBUTTONDOWN;
+ ev.button.state = SDL_PRESSED;
if (event.type == SDL_JOYBUTTONDOWN)
{
- ev.button.type = SDL_MOUSEBUTTONDOWN;
- ev.button.state = SDL_PRESSED;
+ /* First the actions that can be reached via keyboard shortcurts. */
+ /* Escape is usefull to dismiss dialogs */
+ if (event.button.button == joystick_button_escape)
+ {
+ ev.type = SDL_KEYDOWN;
+ ev.key.keysym.sym = SDLK_ESCAPE;
+ ev.key.keysym.mod = KMOD_CTRL;
+ }
+ else if (event.button.button == joystick_button_pagesetup)
+ {
+ ev.type = SDL_KEYDOWN;
+ ev.key.keysym.sym = SDLK_p;
+ ev.key.keysym.mod = KMOD_CTRL | KMOD_SHIFT;
+ }
+
+ /* Those could be reached too via clicks on the buttons. */
+ else if (event.button.button == joystick_button_undo)
+ {
+ ev.type = SDL_KEYDOWN;
+ ev.key.keysym.sym = SDLK_z;
+ ev.key.keysym.mod = KMOD_CTRL;
+ }
+ else if (event.button.button == joystick_button_redo)
+ {
+ ev.type = SDL_KEYDOWN;
+ ev.key.keysym.sym = SDLK_r;
+ ev.key.keysym.mod = KMOD_CTRL;
+ }
+ else if (event.button.button == joystick_button_open)
+ {
+ ev.type = SDL_KEYDOWN;
+ ev.key.keysym.sym = SDLK_o;
+ ev.key.keysym.mod = KMOD_CTRL;
+ }
+ else if (event.button.button == joystick_button_new)
+ {
+ ev.type = SDL_KEYDOWN;
+ ev.key.keysym.sym = SDLK_n;
+ ev.key.keysym.mod = KMOD_CTRL;
+ }
+ else if (event.button.button == joystick_button_save)
+ {
+ ev.type = SDL_KEYDOWN;
+ ev.key.keysym.sym = SDLK_s;
+ ev.key.keysym.mod = KMOD_CTRL;
+ }
+ else if (event.button.button == joystick_button_print)
+ {
+ ev.type = SDL_KEYDOWN;
+ ev.key.keysym.sym = SDLK_p;
+ ev.key.keysym.mod = KMOD_CTRL;
+ }
+
+
+ /* Now the clicks on the tool buttons. */
+ /* Note that at small window sizes there are scroll buttons in the tools rectangle */
+ /* and some tools are hiden. */
+ /* As any click outside of real_r_tools will not select the desired tool, */
+ /* the workaround I came up with is to click on the scroll buttons to reveal the button, */
+ /* then click on it. */
+ else if (event.button.button == joystick_button_selectbrushtool ||
+ event.button.button == joystick_button_selectstamptool ||
+ event.button.button == joystick_button_selectlinestool ||
+ event.button.button == joystick_button_selectshapestool ||
+ event.button.button == joystick_button_selecttexttool ||
+ event.button.button == joystick_button_selectlabeltool ||
+ event.button.button == joystick_button_selectmagictool ||
+ event.button.button == joystick_button_selecterasertool)
+
+ {
+ if (event.button.button == joystick_button_selectbrushtool)
+ {
+ ev.button.x = (TOOL_BRUSH % 2) * button_w + button_w / 2;
+ ev.button.y = real_r_tools.y + TOOL_BRUSH / 2 * button_h + button_h / 2;
+ }
+
+ else if (event.button.button == joystick_button_selectstamptool)
+ {
+ ev.button.x = (TOOL_STAMP % 2) * button_w + button_w / 2;
+ ev.button.y = real_r_tools.y + TOOL_STAMP / 2 * button_h + button_h / 2;
+ }
+
+ else if (event.button.button == joystick_button_selectlinestool)
+ {
+ ev.button.x = (TOOL_LINES % 2) * button_w + button_w / 2;
+ ev.button.y = real_r_tools.y + TOOL_LINES / 2 * button_h + button_h / 2;
+ }
+
+ else if (event.button.button == joystick_button_selectshapestool)
+ {
+ ev.button.x = (TOOL_SHAPES % 2) * button_w + button_w / 2;
+ ev.button.y = real_r_tools.y + TOOL_SHAPES / 2 * button_h + button_h / 2;
+ }
+
+ else if (event.button.button == joystick_button_selecttexttool)
+ {
+ ev.button.x = (TOOL_TEXT % 2) * button_w + button_w / 2;
+ ev.button.y = real_r_tools.y + TOOL_TEXT / 2 * button_h + button_h / 2;
+ }
+
+ else if (event.button.button == joystick_button_selectlabeltool)
+ {
+ ev.button.x = (TOOL_LABEL % 2) * button_w + button_w / 2;
+ ev.button.y = real_r_tools.y + TOOL_LABEL / 2 * button_h + button_h / 2;
+ }
+
+ else if (event.button.button == joystick_button_selectmagictool)
+ {
+ ev.button.x = (TOOL_MAGIC % 2) * button_w + button_w / 2;
+ ev.button.y = real_r_tools.y + TOOL_MAGIC / 2 * button_h + button_h / 2;
+ }
+
+ else if (event.button.button == joystick_button_selecterasertool)
+ {
+ ev.button.x = (TOOL_ERASER % 2) * button_w + button_w / 2;
+ ev.button.y = real_r_tools.y + TOOL_ERASER / 2 * button_h + button_h / 2;
+ }
+
+ /* Deal with scroll to reveal the button that should be clicked */
+ eby = ev.button.y;
+ ts = tool_scroll;
+
+ while (eby < real_r_tools.y + ts / 2 * button_h)
+ {
+ ev.button.y = real_r_tools.y - 1;
+ SDL_PushEvent(&ev);
+ ts -= 2;
+ }
+
+ /* We don't need this ATM, but better left it ready in case the number of tools grows enouth */
+ while (eby > real_r_tools.y + real_r_tools.h + ts / 2 * button_h)
+ {
+ ev.button.y = real_r_tools.y + real_r_tools.h + 1;
+ SDL_PushEvent(&ev);
+ ts += 2;
+ }
+
+ ev.button.y = eby - ts / 2 * button_h;
+ }
}
else
{