Empty the Clipboard. and Set Clipboard Text

Gedit の GtkToolbar を見ていて気が付いた。

Clipboard が空の時に Gedit を起動。
ウエブブラウザ等の別アプリで Ctrl+C を押し何か文字列をコピー。
すると Gedit の貼り付けアイコンが自動的に有効になる。
当然 Ctrl+V で貼り付け可能。

リアルタイムで監視していたんだね。
クリップボードに何か入っているかのインジケータとして使える、便利だ。

それはともかく、ウエブブラウザを終了してもクリップボードに残っている。
あれ?以前はコピー元を終了すると使えなくなっていたはずだが。
GNOME2 時代の古い記憶だから今は変わっているのかもしれない。

よし実験、ちなみに今後このブログは Python3 コードで書きます。

#!/usr/bin/env python3

from gi.repository import Gtk, Gdk

"""
    Empty the Clipboard.
"""

display = Gdk.Display.get_default()
clipboard = Gtk.Clipboard.get_for_display(display, Gdk.SELECTION_CLIPBOARD)
clipboard.set_text("Failed", -1)

だめジャン!
と思ったけど Gedit のツールバーを見ると貼り付けアイコンが無効になっている。
つまりこうするとクリップボードを空にできるってことみたい。

不本意だがクリップボードを空にする方法を発見してしまった。
使い道はともかく。

何故だろう、我が clipoli と同じコードを書いているのに。
もしかして mainloop が必用なのだろうか。

clipoli から mainloop を通る最小限コードを抜き出して実験。

#!/usr/bin/env python3

from gi.repository import Gtk, Gdk

"""
    Success additional main loop
"""

class ClipboardTest(Gtk.Menu):
    def __init__(self):
        Gtk.Menu.__init__(self)
        menuitem = Gtk.MenuItem.new_with_mnemonic("_Set Clipboard Text")
        menuitem.connect("activate", self.on_menuitem)
        self.append(menuitem)
        self.show_all()
        self.popup( None, None, None, None, 0, 0)

    def on_menuitem(self, widget, data=None):
        display = Gdk.Display.get_default()
        clipboard = Gtk.Clipboard.get_for_display(display, Gdk.SELECTION_CLIPBOARD)
        clipboard.set_text("Sucsess", -1)
        Gtk.main_quit()

ClipboardTest()
Gtk.main()

これなら上手くいく、やはり一旦メインループを回す必用があるみたい。
つまりループ無しだと set_text に NULL ポインタが入ってしまうのかな。
とにかく挙動は解ったので内部の細かいことはイイや(ぉい!

しかし gtk_main_quit を呼ぶ必用があるのでコードが冗長だ。
メニューを出さなくても呼べる何か上手い手段は、、、

そうだ GtkApplication があるじゃないか。

#!/usr/bin/env python3

from gi.repository import Gtk, Gdk

"""
    Put the text to clipboard.
"""

class App(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(self)
        self.connect("activate", self.on_activate)
        
    def on_activate(self, data=None):
        display = Gdk.Display.get_default()
        clipboard = Gtk.Clipboard.get_for_display(display, Gdk.SELECTION_CLIPBOARD)
        clipboard.set_text("Success", -1)

app = App()
app.run(None)

GtkApplication ならこんなにスッキリなコードに。
クリップボードにスパッと特定文字列を入れるコマンド程度なら簡単に作れるね。

**********

そういうことなら minipoli の Linux バージョンもイケそう。
なんて思ったけど。

ctrl_c

Nautilus で Ctrl+C して Editor で Ctrl+V すると実はフルパス貼り付けができる。
gnome-terminal に DnD する、そこから Ctrl+Shift+C なんて手段もあるし。
GNOME って便利すぎ、デフォルトでコレだもん。
たまに Windows を使うと何も出来なくてイラッとするのは私だけなのか?

何より GetAsyncKeyState に相当する API が Gtk には無いようだ。
minipoli の移植は作るだけムダだしムリっぽいかな。
でも Palepoli 復活という手もあるな、誰も覚えていないだろうけど。