-GtkWidget* xwgir_create_debug;
-
-
-
-gboolean
-xwidget_osr_event_forward (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- /* copy events that arrive at the outer widget to the offscreen widget */
- struct xwidget* xw = (struct xwidget*) g_object_get_data (G_OBJECT (widget), XG_XWIDGET);
- GdkEvent* eventcopy = gdk_event_copy(event);
- //GdkEvent* eventcopy = gdk_event_new(GDK_BUTTON_PRESS);
-
-
- //((GdkEventAny*)eventcopy)->window = gtk_widget_get_window(xw->widget_osr);
- //eventcopy->any.window = gtk_widget_get_window(GTK_WIDGET (xw->widgetwindow_osr));
- //((GdkEventAny*)eventcopy)->window = gtk_widget_get_window(xwgir_create_debug);
- eventcopy->any.window = gtk_widget_get_window(xw->widget_osr);//gtk_widget_get_window(xwgir_create_debug);
- //eventcopy->any.window = gtk_button_get_event_window(GTK_BUTTON(xw->widget_osr));//gtk_widget_get_window(xwgir_create_debug);
- //eventcopy->button.x=200; eventcopy->button.y=200;
- //event->button.button = GDK_BUTTON_PRIMARY; //debug
-
- //eventcopy->any.window = xw->widgetwindow_osr;//gtk_widget_get_window(xwgir_create_debug);
- /* eventcopy->any.send_event = TRUE; */
- /* eventcopy->button.time = GDK_CURRENT_TIME; */
- /* eventcopy->button.device = event->button.device; */
-
-
- printf("xwidget_osr_event_forward redirect event to window:%d\n", ((GdkEventAny*)eventcopy)->window);
- printf("A type:%d x:%f y:%f \n", event->type, event->button.x, event->button.y);
- printf("B type:%d x:%f y:%f \n", eventcopy->type, eventcopy->button.x, eventcopy->button.y);
- //gtk_button_get_event_window(xwgir_create_debug);
- gtk_main_do_event(eventcopy); //TODO this will leak events. they should be deallocated later, perhaps in xwgir_event_callback
- //printf("gtk_widget_event:%d\n",gtk_widget_event(xw->widget_osr, eventcopy));
- //gdk_event_put(eventcopy);
- //gdk_event_queue_append(eventcopy);
- //gdk_event_free(eventcopy);
- return TRUE; //dont propagate this event furter
- //return FALSE; //dont propagate this event furter
-}
-
-GIRepository *girepository ;
-DEFUN( "xwgir-require-namespace",Fxwgir_require_namespace, Sxwgir_require_namespace, 2,2,0,
- doc: /*require a namespace. must be done for all namespaces we want to use, before using other xwgir functions.*/)
- (Lisp_Object lnamespace, Lisp_Object lnamespace_version)
-{
- char* namespace = SDATA(lnamespace);
- char* namespace_version = SDATA(lnamespace_version);
- GError *error = NULL;
-
- girepository = g_irepository_get_default();
- g_irepository_require(girepository, namespace, namespace_version, 0, &error);
- if (error) {
- g_error("ERROR: %s\n", error->message);
- return Qnil;
- }
- return Qt;
-}
-
-GtkWidget* xwgir_create(char* class, char* namespace){
- //TODO this is more or less the same as xwgir-call-method, so should be refactored
- //create a gtk widget, given its name
- //find the constructor
- //call it
- //also figure out how to pass args
-
- GError *error = NULL;
- GIArgument return_value;
-
- GIObjectInfo* obj_info = g_irepository_find_by_name(girepository, namespace, class);
- GIFunctionInfo* f_info = g_object_info_find_method (obj_info, "new");
- g_function_info_invoke(f_info,
- NULL, 0,
- NULL, 0,
- &return_value,
- NULL);
- xwgir_create_debug = return_value.v_pointer;
- return return_value.v_pointer;
-
-}
-
-int
-xwgir_convert_lisp_to_gir_arg(GIArgument* giarg,
- GIArgInfo* arginfo,
- Lisp_Object lisparg )
-{
-
- GITypeTag tag;
- gboolean is_pointer;
- gboolean is_enum;
- tag = g_type_info_get_tag (g_arg_info_get_type (arginfo));
-
- switch (tag)
- {
- case GI_TYPE_TAG_BOOLEAN:
- giarg->v_boolean = XFASTINT(lisparg);
- break;
- case GI_TYPE_TAG_INT8:
- giarg->v_int8 = XFASTINT(lisparg);
- break;
- case GI_TYPE_TAG_UINT8:
- giarg->v_uint8 = XFASTINT(lisparg);
- break;
- case GI_TYPE_TAG_INT16:
- giarg->v_int16 = XFASTINT(lisparg);
- break;
- case GI_TYPE_TAG_UINT16:
- giarg->v_uint16 = XFASTINT(lisparg);
- break;
- case GI_TYPE_TAG_INT32:
- giarg->v_int32 = XFASTINT(lisparg);
- break;
- case GI_TYPE_TAG_UINT32:
- giarg->v_uint32 = XFASTINT(lisparg);
- break;
-
- case GI_TYPE_TAG_INT64:
- giarg->v_int64 = XFASTINT(lisparg);
- break;
- case GI_TYPE_TAG_UINT64:
- giarg->v_uint64 = XFASTINT(lisparg);
- break;
-
-
- case GI_TYPE_TAG_FLOAT:
- giarg->v_float = XFLOAT_DATA(lisparg);
- break;
-
- case GI_TYPE_TAG_DOUBLE:
- giarg->v_double = XFLOAT_DATA(lisparg);
- break;
-
- case GI_TYPE_TAG_UTF8:
- case GI_TYPE_TAG_FILENAME:
- //giarg->v_string = SDATA(lisparg);
- giarg->v_pointer = SDATA(lisparg);
- break;
-
- case GI_TYPE_TAG_ARRAY:
- case GI_TYPE_TAG_GLIST:
- case GI_TYPE_TAG_GSLIST:
- case GI_TYPE_TAG_GHASH:
- case GI_TYPE_TAG_ERROR:
- case GI_TYPE_TAG_INTERFACE:
- case GI_TYPE_TAG_VOID:
- case GI_TYPE_TAG_UNICHAR:
- case GI_TYPE_TAG_GTYPE:
- //?? i dont know how to handle these yet TODO
- printf("failed in my lisp to gir arg conversion duties. sob!\n");
- return -1;
- break;
- }
- return 0;
-}
-
-#if 0
-void
-refactor_attempt(){
- //this methhod should be called from xwgir-xwidget-call-method and from xwgir xwidget construction
- char* class = SDATA(Fcar(Fcdr(Fget(xw->type, QCxwgir_class))));
-
- GIObjectInfo* obj_info = g_irepository_find_by_name(girepository, namespace, class);
- GIFunctionInfo* f_info = g_object_info_find_method (obj_info, SDATA(method));
-
- //loop over args, convert from lisp to primitive type, given arg introspection data
- //TODO g_callable_info_get_n_args(f_info) should match
- int argscount = XFASTINT(Flength(arguments));
- if(argscount != g_callable_info_get_n_args(f_info)){
- printf("xwgir call method arg count doesn match! \n");
- return Qnil;
- }
- int i;
- for (i = 1; i < argscount + 1; ++i)
- {
- xwgir_convert_lisp_to_gir_arg(&in_args[i], g_callable_info_get_arg(f_info, i - 1), Fnth(i - 1, arguments));
- }
-
- in_args[0].v_pointer = widget;
- if(g_function_info_invoke(f_info,
- in_args, argscount + 1,
- NULL, 0,
- &return_value,
- &error)) {
- //g_error("ERROR: %s\n", error->message);
- printf("invokation error\n");
- return Qnil;
- }
- return Qt;
-}
-#endif /* 0 */
-
-DEFUN ("xwgir-xwidget-call-method", Fxwgir_xwidget_call_method, Sxwgir_xwidget_call_method, 3, 3, 0,
- doc: /* call xwidget object method.*/)
- (Lisp_Object xwidget, Lisp_Object method, Lisp_Object arguments)