history

青木日記 RSS

<前の日 | この月 | 次の日>

2003-05-25

clipshare

クリップボード共有デーモン。 Java で書くと言ったものの、 なぜか Java で書いたもの以外のアプリケーションと 同期してくれないので仕方なく Ruby で書くことにした。 Windows 側も最初の目論見通り C# でいってみよう。

とか言ってると結局全部の言語で書くことになったりする。

clipshare / Ruby ext

Ruby の TCPSocket と X イベントを同時に待つために

rb_thread_wait_fd(ConnectionNumber(display));

としてみたが、一瞬で終わってしまう。なぜだ……。

とりあえず諦めた (早っ)。

むがー! なんで生の select ではうまくいくんだあーっ!

あー! わかたー! シングルスレッドだからだ! シングルスレッドだから rb_thread_schedule がすぐ戻るんだ! くそう、そういえばこれは自分で RHG に書いたような気がする……

clipshare / Ruby

肝心のデーモン作りに着手した。 即座に謎の同期バグに遭遇。

プログラムの最初で stdout をフラッシュしとくと動く。 消すとブロックする。 print しても動いてしまうのでデバッグできない。

ちなみに肝心の内容はこれだけっす。

def main
  ....
  require 'clipshare/xclipboard'
  x_main
end
 
def x_main
  $defout.flush   # I don't know why this statement is needed.
  content = ClipShare::XClipboard.get_string
  while true
    ClipShare::XClipboard.put_string content
    content = ClipShare::XClipboard.get_string
    puts "owner changed; content=#{content.inspect}"
  end
end
 
main

put_string は selection オーナーでなくなるまでブロックするので、 put_string が終わったら別のアプリケーションがオーナーになったということ。 そうしたら即座にクリップボードの中身をそっくり奪って自分がオーナーに復帰する。 puts してるとこで TCPSocket 使ってオーナー宣言してやれば完成〜。

とりあえず動いているようだ。

clipshare / Ruby

甘かった。クリップボードインターフェイスなんかより、 複数ホスト間で同期をとるほうがずっと難しいじゃないか。 かなり慎重に伝達経路をチェックしないとあっさり無限ループになるな。

とりあえず Linux(Ruby) → Windows(Ruby+C#) の push 実験は成功した。

To do

  • Windows の Ruby 部分を C# で書き直す
  • C# でクリップボードの変更を検出する
  • Windows サービスになる
  • Java 版のバグを究明する

clipshare / C#

Windows 側は完全 C# 化した。 あとはクリップボードの内容変更を検出することだけど、 これはポーリングしてみるしかないのかな。 COM に触るとできたりするんだろうか。 ま、とりあえずはポーリングでいいか。 富豪で行こう。

poll

そういえばプログラム初心者のころ、 polling と言われるとどうしても 温泉を掘るボーリングを思い浮かべてしまって困りました。 今でも poll(2) を見ると地盤に杭を打ちこんで ファイルディスクリプタを調べている様がありありと脳内に投射されます。

本日のツッコミ(全2件) [ツッコミを入れる]
sheepman (2003-05-25 12:54)

daveさんの Xselection が役に立つかも。

http://www.yasgursfarm.us/rdic/xselection.html.ja

あおき (2003-05-25 13:17)

いま書いたやつとほとんど同じでした……。がくり。

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS