如何通过按住 GtkNotebook 标题来拖放 GtkWindow?

问题描述 投票:0回答:1

我试图通过按住鼠标单击笔记本标题来移动(拖放)GtkWindow。但我的问题是,由于拖放事件控制器信号,其他子小部件(选项卡上的按钮)无法正常工作。 有人可以告诉我如何在 GtkNotebook 标头中正确实现拖放窗口信号,而不中断子部件。

#include <gtk/gtk.h>
GtkWidget *window;
GtkWidget *notebook;

static gboolean close_page_cb( GtkWidget *widget, gpointer   user_data )
{
  int page = gtk_notebook_get_current_page ((GtkNotebook *)user_data);
  int total_page = gtk_notebook_get_n_pages ((GtkNotebook *)user_data);
      gtk_notebook_remove_page ((GtkNotebook *)user_data, page);
}


static void
start_move (GtkGestureClick *gesture,
            int n_press,
            double x,
            double y,
            gpointer   data)
{
  GtkWidget *widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
  GdkSurface *surface;
  GdkEvent *event;
  guint button;
  guint32 timestamp;

  gtk_gesture_set_state (GTK_GESTURE (gesture), GTK_EVENT_SEQUENCE_CLAIMED);
  surface = gtk_native_get_surface (gtk_widget_get_native (widget));
  event = gtk_event_controller_get_current_event (GTK_EVENT_CONTROLLER (gesture));
  if (gdk_event_get_event_type (event) == GDK_BUTTON_PRESS)
    button = gdk_button_event_get_button (event);
  else
    button = 0;
  timestamp = gdk_event_get_time (event);
  gtk_widget_translate_coordinates (widget, GTK_WIDGET (gtk_widget_get_root (widget)),
                                x, y, &x, &y);
  gdk_toplevel_begin_move (GDK_TOPLEVEL (surface), gdk_event_get_device (event), button, x, y, timestamp);
  gtk_event_controller_reset (GTK_EVENT_CONTROLLER (gesture));
}



static void
activate (GtkApplication *app,
      gpointer        user_data)
{
  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "example");
  gtk_window_set_default_size (GTK_WINDOW (window), 400, 200);

  GtkWidget *grid = gtk_grid_new ();
  gtk_window_set_child ((GtkWindow    *)window, grid);
  gtk_widget_set_vexpand(grid, TRUE);
  gtk_widget_set_hexpand(grid, TRUE);

    /* Create notebook, place position of tabs */
    notebook = gtk_notebook_new ();
    gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
    gtk_grid_attach (GTK_GRID (grid), notebook, 0, 6, 3, 3);
    gtk_notebook_set_scrollable((GtkNotebook     *)notebook, TRUE);
    gtk_widget_set_vexpand(notebook, TRUE);
    gtk_widget_set_hexpand(notebook, TRUE);


    GtkGesture *gesture;
    gesture = gtk_gesture_click_new ();
    g_signal_connect (gesture, "pressed", G_CALLBACK (start_move), NULL);
    gtk_widget_add_controller (notebook, GTK_EVENT_CONTROLLER (gesture));

   /* Append page to the notebook */
    GtkWidget *tv = gtk_text_view_new ();
    GtkWidget *label = gtk_label_new ("example");
    GtkWidget *button = gtk_button_new_with_label ("  X  ");

    GtkWidget *box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
    gtk_box_prepend ((GtkBox  *)box, label);
    gtk_box_append ((GtkBox  *)box, button);

    gtk_notebook_append_page (GTK_NOTEBOOK(notebook), tv, box); 
    g_signal_connect (button, "clicked", G_CALLBACK (close_page_cb), notebook);

  
  gtk_window_present ((GtkWindow*)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;
}
c gtk4
1个回答
0
投票

解决方案是另一个仅响应按钮的 EventController。

    gtk_notebook_append_page (GTK_NOTEBOOK(notebook), tv, box);

    GtkGesture *gesture_1 = gtk_gesture_click_new();
    gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture_1), 0);
    gtk_widget_add_controller(button,(GTK_EVENT_CONTROLLER(gesture_1)));
    g_signal_connect (gesture_1, "pressed", G_CALLBACK (close_page_cb), notebook);


  //  g_signal_connect (button, "clicked", G_CALLBACK (close_page_cb), notebook);

但是功能上还是有问题:

close_page_cb

但是这个问题应该得到回答。

问候

© www.soinside.com 2019 - 2024. All rights reserved.