gnu_java_awt_peer_gtk_gtktoolkit.c

来自「Mac OS X 10.4.9 for x86 Source Code gcc」· C语言 代码 · 共 538 行 · 第 1/2 页

C
538
字号
                               property */       portableNativeSync = 1;#else      portableNativeSync = 0;#endif    }    (*env)->GetJavaVM( env, &the_vm );  if (!g_thread_supported ())    {      if (portableNativeSync)        g_thread_init ( &portable_native_sync_jni_functions );      else        g_thread_init ( NULL );    }  else    {      /* Warn if portable native sync is desired but the threading         system is already initialized.  In that case we can't         override the threading implementation with our portable         native sync functions. */      if (portableNativeSync)        g_printerr ("peer warning: portable native sync disabled.\n");    }  /* Debugging progress message; uncomment if needed: */  /*   printf("called gthread init\n"); */}/* This is a big hack, needed until this pango bug is resolved:   http://bugzilla.gnome.org/show_bug.cgi?id=119081.   See: http://mail.gnome.org/archives/gtk-i18n-list/2003-August/msg00001.html   for details. */static voidinit_dpi_conversion_factor (){  GtkSettings *settings = gtk_settings_get_default ();  GObjectClass *klass;  klass = G_OBJECT_CLASS (GTK_SETTINGS_GET_CLASS (settings));  if (g_object_class_find_property (klass, "gtk-xft-dpi"))    {      int int_dpi;      g_object_get (settings, "gtk-xft-dpi", &int_dpi, NULL);      /* If int_dpi == -1 gtk-xft-dpi returns the default value. So we	 have to do approximate calculation here.  */      if (int_dpi < 0)	dpi_conversion_factor = PANGO_SCALE * 72.0 / 96.;      else	dpi_conversion_factor = PANGO_SCALE * 72.0 / (int_dpi / PANGO_SCALE);      g_signal_connect (settings, "notify::gtk-xft-dpi",			G_CALLBACK (dpi_changed_cb), NULL);    }  else    /* Approximate. */    dpi_conversion_factor = PANGO_SCALE * 72.0 / 96.;}static voiddpi_changed_cb (GtkSettings  *settings,		GParamSpec *pspec __attribute__((unused))){  int int_dpi;  g_object_get (settings, "gtk-xft-dpi", &int_dpi, NULL);  if (int_dpi < 0)    dpi_conversion_factor = PANGO_SCALE * 72.0 / 96.;  else    dpi_conversion_factor = PANGO_SCALE * 72.0 / (int_dpi / PANGO_SCALE);}static intwithin_human_latency_tolerance(struct timeval *init){  struct timeval curr;  unsigned long milliseconds_elapsed;  gettimeofday(&curr, NULL);    milliseconds_elapsed = (((curr.tv_sec * 1000) + (curr.tv_usec / 1000))			  - ((init->tv_sec * 1000) + (init->tv_usec / 1000)));    return milliseconds_elapsed < 100;}JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkToolkit_iterateNativeQueue(JNIEnv *env,  jobject self __attribute__((unused)), jobject lockedQueue, jboolean block){  /* We're holding an EventQueue lock, and we're about to acquire the GDK   * lock before dropping the EventQueue lock. This can deadlock if someone   * holds the GDK lock and wants to acquire the EventQueue lock; however   * all callbacks from GTK happen with the GDK lock released, so this   * would only happen in an odd case such as some JNI helper code   * acquiring the GDK lock and calling back into   * EventQueue.getNextEvent().   */  struct timeval init;  gettimeofday(&init, NULL);  gdk_threads_enter ();  (*env)->MonitorExit (env, lockedQueue);  if (block)    {            /* If we're blocking-when-empty, we want a do .. while loop. */      do 	gtk_main_iteration ();      while (within_human_latency_tolerance (&init) 	     && gtk_events_pending ());    }  else    {      /* If we're not blocking-when-empty, we want a while loop. */      while (within_human_latency_tolerance (&init) 	     && gtk_events_pending ())	gtk_main_iteration ();          }    (*env)->MonitorEnter (env, lockedQueue);  gdk_threads_leave ();}JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkToolkit_wakeNativeQueue  (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused))){  g_main_context_wakeup (NULL);}JNIEXPORT jboolean JNICALL Java_gnu_java_awt_peer_gtk_GtkToolkit_nativeQueueEmpty  (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused))){  jboolean empty = FALSE;  gdk_threads_enter ();  empty = ! gtk_events_pending();  gdk_threads_leave ();  return empty;}static jint gdk_color_to_java_color (GdkColor color);JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkToolkit_beep  (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused))){  gdk_threads_enter ();  gdk_beep ();  gdk_threads_leave ();}JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkToolkit_sync  (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused))){  gdk_threads_enter ();  gdk_flush ();  gdk_threads_leave ();}JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GtkToolkit_getScreenSizeDimensions  (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),   jintArray jdims){  jint *dims = (*env)->GetIntArrayElements (env, jdims, 0);    gdk_threads_enter ();  dims[0] = gdk_screen_width ();  dims[1] = gdk_screen_height ();  gdk_threads_leave ();  (*env)->ReleaseIntArrayElements(env, jdims, dims, 0);}JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_GtkToolkit_getScreenResolution  (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused))){  jint res;  gdk_threads_enter ();  res = gdk_screen_width () / (gdk_screen_width_mm () / 25.4);  gdk_threads_leave ();  return res;}#define CONVERT(type, state) \  gdk_color_to_java_color (style->type[GTK_STATE_ ## state])JNIEXPORT void JNICALLJava_gnu_java_awt_peer_gtk_GtkToolkit_loadSystemColors  (JNIEnv *env, jobject obj __attribute__((unused)),   jintArray jcolors){  jint *colors;  GtkStyle *style;  colors = (*env)->GetIntArrayElements (env, jcolors, 0);  gdk_threads_enter ();  style = gtk_widget_get_default_style ();  colors[AWT_DESKTOP]                 = CONVERT (bg, SELECTED);  colors[AWT_ACTIVE_CAPTION]          = CONVERT (bg, SELECTED);  colors[AWT_ACTIVE_CAPTION_TEXT]     = CONVERT (text, SELECTED);  colors[AWT_ACTIVE_CAPTION_BORDER]   = CONVERT (fg, NORMAL);  colors[AWT_INACTIVE_CAPTION]        = CONVERT (base, INSENSITIVE);  colors[AWT_INACTIVE_CAPTION_TEXT]   = CONVERT (fg, INSENSITIVE);  colors[AWT_INACTIVE_CAPTION_BORDER] = CONVERT (fg, INSENSITIVE);  colors[AWT_WINDOW]                  = CONVERT (bg, NORMAL);  colors[AWT_WINDOW_BORDER]           = CONVERT (fg, NORMAL);  colors[AWT_WINDOW_TEXT]             = CONVERT (fg, NORMAL);  colors[AWT_MENU]                    = CONVERT (bg, NORMAL);  colors[AWT_MENU_TEXT]               = CONVERT (fg, NORMAL);  colors[AWT_TEXT]                    = CONVERT (bg, NORMAL);  colors[AWT_TEXT_TEXT]               = CONVERT (fg, NORMAL);  colors[AWT_TEXT_HIGHLIGHT]          = CONVERT (bg, SELECTED);  colors[AWT_TEXT_HIGHLIGHT_TEXT]     = CONVERT (fg, SELECTED);  colors[AWT_TEXT_INACTIVE_TEXT]      = CONVERT (bg, INSENSITIVE);  colors[AWT_CONTROL]                 = CONVERT (bg, NORMAL);  colors[AWT_CONTROL_TEXT]            = CONVERT (fg, NORMAL);  colors[AWT_CONTROL_HIGHLIGHT]       = CONVERT (base, ACTIVE);  colors[AWT_CONTROL_LT_HIGHLIGHT]    = CONVERT (bg, PRELIGHT);  colors[AWT_CONTROL_SHADOW]          = CONVERT (bg, ACTIVE);  colors[AWT_CONTROL_DK_SHADOW]       = CONVERT (fg, INSENSITIVE);  colors[AWT_SCROLLBAR]               = CONVERT (base, INSENSITIVE);  colors[AWT_INFO]                    = CONVERT (bg, NORMAL);  colors[AWT_INFO_TEXT]               = CONVERT (fg, NORMAL);  gdk_threads_leave ();  (*env)->ReleaseIntArrayElements(env, jcolors, colors, 0);}#undef CONVERTstatic jintgdk_color_to_java_color (GdkColor gdk_color){  guchar red;  guchar green;  guchar blue;  float factor;  factor = 255.0 / 65535.0;  red   = (float) gdk_color.red   * factor;  green = (float) gdk_color.green * factor;  blue  = (float) gdk_color.blue  * factor;  return (jint) (0xff000000 | (red << 16) | (green << 8) | blue);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?