UTF8_STRING

PyGObject Tips 書き直しもやっと最後の項目になった。
そのドラッグアンドドロップについてチマチマ調べている。

とりあえず文字列のドロップを追加することに、したんだけど。
ようするに Gedit 等で文字列選択してドラッグしたもののことね。
下記コメントアウトが昔書いたやり方です。

#!/usr/bin/env python3

import sys, gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib#, Gdk

class Win(Gtk.ApplicationWindow):
    '''
        TreeView
    '''
    def __init__(self, app):
        Gtk.ApplicationWindow.__init__(self, application=app, title='Py')
        # DnD
        '''
        uri = Gtk.TargetEntry.new('text/uri-list', 0, 0)
        plain = Gtk.TargetEntry.new('text/plain', 0, 0)
        self.drag_dest_set(
                Gtk.DestDefaults.MOTION |
                Gtk.DestDefaults.HIGHLIGHT |
                Gtk.DestDefaults.DROP,
                [uri, plain],
                Gdk.DragAction.COPY )
        '''
        self.drag_dest_add_uri_targets()
        self.drag_dest_add_text_targets()
        ###self.drag_dest_add_image_targets()
        #
        self.label = Gtk.Label(label='Please drop your files')
        self.add(self.label)
        self.show_all()

    def do_drag_data_received(self, context, x, y, data, info, time):
        '''
            data: GtkSelectionData
        '''
        #print(data.targets_include_text()) # All False
        name = data.get_data_type().name()
        self.props.title = name
        #if name == 'text/plain':
        if name == 'UTF8_STRING':
            s = data.get_text()
            self.label.set_text(s)
        elif name == 'text/uri-list':
            uris = data.get_uris()
            l = []
            for uri in uris:
                fn = GLib.filename_from_uri(uri)[0]
                l.append(GLib.path_get_basename(fn))
            self.label.set_text('\n'.join(l))
        else:
            self.label.set_text(name)

class App(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(self)

    def do_startup(self):
        Gtk.Application.do_startup(self)
        Win(self)

    def do_activate(self):
        self.props.active_window.present()

app = App()
app.run(sys.argv)

えぇ。。。
gtk_drag_dest_add_text_targets を指定するだけだった。
てか UTF8_STRING という ContentType があったんだ、知らなかった。
新しいのかと思ったら GTK+2.6 からみたい、何故知らなかったんだ俺!

gtk_selection_data_targets_include_text は何をやっても False だ。
上記手段で判別はできるけど、この関数っていったい何なんだろう?

gtk_drag_dest_add_image_targets は簡単に試す手段が無かった。
だいたい使い方は解るので Tips ページを作る時に。
今週こそ終わらせなきゃ、おかげで mac 関連が完全に止まっているし。
macOS がバージョンアップする前にさわっておきたい。