diff --git a/app/devices.c b/app/devices.c index 2480089449..9faa2b0ea4 100644 --- a/app/devices.c +++ b/app/devices.c @@ -106,6 +106,10 @@ static void device_status_drag_color (GtkWidget *, guchar *, guchar *, guchar *, gpointer); static void device_status_drop_color (GtkWidget *, guchar, guchar, guchar, gpointer); +static void device_status_drop_brush (GtkWidget *, + GdkDragContext *, gint, gint, guint, gpointer); +static void device_status_drop_pattern (GtkWidget *, + GdkDragContext *, gint, gint, guint, gpointer); /* Global data */ @@ -287,7 +291,7 @@ devices_restore (void) if (device_info->brush) select_brush (device_info->brush); if (device_info->pattern) - select_pattern(device_info->pattern); + select_pattern (device_info->pattern); } suppress_update = FALSE; @@ -779,14 +783,14 @@ create_device_status (void) gtk_preview_size (GTK_PREVIEW (deviceD->colors[i]), CELL_SIZE, CELL_SIZE); /* dnd stuff */ gtk_drag_source_set (deviceD->colors[i], - GDK_BUTTON1_MASK | GDK_BUTTON3_MASK, + GDK_BUTTON1_MASK, color_area_target_table, n_color_area_targets, GDK_ACTION_COPY); gimp_dnd_color_source_set (deviceD->colors[i], device_status_drag_color, GUINT_TO_POINTER (device_info->device)); gtk_drag_dest_set (deviceD->colors[i], GTK_DEST_DEFAULT_HIGHLIGHT | - GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP, color_area_target_table, n_color_area_targets, GDK_ACTION_COPY); @@ -802,9 +806,12 @@ create_device_status (void) gtk_drag_dest_set (deviceD->brushes[i], GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_MOTION | - GTK_DEST_DEFAULT_DROP, + GTK_DEST_DEFAULT_DROP, brush_area_target_table, n_brush_area_targets, - GDK_ACTION_COPY); + GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (deviceD->brushes[i]), "drag_drop", + GTK_SIGNAL_FUNC (device_status_drop_brush), + GUINT_TO_POINTER (device_info->device)); gtk_table_attach (GTK_TABLE(deviceD->table), deviceD->brushes[i], 3, 4, i, i+1, 0, 0, 2, 2); @@ -814,10 +821,13 @@ create_device_status (void) FALSE, TRUE, TRUE); gtk_drag_dest_set (deviceD->patterns[i], GTK_DEST_DEFAULT_HIGHLIGHT | - GTK_DEST_DEFAULT_MOTION | - GTK_DEST_DEFAULT_DROP, + GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_DROP, pattern_area_target_table, n_pattern_area_targets, GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (deviceD->patterns[i]), "drag_drop", + GTK_SIGNAL_FUNC (device_status_drop_pattern), + GUINT_TO_POINTER (device_info->device)); gtk_table_attach (GTK_TABLE(deviceD->table), deviceD->patterns[i], 4, 5, i, i+1, 0, 0, 2, 2); @@ -1109,4 +1119,82 @@ device_status_drop_color (GtkWidget *widget, } } +static void +device_status_drop_brush (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GimpBrush *brush; + guint32 deviceid; + GList *tmp_list; + DeviceInfo *device_info = NULL; + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + brush = GIMP_BRUSH (GIMP_CONTEXT_PREVIEW (src)->data); + deviceid = GPOINTER_TO_UINT (data); + + tmp_list = devices_info; + while (tmp_list) + { + device_info = (DeviceInfo *)tmp_list->data; + + if (device_info->device == deviceid) + break; + + tmp_list = tmp_list->next; + } + if (device_info && device_info->is_present) + { + device_info->brush = brush; + if (device_info->device == current_device) + select_brush (device_info->brush); + else + device_status_update (device_info->device); + } +} + +static void +device_status_drop_pattern (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GPattern *pattern; + guint32 deviceid; + GList *tmp_list; + DeviceInfo *device_info = NULL; + + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + pattern = (GPattern *)(GIMP_CONTEXT_PREVIEW (src)->data); + deviceid = GPOINTER_TO_UINT (data); + + tmp_list = devices_info; + while (tmp_list) + { + device_info = (DeviceInfo *)tmp_list->data; + + if (device_info->device == deviceid) + break; + + tmp_list = tmp_list->next; + } + if (device_info && device_info->is_present) + { + device_info->pattern = pattern; + if (device_info->device == current_device) + select_pattern (device_info->pattern); + else + device_status_update (device_info->device); + } +} diff --git a/app/gimpcontextpreview.c b/app/gimpcontextpreview.c index 1929c4643e..ee20194c80 100644 --- a/app/gimpcontextpreview.c +++ b/app/gimpcontextpreview.c @@ -99,7 +99,6 @@ static gboolean gimp_context_preview_data_matches_type (GimpContextPreview *, gpointer); static void gimp_context_preview_drag_begin (GtkWidget *, GdkDragContext *); - static void gimp_context_preview_draw_brush (GimpContextPreview *); static void gimp_context_preview_draw_brush_popup (GimpContextPreview *); static void gimp_context_preview_draw_brush_drag (GimpContextPreview *); @@ -234,7 +233,7 @@ gimp_context_preview_update (GimpContextPreview *gcp, if (!gcp->data && gcp->drag_source) /* first call */ { gtk_drag_source_set (GTK_WIDGET (gcp), - GDK_BUTTON1_MASK | GDK_BUTTON3_MASK, + GDK_BUTTON1_MASK, context_preview_target_table[gcp->type], n_targets, GDK_ACTION_COPY); } @@ -463,7 +462,6 @@ gimp_context_preview_drag_begin (GtkWidget *widget, { gcp_drag_window = gtk_window_new (GTK_WINDOW_POPUP); gtk_window_set_policy (GTK_WINDOW (gcp_drag_window), FALSE, FALSE, TRUE); - gtk_widget_realize (gcp_drag_window); gtk_signal_connect (GTK_OBJECT (gcp_drag_window), "destroy", gtk_widget_destroyed, &gcp_drag_window); @@ -472,6 +470,7 @@ gimp_context_preview_drag_begin (GtkWidget *widget, gtk_widget_destroyed, &gcp_drag_preview); gtk_container_add (GTK_CONTAINER (gcp_drag_window), gcp_drag_preview); gtk_widget_show (gcp_drag_preview); + gtk_widget_realize (gcp_drag_window); } switch (gcp->type) diff --git a/app/gui/device-status-dialog.c b/app/gui/device-status-dialog.c index 2480089449..9faa2b0ea4 100644 --- a/app/gui/device-status-dialog.c +++ b/app/gui/device-status-dialog.c @@ -106,6 +106,10 @@ static void device_status_drag_color (GtkWidget *, guchar *, guchar *, guchar *, gpointer); static void device_status_drop_color (GtkWidget *, guchar, guchar, guchar, gpointer); +static void device_status_drop_brush (GtkWidget *, + GdkDragContext *, gint, gint, guint, gpointer); +static void device_status_drop_pattern (GtkWidget *, + GdkDragContext *, gint, gint, guint, gpointer); /* Global data */ @@ -287,7 +291,7 @@ devices_restore (void) if (device_info->brush) select_brush (device_info->brush); if (device_info->pattern) - select_pattern(device_info->pattern); + select_pattern (device_info->pattern); } suppress_update = FALSE; @@ -779,14 +783,14 @@ create_device_status (void) gtk_preview_size (GTK_PREVIEW (deviceD->colors[i]), CELL_SIZE, CELL_SIZE); /* dnd stuff */ gtk_drag_source_set (deviceD->colors[i], - GDK_BUTTON1_MASK | GDK_BUTTON3_MASK, + GDK_BUTTON1_MASK, color_area_target_table, n_color_area_targets, GDK_ACTION_COPY); gimp_dnd_color_source_set (deviceD->colors[i], device_status_drag_color, GUINT_TO_POINTER (device_info->device)); gtk_drag_dest_set (deviceD->colors[i], GTK_DEST_DEFAULT_HIGHLIGHT | - GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP, color_area_target_table, n_color_area_targets, GDK_ACTION_COPY); @@ -802,9 +806,12 @@ create_device_status (void) gtk_drag_dest_set (deviceD->brushes[i], GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_MOTION | - GTK_DEST_DEFAULT_DROP, + GTK_DEST_DEFAULT_DROP, brush_area_target_table, n_brush_area_targets, - GDK_ACTION_COPY); + GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (deviceD->brushes[i]), "drag_drop", + GTK_SIGNAL_FUNC (device_status_drop_brush), + GUINT_TO_POINTER (device_info->device)); gtk_table_attach (GTK_TABLE(deviceD->table), deviceD->brushes[i], 3, 4, i, i+1, 0, 0, 2, 2); @@ -814,10 +821,13 @@ create_device_status (void) FALSE, TRUE, TRUE); gtk_drag_dest_set (deviceD->patterns[i], GTK_DEST_DEFAULT_HIGHLIGHT | - GTK_DEST_DEFAULT_MOTION | - GTK_DEST_DEFAULT_DROP, + GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_DROP, pattern_area_target_table, n_pattern_area_targets, GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (deviceD->patterns[i]), "drag_drop", + GTK_SIGNAL_FUNC (device_status_drop_pattern), + GUINT_TO_POINTER (device_info->device)); gtk_table_attach (GTK_TABLE(deviceD->table), deviceD->patterns[i], 4, 5, i, i+1, 0, 0, 2, 2); @@ -1109,4 +1119,82 @@ device_status_drop_color (GtkWidget *widget, } } +static void +device_status_drop_brush (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GimpBrush *brush; + guint32 deviceid; + GList *tmp_list; + DeviceInfo *device_info = NULL; + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + brush = GIMP_BRUSH (GIMP_CONTEXT_PREVIEW (src)->data); + deviceid = GPOINTER_TO_UINT (data); + + tmp_list = devices_info; + while (tmp_list) + { + device_info = (DeviceInfo *)tmp_list->data; + + if (device_info->device == deviceid) + break; + + tmp_list = tmp_list->next; + } + if (device_info && device_info->is_present) + { + device_info->brush = brush; + if (device_info->device == current_device) + select_brush (device_info->brush); + else + device_status_update (device_info->device); + } +} + +static void +device_status_drop_pattern (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GPattern *pattern; + guint32 deviceid; + GList *tmp_list; + DeviceInfo *device_info = NULL; + + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + pattern = (GPattern *)(GIMP_CONTEXT_PREVIEW (src)->data); + deviceid = GPOINTER_TO_UINT (data); + + tmp_list = devices_info; + while (tmp_list) + { + device_info = (DeviceInfo *)tmp_list->data; + + if (device_info->device == deviceid) + break; + + tmp_list = tmp_list->next; + } + if (device_info && device_info->is_present) + { + device_info->pattern = pattern; + if (device_info->device == current_device) + select_pattern (device_info->pattern); + else + device_status_update (device_info->device); + } +} diff --git a/app/gui/indicator-area.c b/app/gui/indicator-area.c index d8134998f0..ead8e0bb22 100644 --- a/app/gui/indicator-area.c +++ b/app/gui/indicator-area.c @@ -21,6 +21,7 @@ #include "appenv.h" #include "gimpbrushlist.h" #include "gimpcontextpreview.h" +#include "gimpdnd.h" #include "gradient.h" #include "gradient_header.h" #include "indicator_area.h" @@ -37,11 +38,20 @@ static GtkWidget *brush_preview; static GtkWidget *pattern_preview; static GtkWidget *gradient_preview; +/* dnd stuff */ +static GtkTargetEntry brush_area_target_table[] = +{ + GIMP_TARGET_BRUSH +}; +static guint n_brush_area_targets = (sizeof (brush_area_target_table) / + sizeof (brush_area_target_table[0])); +static GtkTargetEntry pattern_area_target_table[] = +{ + GIMP_TARGET_PATTERN +}; +static guint n_pattern_area_targets = (sizeof (pattern_area_target_table) / + sizeof (pattern_area_target_table[0])); -/* The _area_update () functions should be called _preview_update(), - but I've left the old function names in for now since they are - called from devices.c - */ void brush_area_update () @@ -67,6 +77,25 @@ brush_preview_clicked (GtkWidget *widget, return TRUE; } +static void +brush_preview_drag_drop (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GimpBrush *brush; + + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + brush = GIMP_BRUSH (GIMP_CONTEXT_PREVIEW (src)->data); + + select_brush (brush); +} + void pattern_area_update () { @@ -92,6 +121,25 @@ pattern_preview_clicked (GtkWidget *widget, return TRUE; } +static void +pattern_preview_drag_drop (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GPattern *pattern; + + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + pattern = (GPattern *)(GIMP_CONTEXT_PREVIEW (src)->data); + + select_pattern (pattern); +} + void gradient_area_update () { @@ -123,8 +171,17 @@ indicator_area_create () NULL); gtk_signal_connect (GTK_OBJECT (brush_preview), "clicked", (GtkSignalFunc) brush_preview_clicked, NULL); + gtk_drag_dest_set (brush_preview, + GTK_DEST_DEFAULT_HIGHLIGHT | + GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_DROP, + brush_area_target_table, n_brush_area_targets, + GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (brush_preview), "drag_drop", + GTK_SIGNAL_FUNC (brush_preview_drag_drop), + NULL); gtk_table_attach_defaults (GTK_TABLE(indicator_table), brush_preview, - 0, 1, 0, 1); + 0, 1, 0, 1); pattern_preview = gimp_context_preview_new (GCP_PATTERN, CELL_SIZE, CELL_SIZE, @@ -134,6 +191,15 @@ indicator_area_create () NULL); gtk_signal_connect (GTK_OBJECT (pattern_preview), "clicked", (GtkSignalFunc) pattern_preview_clicked, NULL); + gtk_drag_dest_set (pattern_preview, + GTK_DEST_DEFAULT_HIGHLIGHT | + GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_DROP, + pattern_area_target_table, n_pattern_area_targets, + GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (pattern_preview), "drag_drop", + GTK_SIGNAL_FUNC (pattern_preview_drag_drop), + NULL); gtk_table_attach_defaults (GTK_TABLE(indicator_table), pattern_preview, 1, 2, 0, 1); diff --git a/app/gui/input-dialog.c b/app/gui/input-dialog.c index 2480089449..9faa2b0ea4 100644 --- a/app/gui/input-dialog.c +++ b/app/gui/input-dialog.c @@ -106,6 +106,10 @@ static void device_status_drag_color (GtkWidget *, guchar *, guchar *, guchar *, gpointer); static void device_status_drop_color (GtkWidget *, guchar, guchar, guchar, gpointer); +static void device_status_drop_brush (GtkWidget *, + GdkDragContext *, gint, gint, guint, gpointer); +static void device_status_drop_pattern (GtkWidget *, + GdkDragContext *, gint, gint, guint, gpointer); /* Global data */ @@ -287,7 +291,7 @@ devices_restore (void) if (device_info->brush) select_brush (device_info->brush); if (device_info->pattern) - select_pattern(device_info->pattern); + select_pattern (device_info->pattern); } suppress_update = FALSE; @@ -779,14 +783,14 @@ create_device_status (void) gtk_preview_size (GTK_PREVIEW (deviceD->colors[i]), CELL_SIZE, CELL_SIZE); /* dnd stuff */ gtk_drag_source_set (deviceD->colors[i], - GDK_BUTTON1_MASK | GDK_BUTTON3_MASK, + GDK_BUTTON1_MASK, color_area_target_table, n_color_area_targets, GDK_ACTION_COPY); gimp_dnd_color_source_set (deviceD->colors[i], device_status_drag_color, GUINT_TO_POINTER (device_info->device)); gtk_drag_dest_set (deviceD->colors[i], GTK_DEST_DEFAULT_HIGHLIGHT | - GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP, color_area_target_table, n_color_area_targets, GDK_ACTION_COPY); @@ -802,9 +806,12 @@ create_device_status (void) gtk_drag_dest_set (deviceD->brushes[i], GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_MOTION | - GTK_DEST_DEFAULT_DROP, + GTK_DEST_DEFAULT_DROP, brush_area_target_table, n_brush_area_targets, - GDK_ACTION_COPY); + GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (deviceD->brushes[i]), "drag_drop", + GTK_SIGNAL_FUNC (device_status_drop_brush), + GUINT_TO_POINTER (device_info->device)); gtk_table_attach (GTK_TABLE(deviceD->table), deviceD->brushes[i], 3, 4, i, i+1, 0, 0, 2, 2); @@ -814,10 +821,13 @@ create_device_status (void) FALSE, TRUE, TRUE); gtk_drag_dest_set (deviceD->patterns[i], GTK_DEST_DEFAULT_HIGHLIGHT | - GTK_DEST_DEFAULT_MOTION | - GTK_DEST_DEFAULT_DROP, + GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_DROP, pattern_area_target_table, n_pattern_area_targets, GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (deviceD->patterns[i]), "drag_drop", + GTK_SIGNAL_FUNC (device_status_drop_pattern), + GUINT_TO_POINTER (device_info->device)); gtk_table_attach (GTK_TABLE(deviceD->table), deviceD->patterns[i], 4, 5, i, i+1, 0, 0, 2, 2); @@ -1109,4 +1119,82 @@ device_status_drop_color (GtkWidget *widget, } } +static void +device_status_drop_brush (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GimpBrush *brush; + guint32 deviceid; + GList *tmp_list; + DeviceInfo *device_info = NULL; + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + brush = GIMP_BRUSH (GIMP_CONTEXT_PREVIEW (src)->data); + deviceid = GPOINTER_TO_UINT (data); + + tmp_list = devices_info; + while (tmp_list) + { + device_info = (DeviceInfo *)tmp_list->data; + + if (device_info->device == deviceid) + break; + + tmp_list = tmp_list->next; + } + if (device_info && device_info->is_present) + { + device_info->brush = brush; + if (device_info->device == current_device) + select_brush (device_info->brush); + else + device_status_update (device_info->device); + } +} + +static void +device_status_drop_pattern (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GPattern *pattern; + guint32 deviceid; + GList *tmp_list; + DeviceInfo *device_info = NULL; + + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + pattern = (GPattern *)(GIMP_CONTEXT_PREVIEW (src)->data); + deviceid = GPOINTER_TO_UINT (data); + + tmp_list = devices_info; + while (tmp_list) + { + device_info = (DeviceInfo *)tmp_list->data; + + if (device_info->device == deviceid) + break; + + tmp_list = tmp_list->next; + } + if (device_info && device_info->is_present) + { + device_info->pattern = pattern; + if (device_info->device == current_device) + select_pattern (device_info->pattern); + else + device_status_update (device_info->device); + } +} diff --git a/app/indicator_area.c b/app/indicator_area.c index d8134998f0..ead8e0bb22 100644 --- a/app/indicator_area.c +++ b/app/indicator_area.c @@ -21,6 +21,7 @@ #include "appenv.h" #include "gimpbrushlist.h" #include "gimpcontextpreview.h" +#include "gimpdnd.h" #include "gradient.h" #include "gradient_header.h" #include "indicator_area.h" @@ -37,11 +38,20 @@ static GtkWidget *brush_preview; static GtkWidget *pattern_preview; static GtkWidget *gradient_preview; +/* dnd stuff */ +static GtkTargetEntry brush_area_target_table[] = +{ + GIMP_TARGET_BRUSH +}; +static guint n_brush_area_targets = (sizeof (brush_area_target_table) / + sizeof (brush_area_target_table[0])); +static GtkTargetEntry pattern_area_target_table[] = +{ + GIMP_TARGET_PATTERN +}; +static guint n_pattern_area_targets = (sizeof (pattern_area_target_table) / + sizeof (pattern_area_target_table[0])); -/* The _area_update () functions should be called _preview_update(), - but I've left the old function names in for now since they are - called from devices.c - */ void brush_area_update () @@ -67,6 +77,25 @@ brush_preview_clicked (GtkWidget *widget, return TRUE; } +static void +brush_preview_drag_drop (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GimpBrush *brush; + + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + brush = GIMP_BRUSH (GIMP_CONTEXT_PREVIEW (src)->data); + + select_brush (brush); +} + void pattern_area_update () { @@ -92,6 +121,25 @@ pattern_preview_clicked (GtkWidget *widget, return TRUE; } +static void +pattern_preview_drag_drop (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GPattern *pattern; + + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + pattern = (GPattern *)(GIMP_CONTEXT_PREVIEW (src)->data); + + select_pattern (pattern); +} + void gradient_area_update () { @@ -123,8 +171,17 @@ indicator_area_create () NULL); gtk_signal_connect (GTK_OBJECT (brush_preview), "clicked", (GtkSignalFunc) brush_preview_clicked, NULL); + gtk_drag_dest_set (brush_preview, + GTK_DEST_DEFAULT_HIGHLIGHT | + GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_DROP, + brush_area_target_table, n_brush_area_targets, + GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (brush_preview), "drag_drop", + GTK_SIGNAL_FUNC (brush_preview_drag_drop), + NULL); gtk_table_attach_defaults (GTK_TABLE(indicator_table), brush_preview, - 0, 1, 0, 1); + 0, 1, 0, 1); pattern_preview = gimp_context_preview_new (GCP_PATTERN, CELL_SIZE, CELL_SIZE, @@ -134,6 +191,15 @@ indicator_area_create () NULL); gtk_signal_connect (GTK_OBJECT (pattern_preview), "clicked", (GtkSignalFunc) pattern_preview_clicked, NULL); + gtk_drag_dest_set (pattern_preview, + GTK_DEST_DEFAULT_HIGHLIGHT | + GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_DROP, + pattern_area_target_table, n_pattern_area_targets, + GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (pattern_preview), "drag_drop", + GTK_SIGNAL_FUNC (pattern_preview_drag_drop), + NULL); gtk_table_attach_defaults (GTK_TABLE(indicator_table), pattern_preview, 1, 2, 0, 1); diff --git a/app/widgets/gimpdeviceinfo.c b/app/widgets/gimpdeviceinfo.c index 2480089449..9faa2b0ea4 100644 --- a/app/widgets/gimpdeviceinfo.c +++ b/app/widgets/gimpdeviceinfo.c @@ -106,6 +106,10 @@ static void device_status_drag_color (GtkWidget *, guchar *, guchar *, guchar *, gpointer); static void device_status_drop_color (GtkWidget *, guchar, guchar, guchar, gpointer); +static void device_status_drop_brush (GtkWidget *, + GdkDragContext *, gint, gint, guint, gpointer); +static void device_status_drop_pattern (GtkWidget *, + GdkDragContext *, gint, gint, guint, gpointer); /* Global data */ @@ -287,7 +291,7 @@ devices_restore (void) if (device_info->brush) select_brush (device_info->brush); if (device_info->pattern) - select_pattern(device_info->pattern); + select_pattern (device_info->pattern); } suppress_update = FALSE; @@ -779,14 +783,14 @@ create_device_status (void) gtk_preview_size (GTK_PREVIEW (deviceD->colors[i]), CELL_SIZE, CELL_SIZE); /* dnd stuff */ gtk_drag_source_set (deviceD->colors[i], - GDK_BUTTON1_MASK | GDK_BUTTON3_MASK, + GDK_BUTTON1_MASK, color_area_target_table, n_color_area_targets, GDK_ACTION_COPY); gimp_dnd_color_source_set (deviceD->colors[i], device_status_drag_color, GUINT_TO_POINTER (device_info->device)); gtk_drag_dest_set (deviceD->colors[i], GTK_DEST_DEFAULT_HIGHLIGHT | - GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP, color_area_target_table, n_color_area_targets, GDK_ACTION_COPY); @@ -802,9 +806,12 @@ create_device_status (void) gtk_drag_dest_set (deviceD->brushes[i], GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_MOTION | - GTK_DEST_DEFAULT_DROP, + GTK_DEST_DEFAULT_DROP, brush_area_target_table, n_brush_area_targets, - GDK_ACTION_COPY); + GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (deviceD->brushes[i]), "drag_drop", + GTK_SIGNAL_FUNC (device_status_drop_brush), + GUINT_TO_POINTER (device_info->device)); gtk_table_attach (GTK_TABLE(deviceD->table), deviceD->brushes[i], 3, 4, i, i+1, 0, 0, 2, 2); @@ -814,10 +821,13 @@ create_device_status (void) FALSE, TRUE, TRUE); gtk_drag_dest_set (deviceD->patterns[i], GTK_DEST_DEFAULT_HIGHLIGHT | - GTK_DEST_DEFAULT_MOTION | - GTK_DEST_DEFAULT_DROP, + GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_DROP, pattern_area_target_table, n_pattern_area_targets, GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (deviceD->patterns[i]), "drag_drop", + GTK_SIGNAL_FUNC (device_status_drop_pattern), + GUINT_TO_POINTER (device_info->device)); gtk_table_attach (GTK_TABLE(deviceD->table), deviceD->patterns[i], 4, 5, i, i+1, 0, 0, 2, 2); @@ -1109,4 +1119,82 @@ device_status_drop_color (GtkWidget *widget, } } +static void +device_status_drop_brush (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GimpBrush *brush; + guint32 deviceid; + GList *tmp_list; + DeviceInfo *device_info = NULL; + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + brush = GIMP_BRUSH (GIMP_CONTEXT_PREVIEW (src)->data); + deviceid = GPOINTER_TO_UINT (data); + + tmp_list = devices_info; + while (tmp_list) + { + device_info = (DeviceInfo *)tmp_list->data; + + if (device_info->device == deviceid) + break; + + tmp_list = tmp_list->next; + } + if (device_info && device_info->is_present) + { + device_info->brush = brush; + if (device_info->device == current_device) + select_brush (device_info->brush); + else + device_status_update (device_info->device); + } +} + +static void +device_status_drop_pattern (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GPattern *pattern; + guint32 deviceid; + GList *tmp_list; + DeviceInfo *device_info = NULL; + + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + pattern = (GPattern *)(GIMP_CONTEXT_PREVIEW (src)->data); + deviceid = GPOINTER_TO_UINT (data); + + tmp_list = devices_info; + while (tmp_list) + { + device_info = (DeviceInfo *)tmp_list->data; + + if (device_info->device == deviceid) + break; + + tmp_list = tmp_list->next; + } + if (device_info && device_info->is_present) + { + device_info->pattern = pattern; + if (device_info->device == current_device) + select_pattern (device_info->pattern); + else + device_status_update (device_info->device); + } +} diff --git a/app/widgets/gimpdevices.c b/app/widgets/gimpdevices.c index 2480089449..9faa2b0ea4 100644 --- a/app/widgets/gimpdevices.c +++ b/app/widgets/gimpdevices.c @@ -106,6 +106,10 @@ static void device_status_drag_color (GtkWidget *, guchar *, guchar *, guchar *, gpointer); static void device_status_drop_color (GtkWidget *, guchar, guchar, guchar, gpointer); +static void device_status_drop_brush (GtkWidget *, + GdkDragContext *, gint, gint, guint, gpointer); +static void device_status_drop_pattern (GtkWidget *, + GdkDragContext *, gint, gint, guint, gpointer); /* Global data */ @@ -287,7 +291,7 @@ devices_restore (void) if (device_info->brush) select_brush (device_info->brush); if (device_info->pattern) - select_pattern(device_info->pattern); + select_pattern (device_info->pattern); } suppress_update = FALSE; @@ -779,14 +783,14 @@ create_device_status (void) gtk_preview_size (GTK_PREVIEW (deviceD->colors[i]), CELL_SIZE, CELL_SIZE); /* dnd stuff */ gtk_drag_source_set (deviceD->colors[i], - GDK_BUTTON1_MASK | GDK_BUTTON3_MASK, + GDK_BUTTON1_MASK, color_area_target_table, n_color_area_targets, GDK_ACTION_COPY); gimp_dnd_color_source_set (deviceD->colors[i], device_status_drag_color, GUINT_TO_POINTER (device_info->device)); gtk_drag_dest_set (deviceD->colors[i], GTK_DEST_DEFAULT_HIGHLIGHT | - GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP, color_area_target_table, n_color_area_targets, GDK_ACTION_COPY); @@ -802,9 +806,12 @@ create_device_status (void) gtk_drag_dest_set (deviceD->brushes[i], GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_MOTION | - GTK_DEST_DEFAULT_DROP, + GTK_DEST_DEFAULT_DROP, brush_area_target_table, n_brush_area_targets, - GDK_ACTION_COPY); + GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (deviceD->brushes[i]), "drag_drop", + GTK_SIGNAL_FUNC (device_status_drop_brush), + GUINT_TO_POINTER (device_info->device)); gtk_table_attach (GTK_TABLE(deviceD->table), deviceD->brushes[i], 3, 4, i, i+1, 0, 0, 2, 2); @@ -814,10 +821,13 @@ create_device_status (void) FALSE, TRUE, TRUE); gtk_drag_dest_set (deviceD->patterns[i], GTK_DEST_DEFAULT_HIGHLIGHT | - GTK_DEST_DEFAULT_MOTION | - GTK_DEST_DEFAULT_DROP, + GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_DROP, pattern_area_target_table, n_pattern_area_targets, GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (deviceD->patterns[i]), "drag_drop", + GTK_SIGNAL_FUNC (device_status_drop_pattern), + GUINT_TO_POINTER (device_info->device)); gtk_table_attach (GTK_TABLE(deviceD->table), deviceD->patterns[i], 4, 5, i, i+1, 0, 0, 2, 2); @@ -1109,4 +1119,82 @@ device_status_drop_color (GtkWidget *widget, } } +static void +device_status_drop_brush (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GimpBrush *brush; + guint32 deviceid; + GList *tmp_list; + DeviceInfo *device_info = NULL; + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + brush = GIMP_BRUSH (GIMP_CONTEXT_PREVIEW (src)->data); + deviceid = GPOINTER_TO_UINT (data); + + tmp_list = devices_info; + while (tmp_list) + { + device_info = (DeviceInfo *)tmp_list->data; + + if (device_info->device == deviceid) + break; + + tmp_list = tmp_list->next; + } + if (device_info && device_info->is_present) + { + device_info->brush = brush; + if (device_info->device == current_device) + select_brush (device_info->brush); + else + device_status_update (device_info->device); + } +} + +static void +device_status_drop_pattern (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GPattern *pattern; + guint32 deviceid; + GList *tmp_list; + DeviceInfo *device_info = NULL; + + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + pattern = (GPattern *)(GIMP_CONTEXT_PREVIEW (src)->data); + deviceid = GPOINTER_TO_UINT (data); + + tmp_list = devices_info; + while (tmp_list) + { + device_info = (DeviceInfo *)tmp_list->data; + + if (device_info->device == deviceid) + break; + + tmp_list = tmp_list->next; + } + if (device_info && device_info->is_present) + { + device_info->pattern = pattern; + if (device_info->device == current_device) + select_pattern (device_info->pattern); + else + device_status_update (device_info->device); + } +} diff --git a/app/widgets/gimptoolbox-indicator-area.c b/app/widgets/gimptoolbox-indicator-area.c index d8134998f0..ead8e0bb22 100644 --- a/app/widgets/gimptoolbox-indicator-area.c +++ b/app/widgets/gimptoolbox-indicator-area.c @@ -21,6 +21,7 @@ #include "appenv.h" #include "gimpbrushlist.h" #include "gimpcontextpreview.h" +#include "gimpdnd.h" #include "gradient.h" #include "gradient_header.h" #include "indicator_area.h" @@ -37,11 +38,20 @@ static GtkWidget *brush_preview; static GtkWidget *pattern_preview; static GtkWidget *gradient_preview; +/* dnd stuff */ +static GtkTargetEntry brush_area_target_table[] = +{ + GIMP_TARGET_BRUSH +}; +static guint n_brush_area_targets = (sizeof (brush_area_target_table) / + sizeof (brush_area_target_table[0])); +static GtkTargetEntry pattern_area_target_table[] = +{ + GIMP_TARGET_PATTERN +}; +static guint n_pattern_area_targets = (sizeof (pattern_area_target_table) / + sizeof (pattern_area_target_table[0])); -/* The _area_update () functions should be called _preview_update(), - but I've left the old function names in for now since they are - called from devices.c - */ void brush_area_update () @@ -67,6 +77,25 @@ brush_preview_clicked (GtkWidget *widget, return TRUE; } +static void +brush_preview_drag_drop (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GimpBrush *brush; + + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + brush = GIMP_BRUSH (GIMP_CONTEXT_PREVIEW (src)->data); + + select_brush (brush); +} + void pattern_area_update () { @@ -92,6 +121,25 @@ pattern_preview_clicked (GtkWidget *widget, return TRUE; } +static void +pattern_preview_drag_drop (GtkWidget *widget, + GdkDragContext *context, + gint x, + gint y, + guint time, + gpointer data) +{ + GtkWidget *src; + GPattern *pattern; + + src = gtk_drag_get_source_widget (context); + if (!GIMP_IS_CONTEXT_PREVIEW (src) || !GIMP_CONTEXT_PREVIEW (src)->data) + return; + pattern = (GPattern *)(GIMP_CONTEXT_PREVIEW (src)->data); + + select_pattern (pattern); +} + void gradient_area_update () { @@ -123,8 +171,17 @@ indicator_area_create () NULL); gtk_signal_connect (GTK_OBJECT (brush_preview), "clicked", (GtkSignalFunc) brush_preview_clicked, NULL); + gtk_drag_dest_set (brush_preview, + GTK_DEST_DEFAULT_HIGHLIGHT | + GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_DROP, + brush_area_target_table, n_brush_area_targets, + GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (brush_preview), "drag_drop", + GTK_SIGNAL_FUNC (brush_preview_drag_drop), + NULL); gtk_table_attach_defaults (GTK_TABLE(indicator_table), brush_preview, - 0, 1, 0, 1); + 0, 1, 0, 1); pattern_preview = gimp_context_preview_new (GCP_PATTERN, CELL_SIZE, CELL_SIZE, @@ -134,6 +191,15 @@ indicator_area_create () NULL); gtk_signal_connect (GTK_OBJECT (pattern_preview), "clicked", (GtkSignalFunc) pattern_preview_clicked, NULL); + gtk_drag_dest_set (pattern_preview, + GTK_DEST_DEFAULT_HIGHLIGHT | + GTK_DEST_DEFAULT_MOTION | + GTK_DEST_DEFAULT_DROP, + pattern_area_target_table, n_pattern_area_targets, + GDK_ACTION_COPY); + gtk_signal_connect (GTK_OBJECT (pattern_preview), "drag_drop", + GTK_SIGNAL_FUNC (pattern_preview_drag_drop), + NULL); gtk_table_attach_defaults (GTK_TABLE(indicator_table), pattern_preview, 1, 2, 0, 1);