Using the new rewrited of onscreen keyboard.

This commit is contained in:
Pere Pujal i Carabantes 2011-09-02 06:26:09 +00:00
parent f14872a133
commit a9d30e243b

View file

@ -457,6 +457,7 @@ extern WrapperData macosx;
#include "fonts.h" #include "fonts.h"
#include "dirwalk.h" #include "dirwalk.h"
#include "get_fname.h" #include "get_fname.h"
#include "onscreen_keyboard.h"
#include "tools.h" #include "tools.h"
#include "titles.h" #include "titles.h"
@ -649,6 +650,7 @@ static SDL_Rect r_tcolors; /* was 96x48 @ 0,376 (title for colors, "Colors") */
static SDL_Rect r_ttoolopt; /* was 96x40 @ 544,0 (title for tool options) */ static SDL_Rect r_ttoolopt; /* was 96x40 @ 544,0 (title for tool options) */
static SDL_Rect r_tuxarea; /* was 640x56 */ static SDL_Rect r_tuxarea; /* was 640x56 */
static SDL_Rect r_label; static SDL_Rect r_label;
static SDL_Rect old_dest;
static int button_w; /* was 48 */ static int button_w; /* was 48 */
static int button_h; /* was 48 */ static int button_h; /* was 48 */
@ -936,6 +938,47 @@ static int disable_label = 1;
static int disable_label; static int disable_label;
#endif #endif
/* Update the contents of a region */
static void update_canvas_ex_r(int x1, int y1, int x2, int y2, int screen_too)
{
SDL_Rect src, dest;
src.x = x1;
src.y = y1;
src.w = x2 - x1 + 1;
src.h = y2 - y1 + 1;
dest.x = x1;
dest.y = y1;
dest.w = src.w;
dest.h = src.h;
if (img_starter != NULL)
{
/* If there was a starter, cover this part of the drawing with
the corresponding part of the starter's foreground! */
SDL_BlitSurface(img_starter, &dest, canvas, &dest);
}
// printf("%d\n", canvas );
//printf("%d, %d, %d, %d\n", dest.x, dest.y, dest.w, dest.h);
//printf("%d\n", screen);
//printf("%d, %d, %d, %d\n\n\n", r_canvas.x, r_canvas.y, r_canvas.w, r_canvas.w);
// src.x = x1 + 96;
dest.x = x1 + 96;
SDL_BlitSurface(canvas, &src, screen, &dest);
/* If label is not disabled, cover canvas with label layer */
if(!disable_label)
SDL_BlitSurface(label, &src, screen, &dest);
if (screen_too)
update_screen(x1 + 96, y1, x2 + 96, y2);
}
static void update_canvas_ex(int x1, int y1, int x2, int y2, int screen_too) static void update_canvas_ex(int x1, int y1, int x2, int y2, int screen_too)
{ {
SDL_Rect src, dest; SDL_Rect src, dest;
@ -1369,7 +1412,7 @@ static Uint16 *wcstou16(const wchar_t * str)
} }
static SDL_Surface *render_text_w(TuxPaint_Font * restrict font, SDL_Surface *render_text_w(TuxPaint_Font * restrict font,
const wchar_t * restrict str, const wchar_t * restrict str,
SDL_Color color) SDL_Color color)
{ {
@ -1940,7 +1983,7 @@ static void eat_sdl_events(void)
else if (event.type == SDL_ACTIVEEVENT) else if (event.type == SDL_ACTIVEEVENT)
handle_active(&event); handle_active(&event);
else if (event.type == SDL_KEYDOWN) else if (event.type == SDL_KEYDOWN)
{ {//AAAAAAAAAAAAAAQQQQQQQQQQQQQQQQQQUUUUUUUUUUUUUUUUUUIIIIIIIIIII
SDLKey key = event.key.keysym.sym; SDLKey key = event.key.keysym.sym;
SDLMod ctrl = event.key.keysym.mod & KMOD_CTRL; SDLMod ctrl = event.key.keysym.mod & KMOD_CTRL;
SDLMod alt = event.key.keysym.mod & KMOD_ALT; SDLMod alt = event.key.keysym.mod & KMOD_ALT;
@ -2038,15 +2081,15 @@ void apply_surface (int x, int y, SDL_Surface *source, SDL_Surface *destination,
void drawkeybd(void ); void drawkeybd(void );
int regionhit(int x, int y, int w, int h); int regionhit(int x, int y, int w, int h);
void button(int id, int x, int y); void button(int id, int x, int y);
void on_screen_keyboard(void ); void on_screen_keyboardd(void );
SDL_Surface *messager = NULL; SDL_Surface *messager = NULL;
#define initial_x (2 * button_w + 80) #define initial_x (2 * button_w + 80)
#define key_width 24 #define key_width 24
#define key_height 24 #define key_height 24
TTF_Font *fonty = NULL; TTF_Font *fontyy = NULL;
SDL_Color textcolory = { 0, 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",
@ -2101,6 +2144,9 @@ static void mainloop(void)
SDLKey key_down; SDLKey key_down;
#endif #endif
SDL_Event ev; SDL_Event ev;
on_screen_keyboard *kbd, *new_kbd;
SDL_Rect kbd_rect;
num_things = num_brushes; num_things = num_brushes;
thing_scroll = &brush_scroll; thing_scroll = &brush_scroll;
cur_thing = 0; cur_thing = 0;
@ -2128,6 +2174,7 @@ static void mainloop(void)
done = 0; done = 0;
color_flag = 0; color_flag = 0;
keyglobal = 0; keyglobal = 0;
kbd = NULL;
do do
{ {
@ -2187,7 +2234,7 @@ static void mainloop(void)
} }
else if (event.type == SDL_KEYDOWN) else if (event.type == SDL_KEYDOWN)
{ {
key = event.key.keysym.sym; key = event.key.keysym.sym;
mod = event.key.keysym.mod; mod = event.key.keysym.mod;
@ -2541,8 +2588,9 @@ static void mainloop(void)
playsound(screen, 1, SND_CLICK, 0, SNDPOS_LEFT, SNDDIST_NEAR); playsound(screen, 1, SND_CLICK, 0, SNDPOS_LEFT, SNDDIST_NEAR);
update_screen(0,0,WINDOW_WIDTH,WINDOW_HEIGHT); update_screen(0,0,WINDOW_WIDTH,WINDOW_HEIGHT);
} }
/* FIXME: this caused part of the onscreen keyboard flickering,
if (key == SDLK_RETURN && (tool_flag == 1)) need to find a better key to handle this */
if (key == SDLK_RETURN && (tool_flag == 1) && cur_tool != TOOL_LABEL && cur_tool != TOOL_TEXT)
{ {
ev.type = SDL_MOUSEBUTTONDOWN; ev.type = SDL_MOUSEBUTTONDOWN;
ev.button.which = 0; ev.button.which = 0;
@ -2866,7 +2914,7 @@ static void mainloop(void)
{ {
static int redraw = 0; static int redraw = 0;
wchar_t* im_cp = im_data.s; wchar_t* im_cp = im_data.s;
#ifdef DEBUG #ifdef DEBUG
key_down = key; key_down = key;
key_unicode = event.key.keysym.unicode; key_unicode = event.key.keysym.unicode;
@ -3340,8 +3388,25 @@ static void mainloop(void)
} }
else if (cur_tool == TOOL_TEXT || cur_tool == TOOL_LABEL) else if (cur_tool == TOOL_TEXT || cur_tool == TOOL_LABEL)
{ {
if (onscreen_keyboard) if (onscreen_keyboard)
on_screen_keyboard(); {
if (kbd == NULL)
kbd = osk_create("test.layout", screen, img_btnsm_up, img_btnsm_down, img_btnsm_off);
if (kbd == NULL)
printf("kbd = NULL\n");
else
{
kbd_rect.x = button_w * 2 + (canvas->w - kbd->surface->w)/2;
if(old_y > canvas->h / 2)
kbd_rect.y = 0;
else
kbd_rect.y = canvas->h - kbd->surface->h;
kbd_rect.w = kbd->surface->w;
kbd_rect.h = kbd->surface->h;
SDL_BlitSurface(kbd->surface, &kbd->rect, screen, &kbd_rect);
update_screen_rect(&kbd_rect);
}
}
if (!font_thread_done) if (!font_thread_done)
{ {
draw_colors(COLORSEL_DISABLE); draw_colors(COLORSEL_DISABLE);
@ -4018,11 +4083,17 @@ static void mainloop(void)
{ {
cur_label = LABEL_LABEL; cur_label = LABEL_LABEL;
update_canvas(0, 0, WINDOW_WIDTH - 96, (48 * 7) + 40 + HEIGHTOFFSET); update_canvas(0, 0, WINDOW_WIDTH - 96, (48 * 7) + 40 + HEIGHTOFFSET);
} if (onscreen_keyboard)
{
SDL_BlitSurface(kbd->surface, &kbd->rect, screen, &kbd_rect);
update_screen_rect(&kbd_rect);
}
}
else else
{ {
if (are_labels()) if (are_labels())
{ {
update_canvas_ex_r(kbd_rect.x- 96, kbd_rect.y, kbd_rect.x + kbd_rect.w, kbd_rect.y + kbd_rect.h, 1);
if( texttool_len > 0) if( texttool_len > 0)
{ {
rec_undo_buffer(); rec_undo_buffer();
@ -4371,14 +4442,14 @@ static void mainloop(void)
/* Draw something! */ /* Draw something! */
old_x = event.button.x - r_canvas.x; old_x = event.button.x - r_canvas.x;
old_y = event.button.y - r_canvas.y; old_y = event.button.y - r_canvas.y;
if (old_y < r_canvas.h/2) /* if (old_y < r_canvas.h/2) */
{ /* { */
keybd_position = 0; /* keybd_position = 0; */
} /* } */
else /* else */
{ /* { */
keybd_position = 1; /* keybd_position = 1; */
} /* } */
if (been_saved) if (been_saved)
{ {
@ -4599,13 +4670,27 @@ static void mainloop(void)
draw_fonts(); draw_fonts();
update_screen_rect(&r_toolopt); update_screen_rect(&r_toolopt);
if (onscreen_keyboard) if (onscreen_keyboard)
on_screen_keyboard(); {
if (old_y < r_canvas.h/2)
kbd_rect.y = r_canvas.h - kbd->surface->h;
else
kbd_rect.y = 0;
SDL_BlitSurface(kbd->surface, &kbd->rect, screen, &kbd_rect);
update_screen_rect(&kbd_rect);
}
do_render_cur_text(0); do_render_cur_text(0);
draw_colors(COLORSEL_REFRESH); draw_colors(COLORSEL_REFRESH);
draw_fonts(); draw_fonts();
} }
} }
else
hide_blinking_cursor();
if (cursor_x != -1 && cursor_y != -1) if (cursor_x != -1 && cursor_y != -1)
{ {
/* /*
@ -4617,12 +4702,58 @@ static void mainloop(void)
} }
*/ */
} }
if (onscreen_keyboard && HIT(kbd_rect))
{
new_kbd = osk_clicked(kbd, old_x - kbd_rect.x + r_canvas.x, old_y - kbd_rect.y + r_canvas.y);
/* keyboard has changed, erase the old, note that the old kbd has yet been freed. */
if (new_kbd != kbd)
{
kbd = new_kbd;
update_canvas_ex(kbd_rect.x, kbd_rect.y, kbd_rect.x + kbd_rect.w, kbd_rect.y + kbd_rect.h, 0);
/* set kbd_rect dimensions according to the new keyboard */
kbd_rect.x = button_w * 2 + (canvas->w - kbd->surface->w)/2;
if(kbd_rect.y != 0)
kbd_rect.y = canvas->h - kbd->surface->h;
kbd_rect.w = kbd->surface->w;
kbd_rect.h = kbd->surface->h;
}
SDL_BlitSurface(kbd->surface, &kbd->rect, screen, &kbd_rect);
update_screen_rect(&kbd_rect);
}
else
{
cursor_x = old_x;
cursor_y = old_y;
cursor_left = old_x;
cursor_x = old_x; if (onscreen_keyboard)
cursor_y = old_y; if (old_y < r_canvas.h/2)
cursor_left = old_x; {
if (kbd_rect.y != r_canvas.h - kbd->surface->h)
{
update_canvas_ex(kbd_rect.x, kbd_rect.y, kbd_rect.x + kbd_rect.w, kbd_rect.y + kbd_rect.h, 0);
update_screen_rect(&kbd_rect);
kbd_rect.y = r_canvas.h - kbd->surface->h;
SDL_BlitSurface(kbd->surface, &kbd->rect, screen, &kbd_rect);
update_screen_rect(&kbd_rect);
}
}
else
{
if (kbd_rect.y != 0)
{
update_canvas_ex(kbd_rect.x, kbd_rect.y, kbd_rect.x + kbd_rect.w, kbd_rect.y + kbd_rect.h, 0);
update_screen_rect(&kbd_rect);
kbd_rect.y = 0;
SDL_BlitSurface(kbd->surface, &kbd->rect, screen, &kbd_rect);
update_screen_rect(&kbd_rect);
}
}
}
do_render_cur_text(0); do_render_cur_text(0);
} }
button_down = 1; button_down = 1;
@ -4858,7 +4989,7 @@ static void mainloop(void)
} }
} }
else if (event.type == SDL_USEREVENT) else if (event.type == SDL_USEREVENT)
{ {
if (event.user.code == USEREVENT_TEXT_UPDATE) if (event.user.code == USEREVENT_TEXT_UPDATE)
{ {
/* Time to replace "Great!" with old tip text: */ /* Time to replace "Great!" with old tip text: */
@ -5056,6 +5187,15 @@ static void mainloop(void)
update_rect.y + update_rect.h); update_rect.y + update_rect.h);
} }
} }
else if (onscreen_keyboard &&
(cur_tool == TOOL_TEXT ||
(cur_tool == TOOL_LABEL && cur_label != LABEL_SELECT)))
{
osk_released(kbd);
SDL_BlitSurface(kbd->surface, &kbd->rect, screen, &kbd_rect);
update_screen_rect(&kbd_rect);
// SDL_Flip(screen);
}
} }
button_down = 0; button_down = 0;
} }
@ -5260,12 +5400,18 @@ static void mainloop(void)
} }
else if (cur_tool == TOOL_TEXT) else if (cur_tool == TOOL_TEXT)
{ {
do_setcursor(cursor_insertion); if (onscreen_keyboard && HIT(kbd_rect))
do_setcursor(cursor_hand);
else
do_setcursor(cursor_insertion);
} }
else if (cur_tool == TOOL_LABEL) else if (cur_tool == TOOL_LABEL)
{ {
if (cur_label == LABEL_LABEL) if (cur_label == LABEL_LABEL)
do_setcursor(cursor_insertion); if (onscreen_keyboard && HIT(kbd_rect))
do_setcursor(cursor_hand);
else
do_setcursor(cursor_insertion);
else if (cur_label == LABEL_SELECT) else if (cur_label == LABEL_SELECT)
{ {
if (search_label_list(&current_label_node, event.button.x - 96, event.button.y, 1)) if (search_label_list(&current_label_node, event.button.x - 96, event.button.y, 1))
@ -5486,8 +5632,9 @@ static void mainloop(void)
if (cur_tool == TOOL_TEXT || (cur_tool == TOOL_LABEL && cur_label != LABEL_SELECT)) if (cur_tool == TOOL_TEXT || (cur_tool == TOOL_LABEL && cur_label != LABEL_SELECT))
{ {
if (onscreen_keyboard) /* if (onscreen_keyboard) */
on_screen_keyboard(); /* osk_clicked(kbd, old_x, old_y); */
/* on_screen_keyboardd(); */
cur_cursor_blink = SDL_GetTicks(); cur_cursor_blink = SDL_GetTicks();
if( cursor_x != -1 && cursor_y != -1 && if( cursor_x != -1 && cursor_y != -1 &&
@ -16152,7 +16299,7 @@ static void do_render_cur_text(int do_blit)
color_hexes[cur_color][2], color_hexes[cur_color][2],
0 0
}; };
SDL_Surface *tmp_surf; SDL_Surface *tmp_surf;
SDL_Rect dest, src; SDL_Rect dest, src;
wchar_t *str; wchar_t *str;
@ -16212,19 +16359,20 @@ static void do_render_cur_text(int do_blit)
cursor_textwidth = w; cursor_textwidth = w;
} }
else /* Erase the stalle letter. Hope there is not any letter 3 times wider than its height */ else /* Erase the stalle letter . */
{ {
if (cur_label != LABEL_SELECT) if (cur_label != LABEL_SELECT)
{ {
update_canvas(cursor_x - 1, update_canvas_ex_r(old_dest.x - 96, old_dest.y,
cursor_y - 1, old_dest.x + old_dest.w,
cursor_x + 1 + TuxPaint_Font_FontHeight(getfonthandle(cur_font)) * 3, old_dest.y + old_dest.h, 0);
cursor_y + 1 + TuxPaint_Font_FontHeight(getfonthandle(cur_font))); old_dest.x = old_dest.y = old_dest.w = old_dest.h = 0;
update_canvas(old_cursor_x - 1,
old_cursor_y - 1, update_canvas_ex_r(old_cursor_x - 1,
old_cursor_x + 1 + TuxPaint_Font_FontHeight(getfonthandle(cur_font)), old_cursor_y - 1,
old_cursor_y + 1 + TuxPaint_Font_FontHeight(getfonthandle(cur_font))); old_cursor_x + 1,
old_cursor_y + 1 + TuxPaint_Font_FontHeight(getfonthandle(cur_font)), 0);
/* FIXME: Do less flickery updating here (use update_canvas_ex() above, then SDL_Flip() or SDL_UpdateRect() here -bjk 2010.02.10 */ /* FIXME: Do less flickery updating here (use update_canvas_ex() above, then SDL_Flip() or SDL_UpdateRect() here -bjk 2010.02.10 */
@ -16232,18 +16380,23 @@ static void do_render_cur_text(int do_blit)
old_cursor_y = cursor_y; old_cursor_y = cursor_y;
cursor_textwidth = 0; cursor_textwidth = 0;
} }
SDL_Flip(screen); /* FIXME: Is this SDL_Flip() still needed? Pere 2011.06.28 */
return; SDL_Flip(screen);
return;
} }
if (!do_blit) if (!do_blit)
{ {
update_canvas_ex(cursor_x - 1, update_canvas_ex_r(old_dest.x - 96, old_dest.y,
cursor_y - 1, old_dest.x + old_dest.w,
cursor_x + 1 + TuxPaint_Font_FontHeight(getfonthandle(cur_font)) * 3, old_dest.y + old_dest.h, 0);
cursor_y + 1 + TuxPaint_Font_FontHeight(getfonthandle(cur_font)), 0);
/* update_canvas_ex_r(cursor_x - 1, */
/* cursor_y - 1, */
/* cursor_x + 1 + TuxPaint_Font_FontHeight(getfonthandle(cur_font)) * 3, */
/* cursor_y + 1 + TuxPaint_Font_FontHeight(getfonthandle(cur_font)), 0); */
/* Draw outline around text: */ /* Draw outline around text: */
@ -16260,6 +16413,10 @@ static void do_render_cur_text(int do_blit)
SDL_FillRect(screen, &dest, SDL_MapRGB(canvas->format, 0, 0, 0)); SDL_FillRect(screen, &dest, SDL_MapRGB(canvas->format, 0, 0, 0));
old_dest.x = dest.x;
old_dest.y = dest.y;
old_dest.w = dest.w;
old_dest.h = dest.h;
/* FIXME: This would be nice if it were alpha-blended: */ /* FIXME: This would be nice if it were alpha-blended: */
@ -16336,8 +16493,8 @@ static void do_render_cur_text(int do_blit)
{ {
SDL_BlitSurface(tmp_surf, &src, canvas, &dest); SDL_BlitSurface(tmp_surf, &src, canvas, &dest);
} }
update_canvas_ex(dest.x, dest.y, dest.x + tmp_surf->w, update_canvas_ex_r(dest.x - 2, dest.y - 2 , dest.x + tmp_surf->w + 4,
dest.y + tmp_surf->h, 0); dest.y + tmp_surf->h + 4, 0);
} }
else else
{ {
@ -16348,14 +16505,17 @@ static void do_render_cur_text(int do_blit)
/* FIXME: Only update what's changed! */ /* FIXME: Only update what's changed! */
SDL_Flip(screen); SDL_Flip(screen);
//update_screen_rect(&dest);
free(str); free(str);
if (tmp_surf != NULL) if (tmp_surf != NULL)
SDL_FreeSurface(tmp_surf); SDL_FreeSurface(tmp_surf);
/* if (tmp_label != NULL) */ /* if (tmp_label != NULL) */
/* SDL_FreeSurface(tmp_label); */ /* SDL_FreeSurface(tmp_label); */
// SDL_Delay(5000);
} }
@ -23703,15 +23863,16 @@ void button(int id, int x, int y)
{ {
if (caps_flag % 2 != 0) if (caps_flag % 2 != 0)
{ {
event.key.keysym.sym = SDLK_y; event.key.keysym.sym = SDLK_y;
event.key.keysym.mod = KMOD_CAPS; event.key.keysym.mod = KMOD_CAPS;
event.key.keysym.unicode = 89; event.key.keysym.unicode = 89;
} }
else else
{ {
event.key.keysym.sym = SDLK_y; event.key.keysym.sym = SDLK_y;
event.key.keysym.mod = KMOD_NONE; event.key.keysym.mod = KMOD_NONE;
event.key.keysym.unicode = (Uint16)'y'; event.key.keysym.unicode = (Uint16)'y';
// event.key.keysym.unicode = 0x1008ff79;
} }
} }
else if (ide == 46) else if (ide == 46)
@ -23773,283 +23934,11 @@ void button(int id, int x, int y)
if (enter_flag == 0) if (enter_flag == 0)
{ {
static int redraw = 0; event.key.type=SDL_KEYDOWN;
wchar_t* im_cp = im_data.s; SDL_PushEvent(&event);
/* Discard previous # of redraw characters */ event.key.type=SDL_KEYUP;
if((int)texttool_len <= redraw) texttool_len = 0; SDL_PushEvent(&event);
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;
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);
}
}
} }
} }
@ -24060,8 +23949,8 @@ void keybd_prepare()
fontname = malloc(128); fontname = malloc(128);
sprintf(fontname, "%s/fonts/FreeSansBold.ttf", DATA_PREFIX); sprintf(fontname, "%s/fonts/FreeSansBold.ttf", DATA_PREFIX);
fonty = TTF_OpenFont( fontname, 12 ); fontyy = TTF_OpenFont( fontname, 12 );
if (fonty == NULL) if (fontyy == NULL)
{ {
fprintf(stderr, "\nError: Can't open the font!\n" fprintf(stderr, "\nError: Can't open the font!\n"
"The Simple DirectMedia Layer error that occurred was:\n" "The Simple DirectMedia Layer error that occurred was:\n"
@ -24083,7 +23972,7 @@ void keybd_finish()
if (uistate.activeitem == 0) if (uistate.activeitem == 0)
uistate.activeitem = -1; uistate.activeitem = -1;
} }
TTF_CloseFont (fonty); TTF_CloseFont (fontyy);
} }
void apply_surface (int x, int y, SDL_Surface *source, SDL_Surface *destination, SDL_Rect *clip) void apply_surface (int x, int y, SDL_Surface *source, SDL_Surface *destination, SDL_Rect *clip)
@ -24102,33 +23991,33 @@ void drawkeybd(void )
int i; int i;
for (i = 1; i <= 15; i++) for (i = 1; i <= 15; i++)
{ {
messager = TTF_RenderText_Solid( fonty, keybd_array[i], textcolory ); messager = TTF_RenderText_Solid( fontyy, keybd_array[i], textcolory );
apply_surface( initial_x + (key_width)*(i-1), initial_y, messager, screen, NULL); apply_surface( initial_x + (key_width)*(i-1), initial_y, messager, screen, NULL);
SDL_FreeSurface(messager); SDL_FreeSurface(messager);
} }
for (i = 1; i <= 19; i++) for (i = 1; i <= 19; i++)
{ {
messager = TTF_RenderText_Solid( fonty, keybd_array[i+15], textcolory ); messager = TTF_RenderText_Solid( fontyy, keybd_array[i+15], textcolory );
apply_surface( initial_x + (key_width)*(i-1), initial_y + key_height, messager, screen, NULL); apply_surface( initial_x + (key_width)*(i-1), initial_y + key_height, messager, screen, NULL);
SDL_FreeSurface(messager); SDL_FreeSurface(messager);
} }
for (i = 1; i <= 19; i++) for (i = 1; i <= 19; i++)
{ {
messager = TTF_RenderText_Solid( fonty, keybd_array[i+34], textcolory ); messager = TTF_RenderText_Solid( fontyy, keybd_array[i+34], textcolory );
apply_surface( initial_x + (key_width)*(i-1), initial_y + (2 * key_height), messager, screen, NULL); apply_surface( initial_x + (key_width)*(i-1), initial_y + (2 * key_height), messager, screen, NULL);
SDL_FreeSurface(messager); SDL_FreeSurface(messager);
} }
} }
void on_screen_keyboard(void ) void on_screen_keyboardd(void )
{ {
int i; int i;
if (key_board != NULL) if (key_board != NULL)
SDL_FreeSurface(key_board); SDL_FreeSurface(key_board);
key_board = SDL_CreateRGBSurface(canvas->flags, key_board = SDL_CreateRGBSurface(canvas->flags,
key_width * 19, key_width * 19,
key_height * 3, key_height * 3,
@ -24623,7 +24512,7 @@ static void handle_joybuttonupdownscl(SDL_Event event, int oldpos_x, int oldpos_
ev.button.type = SDL_MOUSEBUTTONUP; ev.button.type = SDL_MOUSEBUTTONUP;
ev.button.state = SDL_RELEASED; ev.button.state = SDL_RELEASED;
} }
printf("result %d %d\n", ev.button.x, ev.button.y);
SDL_PushEvent(&ev); SDL_PushEvent(&ev);
} }