LINUX.ORG.RU

gtk & x-selection


0

0

Задача: получить в приложении на gtk2, содержимое
primary selection - выделенный в другом приложении
текст.

Делаю так:
(приложение на pygtk, но думаю это не существенно)

========================================
#!/usr/bin/env python
import gtk

class Selection:
    def __init__(self):
        self.window = gtk.Window()
        self.window.connect("selection_received", self.selection_received_cb)

    def get_selection(self):
        self.window.selection_convert("PRIMARY", "STRING", long(0))
        gtk.main()
        return self.data

    def selection_received_cb(self, widget, data, val):
        self.data = data.data
        gtk.main_quit()

s = Selection()
print "selected:", s.get_selection()
========================================

Работает, но не всегда. Если выделен _русский_ текст
например в xterm - получаем строку в локальной кодировке.
Если выделение в gtk2-приложении - получаем что-то типа:

\x{043F}\x{0438}\x{0442}\x{043E}\x{043D}

Как нибудь это можно исправить? Возможно надо просить не "STRING",
а что-то ещё?

Есть ли у кого-нибудь пример как корректно получить selection?
(Не обязательно на питоне, можно на си)

anonymous

void gtk_clipboard_request_text (GtkClipboard *clipboard, GtkClipboardTextReceivedFunc callback, gpointer user_data);

Requests the contents of the clipboard as text. When the text is later received, it will be converted to UTF-8 if necessary, and callback will be called.

The text parameter to callback will contain the resulting text if the request succeeded, or NULL if it failed. This could happen for various reasons, in particular if the clipboard was empty or if the contents of the clipboard could not be converted into text form.

clipboard : a GtkClipboard callback : a function to call when the text is received, or the retrieval fails. (It will always be called one way or the other.) user_data : user data to pass to callback.

anonymous
()
Ответ на: комментарий от anonymous

Ну и в pygtk есть clipboard.request_text. Лучше использовать эту функцию, а если уж она и не работает, то все-таки, это проблемы X-ого буфера и различных приложений, с этим ничего не поделаешь. Разве что xterm пофиксить.

anonymous
()
Ответ на: комментарий от anonymous

Это проблемы GTK+ и его авторов. Кроме изобретения собственных стандартов все же неплохо бы и существующие (ICCCM) почитывать.

anonymous
()

def find_pressed_cb(widget, event, data): if event.button == 2: result = data.selection_convert("PRIMARY", "UTF8_STRING")

def clipboard_data_received_cb(widget, selection_data, data): if str(selection_data.type) == "UTF8_STRING": textentry.entry.set_text(selection_data.get_text()) entry_pressed_cb(textentry)

ebox = gtk.EventBox() button.connect('button_press_event', find_pressed_cb, ebox) ebox.connect('selection_received', clipboard_data_received_cb)

drF_ckoff ★★
()
Ответ на: комментарий от drF_ckoff

request_text как раз это и делает :) И даже больше.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.