とみたです。

At Wed, 22 Dec 1999 20:45:21 +0900,
とみたまさひろ <tommy / tmtm.org> wrote:

> Gtk::Editable の各種シグナルを扱えるようにしてみました。

ちょいと変更しました。gtk-SNAPSHOT-19991213 オリジナルに対するパッチです。

前のパッチでは insert-text シグナルで呼び出される関数側で、渡された 
position を変更できなかったので、苦肉の策で配列にしてみました。

C API では gint* position なので、関数中で *position = n; とすれば位置を
変更できたんですが、Ruby では整数の in-out parameter が使えないので…。

	e = Gtk::Entry::new
	e.signal_connect("insert_text") do |a| 〜 end

とすると、a = [#<Gtk::Entry:0x4016b588 ptr=0x8188ad0>, "s", [0]] ってな
形で引数が渡されるので、a[2][0] = n として位置を変更できます。

他にもっといい方法あるかなぁ…。

--
とみたまさひろ <tommy / tmtm.org>


*** rbgtk.c.orig	Fri Dec 10 06:58:48 1999
--- rbgtk.c	Fri Dec 24 10:26:24 1999
***************
*** 529,534 ****
--- 529,584 ----
  	    return;
  	}
      }
+     if (rb_obj_is_kind_of(obj, gEditable)) {
+ 	if (strcmp(signame, "insert_text") == 0) {
+ 	    rb_ary_push(args, rb_str_new(GTK_VALUE_STRING(params[0]), GTK_VALUE_INT(params[1])));
+ 	    rb_ary_push(args, rb_ary_new3(1, INT2NUM(*GTK_RETLOC_INT(params[2]))));
+ 	    return;
+ 	}
+ 	if (strcmp(signame, "delete_text") == 0) {
+ 	    rb_ary_push(args, INT2NUM(GTK_VALUE_INT(params[0])));
+ 	    rb_ary_push(args, INT2NUM(GTK_VALUE_INT(params[1])));
+ 	    return;
+ 	}
+ 	if (strcmp(signame, "set_editable") == 0) {
+ 	    rb_ary_push(args, GTK_VALUE_BOOL(params[0])? Qtrue: Qfalse);
+ 	    return;
+ 	}
+ 	if (strcmp(signame, "move_cursor") == 0) {
+ 	    rb_ary_push(args, INT2NUM(GTK_VALUE_INT(params[0])));
+ 	    rb_ary_push(args, INT2NUM(GTK_VALUE_INT(params[1])));
+ 	    return;
+ 	}
+ 	if (strcmp(signame, "move_word") == 0) {
+ 	    rb_ary_push(args, INT2NUM(GTK_VALUE_INT(params[0])));
+ 	    return;
+ 	}
+ 	if (strcmp(signame, "move_page") == 0) {
+ 	    rb_ary_push(args, INT2NUM(GTK_VALUE_INT(params[0])));
+ 	    rb_ary_push(args, INT2NUM(GTK_VALUE_INT(params[1])));
+ 	    return;
+ 	}
+ 	if (strcmp(signame, "move_to_row") == 0) {
+ 	    rb_ary_push(args, INT2NUM(GTK_VALUE_INT(params[1])));
+ 	    return;
+ 	}
+ 	if (strcmp(signame, "move_to_column") == 0) {
+ 	    rb_ary_push(args, INT2NUM(GTK_VALUE_INT(params[1])));
+ 	    return;
+ 	}
+ 	if (strcmp(signame, "kill_char") == 0) {
+ 	    rb_ary_push(args, INT2NUM(GTK_VALUE_INT(params[1])));
+ 	    return;
+ 	}
+ 	if (strcmp(signame, "kill_word") == 0) {
+ 	    rb_ary_push(args, INT2NUM(GTK_VALUE_INT(params[1])));
+ 	    return;
+ 	}
+ 	if (strcmp(signame, "kill_line") == 0) {
+ 	    rb_ary_push(args, INT2NUM(GTK_VALUE_INT(params[1])));
+ 	    return;
+ 	}
+     }
      if (rb_obj_is_kind_of(obj, gEntry)) {
  	if (strcmp(signame, "insert_position") == 0) {
  	    rb_ary_push(args, INT2NUM(*GTK_RETLOC_INT(params[0])));
***************
*** 576,581 ****
--- 626,640 ----
  	if (strcmp(signame, "size_request") == 0) {
  	    memcpy(GTK_VALUE_POINTER(params[0]), get_grequisition(rb_ary_pop(args)),
  		   sizeof(GtkRequisition));
+ 	    return;
+ 	}
+     }
+     if (rb_obj_is_kind_of(obj, gEditable)) {
+ 	if (strcmp(signame, "insert_text") == 0) {
+ 	    VALUE x = RARRAY(rb_ary_pop(args))->ptr[0];
+ 	    VALUE str = rb_ary_pop(args);
+ 	    *GTK_RETLOC_INT(params[2]) = NUM2INT(x);
+ 	    strncpy(GTK_VALUE_STRING(params[0]), RSTRING(str)->ptr, RSTRING(str)->len);
  	    return;
  	}
      }