October 23, 2024
Chicago 12, Melborne City, USA
C#

How to drag & drop (move) GtkWindow using GtkGestureClick on a child widget?


I am trying to drag and drop(move) the GtkWindow on the screen, by clicking(& holding) on its child widget. This is my script, which is working, but it shows warning when compiling: ‘gtk_widget_translate_coordinates’ deprecated: use ‘gtk_widget_compute_point’ instead.

Can someone tell me how to implement the gtk_widget_compute_point function?

#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;
}



You need to sign in to view this answers

Leave feedback about this

  • Quality
  • Price
  • Service

PROS

+
Add Field

CONS

+
Add Field
Choose Image
Choose Video