[#50363] [質問] Ruby socket.send でUDP Packet が出ない? ネットワーク環境によるものか? — <yamataka@...08.itscom.net>

山口と申します。

9 messages 2016/07/27

[ruby-list:50357] Re: [再]Re: TkDND での日本語名の扱い

From: Toshihiko Ichida <dogatana@...>
Date: 2016-07-22 22:23:42 UTC
List: ruby-list #50357
こんにちは、市田です。

tcl側を修正するのはよろしくなさそうなので、tkdnd.rb 側で
text/plain 用と text/uri-list 用のcallback用クラスを用意
することで、

On 2016/07/12 19:53, Toshihiko Ichida wrote:

> また上の
>> PROC_TBL での ?s の処理が TkComm.method(:string) ですから,
> も text/plain の場合に "{abc}" を食べさせると、{}が剥ぎ取られてabcのみ
> になってしまうので、それはそれでよろしくなさそうです。

> 期待としては
> 1) text/plain の場合文字列が取得できる
> 2) text/uri-list の場合文字列(ファイル名)のArrayが取得できる
> なので、この type 情報が、解釈の際に利用することができれば、Dropされた文
> 字列が、単なる文字列と、リストを表す文字列かの判断ができ、利用する側とし
> ては便利です。

の両方を満足できました。

callback クラスでは
・text/plain の場合は何もせず文字をそのまま返す
・text/uri-list の場合は、TkComm.simplistでArrayへ
とし、Win32の場合は更に
・Encodingをutf-8へ強制変換
・text/uri-list の場合、\ を / に変更
としています。

こちらのWindows環境で、ブラウザからのテキストのドロップ、
Explorerからのファイル名のドロップは期待どおり動作しています。
他の環境、Ruby/Tkのアプリ内のDND動作は見られていません。

市田


--- tkdnd.rb.orig	Mon Mar 14 11:24:12 2016
+++ tkdnd.rb	Sat Jul 23 07:06:03 2016
@@ -80,6 +80,45 @@
       _setup_subst_table(KEY_TBL, PROC_TBL);
     end

+    class DND_SubstText < TkUtil::CallbackSubst
+      KEY_TBL = [
+        [ ?D, ?d, :data ],
+        nil
+      ]
+
+      PROC_TBL = [
+        [ ?d, proc do |s|
+                s.force_encoding('utf-8') if TclTkLib::WINDOWING_SYSTEM
== 'win32'
+                s
+              end
+        ],
+        nil
+      ]
+      _setup_subst_table(KEY_TBL, PROC_TBL);
+    end
+
+    class DND_SubstFileList < TkUtil::CallbackSubst
+      KEY_TBL = [
+        [ ?D, ?d, :data ],
+        nil
+      ]
+
+      PROC_TBL = [
+        [ ?d, proc do |s|
+                if TclTkLib::WINDOWING_SYSTEM == 'win32'
+                  s.force_encoding('utf-8')
+                  TkComm.simplelist(s).map { |x| x.tr('\\', '/') }
+                else
+                  TkComm.simplelist(s)
+                end
+              end
+        ],
+        nil
+      ]
+      _setup_subst_table(KEY_TBL, PROC_TBL);
+    end
+
+
     module DND
       def self.version
         begin
@@ -113,6 +152,14 @@
       #end
       def dnd_bindtarget(type, event, *args)
         # if args[0].kind_of?(Proc) || args[0].kind_of?(Method)
+        klass = case type
+                when 'text/plain'
+                  DND_SubstText
+                when 'text/uri-list'
+                  DND_SubstFileList
+                else
+                  DND_Subst
+                end
         if TkComm._callback_entry?(args[0]) || !block_given?
           cmd = args.shift
         else
@@ -125,11 +172,11 @@
         event = tk_event_sequence(event)
         if prior.kind_of?(Numeric)
           tk_call('dnd', 'bindtarget', @path, type, event,
-                  install_bind_for_event_class(DND_Subst, cmd, *args),
+                  install_bind_for_event_class(klass, cmd, *args),
                   prior)
         else
           tk_call('dnd', 'bindtarget', @path, type, event,
-                  install_bind_for_event_class(DND_Subst, cmd, prior,
*args))
+                  install_bind_for_event_class(klass, cmd, prior, *args))
         end
         self
       end



In This Thread