gnu_java_awt_peer_gtk_gtkcomponentpeer.c
来自「Mac OS X 10.4.9 for x86 Source Code gcc」· C语言 代码 · 共 1,079 行 · 第 1/2 页
C
1,079 行
(JNIEnv *env, jobject obj){ void *ptr; ptr = NSA_GET_PTR (env, obj); gdk_threads_enter (); gtk_widget_grab_focus (GTK_WIDGET (ptr)); gdk_threads_leave ();}/* * Translate a Java KeyEvent object into a GdkEventKey event, then * pass it to the GTK main loop for processing. */JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetDispatchKeyEvent (JNIEnv *env, jobject obj, jint id, jlong when, jint mods, jint keyCode, jint keyLocation){ void *ptr; GdkEvent *event = NULL; GdkKeymapKey *keymap_keys = NULL; gint n_keys = 0; guint lookup_keyval = 0; ptr = NSA_GET_PTR (env, obj); gdk_threads_enter (); if (id == AWT_KEY_PRESSED) event = gdk_event_new (GDK_KEY_PRESS); else if (id == AWT_KEY_RELEASED) event = gdk_event_new (GDK_KEY_RELEASE); else { gdk_threads_leave (); /* Don't send AWT KEY_TYPED events to GTK. */ return; } if (GTK_IS_BUTTON (ptr)) event->key.window = GTK_BUTTON (ptr)->event_window; else if (GTK_IS_SCROLLED_WINDOW (ptr)) event->key.window = GTK_WIDGET (GTK_SCROLLED_WINDOW (ptr)->container.child)->window; else event->key.window = GTK_WIDGET (ptr)->window; event->key.send_event = 0; event->key.time = (guint32) when; if (mods & AWT_SHIFT_DOWN_MASK) event->key.state |= GDK_SHIFT_MASK; if (mods & AWT_CTRL_DOWN_MASK) event->key.state |= GDK_CONTROL_MASK; if (mods & AWT_ALT_DOWN_MASK) event->key.state |= GDK_MOD1_MASK; /* This hack is needed because the AWT has no notion of num lock. It infers numlock state from the only Java virtual keys that are affected by it. */ if (keyCode == VK_NUMPAD9 || keyCode == VK_NUMPAD8 || keyCode == VK_NUMPAD7 || keyCode == VK_NUMPAD6 || keyCode == VK_NUMPAD5 || keyCode == VK_NUMPAD4 || keyCode == VK_NUMPAD3 || keyCode == VK_NUMPAD2 || keyCode == VK_NUMPAD1 || keyCode == VK_NUMPAD0 || keyCode == VK_DECIMAL) event->key.state |= GDK_MOD2_MASK; /* These values don't need to be filled in since GTK doesn't use them. */ event->key.length = 0; event->key.string = NULL; lookup_keyval = awt_keycode_to_keysym (keyCode, keyLocation); if (!gdk_keymap_get_entries_for_keyval (gdk_keymap_get_default (), lookup_keyval, &keymap_keys, &n_keys)) { /* No matching keymap entry was found. */ g_printerr ("No matching keymap entries were found\n"); gdk_threads_leave (); return; } /* Note: if n_keys > 1 then there are multiple hardware keycodes that translate to lookup_keyval. We arbitrarily choose the first hardware keycode from the list returned by gdk_keymap_get_entries_for_keyval. */ event->key.hardware_keycode = keymap_keys[0].keycode; event->key.group = keymap_keys[0].group; g_free (keymap_keys); if (!gdk_keymap_translate_keyboard_state (gdk_keymap_get_default (), event->key.hardware_keycode, event->key.state, event->key.group, &event->key.keyval, NULL, NULL, NULL)) { /* No matching keyval was found. */ g_printerr ("No matching keyval was found\n"); gdk_threads_leave (); return; } /* keyevent = (GdkEventKey *) event; */ /* g_printerr ("generated event: sent: %d time: %d state: %d keyval: %d length: %d string: %s hardware_keycode: %d group: %d\n", keyevent->send_event, keyevent->time, keyevent->state, keyevent->keyval, keyevent->length, keyevent->string, keyevent->hardware_keycode, keyevent->group); */ /* We already received the original key event on the window itself, so we don't want to resend it. */ if (!GTK_IS_WINDOW (ptr)) { if (GTK_IS_SCROLLED_WINDOW (ptr)) gtk_widget_event (GTK_WIDGET (GTK_SCROLLED_WINDOW (ptr)->container.child), event); else gtk_widget_event (GTK_WIDGET (ptr), event); } gdk_threads_leave ();}/* * Find the origin of a widget's window. */JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetLocationOnScreen (JNIEnv * env, jobject obj, jintArray jpoint){ void *ptr; jint *point; ptr = NSA_GET_PTR (env, obj); point = (*env)->GetIntArrayElements (env, jpoint, 0); gdk_threads_enter (); gdk_window_get_origin (GTK_WIDGET (ptr)->window, point, point+1); if (!GTK_IS_CONTAINER (ptr)) { *point += GTK_WIDGET(ptr)->allocation.x; *(point+1) += GTK_WIDGET(ptr)->allocation.y; } gdk_threads_leave (); (*env)->ReleaseIntArrayElements(env, jpoint, point, 0);}/* * Find this widget's current size. */JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetDimensions (JNIEnv *env, jobject obj, jintArray jdims){ void *ptr; jint *dims; GtkRequisition requisition; ptr = NSA_GET_PTR (env, obj); dims = (*env)->GetIntArrayElements (env, jdims, 0); dims[0] = dims[1] = 0; gdk_threads_enter (); gtk_widget_size_request (GTK_WIDGET (ptr), &requisition); dims[0] = requisition.width; dims[1] = requisition.height; gdk_threads_leave (); (*env)->ReleaseIntArrayElements (env, jdims, dims, 0);}/* * Find this widget's preferred size. */JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetPreferredDimensions (JNIEnv *env, jobject obj, jintArray jdims){ void *ptr; jint *dims; GtkRequisition current_req; GtkRequisition natural_req; ptr = NSA_GET_PTR (env, obj); dims = (*env)->GetIntArrayElements (env, jdims, 0); dims[0] = dims[1] = 0; gdk_threads_enter (); /* Widgets that extend GtkWindow such as GtkFileChooserDialog may have a default size. These values seem more useful then the natural requisition values, particularly for GtkFileChooserDialog. */ if (GTK_IS_WINDOW (ptr)) { gint width, height; gtk_window_get_default_size (GTK_WINDOW (ptr), &width, &height); dims[0] = width; dims[1] = height; } else { /* Save the widget's current size request. */ gtk_widget_size_request (GTK_WIDGET (ptr), ¤t_req); /* Get the widget's "natural" size request. */ gtk_widget_set_size_request (GTK_WIDGET (ptr), -1, -1); gtk_widget_size_request (GTK_WIDGET (ptr), &natural_req); /* Reset the widget's size request. */ gtk_widget_set_size_request (GTK_WIDGET (ptr), current_req.width, current_req.height); dims[0] = natural_req.width; dims[1] = natural_req.height; } gdk_threads_leave (); (*env)->ReleaseIntArrayElements (env, jdims, dims, 0);}JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GtkComponentPeer_setNativeBounds (JNIEnv *env, jobject obj, jint x, jint y, jint width, jint height){ GtkWidget *widget; void *ptr; ptr = NSA_GET_PTR (env, obj); gdk_threads_enter (); widget = GTK_WIDGET (ptr); /* We assume that -1 is a width or height and not a request for the widget's natural size. */ width = width < 0 ? 0 : width; height = height < 0 ? 0 : height; if (GTK_IS_VIEWPORT (widget->parent)) gtk_widget_set_size_request (widget, width, height); else { if (!(width == 0 && height == 0)) { gtk_widget_set_size_request (widget, width, height); if (widget->parent != NULL) gtk_fixed_move (GTK_FIXED (widget->parent), widget, x, y); } } gdk_threads_leave ();}JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetBackground (JNIEnv *env, jobject obj){ void *ptr; jintArray array; int *rgb; GdkColor bg; ptr = NSA_GET_PTR (env, obj); gdk_threads_enter (); bg = GTK_WIDGET (ptr)->style->bg[GTK_STATE_NORMAL]; gdk_threads_leave (); array = (*env)->NewIntArray (env, 3); rgb = (*env)->GetIntArrayElements (env, array, NULL); /* convert color data from 16 bit values down to 8 bit values */ rgb[0] = bg.red >> 8; rgb[1] = bg.green >> 8; rgb[2] = bg.blue >> 8; (*env)->ReleaseIntArrayElements (env, array, rgb, 0); return array;}JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetGetForeground (JNIEnv *env, jobject obj){ void *ptr; jintArray array; jint *rgb; GdkColor fg; ptr = NSA_GET_PTR (env, obj); gdk_threads_enter (); fg = GTK_WIDGET (ptr)->style->fg[GTK_STATE_NORMAL]; gdk_threads_leave (); array = (*env)->NewIntArray (env, 3); rgb = (*env)->GetIntArrayElements (env, array, NULL); /* convert color data from 16 bit values down to 8 bit values */ rgb[0] = fg.red >> 8; rgb[1] = fg.green >> 8; rgb[2] = fg.blue >> 8; (*env)->ReleaseIntArrayElements (env, array, rgb, 0); return array;}JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetBackground (JNIEnv *env, jobject obj, jint red, jint green, jint blue){ GdkColor normal_color; GdkColor active_color; GtkWidget *widget; void *ptr; ptr = NSA_GET_PTR (env, obj); normal_color.red = (red / 255.0) * 65535; normal_color.green = (green / 255.0) * 65535; normal_color.blue = (blue / 255.0) * 65535; /* This calculation only approximates the active colors produced by Sun's AWT. */ active_color.red = 0.85 * (red / 255.0) * 65535; active_color.green = 0.85 * (green / 255.0) * 65535; active_color.blue = 0.85 * (blue / 255.0) * 65535; gdk_threads_enter (); widget = find_bg_color_widget (GTK_WIDGET (ptr)); gtk_widget_modify_bg (widget, GTK_STATE_NORMAL, &normal_color); gtk_widget_modify_bg (widget, GTK_STATE_ACTIVE, &active_color); gtk_widget_modify_bg (widget, GTK_STATE_PRELIGHT, &normal_color); gdk_threads_leave ();}JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_gtkWidgetSetForeground (JNIEnv *env, jobject obj, jint red, jint green, jint blue){ GdkColor color; GtkWidget *widget; void *ptr; ptr = NSA_GET_PTR (env, obj); color.red = (red / 255.0) * 65535; color.green = (green / 255.0) * 65535; color.blue = (blue / 255.0) * 65535; gdk_threads_enter (); widget = find_fg_color_widget (GTK_WIDGET (ptr)); gtk_widget_modify_fg (widget, GTK_STATE_NORMAL, &color); gtk_widget_modify_fg (widget, GTK_STATE_ACTIVE, &color); gtk_widget_modify_fg (widget, GTK_STATE_PRELIGHT, &color); gdk_threads_leave ();}JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GtkComponentPeer_show (JNIEnv *env, jobject obj){ void *ptr; ptr = NSA_GET_PTR (env, obj); gdk_threads_enter(); gtk_widget_show (GTK_WIDGET (ptr)); gdk_threads_leave();}JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GtkComponentPeer_hide (JNIEnv *env, jobject obj){ void *ptr; ptr = NSA_GET_PTR (env, obj); gdk_threads_enter(); gtk_widget_hide (GTK_WIDGET (ptr)); gdk_threads_leave();}JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isEnabled (JNIEnv *env, jobject obj){ void *ptr; jboolean ret_val; ptr = NSA_GET_PTR (env, obj); gdk_threads_enter (); ret_val = GTK_WIDGET_IS_SENSITIVE (GTK_WIDGET (ptr)); gdk_threads_leave (); return ret_val;}JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_isRealized (JNIEnv *env, jobject obj){ void *ptr; jboolean ret_val; ptr = NSA_GET_PTR (env, obj); if (ptr == NULL) return FALSE; gdk_threads_enter (); ret_val = GTK_WIDGET_REALIZED (GTK_WIDGET (ptr)); gdk_threads_leave (); return ret_val;}JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_GtkComponentPeer_modalHasGrab (JNIEnv *env __attribute__((unused)), jclass clazz __attribute__((unused))){ GtkWidget *widget; jboolean retval; gdk_threads_enter (); widget = gtk_grab_get_current (); retval = (widget && GTK_IS_WINDOW (widget) && GTK_WINDOW (widget)->modal); gdk_threads_leave (); return retval;}JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GtkComponentPeer_connectSignals (JNIEnv *env, jobject obj){ void *ptr; jobject *gref; ptr = NSA_GET_PTR (env, obj); gref = NSA_GET_GLOBAL_REF (env, obj); gdk_threads_enter (); /* Connect EVENT signal, which happens _before_ any specific signal. */ g_signal_connect (GTK_OBJECT (ptr), "event", G_CALLBACK (pre_event_handler), *gref); g_signal_connect (G_OBJECT (ptr), "focus-in-event", G_CALLBACK (focus_in_cb), *gref); g_signal_connect (G_OBJECT (ptr), "focus-out-event", G_CALLBACK (focus_out_cb), *gref); g_signal_connect_after (G_OBJECT (ptr), "realize", G_CALLBACK (connect_awt_hook_cb), *gref); gdk_threads_leave ();}static GtkWidget *find_fg_color_widget (GtkWidget *widget){ GtkWidget *fg_color_widget; if (GTK_IS_EVENT_BOX (widget) || (GTK_IS_BUTTON (widget) && !GTK_IS_OPTION_MENU (widget))) fg_color_widget = gtk_bin_get_child (GTK_BIN(widget)); else fg_color_widget = widget; return fg_color_widget;}static GtkWidget *find_bg_color_widget (GtkWidget *widget){ GtkWidget *bg_color_widget; bg_color_widget = widget; return bg_color_widget;}static gbooleanfocus_in_cb (GtkWidget *widget __attribute((unused)), GdkEventFocus *event __attribute((unused)), jobject peer){ gdk_threads_leave (); (*gdk_env())->CallVoidMethod (gdk_env(), peer, postFocusEventID, AWT_FOCUS_GAINED, JNI_FALSE); gdk_threads_enter (); return FALSE;}static gbooleanfocus_out_cb (GtkWidget *widget __attribute((unused)), GdkEventFocus *event __attribute((unused)), jobject peer){ gdk_threads_leave (); (*gdk_env())->CallVoidMethod (gdk_env(), peer, postFocusEventID, AWT_FOCUS_LOST, JNI_FALSE); gdk_threads_enter (); return FALSE;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?