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 <[email protected]> wrote:
> On 16 February 2013 16:07, salsaman <[email protected]> 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
>> [email protected]
>> https://mail.gnome.org/mailman/listinfo/gtk-list
_______________________________________________
gtk-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/gtk-list