Получить окно GTK, из которого был создан буфер обмена signal_owner_change (Гткмм) - PullRequest
1 голос
/ 01 декабря 2019

Мое приложение должно прослушивать изменения буфера обмена, чтобы записать их. В настоящее время я могу добиться этого с помощью обратного вызова 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()), которое копируется, нони один из указателей не совпадает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...