More improvements on joystick, now Hat can move continuos and there are some shortcurts that can be associated to buttons.

This commit is contained in:
Pere Pujal i Carabantes 2011-07-29 21:27:39 +00:00
parent 0067cbd2af
commit f362d1cb2f

View file

@ -977,6 +977,25 @@ static int onscreen_keyboard = 0;
static int joystick_low_threshold = 3200; static int joystick_low_threshold = 3200;
static int joystick_slowness = 15; static int joystick_slowness = 15;
static int joystick_maxsteps = 7; 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_x;
static int oldpos_y; static int oldpos_y;
static int disable_screensaver; static int disable_screensaver;
@ -1115,9 +1134,13 @@ static void tmp_apply_uncommited_text(void);
static void undo_tmp_applied_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_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_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_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: */ /* Magic tools API and tool handles: */
@ -2018,7 +2041,7 @@ SDL_Surface *messager = NULL;
TTF_Font *fonty = 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", 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", "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) 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_tool_mode,
shape_ctr_x, shape_ctr_y, shape_outer_x, shape_outer_y, color_flag, shape_ctr_x, shape_ctr_y, shape_outer_x, shape_outer_y, color_flag,
old_stamp_group, which; old_stamp_group, which;
@ -2051,6 +2074,7 @@ static void mainloop(void)
int do_draw, max; int do_draw, max;
int ignoring_motion; int ignoring_motion;
int motioner = 0; int motioner = 0;
int hatmotioner = 0;
int whichc = 0; int whichc = 0;
int whicht = 0; int whicht = 0;
int test_x = 0; int test_x = 0;
@ -2066,6 +2090,7 @@ static void mainloop(void)
Uint32 last_cursor_blink, cur_cursor_blink, Uint32 last_cursor_blink, cur_cursor_blink,
pre_event_time, current_event_time; pre_event_time, current_event_time;
SDL_Rect update_rect; SDL_Rect update_rect;
SDL_Rect real_r_tools = r_tools;
#ifdef DEBUG #ifdef DEBUG
Uint16 key_unicode; Uint16 key_unicode;
SDLKey key_down; SDLKey key_down;
@ -2093,6 +2118,8 @@ static void mainloop(void)
text_flag = 0; text_flag = 0;
val_x = 0; val_x = 0;
val_y = 0; val_y = 0;
valhat_x = 0;
valhat_y = 0;
done = 0; done = 0;
color_flag = 0; color_flag = 0;
keyglobal = 0; keyglobal = 0;
@ -2599,6 +2626,8 @@ static void mainloop(void)
#ifndef NOSOUND #ifndef NOSOUND
if (use_sound) if (use_sound)
{ {
printf("modstate at mainloop %d, mod %d\n", SDL_GetModState(), mod);
mute = !mute; mute = !mute;
Mix_HaltChannel(-1); Mix_HaltChannel(-1);
@ -3145,13 +3174,13 @@ static void mainloop(void)
handle_joyaxismotion(event, &motioner, &val_x, &val_y); handle_joyaxismotion(event, &motioner, &val_x, &val_y);
else if (event.type == SDL_JOYHATMOTION) 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) else if (event.type == SDL_JOYBALLMOTION)
handle_joyballmotion(event, oldpos_x, oldpos_y); handle_joyballmotion(event, oldpos_x, oldpos_y);
else if (event.type == SDL_JOYBUTTONDOWN || event.type == SDL_JOYBUTTONUP) 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 && else if (event.type == SDL_MOUSEBUTTONDOWN &&
event.button.button >= 2 && event.button.button >= 2 &&
@ -3192,7 +3221,7 @@ static void mainloop(void)
if (HIT(r_tools)) if (HIT(r_tools))
{ {
SDL_Rect real_r_tools = r_tools; real_r_tools = r_tools;
if (NUM_TOOLS > 14 + TOOLOFFSET) if (NUM_TOOLS > 14 + TOOLOFFSET)
{ {
@ -5464,12 +5493,9 @@ static void mainloop(void)
} }
} }
if (motioner) if (motioner | hatmotioner)
{ handle_motioners(oldpos_x, oldpos_y,motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y);
SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
if (joystick_slowness)
SDL_Delay(joystick_slowness);
}
SDL_Delay(1); SDL_Delay(1);
} }
@ -11643,8 +11669,10 @@ static int do_prompt_image_flash_snd(const char *const text,
int free_img1b; int free_img1b;
int txt_left, txt_right, img_left, btn_left, txt_btn_left, txt_btn_right; int txt_left, txt_right, img_left, btn_left, txt_btn_left, txt_btn_right;
int val_x, val_y, motioner; int val_x, val_y, motioner;
int valhat_x, valhat_y, hatmotioner;
val_x = val_y = motioner = 0; val_x = val_y = motioner = 0;
valhat_x = valhat_y = hatmotioner = 0;
emulate_button_pressed = 0; emulate_button_pressed = 0;
hide_blinking_cursor(); 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); handle_joyaxismotion(event, &motioner, &val_x, &val_y);
else if (event.type == SDL_JOYHATMOTION) 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) else if (event.type == SDL_JOYBALLMOTION)
handle_joyballmotion(event, oldpos_x, oldpos_y); 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); handle_joybuttonupdown(event, oldpos_x, oldpos_y);
} }
if (motioner) if (motioner | hatmotioner)
{ handle_motioners(oldpos_x, oldpos_y,motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y);
if (joystick_slowness)
SDL_Delay(joystick_slowness);
SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
}
SDL_Delay(10); SDL_Delay(10);
@ -13580,9 +13606,10 @@ static int do_open(void)
int places_to_look; int places_to_look;
int opened_something; int opened_something;
int val_x, val_y, motioner; int val_x, val_y, motioner;
int valhat_x, valhat_y, hatmotioner;
val_x = val_y = motioner = 0; val_x = val_y = motioner = 0;
valhat_x = valhat_y = hatmotioner = 0;
opened_something = 0; opened_something = 0;
do do
@ -14381,7 +14408,7 @@ static int do_open(void)
handle_joyaxismotion(event, &motioner, &val_x, &val_y); handle_joyaxismotion(event, &motioner, &val_x, &val_y);
else if (event.type == SDL_JOYHATMOTION) 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) else if (event.type == SDL_JOYBALLMOTION)
handle_joyballmotion(event, oldpos_x, oldpos_y); handle_joyballmotion(event, oldpos_x, oldpos_y);
@ -14390,12 +14417,10 @@ static int do_open(void)
handle_joybuttonupdown(event, oldpos_x, oldpos_y); handle_joybuttonupdown(event, oldpos_x, oldpos_y);
} }
if (motioner) if (motioner | hatmotioner)
{ handle_motioners(oldpos_x, oldpos_y,motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y);
SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
if (joystick_slowness)
SDL_Delay(joystick_slowness);
}
SDL_Delay(10); SDL_Delay(10);
if (want_erase) if (want_erase)
@ -14691,9 +14716,10 @@ static int do_slideshow(void)
int xx, yy; int xx, yy;
SDL_Surface *btn, *blnk; SDL_Surface *btn, *blnk;
int val_x, val_y, motioner; int val_x, val_y, motioner;
int valhat_x, valhat_y, hatmotioner;
val_x = val_y = motioner = 0; val_x = val_y = motioner = 0;
valhat_x = valhat_y = hatmotioner = 0;
do_setcursor(cursor_watch); do_setcursor(cursor_watch);
/* Allocate some space: */ /* Allocate some space: */
@ -15396,7 +15422,7 @@ static int do_slideshow(void)
handle_joyaxismotion(event, &motioner, &val_x, &val_y); handle_joyaxismotion(event, &motioner, &val_x, &val_y);
else if (event.type == SDL_JOYHATMOTION) 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) else if (event.type == SDL_JOYBALLMOTION)
handle_joyballmotion(event, oldpos_x, oldpos_y); handle_joyballmotion(event, oldpos_x, oldpos_y);
@ -15405,12 +15431,9 @@ static int do_slideshow(void)
handle_joybuttonupdown(event, oldpos_x, oldpos_y); handle_joybuttonupdown(event, oldpos_x, oldpos_y);
} }
if (motioner) if (motioner | hatmotioner)
{ handle_motioners(oldpos_x, oldpos_y,motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y);
if (joystick_slowness)
SDL_Delay(joystick_slowness);
SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
}
SDL_Delay(10); SDL_Delay(10);
} }
while (!done); while (!done);
@ -15444,6 +15467,8 @@ static void play_slideshow(int * selected, int num_selected, char * dirname,
{ {
int i, which, next, done; int i, which, next, done;
int val_x, val_y, motioner; int val_x, val_y, motioner;
int valhat_x, valhat_y, hatmotioner;
SDL_Surface * img; SDL_Surface * img;
char * tmp_starter_id, * tmp_template_id, * tmp_file_id; char * tmp_starter_id, * tmp_template_id, * tmp_file_id;
int tmp_starter_mirrored, tmp_starter_flipped, tmp_starter_personal; 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; Uint32 last_ticks;
val_x = val_y = motioner = 0; val_x = val_y = motioner = 0;
valhat_x = valhat_y = hatmotioner = 0;
/* Back up the current image's IDs, because they will get /* Back up the current image's IDs, because they will get
clobbered below! */ 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); handle_joyaxismotion(event, &motioner, &val_x, &val_y);
else if (event.type == SDL_JOYHATMOTION) 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) else if (event.type == SDL_JOYBALLMOTION)
handle_joyballmotion(event, oldpos_x, oldpos_y); handle_joyballmotion(event, oldpos_x, oldpos_y);
@ -15647,12 +15672,8 @@ static void play_slideshow(int * selected, int num_selected, char * dirname,
} }
if (motioner) if (motioner | hatmotioner)
{ handle_motioners(oldpos_x, oldpos_y,motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y);
SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
if (joystick_slowness)
SDL_Delay(joystick_slowness);
}
SDL_Delay(10); SDL_Delay(10);
@ -18021,9 +18042,11 @@ static int do_new_dialog(void)
Uint8 r, g, b; Uint8 r, g, b;
int white_in_palette; int white_in_palette;
int val_x, val_y, motioner; int val_x, val_y, motioner;
int valhat_x, valhat_y, hatmotioner;
val_x = val_y = motioner = 0; val_x = val_y = motioner = 0;
valhat_x = valhat_y = hatmotioner = 0;
do_setcursor(cursor_watch); do_setcursor(cursor_watch);
/* Allocate some space: */ /* Allocate some space: */
@ -18898,7 +18921,7 @@ static int do_new_dialog(void)
handle_joyaxismotion(event, &motioner, &val_x, &val_y); handle_joyaxismotion(event, &motioner, &val_x, &val_y);
else if (event.type == SDL_JOYHATMOTION) 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) else if (event.type == SDL_JOYBALLMOTION)
handle_joyballmotion(event, oldpos_x, oldpos_y); handle_joyballmotion(event, oldpos_x, oldpos_y);
@ -18907,12 +18930,9 @@ static int do_new_dialog(void)
handle_joybuttonupdown(event, oldpos_x, oldpos_y); handle_joybuttonupdown(event, oldpos_x, oldpos_y);
} }
if (motioner) if (motioner | hatmotioner)
{ handle_motioners(oldpos_x, oldpos_y,motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y);
SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
if (joystick_slowness)
SDL_Delay(joystick_slowness);
}
SDL_Delay(10); SDL_Delay(10);
} }
while (!done); while (!done);
@ -19195,6 +19215,7 @@ static int do_color_picker(void)
int x, y, w; int x, y, w;
int ox, oy, oox, ooy, nx, ny; int ox, oy, oox, ooy, nx, ny;
int val_x, val_y, motioner; int val_x, val_y, motioner;
int valhat_x, valhat_y, hatmotioner;
SDL_Surface * tmp_btn_up, * tmp_btn_down; SDL_Surface * tmp_btn_up, * tmp_btn_down;
Uint32(*getpixel_tmp_btn_up) (SDL_Surface *, int, int); Uint32(*getpixel_tmp_btn_up) (SDL_Surface *, int, int);
Uint32(*getpixel_tmp_btn_down) (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; SDL_Surface * backup;
val_x = val_y = motioner = 0; val_x = val_y = motioner = 0;
valhat_x = valhat_y = hatmotioner = 0;
hide_blinking_cursor(); hide_blinking_cursor();
do_setcursor(cursor_hand); do_setcursor(cursor_hand);
@ -19525,7 +19546,7 @@ static int do_color_picker(void)
handle_joyaxismotion(event, &motioner, &val_x, &val_y); handle_joyaxismotion(event, &motioner, &val_x, &val_y);
else if (event.type == SDL_JOYHATMOTION) 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) else if (event.type == SDL_JOYBALLMOTION)
handle_joyballmotion(event, oldpos_x, oldpos_y); handle_joyballmotion(event, oldpos_x, oldpos_y);
@ -19534,12 +19555,8 @@ static int do_color_picker(void)
handle_joybuttonupdown(event, oldpos_x, oldpos_y); handle_joybuttonupdown(event, oldpos_x, oldpos_y);
} }
if (motioner) if (motioner | hatmotioner)
{ handle_motioners(oldpos_x, oldpos_y,motioner, hatmotioner, old_hat_ticks, val_x, val_y, valhat_x, valhat_y);
if (joystick_slowness)
SDL_Delay(joystick_slowness);
SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_y);
}
SDL_Delay(10); 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) if (strtof(tmpcfg.joystick_maxsteps, NULL) < 1 || strtof(tmpcfg.joystick_maxsteps, NULL) > 7)
{ {
/* FIXME: Find better exit code */ /* 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); exit(1);
} }
joystick_maxsteps = strtof(tmpcfg.joystick_maxsteps, NULL); 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); 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); j = SDL_JoystickGetAxis(joystick, 1);
step = 5000; step = 5000;
if (abs(i) < joystick_low_threshold && abs(j) < joystick_low_threshold) if (abs(i) < joystick_low_threshold && abs(j) < joystick_low_threshold)
{
*motioner = FALSE; *motioner = FALSE;
*val_x = 0;
*val_y = 0;
}
else else
{ {
if (i > joystick_low_threshold) 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) { 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) {
int val_x, val_y; *hatmotioner = 1;
val_x = val_y = 0;
switch (event.jhat.value) { switch (event.jhat.value) {
case SDL_HAT_CENTERED: case SDL_HAT_CENTERED:
val_x = 0; *valhat_x = 0;
val_y = 0; *valhat_y = 0;
*hatmotioner = 0;
break; break;
case SDL_HAT_UP: case SDL_HAT_UP:
val_x = 0; *valhat_x = 0;
val_y = -1; *valhat_y = -1;
break; break;
case SDL_HAT_RIGHTUP: case SDL_HAT_RIGHTUP:
val_x = 1; *valhat_x = 1;
val_y = -1; *valhat_y = -1;
break; break;
case SDL_HAT_RIGHT: case SDL_HAT_RIGHT:
val_x = 1; *valhat_x = 1;
val_y = 0; *valhat_y = 0;
break; break;
case SDL_HAT_RIGHTDOWN: case SDL_HAT_RIGHTDOWN:
val_x = 1; *valhat_x = 1;
val_y = 1; *valhat_y = 1;
break; break;
case SDL_HAT_DOWN: case SDL_HAT_DOWN:
val_x = 0; *valhat_x = 0;
val_y = 1; *valhat_y = 1;
break; break;
case SDL_HAT_LEFTDOWN: case SDL_HAT_LEFTDOWN:
val_x = -1; *valhat_x = -1;
val_y = 1; *valhat_y = 1;
break; break;
case SDL_HAT_LEFT: case SDL_HAT_LEFT:
val_x = -1; *valhat_x = -1;
val_y = 0; *valhat_y = 0;
break; break;
case SDL_HAT_LEFTUP: case SDL_HAT_LEFTUP:
val_x = -1; *valhat_x = -1;
val_y = -1; *valhat_y = -1;
break; break;
} }
if(val_x || val_y) if(*valhat_x || *valhat_y)
SDL_WarpMouse(oldpos_x + val_x, oldpos_y + val_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) { 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); 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) { 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; SDL_Event ev;
ev.button.x = oldpos_x; ev.button.x = oldpos_x;
ev.button.y = oldpos_y; ev.button.y = oldpos_y;
ev.button.button = SDL_BUTTON_LEFT; ev.button.button = SDL_BUTTON_LEFT;
ev.button.type = SDL_MOUSEBUTTONDOWN;
ev.button.state = SDL_PRESSED;
if (event.type == SDL_JOYBUTTONDOWN) if (event.type == SDL_JOYBUTTONDOWN)
{ {
ev.button.type = SDL_MOUSEBUTTONDOWN; /* First the actions that can be reached via keyboard shortcurts. */
ev.button.state = SDL_PRESSED; /* 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 else
{ {