LdCategorySymbolView: work around a mysterious bug

We sometimes get a deselecting event when toying around with menus
and then dragging.  There might be a simpler reproducer.
This commit is contained in:
Přemysl Eric Janouch 2021-07-24 10:36:14 +02:00
parent 7f357cb7c8
commit 3102bc0cb9
Signed by: p
GPG Key ID: A0420B94F92B9493
1 changed files with 14 additions and 4 deletions

View File

@ -47,6 +47,7 @@ SymbolData;
* @path: path to the category within the library. * @path: path to the category within the library.
* @layout: (element-type SymbolData *): current layout of symbols. * @layout: (element-type SymbolData *): current layout of symbols.
* @preselected: currently preselected symbol. * @preselected: currently preselected symbol.
* @dragged: currently dragged symbol.
*/ */
struct _LdCategorySymbolViewPrivate struct _LdCategorySymbolViewPrivate
{ {
@ -54,6 +55,7 @@ struct _LdCategorySymbolViewPrivate
gchar *path; gchar *path;
GSList *layout; GSList *layout;
SymbolData *preselected; SymbolData *preselected;
SymbolData *dragged;
}; };
enum enum
@ -180,6 +182,7 @@ layout_destroy (LdCategorySymbolView *self)
g_slist_free (self->priv->layout); g_slist_free (self->priv->layout);
self->priv->layout = NULL; self->priv->layout = NULL;
self->priv->preselected = NULL; self->priv->preselected = NULL;
self->priv->dragged = NULL;
} }
static GSList * static GSList *
@ -457,12 +460,12 @@ on_drag_data_get
LdCategorySymbolView *self; LdCategorySymbolView *self;
self = LD_CATEGORY_SYMBOL_VIEW (widget); self = LD_CATEGORY_SYMBOL_VIEW (widget);
g_return_if_fail (self->priv->preselected != NULL); g_return_if_fail (self->priv->dragged != NULL);
gtk_selection_data_set (selection_data, gtk_selection_data_set (selection_data,
gtk_selection_data_get_target (selection_data), gtk_selection_data_get_target (selection_data),
8, (guchar *) self->priv->preselected->path, 8, (guchar *) self->priv->dragged->path,
strlen (self->priv->preselected->path)); strlen (self->priv->dragged->path));
} }
static void static void
@ -474,6 +477,9 @@ on_drag_begin (GtkWidget *widget, GdkDragContext *ctx, gpointer user_data)
self = LD_CATEGORY_SYMBOL_VIEW (widget); self = LD_CATEGORY_SYMBOL_VIEW (widget);
g_return_if_fail (self->priv->preselected != NULL); g_return_if_fail (self->priv->preselected != NULL);
/* Working around a mysterious bug where we /sometimes/ get deselected. */
self->priv->dragged = self->priv->preselected;
/* Some of the larger previews didn't work, and we have to get rid of /* Some of the larger previews didn't work, and we have to get rid of
* the icon later when we're hovering above LdDiagramView anyway. */ * the icon later when we're hovering above LdDiagramView anyway. */
pbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 1, 1); pbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 1, 1);
@ -485,7 +491,11 @@ on_drag_begin (GtkWidget *widget, GdkDragContext *ctx, gpointer user_data)
static void static void
on_drag_end (GtkWidget *widget, GdkDragContext *ctx, gpointer user_data) on_drag_end (GtkWidget *widget, GdkDragContext *ctx, gpointer user_data)
{ {
symbol_deselect (LD_CATEGORY_SYMBOL_VIEW (widget)); LdCategorySymbolView *self;
self = LD_CATEGORY_SYMBOL_VIEW (widget);
symbol_deselect (self);
self->priv->dragged = NULL;
} }
static void static void