/* gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.c
   Copyright (C) 2004, 2006 Free Software Foundation, Inc.

   This file is part of GNU Classpath.

   GNU Classpath is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2, or (at your option)
   any later version.

   GNU Classpath is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with GNU Classpath; see the file COPYING.  If not, write to the
   Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
   02110-1301 USA.

   Linking this library statically or dynamically with other modules is
   making a combined work based on this library.  Thus, the terms and
   conditions of the GNU General Public License cover the whole
   combination.

   As a special exception, the copyright holders of this library give you
   permission to link this library with independent modules to produce an
   executable, regardless of the license terms of these independent
   modules, and to copy and distribute the resulting executable under
   terms of your choice, provided that you also meet, for each linked
   independent module, the terms and conditions of the license of that
   module.  An independent module is a module which is not derived from
   or based on this library.  If you modify this library, you may extend
   this exception to your version of the library, but you are not
   obligated to do so.  If you do not wish to do so, delete this
   exception statement from your version. */

#include <glib.h>
#include <gdk/gdk.h>

#include "gdkfont.h"
#include "gdkdisplay.h"
#include "gnu_java_awt_peer_gtk_GdkGraphicsEnvironment.h"

struct state_table *cp_gtk_native_display_state_table;

jclass gdkGraphicsEnvironment_class;

JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_initStaticState
(JNIEnv *env, jclass klazz __attribute__((unused)))
{
    gdkGraphicsEnvironment_class = (*env)->NewGlobalRef
    (env, klazz);

	NSA_DISPLAY_INIT(env, gdkGraphicsEnvironment_class);
}

JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_nativeInitState
(JNIEnv *env, jobject obj)
{
	GdkDisplay *defaultDisplay;
	
    gdk_threads_enter();
    
    /* Retrieve the default display. */
    defaultDisplay = gdk_display_get_default();
    
    gdk_threads_leave();
    
    /* Store display pointer in GdkGraphicsEnvironment instance. */
    NSA_SET_DISPLAY_PTR(env, obj, (void *) defaultDisplay);
}

static gint
cmp_families (const void *a, const void *b)
{
  const char *a_name = pango_font_family_get_name (*(PangoFontFamily **)a);
  const char *b_name = pango_font_family_get_name (*(PangoFontFamily **)b);

  return g_utf8_collate (a_name, b_name);
}

JNIEXPORT void JNICALL
Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_nativeGetFontFamilies
(JNIEnv *env, jobject  self __attribute__((unused)), jobjectArray family_name)
{
  PangoContext *context = NULL;
  PangoFontFamily **families = NULL;
  int n_families = 0;
  int idx = 0;

  gdk_threads_enter ();

  context = gdk_pango_context_get();
  g_assert (context != NULL);

  pango_context_list_families (context, &families, &n_families);

  qsort (families, n_families, sizeof (PangoFontFamily *), cmp_families);

  for (idx = 0;  idx < n_families;  idx++)
    {
      const char *name_tmp =  pango_font_family_get_name (families[idx]);
      jstring name = (*env)->NewStringUTF (env, name_tmp);
      (*env)->SetObjectArrayElement (env, family_name, idx, name);
      (*env)->DeleteLocalRef(env, name);
    }
  g_free (families);

  gdk_threads_leave ();
}

JNIEXPORT jint JNICALL
Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_nativeGetNumFontFamilies
(JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)))
{
  PangoContext *context = NULL;
  PangoFontFamily **families = NULL;
  gint n_families = 0;
  gint num = 0;

  gdk_threads_enter ();

  context = gdk_pango_context_get();
  g_assert (context != NULL);

  pango_context_list_families (context, &families, &n_families);

  num = n_families;
  g_free (families);

  gdk_threads_leave ();
  
  return num;
}

JNIEXPORT jobjectArray JNICALL
Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_nativeGetScreenDevices
(JNIEnv *env, jobject obj)
{
	jmethodID gdkScreenGraphicsDevice_ctor, gdkScreenGraphicsDevice_init;
	jclass gdkScreenGraphicsDevice_class;
	int numScreens = 0, i = 0;
	GdkDisplay *display;
	jobjectArray array;
	jobject instance;
	
	gdkScreenGraphicsDevice_class = (*env)->FindClass 
    (env, "gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice");
    
	gdkScreenGraphicsDevice_ctor = (*env)->GetMethodID 
    (env, gdkScreenGraphicsDevice_class, "<init>",
     "(Lgnu/java/awt/peer/gtk/GdkGraphicsEnvironment;)V");

	gdkScreenGraphicsDevice_init = (*env)->GetMethodID 
    (env, gdkScreenGraphicsDevice_class, "init", "()V");

	display = (GdkDisplay *) NSA_GET_DISPLAY_PTR(env, obj);
	
	gdk_threads_enter();
	
	numScreens = gdk_display_get_n_screens(display);
	
	
	/* Create a suitably sized array. */
	array = (*env)->NewObjectArray(env,
                                   numScreens,
                                   gdkScreenGraphicsDevice_class,
                                   NULL);
	
	/* Create GdkScreenGraphicsDevice instances, store the native pointer to
	 * the GScreen object with them, run a 2nd initialization phase and
	 * put the new instance into the result array.
	 */
	for ( ; i < numScreens ; i++)
	{
		instance = (*env)->NewObject (env, 
                                      gdkScreenGraphicsDevice_class,
                                      gdkScreenGraphicsDevice_ctor,
                                      obj);
									  
        NSA_SET_SCREEN_PTR(env,
                           instance,
                           gdk_display_get_screen(display, i));
						   
        gdk_threads_leave();
        (*env)->CallVoidMethod(env,
                               instance,
                               gdkScreenGraphicsDevice_init);
		gdk_threads_enter();
		
        (*env)->SetObjectArrayElement(env, array, i, instance);
    }
	
    gdk_threads_leave();
	
    return array;
}

JNIEXPORT jobject JNICALL
Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_nativeGetDefaultScreenDevice
(JNIEnv *env, jobject obj)
{
    jclass gdkScreenGraphicsDevice_class;
    jmethodID gdkScreenGraphicsDevice_ctor, gdkScreenGraphicsDevice_init;
    jobject defaultDevice;
    GdkScreen *defaultScreen;
    
    gdkScreenGraphicsDevice_class = (*env)->FindClass 
    (env, "gnu/java/awt/peer/gtk/GdkScreenGraphicsDevice");
    
    gdkScreenGraphicsDevice_ctor = (*env)->GetMethodID 
    (env, gdkScreenGraphicsDevice_class, "<init>",
     "(Lgnu/java/awt/peer/gtk/GdkGraphicsEnvironment;)V");
    
    gdkScreenGraphicsDevice_init = (*env)->GetMethodID 
    (env, gdkScreenGraphicsDevice_class, "init", "()V");
    
    /* Create the GdkScreenGraphicsDevice instance. */
    defaultDevice = (*env)->NewObject (env, 
									   gdkScreenGraphicsDevice_class,
									   gdkScreenGraphicsDevice_ctor,
									   obj);
									   
    gdk_threads_enter();
	
    defaultScreen = gdk_screen_get_default();
	
    gdk_threads_leave();
									   
	/* Class initialization will have set up the native_state storage
	 * mechanism for GdkScreenGraphicsDevice.
	 */
    NSA_SET_SCREEN_PTR(env, defaultDevice, defaultScreen);

    (*env)->CallVoidMethod(env,
                           defaultDevice,
                           gdkScreenGraphicsDevice_init);

    return defaultDevice;	
}

JNIEXPORT jintArray JNICALL
Java_gnu_java_awt_peer_gtk_GdkGraphicsEnvironment_getMouseCoordinates
(JNIEnv *env, jobject obj)
{
  jintArray retArray;
  jint *values;
  GdkDisplay *display;
  gint x, y, screenIndex;
  GdkScreen *screen;

  display = (GdkDisplay *) NSA_GET_DISPLAY_PTR(env, obj);
  g_assert (display != NULL);
  
  gdk_threads_enter ();
  
  gdk_display_get_pointer (display, &screen, &x, &y, NULL);
  screenIndex = gdk_screen_get_number( screen );

  gdk_threads_leave ();
	
  retArray = (*env)->NewIntArray (env, 3);
  values = (*env)->GetIntArrayElements (env, retArray, NULL);
  
  values[0] = screenIndex;
  values[1] = x;
  values[2] = y;

  (*env)->ReleaseIntArrayElements (env, retArray, values, 0);

  return retArray;
}
