[#11156] How to delete methods from superclass? — Clemens Hintze <c.hintze@...>

Hello,

25 messages 1998/12/01
[#11157] Re: How to delete methods from superclass? — matz@... (Yukihiro Matsumoto) 1998/12/01

Hi, Clemens.

[#11176] English List [Re: How to delete methods from superclass?] — gotoken@... (GOTO Kentaro) 1998/12/01

In message "[ruby-list:11157] Re: How to delete methods from superclass?"

[#11250] Ruby 用語集 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

25 messages 1998/12/08

[#11269] 京都 (Re: [ruby-dev:3789] Re: List()) — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

21 messages 1998/12/11
[#11299] Re: 京都 — MAEDA Shugo <shugo@...> 1998/12/12

前田です。

[#11393] mod_ruby — shugo@... (Shugo Maeda)

前田です。

28 messages 1998/12/21
[#11394] Re: mod_ruby — matz@... (Yukihiro Matsumoto) 1998/12/21

まつもと ゆきひろです

[#11398] Re: mod_ruby — shugo@... (Shugo Maeda) 1998/12/21

前田です。

[#11399] RE: mod_ruby — OZAWA Sakuro <crouton@...> 1998/12/21

さくです。

[#11408] Re: Be port — shugo@... (Shugo Maeda) 1998/12/22

前田です。

[#11464] ruby and IDE — Noritsugu Nakamura <nnakamur@...>

18 messages 1998/12/27
[#11465] goto (Re: ruby and IDE) — ttate@... 1998/12/27

立石です。

[ruby-list:11432] Re: (gtk) signal (Re: gtk)

From: "D.Kanda" <MAP2303@...>
Date: 1998-12-23 22:27:09 UTC
List: ruby-list #11432
  かんだ@楓街です。

Takehama Hirohisa <thiro@kt.rim.or.jp>さんの書かれた、
	「[ruby-list:11402] Re: (gtk) signal (Re: gtk) 」
からの引用です。

> >   ちょっと見てみましたが、ruby/gtk の signal_connect が gtk の
> > signal_connect_interp を使っているのが悪いのかなぁ…。もう少し見てみます。

  Gtk+のソースを読んでみたところ、どうも親signal を辿るかどうかに使われて
いるようです。同じ signal の次の handler を辿らないようにしたい場合は、処
理をやめたい handler 内で gtk_signal_emit_stop() を実行すればよいようです。
# これでいいんでしょうか? > Gtkな方々

とりあえず GC の周りは考えずに Gtk::Object::signal_emit_stop() メソッドを
定義しておきました。

  KeyEvent だけ実装しました。週末にでももう少し整理して新しい版を出してお
きます。gdk/gdkkeysyms.h に定義されている無数の:) キー番号もそのときに付け
ますので、必要でしたらしばらくは直接整数を記述して下さいませ。
  GtkText のキー入力を横取りするサンプルを付けておきます。小文字で入力して
も大文字にします。

 しかし、Gtk+ って signal 周りが難しい…
 全てのコードは signal に通ず、signal を制する者は Gtk+ を制す :-P


> >   話は違いますが、Gdk::Event って type というメソッドが定義されていますが、
> > Object::type とぶつかるのでマズいですね。event_type とかいう名前に変更した
> > いですけれど、困る方はいますか?
> 
> そんな話は send でもありましたね。今のうちに gtk 側の名前変更に賛成します。

  これも変えました。


> > > Tk ではイベントを <Control-a> のように指定できますね。さらに 
> > > <Control-Button1> とか <Control-Meta-a> とかできます。GTK でもここまでで
> > > きるとうれしいなと思います。
> > 
> >   Tk は知らないんですけれど、<Control-a> というイベントがあるのでしょうか?
> > Keyイベントを受け取ってそのキーコードを判別する、というのが普通:-Pかなと思
> > うのですが…。
> 
> Tk では <Control-a> というイベントを指定できます。また、gtk と同じよう
> に <KeyPress> と指定して Keyイベント受けとって、キーコードを判別するこ
> ともできます。両方指定してあって Control-a を押した場合は、より限定的
> なイベントの方にマッチするようです。

  基本は Gtk+ 互換にしたいので、余分な機能は組み込むとしても別になると思い
ます。問題は Gtk+ でも直接関数ポインタを代入すれば上の機能は果たせるのだけ
れど、それは認められている方法なのかどうかかな…。とりあえずは代用できます
ので、提供しないでおきます。

Attachments (2)

texthook.rb (594 Bytes, text/x-ruby)
require 'gtk'

w = Gtk::Window::new(Gtk::WINDOW_TOPLEVEL)
w.signal_connect("delete_event") { exit }
w.signal_connect("destroy") { exit }

text = Gtk::Text.new
text.set_editable(true)
text.signal_connect("key_press_event") do |widget, event|
  p event

  ret = false
  if widget.editable?
    if event.length == 1 and ?a <= event.keyval and event.keyval <= ?z
      widget.delete_selection()
      widget.insert_text(event.string.capitalize, widget.get_length)

      widget.signal_emit_stop("key_press_event")
      ret = true
    end
  end
  ret
end
w.add(text)
text.show

w.show
Gtk::main()

gtk.c.diff (4.51 KB, text/x-diff)
*** gtk.c.orig	Mon Dec 21 20:15:52 1998
--- gtk.c	Thu Dec 24 06:57:56 1998
***************
*** 1002,1007 ****
--- 1002,1010 ----
      case GDK_3BUTTON_PRESS:
        return Data_Wrap_Struct(gdkEventButton, 0, gdk_event_free, event);
        break;
+     case GDK_KEY_PRESS:
+       return Data_Wrap_Struct(gdkEventKey, 0, gdk_event_free, event);
+       break;
      default:
        return Data_Wrap_Struct(gdkEvent, 0, gdk_event_free, event);
      }
***************
*** 1597,1602 ****
--- 1600,1615 ----
  }
  
  static VALUE
+ gobj_emit_stop(self, sig)
+     VALUE self, sig;
+ {
+     GtkObject *obj = get_gobject(self);
+     
+ 	gtk_signal_emit_stop_by_name(obj, STR2CSTR(sig));
+     return self;
+ }
+ 
+ static VALUE
  gobj_destroy(self)
      VALUE self;
  {
***************
*** 4426,4431 ****
--- 4439,4451 ----
  }
  
  static VALUE
+ txt_has_cursor(self)
+     VALUE self;
+ {
+   return GTK_TEXT(get_widget(self))->has_cursor? TRUE: FALSE;
+ }
+ 
+ static VALUE
  tbar_initialize(argc, argv, self)
      int argc;
      VALUE *argv;
***************
*** 5253,5258 ****
--- 5273,5285 ----
  }
  
  static VALUE
+ edit_is_editable(self)
+     VALUE self;
+ {
+   return GTK_EDITABLE(get_widget(self))->editable? TRUE: FALSE;
+ }
+ 
+ static VALUE
  entry_initialize(self)
      VALUE self;
  {
***************
*** 6755,6760 ****
--- 6782,6817 ----
  }
  
  static VALUE
+ gdkeventkey_time(self)
+ {
+     return INT2NUM(((GdkEventKey*)get_gdkevent(self))->time);
+ }
+ 
+ static VALUE
+ gdkeventkey_state(self)
+ {
+     return INT2NUM(((GdkEventKey*)get_gdkevent(self))->state);
+ }
+ 
+ static VALUE
+ gdkeventkey_keyval(self)
+ {
+     return INT2NUM(((GdkEventKey*)get_gdkevent(self))->keyval);
+ }
+ 
+ static VALUE
+ gdkeventkey_length(self)
+ {
+     return INT2NUM(((GdkEventKey*)get_gdkevent(self))->length);
+ }
+ 
+ static VALUE
+ gdkeventkey_string(self)
+ {
+     return str_new2(((GdkEventKey*)get_gdkevent(self))->string);
+ }
+ 
+ static VALUE
  gdkeventmotion_window(self)
  {
      return make_gdkwindow(((GdkEventMotion*)get_gdkevent(self))->window);
***************
*** 7074,7079 ****
--- 7131,7138 ----
      rb_define_method(gObject, "==", gobj_equal, 1);
      rb_define_method(gObject, "inspect", gobj_inspect, 0);
  
+     rb_define_method(gObject, "signal_emit_stop", gobj_emit_stop, 1);
+ 
      /* Widget */
      rb_define_method(gWidget, "show", widget_show, 0);
      rb_define_method(gWidget, "show_all", widget_show_all, 0);
***************
*** 7379,7384 ****
--- 7438,7444 ----
      rb_define_method(gEditable, "claim_selection", edit_claim_selection, 2);
      rb_define_method(gEditable, "delete_selection", edit_delete_selection, 0);
      rb_define_method(gEditable, "changed", edit_changed, 0);
+     rb_define_method(gEditable, "editable?", edit_is_editable, 0);
  
      /* Entry */
      rb_define_method(gEntry, "initialize", entry_initialize, 0);
***************
*** 7680,7685 ****
--- 7740,7746 ----
      rb_define_method(gText, "insert", txt_insert, 4);
      rb_define_method(gText, "backward_delete", txt_backward_delete, 1);
      rb_define_method(gText, "forward_delete", txt_forward_delete, 1);
+     rb_define_method(gText, "has_cursor?", txt_has_cursor, 0);
  
      /* Toolbar */
      rb_define_method(gToolbar, "initialize", tbar_initialize, -1);
***************
*** 7905,7911 ****
      rb_define_method(gdkRectangle, "height", gdkrect_h, 0);
  
      /* GdkEvent */
!     rb_define_method(gdkEvent, "type", gdkevent_type, 0);
  
      /* GdkEventExpose */
      rb_define_method(gdkEventExpose, "area", gdkeventexpose_area, 0);
--- 7966,7972 ----
      rb_define_method(gdkRectangle, "height", gdkrect_h, 0);
  
      /* GdkEvent */
!     rb_define_method(gdkEvent, "event_type", gdkevent_type, 0);
  
      /* GdkEventExpose */
      rb_define_method(gdkEventExpose, "area", gdkeventexpose_area, 0);
***************
*** 7914,7919 ****
--- 7975,7987 ----
      rb_define_method(gdkEventButton, "x", gdkeventbutton_x, 0);
      rb_define_method(gdkEventButton, "y", gdkeventbutton_y, 0);
      rb_define_method(gdkEventButton, "button", gdkeventbutton_button, 0);
+ 
+     /* GdkEventKey */
+     rb_define_method(gdkEventKey, "time",   gdkeventkey_time, 0);
+     rb_define_method(gdkEventKey, "state",  gdkeventkey_state, 0);
+     rb_define_method(gdkEventKey, "keyval", gdkeventkey_keyval, 0);
+     rb_define_method(gdkEventKey, "length", gdkeventkey_length, 0);
+     rb_define_method(gdkEventKey, "string", gdkeventkey_string, 0);
  
      /* GdkEventMotion */
      rb_define_method(gdkEventMotion, "window", gdkeventmotion_window, 0);

In This Thread