From 3bd130c31bf829e2454963f915aed0e3e9db5b5b Mon Sep 17 00:00:00 2001 From: Alexander Kurtakov Date: Thu, 11 Jul 2013 16:21:18 +0300 Subject: Use gtk_text_buffer_select_range instead of gtk_text_buffer_move_mark. gtk_text_buffer_select_range exists since GTK 2.4 and is an optimized way to do selection as reduces GTK recalculations. It has additional benefit for SWT as it reduces the JNI overhead too - 3-4 function call become a single one. Bug 412758 . --- .../Eclipse SWT PI/gtk/library/os.c | 31 ++++++++++++---------- .../Eclipse SWT PI/gtk/library/os_stats.c | 2 +- .../Eclipse SWT PI/gtk/library/os_stats.h | 2 +- .../gtk/org/eclipse/swt/internal/gtk/OS.java | 10 +++---- .../gtk/org/eclipse/swt/widgets/Text.java | 14 +++------- 5 files changed, 27 insertions(+), 32 deletions(-) diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c index d363181c0d..fd2ace6a78 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os.c @@ -15800,20 +15800,6 @@ fail: } #endif -#ifndef NO__1gtk_1text_1buffer_1move_1mark -JNIEXPORT void JNICALL OS_NATIVE(_1gtk_1text_1buffer_1move_1mark) - (JNIEnv *env, jclass that, jintLong arg0, jintLong arg1, jbyteArray arg2) -{ - jbyte *lparg2=NULL; - OS_NATIVE_ENTER(env, that, _1gtk_1text_1buffer_1move_1mark_FUNC); - if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail; - gtk_text_buffer_move_mark((GtkTextBuffer *)arg0, (GtkTextMark *)arg1, (const GtkTextIter *)lparg2); -fail: - if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0); - OS_NATIVE_EXIT(env, that, _1gtk_1text_1buffer_1move_1mark_FUNC); -} -#endif - #ifndef NO__1gtk_1text_1buffer_1paste_1clipboard JNIEXPORT void JNICALL OS_NATIVE(_1gtk_1text_1buffer_1paste_1clipboard) (JNIEnv *env, jclass that, jintLong arg0, jintLong arg1, jbyteArray arg2, jboolean arg3) @@ -15842,6 +15828,23 @@ fail: } #endif +#ifndef NO__1gtk_1text_1buffer_1select_1range +JNIEXPORT void JNICALL OS_NATIVE(_1gtk_1text_1buffer_1select_1range) + (JNIEnv *env, jclass that, jintLong arg0, jbyteArray arg1, jbyteArray arg2) +{ + jbyte *lparg1=NULL; + jbyte *lparg2=NULL; + OS_NATIVE_ENTER(env, that, _1gtk_1text_1buffer_1select_1range_FUNC); + if (arg1) if ((lparg1 = (*env)->GetByteArrayElements(env, arg1, NULL)) == NULL) goto fail; + if (arg2) if ((lparg2 = (*env)->GetByteArrayElements(env, arg2, NULL)) == NULL) goto fail; + gtk_text_buffer_select_range((GtkTextBuffer *)arg0, (const GtkTextIter *)lparg1, (const GtkTextIter *)lparg2); +fail: + if (arg2 && lparg2) (*env)->ReleaseByteArrayElements(env, arg2, lparg2, 0); + if (arg1 && lparg1) (*env)->ReleaseByteArrayElements(env, arg1, lparg1, 0); + OS_NATIVE_EXIT(env, that, _1gtk_1text_1buffer_1select_1range_FUNC); +} +#endif + #ifndef NO__1gtk_1text_1buffer_1set_1text JNIEXPORT void JNICALL OS_NATIVE(_1gtk_1text_1buffer_1set_1text) (JNIEnv *env, jclass that, jintLong arg0, jbyteArray arg1, jint arg2) diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c index 392de0a764..92680c1b34 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.c @@ -1124,9 +1124,9 @@ char * OS_nativeFunctionNames[] = { #else "_1gtk_1text_1buffer_1insert__J_3B_3BI", #endif - "_1gtk_1text_1buffer_1move_1mark", "_1gtk_1text_1buffer_1paste_1clipboard", "_1gtk_1text_1buffer_1place_1cursor", + "_1gtk_1text_1buffer_1select_1range", "_1gtk_1text_1buffer_1set_1text", "_1gtk_1text_1iter_1get_1line", "_1gtk_1text_1iter_1get_1offset", diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h index 5c149e203b..27152acee5 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/library/os_stats.h @@ -1134,9 +1134,9 @@ typedef enum { #else _1gtk_1text_1buffer_1insert__J_3B_3BI_FUNC, #endif - _1gtk_1text_1buffer_1move_1mark_FUNC, _1gtk_1text_1buffer_1paste_1clipboard_FUNC, _1gtk_1text_1buffer_1place_1cursor_FUNC, + _1gtk_1text_1buffer_1select_1range_FUNC, _1gtk_1text_1buffer_1set_1text_FUNC, _1gtk_1text_1iter_1get_1line_FUNC, _1gtk_1text_1iter_1get_1offset_FUNC, diff --git a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java index 5b6aa53829..3b64195768 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java +++ b/bundles/org.eclipse.swt/Eclipse SWT PI/gtk/org/eclipse/swt/internal/gtk/OS.java @@ -11474,14 +11474,14 @@ public static final void gtk_text_buffer_insert(long /*int*/ buffer, long /*int* } /** * @param buffer cast=(GtkTextBuffer *) - * @param mark cast=(GtkTextMark *) - * @param where cast=(const GtkTextIter *) + * @param ins cast=(const GtkTextIter *) + * @param bound cast=(const GtkTextIter *) */ -public static final native void _gtk_text_buffer_move_mark(long /*int*/ buffer, long /*int*/ mark, byte[] where); -public static final void gtk_text_buffer_move_mark(long /*int*/ buffer, long /*int*/ mark, byte[] where) { +public static final native void _gtk_text_buffer_select_range (long /*int*/ buffer, byte[] ins, byte[] bound); +public static final void gtk_text_buffer_select_range (long /*int*/ buffer, byte[] ins, byte[] bound) { lock.lock(); try { - _gtk_text_buffer_move_mark(buffer, mark, where); + _gtk_text_buffer_select_range(buffer, ins, bound); } finally { lock.unlock(); } diff --git a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java index 4aa53ead4a..dd960b52d6 100644 --- a/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java +++ b/bundles/org.eclipse.swt/Eclipse SWT/gtk/org/eclipse/swt/widgets/Text.java @@ -524,10 +524,8 @@ public void clearSelection () { } else { byte [] position = new byte [ITER_SIZEOF]; long /*int*/ insertMark = OS.gtk_text_buffer_get_insert (bufferHandle); - long /*int*/ selectionMark = OS.gtk_text_buffer_get_selection_bound (bufferHandle); OS.gtk_text_buffer_get_iter_at_mark (bufferHandle, position, insertMark); - OS.gtk_text_buffer_move_mark (bufferHandle, selectionMark, position); - OS.gtk_text_buffer_move_mark (bufferHandle, insertMark, position); + OS.gtk_text_buffer_select_range(bufferHandle, position, position); } } @@ -2079,10 +2077,7 @@ public void selectAll () { byte [] end = new byte [ITER_SIZEOF]; OS.gtk_text_buffer_get_iter_at_offset (bufferHandle, start, 0); OS.gtk_text_buffer_get_end_iter (bufferHandle, end); - long /*int*/ insertMark = OS.gtk_text_buffer_get_insert (bufferHandle); - long /*int*/ selectionMark = OS.gtk_text_buffer_get_selection_bound (bufferHandle); - OS.gtk_text_buffer_move_mark (bufferHandle, selectionMark, start); - OS.gtk_text_buffer_move_mark (bufferHandle, insertMark, end); + OS.gtk_text_buffer_select_range(bufferHandle, start, end); } } @@ -2333,10 +2328,7 @@ public void setSelection (int start, int end) { OS.g_free (ptr); OS.gtk_text_buffer_get_iter_at_offset (bufferHandle, startIter, start); OS.gtk_text_buffer_get_iter_at_offset (bufferHandle, endIter, end); - long /*int*/ insertMark = OS.gtk_text_buffer_get_insert (bufferHandle); - long /*int*/ selectionMark = OS.gtk_text_buffer_get_selection_bound (bufferHandle); - OS.gtk_text_buffer_move_mark (bufferHandle, selectionMark, startIter); - OS.gtk_text_buffer_move_mark (bufferHandle, insertMark, endIter); + OS.gtk_text_buffer_select_range(bufferHandle, startIter, endIter); } } -- cgit