Мое приложение должно прослушивать изменения буфера обмена, чтобы записать их. В настоящее время я могу добиться этого с помощью обратного вызова signal_owner_change
, который затем запрашивает содержимое буфера обмена. Однако мне нужно выяснить, из какого окна произошло событие, так что я могу игнорировать, когда пользователь копирует текст из самого приложения (используя Ctrl + C , а не программно).
Обратный вызов signal_owner_change
принимает GdkEventOwnerChange*
в качестве параметра, который содержит поля owner
и window
типа GdkWindow*
.
- Поле
owner
изменения для каждого отдельного приложения / окна, из которого я копирую, но никогда не соответствует указателю окна моего приложения. - Поле
window
всегда одинаково, но также не соответствует окну моего приложения.
К сожалению, в документации GTK + очень неясно, что такое «владелец» и «окно» GdkEventOwnerChange или как использовать данные.
Мое окно приложения - это класснаследование от Gtk::ApplicationWindow
. Я получаю GdkWindow*
как таковое:
GdkWindow* win = gtk_widget_get_window(GTK_WIDGET(gobj()));
Вот выдержка из обработчика даже владельца изменения буфера обмена: (в другом классе, который получает указатель окна выше как parentWindow
)
MyNamespace::MyClass::MyClass(GdkWindow* parentWindow)
: parentWindow(parentWindow) {
// setup UI, etc...
clipboard = Gtk::Clipboard::get();
clipboard->signal_owner_change().connect(
sigc::mem_fun(*this, &MyClass::on_clipboard_owner_change));
}
void MyNamespace::MyClass::on_clipboard_owner_change(GdkEventOwnerChange* event) {
std::cout << "Owner: " << event->owner
<< ", window: " << event->window
<< ", parent: " << parentWindow
<< std::endl;
// This does not work
if (event->owner == parentWindow)
return;
switch (get_clipboard_content_type()) {
case ClipboardDataType::Text: {
clipboard->request_text(
sigc::mem_fun(*this, &MyClass::on_clipboard_text_received));
break;
}
case ClipboardDataType::Image: {
std::cout << "Image is available, unimplemented handler" << std::endl;
break;
}
case ClipboardDataType::URIs: {
std::cout << "URIs is available, unimplemented handler" << std::endl;
break;
}
default: {
std::cout << "Unknown or unsupported clipboard data type" << std::endl;
}
}
}
Вот вывод консоли:
# Copy from another application
Owner: 0x5571ec44dc80, window: 0x5571ec08f330, parent: 0x5571ec08f4c0
# Copy from the application itself
Owner: 0x5571ec44de10, window: 0x5571ec08f330, parent: 0x5571ec08f4c0
Я попытался сравнить с окном верхнего уровня Gtk::Application
или с окном Gtk::Label
(label->get_window()->gobj()
), которое копируется, нони один из указателей не совпадает.