diff options
| author | Po Lu | 2023-02-26 15:00:47 +0800 |
|---|---|---|
| committer | Po Lu | 2023-02-26 15:00:47 +0800 |
| commit | 744f19c22f2be1f8ab6d5da89eb33392fcbcfc25 (patch) | |
| tree | d69880538c950b020345801423beb7b452491d58 /src | |
| parent | 74a7d34361a857fdb48ec89276f0efedec32f6d0 (diff) | |
| download | emacs-744f19c22f2be1f8ab6d5da89eb33392fcbcfc25.tar.gz emacs-744f19c22f2be1f8ab6d5da89eb33392fcbcfc25.zip | |
Get rid of android_lookup_method
* src/android.c (struct android_emacs_window): New methods.
(android_init_emacs_window): Add new methods.
(android_lookup_method): Delete now-unused function.
(android_change_window_attributes, android_reparent_window)
(android_map_window, android_unmap_window, android_resize_window)
(android_move_window, android_set_input_focus)
(android_raise_window, android_lower_window, android_get_geometry)
(android_translate_coordinates, android_set_dont_focus_on_map)
(android_set_dont_accept_focus): Don't look up the class and
method each time when calling a function; that's just waste.
Diffstat (limited to 'src')
| -rw-r--r-- | src/android.c | 115 |
1 files changed, 43 insertions, 72 deletions
diff --git a/src/android.c b/src/android.c index cf6ddd736eb..001fa867d9c 100644 --- a/src/android.c +++ b/src/android.c | |||
| @@ -141,6 +141,19 @@ struct android_emacs_window | |||
| 141 | jmethodID toggle_on_screen_keyboard; | 141 | jmethodID toggle_on_screen_keyboard; |
| 142 | jmethodID lookup_string; | 142 | jmethodID lookup_string; |
| 143 | jmethodID set_fullscreen; | 143 | jmethodID set_fullscreen; |
| 144 | jmethodID change_window_background; | ||
| 145 | jmethodID reparent_to; | ||
| 146 | jmethodID map_window; | ||
| 147 | jmethodID unmap_window; | ||
| 148 | jmethodID resize_window; | ||
| 149 | jmethodID move_window; | ||
| 150 | jmethodID make_input_focus; | ||
| 151 | jmethodID raise; | ||
| 152 | jmethodID lower; | ||
| 153 | jmethodID get_window_geometry; | ||
| 154 | jmethodID translate_coordinates; | ||
| 155 | jmethodID set_dont_accept_focus; | ||
| 156 | jmethodID set_dont_focus_on_map; | ||
| 144 | }; | 157 | }; |
| 145 | 158 | ||
| 146 | /* The API level of the current device. */ | 159 | /* The API level of the current device. */ |
| @@ -2238,6 +2251,23 @@ android_init_emacs_window (void) | |||
| 2238 | "toggleOnScreenKeyboard", "(Z)V"); | 2251 | "toggleOnScreenKeyboard", "(Z)V"); |
| 2239 | FIND_METHOD (lookup_string, "lookupString", "(I)Ljava/lang/String;"); | 2252 | FIND_METHOD (lookup_string, "lookupString", "(I)Ljava/lang/String;"); |
| 2240 | FIND_METHOD (set_fullscreen, "setFullscreen", "(Z)V"); | 2253 | FIND_METHOD (set_fullscreen, "setFullscreen", "(Z)V"); |
| 2254 | FIND_METHOD (change_window_background, "changeWindowBackground", | ||
| 2255 | "(I)V"); | ||
| 2256 | FIND_METHOD (reparent_to, "reparentTo", | ||
| 2257 | "(Lorg/gnu/emacs/EmacsWindow;II)V"); | ||
| 2258 | FIND_METHOD (map_window, "mapWindow", "()V"); | ||
| 2259 | FIND_METHOD (unmap_window, "unmapWindow", "()V"); | ||
| 2260 | FIND_METHOD (resize_window, "resizeWindow", "(II)V"); | ||
| 2261 | FIND_METHOD (move_window, "moveWindow", "(II)V"); | ||
| 2262 | FIND_METHOD (make_input_focus, "makeInputFocus", "(J)V"); | ||
| 2263 | FIND_METHOD (raise, "raise", "()V"); | ||
| 2264 | FIND_METHOD (lower, "lower", "()V"); | ||
| 2265 | FIND_METHOD (get_window_geometry, "getWindowGeometry", | ||
| 2266 | "()[I"); | ||
| 2267 | FIND_METHOD (translate_coordinates, "translateCoordinates", | ||
| 2268 | "(II)[I"); | ||
| 2269 | FIND_METHOD (set_dont_focus_on_map, "setDontFocusOnMap", "(Z)V"); | ||
| 2270 | FIND_METHOD (set_dont_accept_focus, "setDontAcceptFocus", "(Z)V"); | ||
| 2241 | #undef FIND_METHOD | 2271 | #undef FIND_METHOD |
| 2242 | } | 2272 | } |
| 2243 | 2273 | ||
| @@ -2911,9 +2941,6 @@ android_resolve_handle2 (android_handle handle, | |||
| 2911 | return android_handles[handle].handle; | 2941 | return android_handles[handle].handle; |
| 2912 | } | 2942 | } |
| 2913 | 2943 | ||
| 2914 | static jmethodID android_lookup_method (const char *, const char *, | ||
| 2915 | const char *); | ||
| 2916 | |||
| 2917 | void | 2944 | void |
| 2918 | android_change_window_attributes (android_window handle, | 2945 | android_change_window_attributes (android_window handle, |
| 2919 | enum android_window_value_mask value_mask, | 2946 | enum android_window_value_mask value_mask, |
| @@ -2926,8 +2953,7 @@ android_change_window_attributes (android_window handle, | |||
| 2926 | 2953 | ||
| 2927 | if (value_mask & ANDROID_CW_BACK_PIXEL) | 2954 | if (value_mask & ANDROID_CW_BACK_PIXEL) |
| 2928 | { | 2955 | { |
| 2929 | method = android_lookup_method ("org/gnu/emacs/EmacsWindow", | 2956 | method = window_class.change_window_background; |
| 2930 | "changeWindowBackground", "(I)V"); | ||
| 2931 | (*android_java_env)->CallVoidMethod (android_java_env, | 2957 | (*android_java_env)->CallVoidMethod (android_java_env, |
| 2932 | window, method, | 2958 | window, method, |
| 2933 | (jint) attrs->background_pixel); | 2959 | (jint) attrs->background_pixel); |
| @@ -3403,55 +3429,12 @@ android_reparent_window (android_window w, android_window parent_handle, | |||
| 3403 | parent = android_resolve_handle (parent_handle, | 3429 | parent = android_resolve_handle (parent_handle, |
| 3404 | ANDROID_HANDLE_WINDOW); | 3430 | ANDROID_HANDLE_WINDOW); |
| 3405 | 3431 | ||
| 3406 | method = android_lookup_method ("org/gnu/emacs/EmacsWindow", | 3432 | method = window_class.reparent_to; |
| 3407 | "reparentTo", | ||
| 3408 | "(Lorg/gnu/emacs/EmacsWindow;II)V"); | ||
| 3409 | (*android_java_env)->CallVoidMethod (android_java_env, window, | 3433 | (*android_java_env)->CallVoidMethod (android_java_env, window, |
| 3410 | method, | 3434 | method, |
| 3411 | parent, (jint) x, (jint) y); | 3435 | parent, (jint) x, (jint) y); |
| 3412 | } | 3436 | } |
| 3413 | 3437 | ||
| 3414 | /* Look up the method with SIGNATURE by NAME in CLASS. Abort if it | ||
| 3415 | could not be found. This should be used for functions which are | ||
| 3416 | not called very often. | ||
| 3417 | |||
| 3418 | CLASS must never be unloaded, or the behavior is undefined. */ | ||
| 3419 | |||
| 3420 | static jmethodID | ||
| 3421 | android_lookup_method (const char *class, const char *name, | ||
| 3422 | const char *signature) | ||
| 3423 | { | ||
| 3424 | jclass java_class; | ||
| 3425 | jmethodID method; | ||
| 3426 | |||
| 3427 | java_class | ||
| 3428 | = (*android_java_env)->FindClass (android_java_env, class); | ||
| 3429 | |||
| 3430 | if (!java_class) | ||
| 3431 | { | ||
| 3432 | __android_log_print (ANDROID_LOG_ERROR, __func__, | ||
| 3433 | "Failed to find class %s", class); | ||
| 3434 | emacs_abort (); | ||
| 3435 | } | ||
| 3436 | |||
| 3437 | method | ||
| 3438 | = (*android_java_env)->GetMethodID (android_java_env, | ||
| 3439 | java_class, name, | ||
| 3440 | signature); | ||
| 3441 | |||
| 3442 | if (!method) | ||
| 3443 | { | ||
| 3444 | __android_log_print (ANDROID_LOG_ERROR, __func__, | ||
| 3445 | "Failed to find method %s in class %s" | ||
| 3446 | " with signature %s", | ||
| 3447 | name, class, signature); | ||
| 3448 | emacs_abort (); | ||
| 3449 | } | ||
| 3450 | |||
| 3451 | ANDROID_DELETE_LOCAL_REF (java_class); | ||
| 3452 | return method; | ||
| 3453 | } | ||
| 3454 | |||
| 3455 | void | 3438 | void |
| 3456 | android_clear_window (android_window handle) | 3439 | android_clear_window (android_window handle) |
| 3457 | { | 3440 | { |
| @@ -3472,8 +3455,7 @@ android_map_window (android_window handle) | |||
| 3472 | jmethodID map_window; | 3455 | jmethodID map_window; |
| 3473 | 3456 | ||
| 3474 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); | 3457 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); |
| 3475 | map_window = android_lookup_method ("org/gnu/emacs/EmacsWindow", | 3458 | map_window = window_class.map_window; |
| 3476 | "mapWindow", "()V"); | ||
| 3477 | 3459 | ||
| 3478 | (*android_java_env)->CallVoidMethod (android_java_env, | 3460 | (*android_java_env)->CallVoidMethod (android_java_env, |
| 3479 | window, map_window); | 3461 | window, map_window); |
| @@ -3486,8 +3468,7 @@ android_unmap_window (android_window handle) | |||
| 3486 | jmethodID unmap_window; | 3468 | jmethodID unmap_window; |
| 3487 | 3469 | ||
| 3488 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); | 3470 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); |
| 3489 | unmap_window = android_lookup_method ("org/gnu/emacs/EmacsWindow", | 3471 | unmap_window = window_class.unmap_window; |
| 3490 | "unmapWindow", "()V"); | ||
| 3491 | 3472 | ||
| 3492 | (*android_java_env)->CallVoidMethod (android_java_env, | 3473 | (*android_java_env)->CallVoidMethod (android_java_env, |
| 3493 | window, unmap_window); | 3474 | window, unmap_window); |
| @@ -3501,8 +3482,7 @@ android_resize_window (android_window handle, unsigned int width, | |||
| 3501 | jmethodID resize_window; | 3482 | jmethodID resize_window; |
| 3502 | 3483 | ||
| 3503 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); | 3484 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); |
| 3504 | resize_window = android_lookup_method ("org/gnu/emacs/EmacsWindow", | 3485 | resize_window = window_class.resize_window; |
| 3505 | "resizeWindow", "(II)V"); | ||
| 3506 | 3486 | ||
| 3507 | (*android_java_env)->CallVoidMethod (android_java_env, | 3487 | (*android_java_env)->CallVoidMethod (android_java_env, |
| 3508 | window, resize_window, | 3488 | window, resize_window, |
| @@ -3516,8 +3496,7 @@ android_move_window (android_window handle, int x, int y) | |||
| 3516 | jmethodID move_window; | 3496 | jmethodID move_window; |
| 3517 | 3497 | ||
| 3518 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); | 3498 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); |
| 3519 | move_window = android_lookup_method ("org/gnu/emacs/EmacsWindow", | 3499 | move_window = window_class.move_window; |
| 3520 | "moveWindow", "(II)V"); | ||
| 3521 | 3500 | ||
| 3522 | (*android_java_env)->CallVoidMethod (android_java_env, | 3501 | (*android_java_env)->CallVoidMethod (android_java_env, |
| 3523 | window, move_window, | 3502 | window, move_window, |
| @@ -4323,8 +4302,7 @@ android_set_input_focus (android_window handle, unsigned long time) | |||
| 4323 | jmethodID make_input_focus; | 4302 | jmethodID make_input_focus; |
| 4324 | 4303 | ||
| 4325 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); | 4304 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); |
| 4326 | make_input_focus = android_lookup_method ("org/gnu/emacs/EmacsWindow", | 4305 | make_input_focus = window_class.make_input_focus; |
| 4327 | "makeInputFocus", "(J)V"); | ||
| 4328 | 4306 | ||
| 4329 | (*android_java_env)->CallVoidMethod (android_java_env, window, | 4307 | (*android_java_env)->CallVoidMethod (android_java_env, window, |
| 4330 | make_input_focus, (jlong) time); | 4308 | make_input_focus, (jlong) time); |
| @@ -4338,8 +4316,7 @@ android_raise_window (android_window handle) | |||
| 4338 | jmethodID raise; | 4316 | jmethodID raise; |
| 4339 | 4317 | ||
| 4340 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); | 4318 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); |
| 4341 | raise = android_lookup_method ("org/gnu/emacs/EmacsWindow", | 4319 | raise = window_class.raise; |
| 4342 | "raise", "()V"); | ||
| 4343 | 4320 | ||
| 4344 | (*android_java_env)->CallVoidMethod (android_java_env, window, | 4321 | (*android_java_env)->CallVoidMethod (android_java_env, window, |
| 4345 | raise); | 4322 | raise); |
| @@ -4353,8 +4330,7 @@ android_lower_window (android_window handle) | |||
| 4353 | jmethodID lower; | 4330 | jmethodID lower; |
| 4354 | 4331 | ||
| 4355 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); | 4332 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); |
| 4356 | lower = android_lookup_method ("org/gnu/emacs/EmacsWindow", | 4333 | lower = window_class.lower; |
| 4357 | "lower", "()V"); | ||
| 4358 | 4334 | ||
| 4359 | (*android_java_env)->CallVoidMethod (android_java_env, window, | 4335 | (*android_java_env)->CallVoidMethod (android_java_env, window, |
| 4360 | lower); | 4336 | lower); |
| @@ -4425,8 +4401,7 @@ android_get_geometry (android_window handle, | |||
| 4425 | jint *ints; | 4401 | jint *ints; |
| 4426 | 4402 | ||
| 4427 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); | 4403 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); |
| 4428 | get_geometry = android_lookup_method ("org/gnu/emacs/EmacsWindow", | 4404 | get_geometry = window_class.get_window_geometry; |
| 4429 | "getWindowGeometry", "()[I"); | ||
| 4430 | 4405 | ||
| 4431 | window_geometry | 4406 | window_geometry |
| 4432 | = (*android_java_env)->CallObjectMethod (android_java_env, | 4407 | = (*android_java_env)->CallObjectMethod (android_java_env, |
| @@ -4486,9 +4461,7 @@ android_translate_coordinates (android_window src, int x, | |||
| 4486 | jint *ints; | 4461 | jint *ints; |
| 4487 | 4462 | ||
| 4488 | window = android_resolve_handle (src, ANDROID_HANDLE_WINDOW); | 4463 | window = android_resolve_handle (src, ANDROID_HANDLE_WINDOW); |
| 4489 | method = android_lookup_method ("org/gnu/emacs/EmacsWindow", | 4464 | method = window_class.translate_coordinates; |
| 4490 | "translateCoordinates", | ||
| 4491 | "(II)[I"); | ||
| 4492 | coordinates | 4465 | coordinates |
| 4493 | = (*android_java_env)->CallObjectMethod (android_java_env, | 4466 | = (*android_java_env)->CallObjectMethod (android_java_env, |
| 4494 | window, method, | 4467 | window, method, |
| @@ -4780,8 +4753,7 @@ android_set_dont_focus_on_map (android_window handle, | |||
| 4780 | jobject window; | 4753 | jobject window; |
| 4781 | 4754 | ||
| 4782 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); | 4755 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); |
| 4783 | method = android_lookup_method ("org/gnu/emacs/EmacsWindow", | 4756 | method = window_class.set_dont_focus_on_map; |
| 4784 | "setDontFocusOnMap", "(Z)V"); | ||
| 4785 | 4757 | ||
| 4786 | (*android_java_env)->CallVoidMethod (android_java_env, window, | 4758 | (*android_java_env)->CallVoidMethod (android_java_env, window, |
| 4787 | method, | 4759 | method, |
| @@ -4796,8 +4768,7 @@ android_set_dont_accept_focus (android_window handle, | |||
| 4796 | jobject window; | 4768 | jobject window; |
| 4797 | 4769 | ||
| 4798 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); | 4770 | window = android_resolve_handle (handle, ANDROID_HANDLE_WINDOW); |
| 4799 | method = android_lookup_method ("org/gnu/emacs/EmacsWindow", | 4771 | method = window_class.set_dont_accept_focus; |
| 4800 | "setDontAcceptFocus", "(Z)V"); | ||
| 4801 | 4772 | ||
| 4802 | (*android_java_env)->CallVoidMethod (android_java_env, window, | 4773 | (*android_java_env)->CallVoidMethod (android_java_env, window, |
| 4803 | method, | 4774 | method, |