Popover Test in Pure Wayland

In this post, I share a sample C code that tests focus behavior by triggering a popover in a pure Wayland environment. In the example, pressing the backspace key on a text view causes a popover to appear—a simple yet effective way to verify whether the widget has focus.

Below is the complete code:

void on_backspace (GtkTextView editor, GtkPopover popover)
{
  puts ("on_backspace");
  /*gtk_widget_show (popover);*/
  gtk_popover_popup ((GtkPopover*) popover);
}

static void
activate (GtkApplication* app,
          gpointer        user_data)
{
  GtkWidget* window;
  GtkWidget* editor;
  GtkWidget* popover;
  GtkWidget* label;

  GdkRectangle rect = { 0, 40, 10, 10 };

  window = gtk_application_window_new (app);
  label = gtk_label_new ("Popover");
  popover = gtk_popover_new ();
  gtk_popover_set_child ((GtkPopover*) popover, label);
  gtk_widget_set_parent (popover, window);
  gtk_popover_set_pointing_to ((GtkPopover*) popover, &rect);

  editor = gtk_text_view_new ();
  g_signal_connect (editor, "backspace", (GCallback) on_backspace, popover);

  gtk_window_set_title (GTK_WINDOW (window), "Window");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);
  gtk_window_set_child ((GtkWindow*) window, editor);
  gtk_widget_show (window);
}

int
main (int    argc,
      char **argv)
{
  GtkApplication *app;
  int status;

  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);

  return status;
}