gboolean GN_widget_get_attr(int ARI, ei_x_buff *XBUF, char *B, int *I) { gchar attr[MAXATOMLEN+1]; GtkWidget* widget; if ( ! gn_check_arity(XBUF, 2, ARI) ) return FALSE; if ( ! gn_get_arg_object(XBUF, B, I, GTK_TYPE_WIDGET, (GObject**)&widget) ) return FALSE; if ( ! gn_get_arg_gchar_fix(XBUF, B, I, attr) ) return FALSE; if ( strcmp("window",attr) == 0 ){ gn_put_object(XBUF,(GObject*) widget->window); }else if ( strcmp("x",attr) == 0 ) { gn_put_longlong(XBUF,(long long)widget->allocation.x); }else if ( strcmp("y",attr) == 0 ) { gn_put_longlong(XBUF,(long long)widget->allocation.y); }else if ( strcmp("width",attr) == 0 ) { gn_put_longlong(XBUF,(long long)widget->allocation.width); }else if ( strcmp("height",attr) == 0 ) { gn_put_longlong(XBUF,(long long)widget->allocation.height); }else{ gn_enc_2_error(XBUF, "no_such_attr"); ei_x_encode_atom(XBUF, attr); return FALSE; } return TRUE; }
gboolean GN_value_set(int ARI, ei_x_buff *XBUF, char *B, int *I){ GValue* object; int type, len; gboolean v_boolean; gchar v_atom[MAXATOMLEN+1]; gchar* v_gchar; gint64 v_gint64; gdouble v_double; /* no return value */ if ( ! gn_check_arity(XBUF, 2, ARI) ) return FALSE; if ( ! gn_get_arg_struct(XBUF, B, I, "GValue", (void**)&object) ) return FALSE; if ( G_IS_VALUE(object) ) g_value_unset(object); ei_get_type(B,I,&type,&len); /* can't fail */ switch (type) { case ERL_ATOM_EXT: if ( ! ei_decode_boolean(B, I, (int*)&v_boolean) ){ g_value_init(object,G_TYPE_BOOLEAN); g_value_set_boolean(object, v_boolean); } else if ( gn_get_arg_gchar_fix(XBUF, B, I, v_atom) ){ g_value_init(object,G_TYPE_STRING); g_value_set_string(object,v_atom); } else { return FALSE; } break; case ERL_SMALL_INTEGER_EXT: case ERL_INTEGER_EXT: case ERL_SMALL_BIG_EXT: case ERL_LARGE_BIG_EXT: if ( ! gn_get_arg_gint64(XBUF, B, I, &v_gint64) ) return FALSE; g_value_init(object,G_TYPE_INT64); g_value_set_int64(object, v_gint64); break; case ERL_FLOAT_EXT: if ( ! gn_get_arg_gdouble(XBUF, B, I, &v_double) ) return FALSE; g_value_init(object,G_TYPE_DOUBLE); g_value_set_double(object, v_double); break; case ERL_NIL_EXT: case ERL_STRING_EXT: if ( ! gn_get_arg_gchar(XBUF, B, I, &v_gchar) ) return FALSE; g_value_init(object,G_TYPE_STRING); g_value_set_string(object,v_gchar); free(v_gchar); break; default: gn_enc_1_error(XBUF, "bad_erl_type"); return FALSE; break; } gn_put_void(XBUF); return TRUE; }
gboolean GN_signal_connect(int ARI, ei_x_buff *XBUF, char *B, int *I) { gchar signal[MAXATOMLEN+1]; GtkWidget* widget; if ( ! gn_check_arity(XBUF, 2, ARI) ) return FALSE; if ( ! gn_get_arg_object(XBUF, B, I, GTK_TYPE_WIDGET, (GObject**)&widget) ) return FALSE; if ( ! gn_get_arg_gchar_fix(XBUF, B, I, signal) ) return FALSE; g_signal_connect (G_OBJECT (widget), signal, G_CALLBACK (erl), NULL); gn_put_void(XBUF); return TRUE; }
static gboolean make_reply(ei_x_buff *xbuf, char *buff, int *index) { int k; gint arity; gchar cmd[MAXATOMLEN+1]; gboolean (*funcp)(int, ei_x_buff *, char *, int *); if ( ! ((arity = gn_get_tuple(xbuf, buff, index)) > -1) || ! gn_check_arity(xbuf,2,arity) || ! gn_get_arg_gchar_fix(xbuf, buff, index, cmd) || ! ((arity = gn_get_list(xbuf, buff, index)) > -1) ) return FALSE; if ( get_fpointer(cmd, xbuf, (gpointer *)&funcp) && (*funcp)(arity, xbuf, buff, index) ) { g_assert( ei_decode_list_header(buff,index,&k) == 0 ); g_assert( k == 0 ); return TRUE; } return FALSE; }