あおきです。

Gtk::AccelGroupを実装しましたので、追加をお願いいたします。
以下を定義しています。

Gtk::AccelGroup
  .new()
  .get_default()
  .activate( Gtk::Object obj, Integer key, Integer modyfier )
  #attach( Gtk::Object obj )
  #detach( Gtk::Object obj )
  #add( Integer key, Integer modifier, Integer flag,
        Gtk::Object target, String signal )
  #remove( Integer key, Integer modifier, Gtk::Object obj )
  #activate( Integer key, Integer modifier )
  #lock()
  #unlock()
  ::ACCEL_VISIBLE
  ::ACCEL_SIGNAL_VISIBLE
  ::ACCEL_LOCKED
  ::ACCEL_MASK

gtk_accel_groups_activate
(あるオブジェクトにattachされているAccelGroupすべてにシグナルを送る)
をどうするかちょっと悩んだのですが、とりあえず特異メソッドにしておき
ました。Gtk::Objectのメソッドにするよりはいいですよね。

あと、未使用の変数のクリーンアップと、明示的な型変換の追加
(in gobj_emit_stop)をしています。いちおうテストはしましたが、
もしまずければすててください。

(0.20へのパッチです)
-------------------------------------------------------------------
あおきみねろう     site: http://www1.u-netsurf.ne.jp/~brew/mine/jp/

--- rbgtk.c.orig Sun Jul 18 22:28:53 1999 +++ rbgtk.c Thu Jul 22 16:34:21 1999 @@ -84,6 +84,7 @@ VALUE gTreeItem; VALUE gViewPort; +VALUE gAccelGroup; VALUE gAcceleratorTable; VALUE gStyle; VALUE gRcStyle; @@ -328,8 +329,6 @@ make_gstyle(style) GtkStyle *style; { - VALUE obj; - gtk_style_ref(style); return Data_Wrap_Struct(gStyle, 0, gtk_style_unref, style); } @@ -354,8 +353,6 @@ make_grcstyle(style) GtkRcStyle *style; { - VALUE obj; - gtk_rc_style_ref(style); return Data_Wrap_Struct(gRcStyle, 0, gtk_rc_style_unref, style); } @@ -376,6 +373,32 @@ return gstyle; } +VALUE +make_gtkaccelgrp(accel) + GtkAccelGroup *accel; +{ + gtk_accel_group_ref(accel); + return Data_Wrap_Struct(gAccelGroup, + 0, + gtk_accel_group_unref, + accel); +} + +GtkAccelGroup* +get_gtkaccelgrp(value) + VALUE value; +{ + GtkAccelGroup *accel; + + if (NIL_P(value)) return NULL; + if (!rb_obj_is_instance_of(value, gAccelGroup)) { + rb_raise(rb_eTypeError, "not a GtkAccelGroup"); + } + Data_Get_Struct(value, GtkAccelGroup, accel); + + return accel; +} + #if 0 VALUE make_gtkacceltbl(tbl) @@ -501,7 +524,6 @@ GtkArg *params; VALUE args; { - int i; char *signame = rb_id2name(sig); if (rb_obj_is_kind_of(obj, gWidget)) { @@ -518,8 +540,6 @@ GtkArg *arg; VALUE value; { - char *type = 0; - switch (GTK_FUNDAMENTAL_TYPE(arg->type)) { case GTK_TYPE_NONE: break; @@ -581,6 +601,10 @@ else if (arg->type == GTK_TYPE_GDK_VISUAL) GTK_VALUE_BOXED(*arg) = get_gdkvisual(value); #endif +#ifdef GTK_TYPE_ACCEL_GROUP + else if (arg->type == GTK_TYPE_ACCEL_GROUP) + GTK_VALUE_BOXED(*arg) = get_gtkaccelgrp(value); +#endif #ifdef GTK_TYPE_ACCELERATOR_TABLE else if (arg->type == GTK_TYPE_ACCELERATOR_TABLE) GTK_VALUE_BOXED(*arg) = get_gtkacceltbl(value); @@ -733,9 +757,8 @@ gobj_emit_stop(self, sig) VALUE self, sig; { - GtkObject *obj = get_gobject(self); - - gtk_signal_emit_stop_by_name(obj, STR2CSTR(sig)); + gtk_signal_emit_stop_by_name(GTK_OBJECT(get_gobject(self)), + STR2CSTR(sig)); return self; } @@ -1597,6 +1620,122 @@ } /* + * AccelGroup + */ + +static VALUE +gaccelgrp_s_new(self) + VALUE self; +{ + return make_gtkaccelgrp(gtk_accel_group_new()); +} + +static VALUE +gaccelgrp_s_get_default(self) + VALUE self; +{ + return make_gtkaccelgrp(gtk_accel_group_get_default()); +} + +static VALUE +gaccelgrp_activate(self, key, modtype) + VALUE self, key, modtype; +{ + gtk_accel_group_activate(get_gtkaccelgrp(self), + NUM2INT(key), + NUM2INT(modtype)); + return(self); +} + +static VALUE +gaccelgrp_s_activate(self, obj, key, modtype) + VALUE self, obj, key, modtype; +{ + gtk_accel_groups_activate(get_gobject(obj), + NUM2INT(key), + NUM2INT(modtype)); + return(self); +} + +static VALUE +gaccelgrp_attach(self, obj) + VALUE self, obj; +{ + gtk_accel_group_attach(get_gtkaccelgrp(self), + GTK_OBJECT(get_gobject(obj))); + return Qnil; +} + +static VALUE +gaccelgrp_detach(self, obj) + VALUE self, obj; +{ + gtk_accel_group_detach(get_gtkaccelgrp(self), + GTK_OBJECT(get_gobject(obj))); + return Qnil; +} + +static VALUE +gaccelgrp_lock(self) + VALUE self; +{ + gtk_accel_group_lock(get_gtkaccelgrp(self)); + return Qnil; +} + +static VALUE +gaccelgrp_unlock(self) + VALUE self; +{ + gtk_accel_group_unlock(get_gtkaccelgrp(self)); + return Qnil; +} + +static VALUE +gaccelgrp_add(self, key, modtype, flag, obj, strsig) + VALUE self, key, modtype, flag, obj, strsig; +{ + gtk_accel_group_add(get_gtkaccelgrp(self), + NUM2INT(key), + NUM2INT(modtype), + NUM2INT(flag), + GTK_OBJECT(get_gobject(obj)), + STR2CSTR(strsig)); + return Qnil; +} + +static VALUE +gaccelgrp_remove(self, key, modtype, obj) + VALUE self, key, modtype, obj; +{ + gtk_accel_group_remove(get_gtkaccelgrp(self), + NUM2INT(key), + NUM2INT(modtype), + GTK_OBJECT(get_gobject(obj))); + return Qnil; +} + +void Init_gtk_accel_group() +{ + gAccelGroup = rb_define_class_under(mGtk, "AccelGroup", rb_cData); + rb_define_singleton_method(gAccelGroup, "new", gaccelgrp_s_new, 0); + rb_define_singleton_method(gAccelGroup, "get_default", gaccelgrp_s_get_default, 0); + rb_define_singleton_method(gAccelGroup, "activate", gaccelgrp_s_activate, 3); + rb_define_method(gAccelGroup, "attach", gaccelgrp_attach, 1); + rb_define_method(gAccelGroup, "detach", gaccelgrp_detach, 1); + rb_define_method(gAccelGroup, "lock", gaccelgrp_lock, 0); + rb_define_method(gAccelGroup, "unlock", gaccelgrp_unlock, 0); + rb_define_method(gAccelGroup, "add", gaccelgrp_add, 5); + rb_define_method(gAccelGroup, "remove", gaccelgrp_remove, 3); + rb_define_method(gAccelGroup, "activate", gaccelgrp_activate, 2); + rb_define_method(gAccelGroup, "activate", gaccelgrp_activate, 2); + rb_define_const(gAccelGroup, "ACCEL_VISIBLE", INT2NUM(GTK_ACCEL_VISIBLE)); + rb_define_const(gAccelGroup, "ACCEL_SIGNAL_VISIBLE", INT2NUM(GTK_ACCEL_SIGNAL_VISIBLE)); + rb_define_const(gAccelGroup, "ACCEL_LOCKED", INT2NUM(GTK_ACCEL_LOCKED)); + rb_define_const(gAccelGroup, "ACCEL_MASK", INT2NUM(GTK_ACCEL_MASK)); +} + +/* * Requisition */ static VALUE grequisition_new(self, w, h) @@ -1777,6 +1916,7 @@ Init_gtk_tree(); Init_gtk_tree_item(); Init_gtk_viewport(); + Init_gtk_accel_group(); gAcceleratorTable = rb_define_class_under(mGtk, "AcceleratorTable", rb_cData); Init_gtk_style(); gRcStyle = rb_define_class_under(mGtk, "RcStyle", rb_cData);