This repository has been archived on 2021-09-15. You can view files and clone it, but cannot push or open issues or pull requests.
DUT2Curling/lib/ruby-gtk2-2.0.2/atk/ext/atk/rbatkeditabletext.c

178 lines
4.8 KiB
C

/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
/*
* Copyright (C) 2011 Ruby-GNOME2 Project Team
* Copyright (C) 2003 Masao Mutoh
*
* This library 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.1 of the License, or (at your option) any later version.
*
* This library 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 library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
#include "rbatkprivate.h"
#define RG_TARGET_NAMESPACE mEditableText
#define _SELF(s) (RVAL2ATKEDITABLETEXT(s))
struct rval2atkattributegslist_args {
VALUE ary;
long n;
GSList *result;
};
static VALUE
rbatk_rval2atkattributegslist_body(VALUE value)
{
long i;
struct rval2atkattributegslist_args *args = (struct rval2atkattributegslist_args *)value;
for (i = 0; i < args->n; i++) {
VALUE ary = rb_ary_to_ary(RARRAY_PTR(args->ary)[i]);
AtkAttribute *attribute;
if (RARRAY_LEN(ary) != 2)
rb_raise(rb_eArgError, "attribute %ld should be an array of length 2", i);
attribute = g_new(AtkAttribute, 1);
args->result = g_slist_append(args->result, attribute);
attribute->name = g_strdup(RVAL2CSTR(RARRAY_PTR(ary)[0]));
attribute->value = g_strdup(RVAL2CSTR(RARRAY_PTR(ary)[1]));
}
return Qnil;
}
static void
rbatk_atkattributegslist_free(GSList *list)
{
GSList *p;
for (p = list; p != NULL; p = g_slist_next(p)) {
AtkAttribute *attribute = (AtkAttribute *)p->data;
g_free(attribute->value);
g_free(attribute->name);
g_free(attribute);
}
g_slist_free(list);
}
static G_GNUC_NORETURN VALUE
rbatk_rval2atkattributegslist_rescue(VALUE value)
{
rbatk_atkattributegslist_free(((struct rval2atkattributegslist_args *)value)->result);
rb_exc_raise(rb_errinfo());
}
static GSList *
rbatk_rval2atkattributegslist(VALUE value)
{
struct rval2atkattributegslist_args args;
args.ary = rb_ary_to_ary(value);
args.n = RARRAY_LEN(args.ary);
args.result = NULL;
rb_rescue(rbatk_rval2atkattributegslist_body, (VALUE)&args,
rbatk_rval2atkattributegslist_rescue, (VALUE)&args);
return args.result;
}
#define RVAL2ATKATTRIBUTEGSLIST(value) rbatk_rval2atkattributegslist(value)
static VALUE
rg_set_run_attributes(VALUE self,
VALUE attributes,
VALUE rbstart_offset,
VALUE rbend_offset)
{
AtkEditableText *editable;
gint start_offset, end_offset;
AtkAttributeSet *list;
gboolean result;
if (NIL_P(attributes))
return Qfalse;
editable = _SELF(self);
start_offset = NUM2INT(rbstart_offset);
end_offset = NUM2INT(rbend_offset);
list = RVAL2ATKATTRIBUTEGSLIST(attributes);
result = atk_editable_text_set_run_attributes(editable, list, start_offset, end_offset);
rbatk_atkattributegslist_free(list);
return CBOOL2RVAL(result);
}
static VALUE
rg_set_text_contents(VALUE self, VALUE str)
{
atk_editable_text_set_text_contents(_SELF(self), RVAL2CSTR(str));
return self;
}
static VALUE
rg_insert_text(VALUE self, VALUE str, VALUE position)
{
gint pos = NUM2INT(position);
StringValue(str);
atk_editable_text_insert_text(_SELF(self), RVAL2CSTR(str), RSTRING_LEN(str), &pos);
return INT2NUM(pos);
}
static VALUE
rg_copy_text(VALUE self, VALUE start_pos, VALUE end_pos)
{
atk_editable_text_copy_text(_SELF(self), NUM2INT(start_pos), NUM2INT(end_pos));
return self;
}
static VALUE
rg_cut_text(VALUE self, VALUE start_pos, VALUE end_pos)
{
atk_editable_text_cut_text(_SELF(self), NUM2INT(start_pos), NUM2INT(end_pos));
return self;
}
static VALUE
rg_delete_text(VALUE self, VALUE start_pos, VALUE end_pos)
{
atk_editable_text_delete_text(_SELF(self), NUM2INT(start_pos), NUM2INT(end_pos));
return self;
}
static VALUE
rg_paste_text(VALUE self, VALUE position)
{
atk_editable_text_paste_text(_SELF(self), NUM2INT(position));
return self;
}
void
Init_atk_editabletext(VALUE mAtk)
{
VALUE RG_TARGET_NAMESPACE = G_DEF_INTERFACE(ATK_TYPE_EDITABLE_TEXT, "EditableText", mAtk);
RG_DEF_METHOD(set_run_attributes, 3);
RG_DEF_METHOD(set_text_contents, 1);
RG_DEF_METHOD(insert_text, 2);
RG_DEF_METHOD(copy_text, 2);
RG_DEF_METHOD(cut_text, 2);
RG_DEF_METHOD(delete_text, 2);
RG_DEF_METHOD(paste_text, 1);
}