我试图通过单击(并按住)其子窗口小部件来拖放(移动)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;
}
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;
}
享受编程的乐趣