如何使用 GtkGestureClick 拖放(移动)GtkWindow 子部件?

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

我试图通过单击(并按住)其子窗口小部件来拖放(移动)GtkWindow 在屏幕上。这是我的脚本,它正在运行,但在编译时显示警告: 'gtk_widget_translate_coordinates' 已弃用:使用 'gtk_widget_compute_point' 代替。

有人可以告诉我如何实现 gtk_widget_compute_point 功能吗?

#include <gtk/gtk.h>

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)
{
  GtkWidget *window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "example");

  GtkWidget *fixed = gtk_fixed_new ();
  gtk_window_set_child ((GtkWindow    *)window, fixed);
  gtk_widget_set_size_request (fixed, 400, 200);

  GtkWidget *c_btn = gtk_button_new_from_icon_name ("window-close-symbolic");
  gtk_fixed_put (GTK_FIXED (fixed), c_btn, 125, 90);


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


  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
投票

gtk_widget_compute_point
函数使用
graphene_point_t
,一种能够用两个坐标描述点的数据结构:

graphene_point_t.x

graphene_point_t.y

在我看来,切换给定程序的最简单方法如下。

#include <gtk/gtk.h>

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;
  // added
  const graphene_point_t *point = graphene_point_init (graphene_point_alloc (), x, y);
  graphene_point_t *point1 = graphene_point_init (graphene_point_alloc (), x, y);

  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);
  // changed
  gboolean a =gtk_widget_compute_point (widget, GTK_WIDGET (gtk_widget_get_root (widget)),point,point1);
  gdk_toplevel_begin_move (GDK_TOPLEVEL (surface), gdk_event_get_device (event), button, x, y, timestamp);
  gtk_event_controller_reset (GTK_EVENT_CONTROLLER (gesture));
  // added
  graphene_point_free(point1);
  free((void*)point);
}


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

  GtkWidget *fixed = gtk_fixed_new ();
  gtk_window_set_child ((GtkWindow    *)window, fixed);
  gtk_widget_set_size_request (fixed, 400, 200);

  GtkWidget *c_btn = gtk_button_new_from_icon_name ("window-close-symbolic");
  gtk_fixed_put (GTK_FIXED (fixed), c_btn, 125, 90);


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


  gtk_window_present ((GtkWindow*)window);
}

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

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

  return status;
}

享受编程的乐趣

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