繁体   English   中英

获取GTK窗口,剪贴板信号源自该GTK窗口(Gtkmm)

[英]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*作为一个参数,它包含的字段ownerwindow类型的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM