Skip to content

Commit

Permalink
Merge pull request #142 from mozlima/mozlima
Browse files Browse the repository at this point in the history
Enable  Drag-and-Drop enter action for all widgets
  • Loading branch information
LBCrion authored Feb 8, 2024
2 parents c127a6c + 4c102d4 commit 43ac1c5
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 8 deletions.
47 changes: 46 additions & 1 deletion src/basewidget.c
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,44 @@ static gboolean base_widget_action_exec_impl ( GtkWidget *self, gint slot,
return TRUE;
}

static gboolean base_widget_drag_motion( GtkWidget *self, GdkDragContext *ctx,
gint x, gint y, guint time )
{
BaseWidgetPrivate *priv;
GList *target;
gchar *name;

priv = base_widget_get_instance_private(BASE_WIDGET(self));

if (priv->is_drag_dest)
return TRUE;

priv->is_drag_dest = TRUE;

for(target=gdk_drag_context_list_targets(ctx); target; target=target->next)
{
name = gdk_atom_name(target->data);
if(g_str_has_prefix(name, "flow-item-"))
{
g_free(name);
return TRUE;
}
g_free(name);
}

base_widget_action_exec(self, 8, NULL);
return TRUE;
}

static void base_widget_drag_leave (GtkWidget *self,
GdkDragContext *context, guint time )
{
BaseWidgetPrivate *priv;

priv = base_widget_get_instance_private(BASE_WIDGET(self));
priv->is_drag_dest = FALSE;
}

static void base_widget_class_init ( BaseWidgetClass *kclass )
{
GTK_WIDGET_CLASS(kclass)->destroy = base_widget_destroy;
Expand All @@ -255,6 +293,8 @@ static void base_widget_class_init ( BaseWidgetClass *kclass )
GTK_WIDGET_CLASS(kclass)->button_release_event =
base_widget_button_release_event;
GTK_WIDGET_CLASS(kclass)->scroll_event = base_widget_scroll_event;
GTK_WIDGET_CLASS(kclass)->drag_motion = base_widget_drag_motion;
GTK_WIDGET_CLASS(kclass)->drag_leave = base_widget_drag_leave;
}

static void base_widget_init ( BaseWidget *self )
Expand Down Expand Up @@ -664,7 +704,7 @@ void base_widget_set_action ( GtkWidget *self, gint n, GdkModifierType mods,
g_return_if_fail(IS_BASE_WIDGET(self));
priv = base_widget_get_instance_private(BASE_WIDGET(self));

if(n<0 || n>=8)
if(n<0 || n>=9)
return;

for(iter=priv->actions; iter; iter=g_list_next(iter))
Expand Down Expand Up @@ -696,6 +736,11 @@ void base_widget_set_action ( GtkWidget *self, gint n, GdkModifierType mods,
gtk_widget_add_events(GTK_WIDGET(self), GDK_BUTTON_RELEASE_MASK);
else if(n>=4 && n<=7)
gtk_widget_add_events(GTK_WIDGET(self),GDK_SCROLL_MASK);
else if(n==8)
{
gtk_drag_dest_set(self, GTK_DEST_DEFAULT_ALL, NULL, 1, GDK_ACTION_MOVE);
gtk_drag_dest_set_track_motion(self, TRUE);
}
}

void base_widget_copy_actions ( GtkWidget *dest, GtkWidget *src )
Expand Down
1 change: 1 addition & 0 deletions src/basewidget.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ struct _BaseWidgetPrivate
gint64 next_poll;
gint dir;
gboolean always_update;
gboolean is_drag_dest;
guint16 user_state;
GdkRectangle rect;
GList *mirror_children;
Expand Down
2 changes: 1 addition & 1 deletion src/config/layout.c
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ void config_widget_action ( GScanner *scanner, GtkWidget *widget )
if(scanner->max_parse_errors)
return;

if( button<0 || button >=8 )
if( button<0 || button >=9 )
{
g_scanner_error(scanner,"invalid action index %d",button);
return;
Expand Down
17 changes: 11 additions & 6 deletions src/flowgrid.c
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ static void flow_grid_init ( FlowGrid *self )
priv->cols = 0;
priv->limit = TRUE;
sig = g_strdup_printf("flow-item-%p", (void *)self);
priv->dnd_target = gtk_target_entry_new(sig, 0, 1);
priv->dnd_target = gtk_target_entry_new(sig, 0, SFWB_DND_TARGET_FLOW_ITEM);
g_free(sig);

gtk_grid_set_row_homogeneous(GTK_GRID(self), TRUE);
Expand Down Expand Up @@ -434,12 +434,16 @@ static void flow_grid_dnd_data_rec_cb ( GtkWidget *dest, GdkDragContext *ctx,
{
GtkWidget *src;

if(IS_BASE_WIDGET(parent))
parent = base_widget_get_child(parent);
g_return_if_fail(IS_FLOW_GRID(parent));
src = *(GtkWidget **)gtk_selection_data_get_data(sel);
if(info == SFWB_DND_TARGET_FLOW_ITEM)
{
if(IS_BASE_WIDGET(parent))
parent = base_widget_get_child(parent);
g_return_if_fail(IS_FLOW_GRID(parent));

flow_item_dnd_dest(dest, src, x, y);
src = *(GtkWidget **)gtk_selection_data_get_data(sel);
flow_item_dnd_dest(dest, src, x, y);
}
gtk_drag_finish(ctx, TRUE, FALSE, time);
}

static void flow_grid_dnd_enter_cb ( GtkWidget *widget, GdkEventCrossing *ev,
Expand Down Expand Up @@ -491,6 +495,7 @@ void flow_grid_child_dnd_enable ( GtkWidget *self, GtkWidget *child,
GDK_ACTION_MOVE);
g_signal_connect(G_OBJECT(child), "drag-data-received",
G_CALLBACK(flow_grid_dnd_data_rec_cb), self);
gtk_drag_dest_set_track_motion(child, TRUE);

if(src)
{
Expand Down
6 changes: 6 additions & 0 deletions src/flowgrid.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@
#define IS_FLOW_GRID(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), FLOW_GRID_TYPE))
#define IS_FLOW_GRIDCLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), FLOW_GRID_TYPE))

enum {
/* drag_dest_add_(image|text|uri)_targets sets info to 0 */
SFWB_DND_TARGET_GENERIC_GTK_API,
SFWB_DND_TARGET_FLOW_ITEM
};

typedef struct _FlowGrid FlowGrid;
typedef struct _FlowGridClass FlowGridClass;

Expand Down

0 comments on commit 43ac1c5

Please sign in to comment.