[Bf-blender-cvs] [36fc98c] input_method_editor: IME: Various fixes + usual cleanup

Severin noreply at git.blender.org
Tue Dec 2 01:26:32 CET 2014


Commit: 36fc98cb0ba193084888c18b13f8645ee50bd25f
Author: Severin
Date:   Tue Dec 2 01:24:16 2014 +0100
Branches: input_method_editor
https://developer.blender.org/rB36fc98cb0ba193084888c18b13f8645ee50bd25f

IME: Various fixes + usual cleanup

===================================================================

M	intern/ghost/intern/GHOST_WindowWin32.cpp
M	source/blender/editors/include/ED_space_api.h
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/interface/interface_intern.h
M	source/blender/editors/screen/screen_edit.c
M	source/blender/editors/space_console/space_console.c
M	source/blender/editors/space_text/space_text.c
M	source/blender/editors/space_text/text_draw.c
M	source/blender/editors/util/ed_util.c
M	source/blender/makesdna/DNA_windowmanager_types.h
M	source/blender/windowmanager/WM_types.h
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/intern/wm_window.c

===================================================================

diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp
index 5ae5ec0..4e38488 100644
--- a/intern/ghost/intern/GHOST_WindowWin32.cpp
+++ b/intern/ghost/intern/GHOST_WindowWin32.cpp
@@ -1054,7 +1054,6 @@ GHOST_TSuccess GHOST_WindowWin32::endProgressBar()
 #ifdef WITH_INPUT_IME
 void GHOST_WindowWin32::beginIME(GHOST_TInt32 x, GHOST_TInt32 y, GHOST_TInt32 w, GHOST_TInt32 h, int completed)
 {
-	h = 20; /* text height */
 	this->getImeInput()->BeginIME(this->getHWND(),	GHOST_Rect(x, y - h , x, y), (bool)completed);
 }
 
diff --git a/source/blender/editors/include/ED_space_api.h b/source/blender/editors/include/ED_space_api.h
index d268c57..204c0e1 100644
--- a/source/blender/editors/include/ED_space_api.h
+++ b/source/blender/editors/include/ED_space_api.h
@@ -78,5 +78,6 @@ void *ED_region_draw_cb_customdata(void *handle);
 /* generic callbacks */
 /* ed_util.c */
 void ED_region_draw_mouse_line_cb(const struct bContext *C, struct ARegion *ar, void *arg_info);
+void ED_text_draw_underline(int x, int y, int len, int height);
 
 #endif /* __ED_SPACE_API_H__ */
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index ec212c7..fef9e20 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -2635,7 +2635,7 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle
 
 	wmWindow *win = CTX_wm_window(C);
 	wmImeData *ime_data = win->ime_data;
-	bool is_ime_composing = win->is_ime_composite;
+	bool is_ime_composing = ime_data && ime_data->is_ime_composite;
 
 	switch (event->type) {
 		case MOUSEMOVE:
@@ -2831,10 +2831,10 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle
 		}
 
 		if ((event->ascii || event->utf8_buf[0]) &&
-			(retval == WM_UI_HANDLER_CONTINUE) &&
-			!is_ime_composing
+			(retval == WM_UI_HANDLER_CONTINUE)
 #ifdef WITH_INPUT_IME
-			&& !WM_event_is_ime_switch(event)
+			 && !is_ime_composing &&
+			 !WM_event_is_ime_switch(event)
 #endif
 			)
 		{
@@ -2874,7 +2874,6 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle
 
 #ifdef WITH_INPUT_IME
 	if (event->type == WM_IME_COMPOSITE_START || event->type == WM_IME_COMPOSITE_EVENT) {
-		but->editime = ime_data;
 		changed = true;
 		
 		if (event->type == WM_IME_COMPOSITE_START && but->selend > but->selsta)
@@ -2886,7 +2885,6 @@ static void ui_do_but_textedit(bContext *C, uiBlock *block, uiBut *but, uiHandle
 	}
 	else if (event->type == WM_IME_COMPOSITE_END) {
 		changed = true;
-		but->editime = NULL;
 	}
 #endif
 
diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h
index 3a8f8b7..3a42ca5 100644
--- a/source/blender/editors/interface/interface_intern.h
+++ b/source/blender/editors/interface/interface_intern.h
@@ -302,7 +302,6 @@ struct uiBut {
 	float *editvec;
 	void *editcoba;
 	void *editcumap;
-	void *editime;
 	
 	/* pointer back */
 	uiBlock *block;
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 816479f..d1af93b 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -1436,9 +1436,7 @@ void ED_screen_set_subwinactive(bContext *C, wmEvent *event)
 			/* notifier invokes freeing the buttons... causing a bit too much redraws */
 			if (oldswin != scr->subwinactive) {
 #ifdef WITH_INPUT_IME
-				/* when cursor leave a region, disable IME,
-				 * used for disable IME when cursor leave text or console region
-				 */
+				/* when cursor leaves a region, disable IME */
 				wm_window_IME_end(win);
 #endif
 
diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c
index 80e2623..6e02a4c 100644
--- a/source/blender/editors/space_console/space_console.c
+++ b/source/blender/editors/space_console/space_console.c
@@ -170,6 +170,7 @@ static void console_cursor(wmWindow *win, ScrArea *sa, ARegion *ar)
 		wmcursor = CURSOR_STD;
 	}
 #ifdef WITH_INPUT_IME
+	/* XXX find a better place */
 	else {
 		wm_window_IME_begin(win, ar->winrct.xmin, ar->winrct.ymin, 0, 0, true);
 	}
@@ -255,22 +256,24 @@ static void console_main_area_draw(const bContext *C, ARegion *ar)
 	console_history_verify(C); /* make sure we have some command line */
 
 #ifdef WITH_INPUT_IME
-	/* get cursor position from console_textview_main and repositon ime window */
 	if (is_ime_active) {
+		/* get cursor position from console_textview_main and repositon ime window */
 		ConsoleLine *line = (ConsoleLine *)sc->history.last;
 		ime_data->cursor_pos_text = line->cursor + strlen(sc->prompt);
 	}
 	else {
+		/* delete ImeData if it didn't exist previously */
 		ime_data = NULL;
 	}
 
 	console_textview_main(sc, ar, ime_data);
 
-	if (is_ime_active) {
+	if (ime_data && is_ime_active) {
 		int x = ime_data->cursor_xy[0];
 		int y = ime_data->cursor_xy[1];
 
 		ui_region_to_window(ar, &x, &y);
+
 		wm_window_IME_begin(win, x + 5, y, 0, 0, false);
 
 		ime_data->cursor_xy[0] = ime_data->cursor_xy[1] = 0;
diff --git a/source/blender/editors/space_text/space_text.c b/source/blender/editors/space_text/space_text.c
index 362b286..2e6ce2c 100644
--- a/source/blender/editors/space_text/space_text.c
+++ b/source/blender/editors/space_text/space_text.c
@@ -449,13 +449,17 @@ static void text_main_area_draw(const bContext *C, ARegion *ar)
 	
 	/* get cursor position from draw_text_main and repositon ime window */
 #ifdef WITH_INPUT_IME
+	if (!is_ime_active) {
+		ime_data = NULL;
+	}
 	draw_text_main(win, st, ar);
 
-	if (is_ime_active) {
+	if (ime_data && is_ime_active) {
 		int x = ime_data->cursor_xy[0];
 		int y = ime_data->cursor_xy[1];
 
 		ui_region_to_window(ar, &x, &y);
+
 		wm_window_IME_begin(win, x + 5, y, 0, 0, false);
 
 		ime_data->cursor_xy[0] = ime_data->cursor_xy[1] = 0;
diff --git a/source/blender/editors/space_text/text_draw.c b/source/blender/editors/space_text/text_draw.c
index 7166fd0..216937b 100644
--- a/source/blender/editors/space_text/text_draw.c
+++ b/source/blender/editors/space_text/text_draw.c
@@ -48,6 +48,8 @@
 
 #include "BIF_gl.h"
 
+#include "ED_space_api.h"
+
 #include "UI_interface.h"
 #include "UI_resources.h"
 #include "UI_view2d.h"
@@ -374,10 +376,6 @@ static const char *txt_utf8_forward_columns(const char *str, int columns, int *p
 	return p;
 }
 
-static void text_draw_ime_underline(SpaceText *st, int x, int y, int len, int height) {
-	glRecti(x, y - 4, x + len, y - 4 + height);
-}
-
 static int text_draw_wrapped(SpaceText *st, const char *str, int x, int y, int w, const char *format, int skip)
 {
 	const bool use_syntax = (st->showsyntax && format);
@@ -427,10 +425,10 @@ static int text_draw_wrapped(SpaceText *st, const char *str, int x, int y, int w
 				len = text_font_draw_character_utf8(st, x, y, str + ma);
 				/* draw underline */
 				if (format && format[a] == FMT_TYPE_ULINE)
-					text_draw_ime_underline(st, x, y, len, 1);
+					ED_text_draw_underline(x, y, len, 1);
 				else
 				if (format && format[a] == FMT_TYPE_TULINE)
-					text_draw_ime_underline(st, x, y, len, 2);
+					ED_text_draw_underline(x, y, len, 2);
 				x += len;
 				fpos++;
 			}
@@ -460,10 +458,10 @@ static int text_draw_wrapped(SpaceText *st, const char *str, int x, int y, int w
 
 		/* draw underline */
 		if (format && format[a] == FMT_TYPE_ULINE)
-			text_draw_ime_underline(st, x, y, len, 1);
+			ED_text_draw_underline(x, y, len, 1);
 		else
 		if (format && format[a] == FMT_TYPE_TULINE)
-			text_draw_ime_underline(st, x, y, len, 2);
+			ED_text_draw_underline(x, y, len, 2);
 		x += len;
 	}
 
@@ -516,10 +514,10 @@ static void text_draw(SpaceText *st, wmImeData *ime_data, char *str, int cshift,
 			len = text_font_draw_character_utf8(st, x, y, in + str_shift);
 			/* draw underline */
 			if (fmt_prev == FMT_TYPE_ULINE)
-				text_draw_ime_underline(st, x, y, len, 1);
+				ED_text_draw_underline(x, y, len, 1);
 			else
 			if (fmt_prev == FMT_TYPE_TULINE)
-				text_draw_ime_underline(st, x, y, len, 2);
+				ED_text_draw_underline(x, y, len, 2);
 			x += len;
 			str_shift += BLI_str_utf8_size_safe(in + str_shift);
 		}
@@ -1358,8 +1356,7 @@ void draw_text_main(wmWindow *win, SpaceText *st, ARegion *ar)
 {
 	Text *text = st->text;
 	TextFormatType *tft;
-	TextLine *tmp, bak = {0};
-	wmImeData *ime_data = win->ime_data;
+	TextLine *tmp;
 	rcti scroll, back;
 	char linenr[12];
 	int i, x, y, winx, linecount = 0, lineno = 0;
@@ -1367,6 +1364,14 @@ void draw_text_main(wmWindow *win, SpaceText *st, ARegion *ar)
 	int margin_column_x;
 	/* don't draw lines below this */
 	const int clip_min_y = -(int)(st->lheight_dpi - 1);
+#ifdef WITH_INPUT_IME
+	TextLine bak = {0};
+	wmImeData *ime_data = win->ime_data;
+	bool is_ime_active = ime_data &&
+	                     ime_data->cursor_xy &&
+	                     ime_data->composite_len &&
+	                     BLI_rcti_isect_pt_v(&ar->winrct, &win->eventstate->x);
+#endif
 
 	/* if no text, nothing to do */
 	if (!text)
@@ -1378,11 +1383,7 @@ void draw_text_main(wmWindow *win, SpaceText *st, ARegion *ar)
 
 #ifdef WITH_INPUT_IME
 	/* if is composing, backup and insert composition string */
-	if (ime_data &&
-		ime_data->cursor_xy &&
-		ime_data->composite_len &&
-		text->curl)
-	{
+	if (is_ime_active && text->curl) {
 		int clen = ime_data->composite_len;
 		int tlen = text->curl->len;
 		int clen_utf8 = BLI_strnlen_utf8(ime_data->composite, clen);
@@ -1547,16 +1548,16 @@ void draw_text_main(wmWindow *win, SpaceText *st, ARegion *ar)
 	
 	text_font_end(st);
 
+#ifdef WITH_INPUT_IME
 	if (bak.line) {
 		MEM_freeN(text->curl->line);
 		MEM_freeN(text->curl->format);
 		*text->curl = bak;
-#ifdef WITH_INPUT_IME
 		/* recover the cursor */
 		text->curc -= ime_data->cursor_position;
 		text->selc -= ime_data->cursor_position;
-#endif
 	}
+#endif
 }
 
 /************************** update ***************************/
diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c
index 86b9696..ad9a873 100644
--- a/source/blender/editors/util/ed_util.c

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list