[英]Get the GTK Window from which a Clipboard signal_owner_change originated (Gtkmm)
我的应用程序需要收听剪贴板的更改以进行记录。 目前,我可以使用signal_owner_change
回调来实现这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()
)进行比较,该窗口被复制但没有指针匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.