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;
}
Exemple #4
0
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;
}