/*
This source file is part of Scol
For the latest info, see http://www.scolring.org

Copyright (c) 2010 Stephane Bisaro, aka Iri <iri@irizone.net>

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

This program 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 Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA, or go to
http://www.gnu.org/copyleft/lesser.txt

For others informations, please contact us from http://www.scolring.org/
*/


#include "../include/scol_gtk_base.h"

/**
 * \brief Return the current library version
 * fun [] [I I I]
 */
int SCOL_gtkVersionLib (mmachine m)
{
    g_message ("SCOL_gtkVersionLib : entering");

    MMpush (m, ITOM (SCOL_LIB_GTK_MAJOR_VERSION));
    MMpush (m, ITOM (SCOL_LIB_GTK_MINOR_VERSION));
    MMpush (m, ITOM (SCOL_LIB_GTK_MICRO_VERSION));
    return 0;
}

/**
 * \brief Return the current GTK version - fun [] [I I I]
 * Major Minor Micro from the GTK+ libraries linked (except to GTK 2.x, from the headers)
 */
int SCOL_gtkVersionGtk (mmachine m)
{
    g_message ("SCOL_gtkVersionGtk : entering");

    #ifndef SCOL_GTK_2  /* GTK+ 3.x */
    MMpush (m, ITOM (gtk_get_major_version ()));
    MMpush (m, ITOM (gtk_get_minor_version ()));
    MMpush (m, ITOM (gtk_get_micro_version ()));
    #else               /* GTK+ 2.x */
    MMpush (m, ITOM (GTK_MAJOR_VERSION));
    MMpush (m, ITOM (GTK_MINOR_VERSION));
    MMpush (m, ITOM (GTK_MICRO_VERSION));
    #endif
    MMpush (m, ITOM (3));
    MBdeftab (m);
    return 0;
}

/**
 * \brief Return the current GLib version - fun [] [I I I]
 * Major Minor Micro from the GLib libraries linked
 */
int SCOL_gtkVersionGLib (mmachine m)
{
    g_message ("SCOL_gtkVersionGLib : entering");

    MMpush (m, ITOM (glib_major_version));
    MMpush (m, ITOM (glib_minor_version));
    MMpush (m, ITOM (glib_micro_version));
    MMpush (m, ITOM (3));
    MBdeftab (m);
    return 0;
}

/**
 * \brief Return the current GdkPixbuf library version - fun [] [I I I]
 * Major Minor Micro from the GLib libraries linked
 */
int SCOL_gtkVersionGPix (mmachine m)
{
    g_message ("SCOL_gtkVersionGPix : entering");

    MMpush (m, ITOM (gdk_pixbuf_major_version));
    MMpush (m, ITOM (gdk_pixbuf_minor_version));
    MMpush (m, ITOM (gdk_pixbuf_micro_version));
    MMpush (m, ITOM (3));
    MBdeftab (m);
    return 0;
}




/**
 * \brief Init GTK+ loop : fun [ ] I
 *
 * \return : I : 0
 */
int SCOL_gtkMain (mmachine m)
{
    g_message ("_gtkMain : entering ...");

    gtk_main ();
    MMpush (m, 0);
    return 0;
}

/**
 * \brief End GTK+ loop : fun [ ] I
 *
 * \return : I : 0
 */
int SCOL_gtkMainQuit (mmachine m)
{
    g_message ("_gtkMainQuit : entering ...");

    gtk_main_quit ();
    MMpush (m, 0);
    return 0;
}

/**
 * \brief return the current nesting level of the main loop
 */
int SCOL_gtkMainLevel (mmachine m)
{
    g_message ("SCOL_gtkMainLevel : entering");

    MMpush (m, ITOM (gtk_main_level ()));
    return 0;
}





/* API définitions : */

char* gtk_base_name[GTK_BASE_PKG_NB]=
{
    "ObjGtkWidget",
    "ObjGtkPix",

    "_gtkMain",
    "_gtkMainQuit",
    "_gtkMainLevel",
    "_gtkVersionLib",
    "_gtkVersionGtk",
    "_gtkVersionGLib",
    "_gtkVersionGPix"
};

int (*gtk_base_fun[GTK_BASE_PKG_NB])(mmachine m)=
{
    NULL,
    NULL,

    SCOL_gtkMain,
    SCOL_gtkMainQuit,
    SCOL_gtkMainLevel,
    SCOL_gtkVersionLib,
    SCOL_gtkVersionGtk,
    SCOL_gtkVersionGLib,
    SCOL_gtkVersionGPix
};

int gtk_base_narg[GTK_BASE_PKG_NB]=
{
    TYPTYPE,
    TYPTYPE,

    0,
    0,
    0,
    0,
    0,
    0,
    0
};

char* gtk_base_type[GTK_BASE_PKG_NB]=
{
    NULL,
    NULL,

    "fun [] I",
    "fun [] I",
    "fun [] I",
    "fun [] [I I I]",
    "fun [] [I I I]",
    "fun [] [I I I]",
    "fun [] [I I I]"
};





int ObjGtkWidgetTypeDestroy (mmachine m, int handsys, int mobj)
{
    GtkWidget *o;
    g_message ("ObjGtkWidgetTypeDestroy: entering");

    o = (GtkWidget*) MMfetch (m, MTOP (mobj), OBJ2DGTK_WIDGET_HANDLE);
    if (o == (int) NULL)
    {
        g_message ("ObjGtkWidgetTypeDestroy : object %p already destroyed", (void *) o);
        return 0;
    }
    /*g_signal_connect ( G_OBJECT (o), "destroy", G_CALLBACK (gtk_widget_destroyed), &o );
    gtk_widget_destroy (o);*/
    g_object_unref (o);

    MMstore (m, MTOP (mobj), OBJ2DGTK_WIDGET_HANDLE, (int) NULL);
    g_message ("ObjGtkWidgetTypeDestroy : object %p has been destroyed", (void *) o);

    return 0;
}

int ObjGtkPixTypeDestroy (mmachine m, int handsys, int mobj)
{
    GdkPixbuf *o;
    g_message ("ObjGtkPixTypeDestroy: entering");

    o = (GdkPixbuf*) MMfetch (m, MTOP (mobj), OBJ2DGTK_WIDGET_HANDLE);
    if (o == (int) NULL)
    {
        g_message ("ObjGtkPixTypeDestroy : object %p already destroyed", (void *) o);
        return 0;
    }
    g_object_unref (o);

    MMstore (m, MTOP (mobj), OBJ2DGTK_WIDGET_HANDLE, (int) NULL);
    g_message ("ObjGtkPixTypeDestroy : object %p has been destroyed", (void *) o);

    return 0;
}
/*
int ObjGtkStyleTypeDestroy (mmachine m, int handsys, int mobj)
{
    GtkStyle *o;
    g_message ("ObjGtkStyleTypeDestroy: entering");

    o = (GtkStyle*) MMfetch (m, MTOP (mobj), OBJ2DGTK_WIDGET_HANDLE);
    if (o == (int) NULL)
    {
        g_message ("ObjGtkStyleTypeDestroy : object %p already destroyed", (void *) o);
        return 0;
    }
    g_object_unref (o);

    MMstore (m, MTOP (mobj), OBJ2DGTK_WIDGET_HANDLE, (int) NULL);
    g_message ("ObjGtkStyleTypeDestroy : object %p has been destroyed", (void *) o);

    return 0;
}
*/

int SCOLloadGTKbase (mmachine m)
{
    int k;

    g_message ("SCOLloadGTKbase : entering");

    ObjGtkWidgetType = OBJregister (GTK_WIDGET_RFL_NB, 1, ObjGtkWidgetTypeDestroy, "ObjGtkWidgetType");
    ObjGtkPixType = OBJregister (GTK_PIX_RFL_NB, 1, ObjGtkPixTypeDestroy, "ObjGtkPixType");
    /*ObjGtkStyleType = OBJregister (GTK_STYLE_RFL_NB, 1, ObjGtkStyleTypeDestroy, "ObjGtkStyleType");*/

    k = PKhardpak (m, "GTK2DbaseEngine", GTK_BASE_PKG_NB, gtk_base_name, gtk_base_fun, gtk_base_narg, gtk_base_type);
    return k;
}


int SCOLinit2dGTKclass (mmachine m)
{
    int k;
    int ac = 0;
    char ** av = NULL;  /* to change, if needed */

    ScolSerror = (Scol2dGtkError) malloc (sizeof (struct SCOL2dGtkError));
    ScolSerror->pFileLog = scol_2dgtk_log_create ();
    ScolSerror->hLogGtk = g_log_set_handler ("Gtk", G_LOG_LEVEL_DEBUG, (GLogFunc) gtk_false, NULL);
    gtk_init (&ac, &av); /*  initialisation de GTK avant tout appel gtk. Voir pour les deux arguments !...*/
    ScolSerror->hLogApp = g_log_set_handler (NULL, G_LOG_LEVEL_MESSAGE|G_LOG_LEVEL_WARNING|G_LOG_LEVEL_CRITICAL|G_LOG_LEVEL_ERROR|G_LOG_FLAG_FATAL|G_LOG_FLAG_RECURSION, scol_2dgtk_log_handler, ScolSerror->pFileLog);
    ScolSerror->hLogGtk = g_log_set_handler ("Gtk", G_LOG_LEVEL_MESSAGE|G_LOG_LEVEL_WARNING|G_LOG_LEVEL_CRITICAL|G_LOG_LEVEL_ERROR|G_LOG_FLAG_FATAL|G_LOG_FLAG_RECURSION, scol_2dgtk_log_handler, ScolSerror->pFileLog);
    ScolSerror->hLogGlib =  g_log_set_handler ("GLib", G_LOG_LEVEL_MESSAGE|G_LOG_LEVEL_WARNING|G_LOG_LEVEL_CRITICAL|G_LOG_LEVEL_ERROR|G_LOG_FLAG_FATAL|G_LOG_FLAG_RECURSION, scol_2dgtk_log_handler, ScolSerror->pFileLog);

    if ((k = SCOLloadGTKbase (m))) return k;
    if ((k = SCOLloadGTKcommon (m))) return k;
    if ((k = SCOLloadGTKwindow (m))) return k;
    if ((k = SCOLloadGTKwidget (m))) return k;
    if ((k = SCOLloadGTKbutton (m))) return k;
    if ((k = SCOLloadGTKcontainer (m))) return k;
    if ((k = SCOLloadGTKbuilder (m))) return k;
    if ((k = SCOLloadGTKlabel (m))) return k;
    if ((k = SCOLloadGTKmisc (m))) return k;
    if ((k = SCOLloadGTKnotebook (m))) return k;
    if ((k = SCOLloadGTKdialog (m))) return k;
    if ((k = SCOLloadGTKtext (m))) return k;
    if ((k = SCOLloadGTKstyle (m))) return k;
    if ((k = SCOLloadGTKpixbuf (m))) return k;
    if ((k = SCOLloadGTKimage (m))) return k;
    if ((k = SCOLloadGTKrange (m))) return k;

    if ((k = SCOLloadGTKeasy (m))) return k;

    return k;
}

