
//#include <gtk/gtk.h>


// --- debut de gtk 2 mui 
#include <stdio.h>
#include <stdlib.h>

#include <exec/types.h>
#include <libraries/mui.h>
 
#include <proto/exec.h>
#include <proto/intuition.h>
#include <proto/muimaster.h>
#include <clib/alib_protos.h>
 


#define GTK_WINDOW_TOPLEVEL 1

#define G_CALLBACK(f)  (f) 
#define GTK_CONTAINER(f) (Object *)XGET(f,WindowContents)

Object* app,  *win,* ptrtmp;

struct {int (*ptr)();} tab[256]; 
unsigned short int tabidx=1; // 0 is reserved 

typedef Object  GtkWidget;
typedef struct MUIP_HandleEvent GdkEvent;
typedef char* gpointer;
typedef BOOL  gboolean;

#define g_print(s) printf("%s",s)

#define gtk_widget_destroy  gtk_main_quit 
void gtk_main_quit() {MUI_DisposeObject(app);exit(0);}

#define gtk_init(c,v) { app = ApplicationObject, End;   if ( !app) {printf("error app mui\n"); exit(1);}}

#define gtk_window_new(mode)  ptrtmp=WindowObject, WindowContents,VGroup, End,End; if (ptrtmp) { DoMethod(app,OM_ADDMEMBER,ptrtmp); }


#define gtk_widget_show(a) set(a,MUIA_Window_Open,TRUE);

#define gtk_container_set_border_width(o,n) set(o,MUIA_InnerTop,n)

#define gtk_container_add(o,b) DoMethod(o,OM_ADDMEMBER,b)

#define gtk_button_new_with_label(l) SimpleButton(l)

#define  g_signal_connect_swapped    g_signal_connect

// --- connect !!!
void g_signal_connect( Object* objet , char *eventType, APTR fonctionHook , Object* pointeur )  {
  // --- delete destroy
   if (strcmp(eventType, "delete-event")==0 || strcmp(eventType, "destroy")==0) {
 DoMethod(objet,MUIM_Notify,MUIA_Window_CloseRequest,TRUE,(IPTR)app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit);
  }
  // ---  clicked    
   else if (strcmp(eventType, "clicked")==0){
    tab[tabidx].ptr=fonctionHook;
  DoMethod(objet,MUIM_Notify,MUIA_Pressed,FALSE,(IPTR)app,2,MUIM_Application_ReturnID,tabidx);
    tabidx++;
   } 
}


void gtk_main() {
      ULONG sigs = 0;
      ULONG rc;   
      unsigned short quit=0;
   while (!quit) {
     rc=DoMethod(app,MUIM_Application_NewInput,&sigs);
     if (rc==MUIV_Application_ReturnID_Quit) quit=1;
     if (rc>0 && rc<tabidx) { (tab[rc].ptr)();}
     if (sigs) {      
         sigs = Wait(sigs | SIGBREAKF_CTRL_C);
         if (sigs & SIGBREAKF_CTRL_C) break;
      } 
     }
   MUI_DisposeObject(app);     
}


// --------- fin de gtk 2 mui 



static void hello( GtkWidget *widget, gpointer   data ) { g_print ("Hello World\n"); }
static gboolean delete_event( GtkWidget *widget,  GdkEvent  *event, gpointer   data )  { g_print ("delete event occurred\n"); return TRUE;}
static void destroy( GtkWidget *widget, gpointer   data ) {    gtk_main_quit (); }



int main( int   argc, char *argv[] ) {
   
       /* GtkWidget is the storage type for widgets */
       GtkWidget *window ;
       GtkWidget *button ;
      
       gtk_init (&argc, &argv);
          
       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);       


       g_signal_connect (window, "delete-event",   G_CALLBACK (delete_event), NULL);       
       g_signal_connect (window, "destroy",  G_CALLBACK (destroy), NULL);
       
    gtk_container_set_border_width (GTK_CONTAINER (window), 100);
       
      button = gtk_button_new_with_label ("Hello World");
  

    g_signal_connect (button, "clicked",  G_CALLBACK (hello), NULL);
    g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy),  window);
        
     gtk_container_add (GTK_CONTAINER (window), button);
  
       
     gtk_widget_show (button);       
       gtk_widget_show (window);
       
       /* All GTK applications must have a gtk_main(). Control ends here
    *      * and waits for an event to occur (like a key press or
    *      * mouse event). */
       gtk_main ();
       
 
             
       return 0;
}


