----Next_Part(Thu_Dec_24_07:15:30_1998_893)--
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit


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


Takehama Hirohisa <thiro / kt.rim.or.jp>¤µ¤ó¤Î«¤ì¤¿¡¨Â
	¡Ö[ruby-list:11395] Re: gtk ¡×
¤«¤é¤Î°úÍѤǤ¹¡£

> ¤«¤ó¤À¤µ¤ó¡¢¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£
> 
> > > ¡¦signal_connect ¤ÎºÇ¸å¤Ç¡¢¿¿µ¶Ãͤ«À°¿ôÃͤòÊÖ¤µ¤Ê¤¤¤È¤¤¤±¤Ê¤¤¤è¤¦¤Ê¤Î¤Ç¤¹¤¬¡¢
> > >   ¤³¤ì¤Ï²¿¤ÎÃͤǤ·¤ç¤¦¤«?
> > 
> >    signal ¤Îý¤ò³¤±¤ë¤«¤ä¤á¤ë¤«¤ò»ØÄꤷ¤Þ¤¹¡¨Âôòõå¤À¤È¤Ç»ß¤á¤Þ¤¹¡£
> >   ¤¢¤ë signal ¤ËÊ£¿ô¤Î handler ¤¬ÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë¾ì¹ç¤ÏÅÐÏ¿ËÅϤµ¤ì¤Þ¤¨Â
¤¬¡¢¤µ¤é¤Ë»ÒsignalÊý¸þ¡¢¿Æwidget Êý¸þ¤Ø¤Èé¤ë¤è¤¦¤Ç¤¹¡£
> 
> 3¤Ä¤á¤Î¼ÁÌä¤È´ØÏ¢¤·¤Æ¤¤¤Þ¤¹¤¬¡¢true ¤òÊÖ¤·¤Æ signal ¤Îý¤ò¤ä¤á¤ë¤È¡¨Â
÷éäçåô ¤Î¤â¤È¤â¤È¤Î¥­¡¼ÆþÎÏý¤ò²£¼è¤ê¤Ç¤­¤Ê¤¤¤Î¤Ç¤·¤ç¤¦¤«¡£»î¤·¤¿¤¨Â
¤³¤í¡¢
> 
> text.signal_connect('key_press_event') {|w, e|
>   true
> }
> 
> ¤È¤·¤¿¤À¤±¤Ç¤Ï¡¢¤¢¤¤¤«¤ï¤é¤º¥Ç¥Õ¥©¥ë¥È¤Îưºî(ʸ»ú¤¬ÁÞÆþ¤µ¤ì¤¿¤ê¡¢¥«¡¼
> °Üư¤·¤¿¤ê)¤¬¹Ô¤Ê¤ï¤ì¤Þ¤¹¡£

  Gtk+¤Î¥¹¤òÆÉ¤ó¤Ç¤ß¤¿¤È¤³¤í¡¢¤É¤¦¤â¿Æsignal ¤òé¤ë¤«¤É¤¦¤«¤Ë»È¤ï¤ì¤Æ
¤¤¤ë¤è¤¦¤Ç¤¹¡£Æ±¤¸ signal ¤Î¼¡¤Î handler ¤òé¤é¤Ê¤¤¤è¤¦¤Ë¤·¤¿¤¤¾ì¹ç¤Ï¡¢¨Â
Íý¤ò¤ä¤á¤¿¤¤ handler Æâ¤Ç gtk_signal_emit_stop() ¤ò¼Â¹Ô¤¹¤ì¤Ð¤è¤¤¤è¤¦¤Ç¤¹¡£
# ¤³¤ì¤Ç¤¤¤¤¤ó¤Ç¤·¤ç¤¦¤«? > Gtk¤ÊÊý¡¹

¤È¤ê¤¢¤¨¤º GC ¤Î¼þ¤ê¤Ï¹Í¤¨¤º¤Ë Gtk::Object::signal_emit_stop() ¥á¥É¤ò
ÄêµÁ¤·¤Æ¤ª¤­¤Þ¤·¤¿¡£¥Ñ¥Ã¥ÁÉÕ¤±¤Þ¤¹¡£

 ¤·¤«¤·¡¢Gtk+ ¤Ã¤Æ signal ¼þ¤ê¤¬Æñ¤·¤¤¡Ä
 Á´¤Æ¤Î¥³¡¼¥É¤Ï signal ¤ËÄ̤º¡¢signal ¤òÀ©¤¹¤ë¼Ô¤Ï Gtk+ ¤òÀ©¤¹ :-P


> >   event¼þ¤ê¤Ï¤Þ¤À¤Û¤È¤ó¤É¤Ç¤­¤Æ¤¤¤Þ¤»¤ó¡£¤³¤³¤Ï¥Û¥ó¥È¤Ï GdkEventKey ¥¤¥ó¥¹
> > ¥¿¥ó¥¹¤òÊÖ¤¹¤Ù¤­¤È¤³¤í¤Ç¡¢GdkEventKey ¤Ï keyval ¤È¤«¤¤¤¦¥á¥É¤¬ÄêµÁ¤µ¤ì
> > ¤ë¤è¤¦¤Ç¤¹¡£
> > # ¤³¤ì¤¯¤é¤¤¤Ê¤é¤¹¤°¤Ë¤Ç¤­¤Þ¤¹¤¬¡¢º£¤Á¤ç¤Ã¤ÈË»¤·¤¤¤Î¤Çº£Ìë¤Ë¤Ç¤â
> 
> ¤ª¼ê¿ô¤Ç¤¹¤¬À§È󤪴ꤤ¤·¤Þ¤¹¡£

  KeyEvent ¤À¤±¼ÂÁõ¤·¤Þ¤·¤¿¡£Ðö¤Ë¤Ç¤â¤â¤¦¾¯¤·À°Íý¤·¤Æ¿·¤·¤¤ÈǤò·¤Æ¤¨Â
¤­¤Þ¤¹¡£gdk/gdkkeysyms.h ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë̵¿ô¤Î:) ¥­¡¼ÈÖ¹æ¤â¤È¤­¤ËÉÕ¤±
¤Þ¤¹¤Î¤Ç¡¢É¬ÍפǤ·¤¿¤é¤·¤Ð¤é¤¯¤ÏľÀÜÀ°¿ô¤òµ­·¤Æ²¼¤µ¤¤¤Þ¤»¡¨Â
  ÇôëÔåø¤Î¥­¡¼ÆþÎϤò²£¼è¤ê¤¹¤ë¥µ¥ó¥×¥ë¤òÉÕ¤±¤Æ¤ª¤­¤Þ¤¹¡£¾®Ê¸»ú¤ÇÆþÎϤ·¤Æ
¤âÂçʸ»ú¤Ë¤·¤Þ¤¹¡£


> >   gtktext ¤Ë¤Ï control_key['z'-'a'+1] ¤È¤«¤¤¤Ã¤¿ÇÛÎó¤¬ÍѰդµ¤ì¤Æ¤¤¤Æ¡¢¤³¤ì
> > ¤Ë´Ø¿ô¥Ý¥¤¥ó¥¿¤òËä¤á¹þ¤ó¤Ç¤¤¤Þ¤¹¡£¤Ç¡¢¼ÂºÝ¤Ë ctrl-a ¤È¤«¤¬²¡¤µ¤ì¤ë¤È¡¢
> > control_key[0] ¤Î´Ø¿ô¤¬¸Æ¤Óµ¤ì¤ë¡£¤À¤«¤é¡¢¤³¤ÎÇÛÎó¤ËÊ̤δؿô¥Ý¥¤¥ó¥¿¤ò¨Â
Æþ¤¹¤ì¤Ð¤Ç¥­¡¼¥Ð¥¤¥ó¥É¤¬Êѹ¹¤Ç¤­¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¤Í¡£¤¿¤À¡¢gtk¤Î´Ø¿ô¤È¤·
> > ¤ÆÍѰդϤµ¤ì¤Æ¤¤¤Ê¤¤¤è¤¦¤Ç¤¹¤Î¤Ç¡¢»ÅÍͤ«¤é¹Í¤¨¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
> 
> Tk ¤Ç¤Ï¥¤¥Ù¥ó¥È¤ò <Control-a> ¤Î¤è¤¦¤Ë»ØÄê¤Ç¤­¤Þ¤¹¤Í¡£¤µ¤é¤Ë 
> <Control-Button1> ¤È¤« <Control-Meta-a> ¤È¤«¤Ç¤­¤Þ¤¹¡£GTK ¤Ç¤â¤³¤³¤Þ¤Ç¤Ç
> ¤­¤ë¤È¤¦¤ì¤·¤¤¤Ê¤È»×¤¤¤Þ¤¹¡£

  ´ðËÜ¤Ï Gtk+ ¸ß´¹¤Ë¤·¤¿¤¤¤Î¤Ç¡¢Í¾Ê¬¤Êµ¡ÁȤ߹þ¤à¤È¤·¤Æ¤âÊ̤ˤʤë¤È»×¤¤
¤Þ¤¹¡£ÌäÂê¤Ï Gtk+ ¤Ç¤âľÀÜ´Ø¿ô¥Ý¥¤¥ó¥¿¤òÂåÆþ¤¹¤ì¤Ð¾å¤Îµ¡²Ì¤¿¤»¤ë¤Î¤À¤±
¤ì¤É¡¢¤Ïǧ¤á¤é¤ì¤Æ¤¤¤ëÊýË¡¤Ê¤Î¤«¤É¤¦¤«¤«¤Ê¡Ä¡£¤È¤ê¤¢¤¨¤º¤ÏÂåÍѤǤ­¤Þ¤¹
¤Î¤Ç¡¢Ä󶡤·¤Ê¤¤¤Ç¤ª¤­¤Þ¤¹¡£


----Next_Part(Thu_Dec_24_07:15:30_1998_893)--
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:15:30_1998_893)--
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:15:30_1998_893)----