Re: Possible bug in gdk_window_get_device_position ?



The device value was not NULL when the crash occured, I checked.

There are also similar crashes in gdk_device_warp(),
gdk_device_get_position(), and gdk_device_get_window_at_position().


I also tested with code like:

GdkDeviceManager *devman=gdk_display_get_device_manager(disp);
GList *devlist=gdk_device_manager_list_devices(devman,GDK_DEVICE_TYPE_MASTER);

...

        for (k=0;k<g_list_length(devlist);k++) {
          GdkDevice *device=(GdkDevice *)g_list_nth_data(devlist,k);
          if (gdk_device_get_display(device)==disp&&
              gdk_device_get_source(device)==GDK_SOURCE_MOUSE)
            mouse_device=device;
        }

If I use mouse_device then it also works.



Regards,
Salsaman.


http://lives.sourceforge.net
https://www.ohloh.net/accounts/salsaman


On Sat, Feb 16, 2013 at 2:53 AM, Lex Trotman <elextr gmail com> wrote:
On 16 February 2013 16:07, salsaman <salsaman gmail com> wrote:
Hi,
with gtk 3.4.4 I get a crash with code like:

gboolean button_callback (GtkWidget *widget, GdkEventButton *event,
gpointer user_data) {
  gint x,y;
  GdkWindow *xwin=gtk_widget_get_window(widget);
  GdkDevice *device=gdk_event_get_source_device((GdkEvent *)event);
Which IIRC can return NULL, so you will crash in those situations,
test your return values :)

  gdk_window_get_device_position (xwin,device,&x,&y,NULL);  // crash !!

}

There is not even a stack trace, it just instantly quits the app.


However, if I replace:

GdkDevice *device=gdk_event_get_source_device((GdkEvent *)event);

with:

GdkDeviceManager *device_manager =
gdk_display_get_device_manager(gdk_window_get_display(xwin));
GdkDevice *device = gdk_device_manager_get_client_pointer (device_manager);
This doesn't return NULL because it always can find a display.

then there is no crash. Is this a bug ?

In the documentation for gdk_device_manager_get_client_pointer(), it says:
"You should use this function sheldomly (sic), only in code that isn't
triggered by a GdkEvent..."
Well, it works in the situation you happened to use it in, but that
doesn't guarantee it works in all situations.  For the documentation
to warn you not to use it, there only needs to be one situation in
which it fails.

http://developer.gnome.org/gdk3/stable/GdkDeviceManager.html#gdk-device-manager-get-client-pointer


If it is not a bug then the documentation is somewhat misleading.

It would be a bug and the documentation misleading if it worked in all
circumstances and was guaranteed by the developers that it would keep
doing so.  Neither of those conditions is known to be true.

Cheers
Lex



Regards,
Salsaman.


http://lives.sourceforge.net
https://www.ohloh.net/accounts/salsaman
_______________________________________________
gtk-list mailing list
gtk-list gnome org
https://mail.gnome.org/mailman/listinfo/gtk-list


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]