----Next_Part(Thu_Dec_24_07:27:14_1998_300)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit


  ¤«¤ó¤À@Éö³¹¤Ç¤¹¡£

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 ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë̵¿ô¤Î:) ¥­¡¼ÈÖ¹æ¤â¤È¤­¤ËÉÕ¤±
¤Þ¤¹¤Î¤Ç¡¢É¬ÍפǤ·¤¿¤é¤·¤Ð¤é¤¯¤ÏľÀÜÀ°¿ô¤òµ­·¤Æ²¼¤µ¤¤¤Þ¤»¡¨Â
  ÇôëÔåø¤Î¥­¡¼ÆþÎϤò²£¼è¤ê¤¹¤ë¥µ¥ó¥×¥ë¤òÉÕ¤±¤Æ¤ª¤­¤Þ¤¹¡£¾®Ê¸»ú¤ÇÆþÎϤ·¤Æ
¤âÂçʸ»ú¤Ë¤·¤Þ¤¹¡£

 ¤·¤«¤·¡¢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+ ¤Ç¤âľÀÜ´Ø¿ô¥Ý¥¤¥ó¥¿¤òÂåÆþ¤¹¤ì¤Ð¾å¤Îµ¡²Ì¤¿¤»¤ë¤Î¤À¤±
¤ì¤É¡¢¤Ïǧ¤á¤é¤ì¤Æ¤¤¤ëÊýË¡¤Ê¤Î¤«¤É¤¦¤«¤«¤Ê¡Ä¡£¤È¤ê¤¢¤¨¤º¤ÏÂåÍѤǤ­¤Þ¤¹
¤Î¤Ç¡¢Ä󶡤·¤Ê¤¤¤Ç¤ª¤­¤Þ¤¹¡£


----Next_Part(Thu_Dec_24_07:27:14_1998_300)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=texthook.rb

require 'gtk'

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

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

  ret  alse
  if widget.editable?
    if event.length 1 and ?a < vent.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  rue
    end
  end
  ret
end
w.add(text)
text.show

w.show
Gtk::main()


----Next_Part(Thu_Dec_24_07:27:14_1998_300)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=gtk.c.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  et_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);

----Next_Part(Thu_Dec_24_07:27:14_1998_300)----