diff options
author | perepujal <perepujal> | 2010-08-13 23:40:58 (GMT) |
---|---|---|
committer | perepujal <perepujal> | 2010-08-13 23:40:58 (GMT) |
commit | 768cb94ba52f6c7fdb906e716d3f2af33207267e (patch) | |
tree | bdce91a0fb371068af0dc68c930c6a1c2f20b842 | |
parent | cd1058308dbf1a65885be313a3e91409b5428604 (diff) |
More on onscreen keyboard by Ankit.
Can CVS acces be given to Ankit yet?
-rw-r--r-- | src/tuxpaint.c | 1274 |
1 files changed, 651 insertions, 623 deletions
diff --git a/src/tuxpaint.c b/src/tuxpaint.c index f8e7ed9..fc48860 100644 --- a/src/tuxpaint.c +++ b/src/tuxpaint.c @@ -1985,11 +1985,11 @@ void apply_surface (int x, int y, SDL_Surface *source, SDL_Surface *destination, void drawkeybd(void ); int regionhit(int x, int y, int w, int h); int button(int id, int x, int y); -void gen_key_event(int ide); +//void gen_key_event(int ide); void on_screen_keyboard(void ); SDL_Surface *messager = NULL; #define initial_x (2 * button_w + 80) -#define initial_y 400 +//#define initial_y 400 #define key_width 24 #define key_height 24 @@ -2012,19 +2012,20 @@ struct UIState int activeitem; } uistate = {0,0,0,0,0}; -int brushflag,xnew,ynew,eraflag,lineflag, magicflag, keybd_flag, keyglobal,cur_thing,old_x,old_y; +int brushflag,xnew,ynew,eraflag,lineflag, magicflag, keybd_flag, keybd_position, keyglobal, initial_y, gen_key_flag, ide, activeflag; /* --- MAIN LOOP! --- */ 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, old_x, old_y, new_x, new_y, line_start_x, line_start_y, line_end_x, line_end_y, shape_tool_mode, shape_ctr_x, shape_ctr_y, shape_outer_x, shape_outer_y, color_flag, - old_stamp_group, which, whicht, whichc, test_x, test_y, motioner; + old_stamp_group, which, whicht, whichc, test_x, test_y, motioner,k; + k = 0; int num_things; int *thing_scroll; - int do_draw, max; + int cur_thing, do_draw, max; int ignoring_motion; int j = 0; unsigned int i = 0; @@ -3182,7 +3183,7 @@ static void mainloop(void) update_screen(0,0,WINDOW_WIDTH,WINDOW_HEIGHT); } } - + else if (event.type == SDL_MOUSEBUTTONDOWN && event.button.button >= 2 && event.button.button <= 3 && @@ -4340,7 +4341,14 @@ static void mainloop(void) text_flag = 0; old_x = event.button.x - r_canvas.x; old_y = event.button.y - r_canvas.y; - + if (old_y < r_canvas.h/2) + { + keybd_position = 0; + } + else + { + keybd_position = 1; + } if (been_saved) { been_saved = 0; @@ -4663,6 +4671,614 @@ static void mainloop(void) #endif } } + else if (gen_key_flag == 1) + { + gen_key_flag = 0; + int i,j; + SDL_EnableUNICODE(1); + printf("\n entered here %d th time \n", k); + k++; + if (ide == 1) + { + event.key.keysym.sym = SDLK_ESCAPE; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 27; + } + else if (ide == 2) + { + event.key.keysym.sym = SDLK_BACKQUOTE; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 96; + } + else if (ide == 3) + { + event.key.keysym.sym = SDLK_1; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 49; + } + else if (ide == 4) + { + event.key.keysym.sym = SDLK_2; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 50; + } + else if (ide == 5) + { + event.key.keysym.sym = SDLK_3; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 51; + } + else if (ide == 6) + { + event.key.keysym.sym = SDLK_4; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 52; + } + else if (ide == 7) + { + event.key.keysym.sym = SDLK_5; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 53; + } + else if (ide == 8) + { + event.key.keysym.sym = SDLK_6; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 54; + } + else if (ide == 9) + { + event.key.keysym.sym = SDLK_7; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 55; + } + else if (ide == 10) + { + event.key.keysym.sym = SDLK_8; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 56; + } + else if (ide == 11) + { + event.key.keysym.sym = SDLK_9; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 57; + } + else if (ide == 12) + { + event.key.keysym.sym = SDLK_0; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 48; + } + else if (ide == 13) + { + event.key.keysym.sym = SDLK_MINUS; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 45; + } + else if (ide == 14) + { + event.key.keysym.sym = SDLK_EQUALS; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 61; + } + else if (ide == 15) + { + event.key.keysym.sym = SDLK_BACKSPACE; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 8; + } + else if (ide == 16) + { + event.key.keysym.sym = SDLK_CAPSLOCK; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 301; + } + else if (ide == 17) + { + event.key.keysym.sym = SDLK_a; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'a'; + } + else if (ide == 18) + { + event.key.keysym.sym = SDLK_b; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'b'; + } + else if (ide == 19) + { + event.key.keysym.sym = SDLK_c; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'c'; + } + else if (ide == 20) + { + event.key.keysym.sym = SDLK_d; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'d'; + } + else if (ide == 21) + { + event.key.keysym.sym = SDLK_e; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'e'; + } + else if (ide == 22) + { + event.key.keysym.sym = SDLK_f; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'f'; + } + else if (ide == 23) + { + event.key.keysym.sym = SDLK_g; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'g'; + } + else if (ide == 24) + { + event.key.keysym.sym = SDLK_h; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'h'; + } + else if (ide == 25) + { + event.key.keysym.sym = SDLK_i; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'i'; + } + else if (ide == 26) + { + event.key.keysym.sym = SDLK_j; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'j'; + } + else if (ide == 27) + { + event.key.keysym.sym = SDLK_k; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'k'; + } + else if (ide == 28) + { + event.key.keysym.sym = SDLK_l; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'l'; + } + else if (ide == 29) + { + event.key.keysym.sym = SDLK_m; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'m'; + } + else if (ide == 30) + { + event.key.keysym.sym = SDLK_n; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'n'; + } + else if (ide == 31) + { + event.key.keysym.sym = SDLK_LEFTBRACKET; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 91; + } + else if (ide == 32) + { + event.key.keysym.sym = SDLK_RIGHTBRACKET; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 93; + } + else if (ide == 33) + { + event.key.keysym.sym = SDLK_BACKSLASH; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 92; + } + else if (ide == 34) + { + event.key.keysym.sym = SDLK_RETURN; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 13; + } + else if (ide == 35) + { + event.key.keysym.sym = SDLK_o; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'o'; + } + else if (ide == 36) + { + event.key.keysym.sym = SDLK_p; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'p'; + } + else if (ide == 37) + { + event.key.keysym.sym = SDLK_q; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'q'; + } + else if (ide == 38) + { + event.key.keysym.sym = SDLK_r; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'r'; + } + else if (ide == 39) + { + event.key.keysym.sym = SDLK_s; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'s'; + } + else if (ide == 40) + { + event.key.keysym.sym = SDLK_t; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'t'; + } + else if (ide == 41) + { + event.key.keysym.sym = SDLK_u; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'u'; + } + else if (ide == 41) + { + event.key.keysym.sym = SDLK_v; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'v'; + } + else if (ide == 42) + { + event.key.keysym.sym = SDLK_w; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'w'; + } + else if (ide == 43) + { + event.key.keysym.sym = SDLK_x; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'x'; + } + else if (ide == 44) + { + event.key.keysym.sym = SDLK_y; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'y'; + } + else if (ide == 45) + { + event.key.keysym.sym = SDLK_z; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = (Uint16)'z'; + } + else if (ide == 46) + { + event.key.keysym.sym = SDLK_COMMA; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 44; + } + else if (ide == 47) + { + event.key.keysym.sym = SDLK_PERIOD; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 46; + } + else if (ide == 48) + { + event.key.keysym.sym = SDLK_SLASH; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 47; + } + else if (ide == 49) + { + event.key.keysym.sym = SDLK_SEMICOLON; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 59; + } + else if (ide == 50) + { + event.key.keysym.sym = SDLK_QUOTEDBL; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 34; + } + else if (ide == 51) + { + event.key.keysym.sym = SDLK_RALT; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 307; + } + else if (ide == 52) + { + event.key.keysym.sym = SDLK_RSHIFT; + event.key.keysym.mod = KMOD_NONE; + event.key.keysym.unicode = 303; + } + + static int redraw = 0; + wchar_t* im_cp = im_data.s; + /* Discard previous # of redraw characters */ + if((int)texttool_len <= redraw) texttool_len = 0; + else texttool_len -= redraw; + texttool_str[texttool_len] = L'\0'; + + /* Read IM, remember how many to redraw next iteration */ + redraw = im_read(&im_data, event.key.keysym); + + /* Queue each character to be displayed */ + while(*im_cp) { + if (*im_cp == L'\b') + { + hide_blinking_cursor(); + if (texttool_len > 0) + { + texttool_len--; + texttool_str[texttool_len] = 0; + playsound(screen, 0, SND_KEYCLICK, 0, SNDPOS_CENTER, + SNDDIST_NEAR); + + do_render_cur_text(0); + + if (been_saved) + { + been_saved = 0; + + if (!disable_save) + tool_avail[TOOL_SAVE] = 1; + + draw_toolbar(); + update_screen_rect(&r_tools); + } + + } + } + else if (*im_cp == L'\r') + { + int font_height; + font_height = TuxPaint_Font_FontHeight(getfonthandle(cur_font)); + + hide_blinking_cursor(); + if (texttool_len > 0) + { + rec_undo_buffer(); + do_render_cur_text(1); + label_node_to_edit = NULL; + texttool_len = 0; + cursor_textwidth = 0; + if (cur_tool == TOOL_LABEL) + { + draw_fonts(); + update_screen_rect(&r_toolopt); + } + + if (been_saved) + { + been_saved = 0; + + if (!disable_save) + tool_avail[TOOL_SAVE] = 1; + + draw_toolbar(); + update_screen_rect(&r_tools); + } + + + cursor_x = cursor_left; + cursor_y = min(cursor_y + font_height, canvas->h - font_height); + + playsound(screen, 0, SND_RETURN, 1, SNDPOS_RIGHT, SNDDIST_NEAR); + + } + else if (cur_tool == TOOL_LABEL && label_node_to_edit) + { + rec_undo_buffer(); + have_to_rec_label_node = TRUE; + add_label_node(0, 0, 0, 0, NULL); + derender_node(&label_node_to_edit); + label_node_to_edit = NULL; +// playsound(screen, 0, SND_DELETE_LABEL, 0, SNDPOS_CENTER); // FIXME lack of specific sound + + if (been_saved) + { + been_saved = 0; + + if (!disable_save) + tool_avail[TOOL_SAVE] = 1; + + draw_toolbar(); + update_screen_rect(&r_tools); + } + } + + /* Select a node to edit */ + else if (cur_tool == TOOL_LABEL && + cur_label == LABEL_SELECT) + { + label_node_to_edit=search_label_list(&highlighted_label_node, highlighted_label_node->save_x + 3, highlighted_label_node->save_y + 3, 0); + if(label_node_to_edit) + { + cur_label = LABEL_LABEL; + cur_thing=label_node_to_edit->save_cur_font; + do_setcursor(cursor_insertion); + i = 0; + label_node_to_edit->is_enabled = FALSE; + derender_node(&label_node_to_edit); + + texttool_len = select_texttool_len; + while(i < texttool_len) + { + texttool_str[i] = select_texttool_str[i]; + i = i+1; + } + texttool_str[i] = L'\0'; + cur_color = select_color; + old_x = select_x; + old_y = select_y; + cur_font = select_cur_font; + text_state = select_text_state; + text_size = select_text_size; + // int j; + for (j = 0; j < num_font_families; j++) + { + if (user_font_families[j] + && user_font_families[j]->handle) + { + TuxPaint_Font_CloseFont(user_font_families[j]->handle); + user_font_families[j]->handle = NULL; + } + } + draw_fonts(); + update_screen_rect(&r_toolopt); + + cursor_x = old_x; + cursor_y = old_y; + cursor_left = old_x; + + draw_colors(COLORSEL_REFRESH); + draw_fonts(); + } + + + do_render_cur_text(0); + + } + else + { + cursor_x = cursor_left; + cursor_y = min(cursor_y + font_height, canvas->h - font_height); + } + +#ifdef SPEECH +#ifdef __APPLE__ + if (use_sound) + speak_string(texttool_str); +#endif +#endif + im_softreset(&im_data); + } + else if (*im_cp == L'\t') + { + + if (texttool_len > 0) + { + rec_undo_buffer(); + do_render_cur_text(1); + label_node_to_edit = NULL; + cursor_x = min(cursor_x + cursor_textwidth, canvas->w); + texttool_len = 0; + cursor_textwidth = 0; + if (cur_tool == TOOL_LABEL) + { + draw_fonts(); + update_screen_rect(&r_toolopt); + } + + if (been_saved) + { + been_saved = 0; + + if (!disable_save) + tool_avail[TOOL_SAVE] = 1; + + draw_toolbar(); + update_screen_rect(&r_tools); + } + } + else if (cur_tool == TOOL_LABEL && label_node_to_edit) + { + rec_undo_buffer(); + have_to_rec_label_node = TRUE; + add_label_node(0, 0, 0, 0, NULL); + derender_node(&label_node_to_edit); + label_node_to_edit = NULL; +// playsound(screen, 0, SND_DELETE_LABEL, 0, SNDPOS_CENTER); // FIXME lack of specific sound + + if (been_saved) + { + been_saved = 0; + + if (!disable_save) + tool_avail[TOOL_SAVE] = 1; + + draw_toolbar(); + update_screen_rect(&r_tools); + } + } + /* Cycle accross the nodes */ + else if (cur_tool == TOOL_LABEL && + cur_label == LABEL_SELECT) + { + cycle_highlighted_label_node(); + highlight_label_nodes(); + } + + + +#ifdef SPEECH +#ifdef __APPLE__ + if (use_sound) + speak_string(texttool_str); +#endif +#endif + im_softreset(&im_data); + } + else if (iswprint(*im_cp) && + (cur_tool == TOOL_TEXT || cur_label == LABEL_LABEL)) + { + if (texttool_len < (sizeof(texttool_str) / sizeof(wchar_t)) - 1) + { + int old_cursor_textwidth = cursor_textwidth; +#ifdef DEBUG + wprintf(L" key = <%c>\nunicode = <%lc> 0x%04x %d\n\n", + key_down, key_unicode, key_unicode, key_unicode); +#endif + + texttool_str[texttool_len++] = *im_cp; + texttool_str[texttool_len] = 0; + + do_render_cur_text(0); + + if (been_saved) + { + been_saved = 0; + + if (!disable_save) + tool_avail[TOOL_SAVE] = 1; + + draw_toolbar(); + update_screen_rect(&r_tools); + } + + + if (cursor_x + old_cursor_textwidth <= canvas->w - 50 && + cursor_x + cursor_textwidth > canvas->w - 50) + { + playsound(screen, 0, SND_KEYCLICKRING, 1, SNDPOS_RIGHT, + SNDDIST_NEAR); + } + else + { + /* FIXME: Might be fun to position the + sound based on keyboard layout...? */ + + playsound(screen, 0, SND_KEYCLICK, 0, SNDPOS_CENTER, + SNDDIST_NEAR); + } + } + } + + im_cp++; + } /* while(*im_cp) */ + + /* Show IM tip text */ + if(im_data.tip_text) { + draw_tux_text(TUX_DEFAULT, im_data.tip_text, 1); + } + + } + else if (event.type == SDL_MOUSEBUTTONDOWN && wheely && event.button.button >= 4 && event.button.button <= 5) { @@ -22715,617 +23331,8 @@ int main(int argc, char *argv[]) return 0; } -void gen_key_event(int ide) -{ - -int i,j; -SDL_Event event; -SDL_EnableUNICODE(1); - - -if (ide == 1) -{ - event.key.keysym.sym = SDLK_ESCAPE; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 27; -} -else if (ide == 2) -{ - event.key.keysym.sym = SDLK_BACKQUOTE; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 96; -} -else if (ide == 3) -{ - event.key.keysym.sym = SDLK_1; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 49; -} -else if (ide == 4) -{ - event.key.keysym.sym = SDLK_2; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 50; -} -else if (ide == 5) -{ - event.key.keysym.sym = SDLK_3; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 51; -} -else if (ide == 6) -{ - event.key.keysym.sym = SDLK_4; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 52; -} -else if (ide == 7) -{ - event.key.keysym.sym = SDLK_5; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 53; -} -else if (ide == 8) -{ - event.key.keysym.sym = SDLK_6; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 54; -} -else if (ide == 9) -{ - event.key.keysym.sym = SDLK_7; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 55; -} -else if (ide == 10) -{ - event.key.keysym.sym = SDLK_8; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 56; -} -else if (ide == 11) -{ - event.key.keysym.sym = SDLK_9; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 57; -} -else if (ide == 12) -{ - event.key.keysym.sym = SDLK_0; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 48; -} -else if (ide == 13) -{ - event.key.keysym.sym = SDLK_MINUS; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 45; -} -else if (ide == 14) -{ - event.key.keysym.sym = SDLK_EQUALS; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 61; -} -else if (ide == 15) -{ - event.key.keysym.sym = SDLK_BACKSPACE; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 8; -} -else if (ide == 16) -{ - event.key.keysym.sym = SDLK_CAPSLOCK; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 301; -} -else if (ide == 17) -{ - event.key.keysym.sym = SDLK_a; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'a'; -} -else if (ide == 18) -{ - event.key.keysym.sym = SDLK_b; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'b'; -} -else if (ide == 19) -{ - event.key.keysym.sym = SDLK_c; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'c'; -} -else if (ide == 20) -{ - event.key.keysym.sym = SDLK_d; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'d'; -} -else if (ide == 21) -{ - event.key.keysym.sym = SDLK_e; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'e'; -} -else if (ide == 22) -{ - event.key.keysym.sym = SDLK_f; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'f'; -} -else if (ide == 23) -{ - event.key.keysym.sym = SDLK_g; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'g'; -} -else if (ide == 24) -{ - event.key.keysym.sym = SDLK_h; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'h'; -} -else if (ide == 25) -{ - event.key.keysym.sym = SDLK_i; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'i'; -} -else if (ide == 26) -{ - event.key.keysym.sym = SDLK_j; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'j'; -} -else if (ide == 27) -{ - event.key.keysym.sym = SDLK_k; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'k'; -} -else if (ide == 28) -{ - event.key.keysym.sym = SDLK_l; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'l'; -} -else if (ide == 29) -{ - event.key.keysym.sym = SDLK_m; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'m'; -} -else if (ide == 30) -{ - event.key.keysym.sym = SDLK_n; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'n'; -} -else if (ide == 31) -{ - event.key.keysym.sym = SDLK_LEFTBRACKET; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 91; -} -else if (ide == 32) -{ - event.key.keysym.sym = SDLK_RIGHTBRACKET; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 93; -} -else if (ide == 33) -{ - event.key.keysym.sym = SDLK_BACKSLASH; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 92; -} -else if (ide == 34) -{ - event.key.keysym.sym = SDLK_RETURN; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 13; -} -else if (ide == 35) -{ - event.key.keysym.sym = SDLK_o; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'o'; -} -else if (ide == 36) -{ - event.key.keysym.sym = SDLK_p; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'p'; -} -else if (ide == 37) -{ - event.key.keysym.sym = SDLK_q; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'q'; -} -else if (ide == 38) -{ - event.key.keysym.sym = SDLK_r; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'r'; -} -else if (ide == 39) -{ - event.key.keysym.sym = SDLK_s; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'s'; -} -else if (ide == 40) -{ - event.key.keysym.sym = SDLK_t; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'t'; -} -else if (ide == 41) -{ - event.key.keysym.sym = SDLK_u; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'u'; -} -else if (ide == 41) -{ - event.key.keysym.sym = SDLK_v; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'v'; -} -else if (ide == 42) -{ - event.key.keysym.sym = SDLK_w; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'w'; -} -else if (ide == 43) -{ - event.key.keysym.sym = SDLK_x; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'x'; -} -else if (ide == 44) -{ - event.key.keysym.sym = SDLK_y; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'y'; -} -else if (ide == 45) -{ - event.key.keysym.sym = SDLK_z; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = (Uint16)'z'; -} -else if (ide == 46) -{ - event.key.keysym.sym = SDLK_COMMA; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 44; -} -else if (ide == 47) -{ - event.key.keysym.sym = SDLK_PERIOD; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 46; -} -else if (ide == 48) -{ - event.key.keysym.sym = SDLK_SLASH; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 47; -} -else if (ide == 49) -{ - event.key.keysym.sym = SDLK_SEMICOLON; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 59; -} -else if (ide == 50) -{ - event.key.keysym.sym = SDLK_QUOTEDBL; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 34; -} -else if (ide == 51) -{ - event.key.keysym.sym = SDLK_RALT; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 307; -} -else if (ide == 52) -{ - event.key.keysym.sym = SDLK_RSHIFT; - event.key.keysym.mod = KMOD_NONE; - event.key.keysym.unicode = 303; -} - - - - - static int redraw = 0; - wchar_t* im_cp = im_data.s; - /* Discard previous # of redraw characters */ - if((int)texttool_len <= redraw) texttool_len = 0; - else texttool_len -= redraw; - texttool_str[texttool_len] = L'\0'; - - /* Read IM, remember how many to redraw next iteration */ - redraw = im_read(&im_data, event.key.keysym); - - /* Queue each character to be displayed */ - while(*im_cp) { - if (*im_cp == L'\b') - { - hide_blinking_cursor(); - if (texttool_len > 0) - { - texttool_len--; - texttool_str[texttool_len] = 0; - playsound(screen, 0, SND_KEYCLICK, 0, SNDPOS_CENTER, - SNDDIST_NEAR); - - do_render_cur_text(0); - - if (been_saved) - { - been_saved = 0; - - if (!disable_save) - tool_avail[TOOL_SAVE] = 1; - - draw_toolbar(); - update_screen_rect(&r_tools); - } - - } - } - else if (*im_cp == L'\r') - { - int font_height; - font_height = TuxPaint_Font_FontHeight(getfonthandle(cur_font)); - - hide_blinking_cursor(); - if (texttool_len > 0) - { - rec_undo_buffer(); - do_render_cur_text(1); - label_node_to_edit = NULL; - texttool_len = 0; - cursor_textwidth = 0; - if (cur_tool == TOOL_LABEL) - { - draw_fonts(); - update_screen_rect(&r_toolopt); - } - - if (been_saved) - { - been_saved = 0; - - if (!disable_save) - tool_avail[TOOL_SAVE] = 1; - - draw_toolbar(); - update_screen_rect(&r_tools); - } - +//void gen_key_event(int ide) - cursor_x = cursor_left; - cursor_y = min(cursor_y + font_height, canvas->h - font_height); - - playsound(screen, 0, SND_RETURN, 1, SNDPOS_RIGHT, SNDDIST_NEAR); - - } - else if (cur_tool == TOOL_LABEL && label_node_to_edit) - { - rec_undo_buffer(); - have_to_rec_label_node = TRUE; - add_label_node(0, 0, 0, 0, NULL); - derender_node(&label_node_to_edit); - label_node_to_edit = NULL; -// playsound(screen, 0, SND_DELETE_LABEL, 0, SNDPOS_CENTER); // FIXME lack of specific sound - - if (been_saved) - { - been_saved = 0; - - if (!disable_save) - tool_avail[TOOL_SAVE] = 1; - - draw_toolbar(); - update_screen_rect(&r_tools); - } - } - - /* Select a node to edit */ - else if (cur_tool == TOOL_LABEL && - cur_label == LABEL_SELECT) - { - label_node_to_edit=search_label_list(&highlighted_label_node, highlighted_label_node->save_x + 3, highlighted_label_node->save_y + 3, 0); - if(label_node_to_edit) - { - cur_label = LABEL_LABEL; - cur_thing=label_node_to_edit->save_cur_font; - do_setcursor(cursor_insertion); - i = 0; - label_node_to_edit->is_enabled = FALSE; - derender_node(&label_node_to_edit); - - texttool_len = select_texttool_len; - while(i < texttool_len) - { - texttool_str[i] = select_texttool_str[i]; - i = i+1; - } - texttool_str[i] = L'\0'; - cur_color = select_color; - old_x = select_x; - old_y = select_y; - cur_font = select_cur_font; - text_state = select_text_state; - text_size = select_text_size; - // int j; - for (j = 0; j < num_font_families; j++) - { - if (user_font_families[j] - && user_font_families[j]->handle) - { - TuxPaint_Font_CloseFont(user_font_families[j]->handle); - user_font_families[j]->handle = NULL; - } - } - draw_fonts(); - update_screen_rect(&r_toolopt); - - cursor_x = old_x; - cursor_y = old_y; - cursor_left = old_x; - - draw_colors(COLORSEL_REFRESH); - draw_fonts(); - } - - - do_render_cur_text(0); - - } - else - { - cursor_x = cursor_left; - cursor_y = min(cursor_y + font_height, canvas->h - font_height); - } - -#ifdef SPEECH -#ifdef __APPLE__ - if (use_sound) - speak_string(texttool_str); -#endif -#endif - im_softreset(&im_data); - } - else if (*im_cp == L'\t') - { - - if (texttool_len > 0) - { - rec_undo_buffer(); - do_render_cur_text(1); - label_node_to_edit = NULL; - cursor_x = min(cursor_x + cursor_textwidth, canvas->w); - texttool_len = 0; - cursor_textwidth = 0; - if (cur_tool == TOOL_LABEL) - { - draw_fonts(); - update_screen_rect(&r_toolopt); - } - - if (been_saved) - { - been_saved = 0; - - if (!disable_save) - tool_avail[TOOL_SAVE] = 1; - - draw_toolbar(); - update_screen_rect(&r_tools); - } - } - else if (cur_tool == TOOL_LABEL && label_node_to_edit) - { - rec_undo_buffer(); - have_to_rec_label_node = TRUE; - add_label_node(0, 0, 0, 0, NULL); - derender_node(&label_node_to_edit); - label_node_to_edit = NULL; -// playsound(screen, 0, SND_DELETE_LABEL, 0, SNDPOS_CENTER); // FIXME lack of specific sound - - if (been_saved) - { - been_saved = 0; - - if (!disable_save) - tool_avail[TOOL_SAVE] = 1; - - draw_toolbar(); - update_screen_rect(&r_tools); - } - } - /* Cycle accross the nodes */ - else if (cur_tool == TOOL_LABEL && - cur_label == LABEL_SELECT) - { - cycle_highlighted_label_node(); - highlight_label_nodes(); - } - - - -#ifdef SPEECH -#ifdef __APPLE__ - if (use_sound) - speak_string(texttool_str); -#endif -#endif - im_softreset(&im_data); - } - else if (iswprint(*im_cp) && - (cur_tool == TOOL_TEXT || cur_label == LABEL_LABEL)) - { - if (texttool_len < (sizeof(texttool_str) / sizeof(wchar_t)) - 1) - { - int old_cursor_textwidth = cursor_textwidth; -#ifdef DEBUG - wprintf(L" key = <%c>\nunicode = <%lc> 0x%04x %d\n\n", - key_down, key_unicode, key_unicode, key_unicode); -#endif - - texttool_str[texttool_len++] = *im_cp; - texttool_str[texttool_len] = 0; - - do_render_cur_text(0); - - if (been_saved) - { - been_saved = 0; - - if (!disable_save) - tool_avail[TOOL_SAVE] = 1; - - draw_toolbar(); - update_screen_rect(&r_tools); - } - - - if (cursor_x + old_cursor_textwidth <= canvas->w - 50 && - cursor_x + cursor_textwidth > canvas->w - 50) - { - playsound(screen, 0, SND_KEYCLICKRING, 1, SNDPOS_RIGHT, - SNDDIST_NEAR); - } - else - { - /* FIXME: Might be fun to position the - sound based on keyboard layout...? */ - - playsound(screen, 0, SND_KEYCLICK, 0, SNDPOS_CENTER, - SNDDIST_NEAR); - } - } - } - - im_cp++; - } /* while(*im_cp) */ - - /* Show IM tip text */ - if(im_data.tip_text) { - draw_tux_text(TUX_DEFAULT, im_data.tip_text, 1); - } - -} // Check whether current mouse position is within a rectangle @@ -23346,8 +23353,11 @@ int button(int id, int x, int y) if (regionhit(x, y, 24, 24)) { uistate.hotitem = id; - if (uistate.activeitem == 0 && uistate.mousedown) - uistate.activeitem = id; + if (uistate.activeitem != id && uistate.mousedown) + { + uistate.activeitem = id; + activeflag = 1; + } } SDL_Rect dest; SDL_Surface *tmp_imgup; @@ -23362,7 +23372,12 @@ int button(int id, int x, int y) if (uistate.activeitem == id) { // Button is both 'hot' and 'active' - gen_key_event(id); + if (activeflag == 1) + { + ide = id; + gen_key_flag = 1; + activeflag = 0; + } SDL_BlitSurface(img_btnsm_down, NULL, screen, &dest); } else @@ -23424,25 +23439,31 @@ void drawkeybd(void ) { messager = TTF_RenderText_Solid( fonty, array[i], textcolory ); apply_surface( initial_x + (key_width)*(i-1), initial_y, messager, screen, NULL); + SDL_FreeSurface(messager); } for (i = 1; i <= 19; i++) { messager = TTF_RenderText_Solid( fonty, array[i+15], textcolory ); apply_surface( initial_x + (key_width)*(i-1), initial_y + key_height, messager, screen, NULL); + SDL_FreeSurface(messager); } for (i = 1; i <= 18; i++) { messager = TTF_RenderText_Solid( fonty, array[i+34], textcolory ); apply_surface( initial_x + (key_width)*(i-1), initial_y + (2 * key_height), messager, screen, NULL); + SDL_FreeSurface(messager); } } void on_screen_keyboard(void ) { - key_board = SDL_CreateRGBSurface(canvas->flags, + if (key_board != NULL) + SDL_FreeSurface(key_board); + + key_board = SDL_CreateRGBSurface(canvas->flags, key_width * 19, key_height * 3, canvas->format->BitsPerPixel, @@ -23454,7 +23475,14 @@ void on_screen_keyboard(void ) key_board_color_b = 255; SDL_FillRect(key_board, NULL, SDL_MapRGB(key_board->format, 255, 255, 255)); - + if (keybd_position == 0) + { + initial_y = 400; + } + else + { + initial_y = 25; + } apply_surface( initial_x, initial_y, key_board, screen, NULL); prepare(); |