Skip to content

Commit d115abf

Browse files
Darkroom: add a delay on history addition for drawn events
1 parent 8f86b77 commit d115abf

File tree

3 files changed

+29
-8
lines changed

3 files changed

+29
-8
lines changed

src/develop/develop.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ void dt_dev_init(dt_develop_t *dev, int32_t gui_attached)
110110
dev->display_histogram.bpp = 0;
111111

112112
dev->auto_save_timeout = 0;
113+
dev->drawing_timeout = 0;
113114

114115
dev->iop_instance = 0;
115116
dev->iop = NULL;
@@ -154,6 +155,7 @@ void dt_dev_cleanup(dt_develop_t *dev)
154155

155156
// On dev cleanup, it is expected to force an history save
156157
if(dev->auto_save_timeout) g_source_remove(dev->auto_save_timeout);
158+
if(dev->drawing_timeout) g_source_remove(dev->drawing_timeout);
157159

158160
dev->proxy.chroma_adaptation = NULL;
159161
dev->proxy.wb_coeffs[0] = 0.f;

src/develop/develop.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,7 @@ typedef struct dt_develop_t
329329
int mask_form_selected_id; // select a mask inside an iop
330330
gboolean darkroom_skip_mouse_events; // skip mouse events for masks
331331
gboolean mask_lock;
332+
gint drawing_timeout;
332333
} dt_develop_t;
333334

334335
void dt_dev_init(dt_develop_t *dev, int32_t gui_attached);

src/views/darkroom.c

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2401,9 +2401,7 @@ void leave(dt_view_t *self)
24012401
dt_image_update_final_size(dev->image_storage.id);
24022402
// possibly dump new xmp data
24032403
const dt_history_hash_t hash_status = dt_history_hash_get_status(dev->image_storage.id);
2404-
24052404
const gboolean fresh = (hash_status == DT_HISTORY_HASH_BASIC) || (hash_status == DT_HISTORY_HASH_AUTO);
2406-
const dt_imageio_write_xmp_t xmp_mode = dt_image_get_xmp_mode();
24072405
if(!fresh)
24082406
dt_control_save_xmp(dev->image_storage.id);
24092407
dt_history_hash_set_mipmap(dev->image_storage.id);
@@ -2542,6 +2540,27 @@ void mouse_enter(dt_view_t *self)
25422540
dt_masks_events_mouse_enter(dev->gui_module);
25432541
}
25442542

2543+
#define DRAWING_TIMEOUT 80
2544+
2545+
static int _delayed_history_commit(gpointer data)
2546+
{
2547+
dt_develop_t *dev = (dt_develop_t *)data;
2548+
dev->drawing_timeout = 0;
2549+
dt_dev_add_history_item(dev, dev->gui_module, FALSE);
2550+
dt_dev_masks_list_update(dev);
2551+
return G_SOURCE_REMOVE;
2552+
}
2553+
2554+
static void _do_delayed_history_commit(dt_develop_t *dev)
2555+
{
2556+
if(dev->drawing_timeout)
2557+
{
2558+
g_source_remove(dev->drawing_timeout);
2559+
dev->drawing_timeout = 0;
2560+
}
2561+
dev->drawing_timeout = g_timeout_add(DRAWING_TIMEOUT, _delayed_history_commit, dev);
2562+
}
2563+
25452564
#define COORDINATES_ADAPT \
25462565
dt_develop_t *dev = (dt_develop_t *)self->data; \
25472566
const int32_t tb = dev->border_size; \
@@ -2616,8 +2635,7 @@ void mouse_moved(dt_view_t *self, double x, double y, double pressure, int which
26162635
if(dev->form_visible && dt_masks_events_mouse_moved(dev->gui_module, x, y, pressure, which))
26172636
{
26182637
dt_control_queue_redraw_center();
2619-
dt_dev_add_history_item(dev, dev->gui_module, FALSE);
2620-
dt_dev_masks_list_update(dev);
2638+
_do_delayed_history_commit(dev);
26212639
return;
26222640
}
26232641

@@ -2684,8 +2702,7 @@ int button_released(dt_view_t *self, double x, double y, int which, uint32_t sta
26842702
// Change on mask parameters and image output.
26852703
// FIXME: use invalidate_top in the future
26862704
dt_control_queue_redraw_center();
2687-
dt_dev_add_history_item(dev, dev->gui_module, FALSE);
2688-
dt_dev_masks_list_change(dev);
2705+
_do_delayed_history_commit(dev);
26892706
return 1;
26902707
}
26912708

@@ -2892,6 +2909,8 @@ int button_pressed(dt_view_t *self, double x, double y, double pressure, int whi
28922909
// masks
28932910
if(dev->form_visible && dt_masks_events_button_pressed(dev->gui_module, x, y, pressure, which, type, state))
28942911
{
2912+
dt_control_queue_redraw_center();
2913+
_do_delayed_history_commit(dev);
28952914
return 1;
28962915
}
28972916
// module
@@ -2923,8 +2942,7 @@ void scrolled(dt_view_t *self, double x, double y, int up, int state)
29232942
// Scroll on masks changes their size, therefore mask parameters and image output.
29242943
// FIXME: use invalidate_top in the future
29252944
dt_control_queue_redraw_center();
2926-
dt_dev_add_history_item(dev, dev->gui_module, FALSE);
2927-
dt_dev_masks_list_update(dev);
2945+
_do_delayed_history_commit(dev);
29282946
return;
29292947
}
29302948

0 commit comments

Comments
 (0)