From 6533c0be3222c22696191141face2f067d85f549 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sun, 13 May 2018 13:00:42 -0400 Subject: [PATCH 1/3] Fixed the datetime example --- examples/datetime/main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/datetime/main.c b/examples/datetime/main.c index faf2c2f4..5f10eb0f 100644 --- a/examples/datetime/main.c +++ b/examples/datetime/main.c @@ -1,5 +1,6 @@ -#include +#include #include +#include #include #include "../../ui.h" From e00a91ded49fd279617501f2ee67f7f9f757ddef Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sun, 13 May 2018 18:00:25 -0400 Subject: [PATCH 2/3] Fixed event propagation in GTK+ uiDateTimePicker. --- unix/datetimepicker.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/unix/datetimepicker.c b/unix/datetimepicker.c index 0f57b721..8ca3a274 100644 --- a/unix/datetimepicker.c +++ b/unix/datetimepicker.c @@ -558,6 +558,7 @@ struct uiDateTimePicker { uiprivDateTimePickerWidget *d; void (*onChanged)(uiDateTimePicker *, void *); void *onChangedData; + gulong setBlock; }; uiUnixControlAllDefaults(uiDateTimePicker) @@ -588,12 +589,17 @@ void uiDateTimePickerSetTime(uiDateTimePicker *d, const struct tm *time) time_t t; struct tm tmbuf; + // TODO find a better way to avoid this; possibly by removing the signal entirely, or the call to dateTimeChanged() (most likely both) + g_signal_handler_block(d->d, d->setBlock); + // Copy time because mktime() modifies its argument memcpy(&tmbuf, time, sizeof (struct tm)); t = mktime(&tmbuf); uiprivDateTimePickerWidget_setTime(d->d, g_date_time_new_from_unix_local(t)); dateTimeChanged(d->d); + + g_signal_handler_unblock(d->d, d->setBlock); } void uiDateTimePickerOnChanged(uiDateTimePicker *d, void (*f)(uiDateTimePicker *, void *), void *data) @@ -647,7 +653,7 @@ uiDateTimePicker *finishNewDateTimePicker(GtkWidget *(*fn)(void)) d->widget = (*fn)(); d->d = uiprivDateTimePickerWidget(d->widget); - g_signal_connect(d->widget, "changed", G_CALLBACK(onChanged), d); + d->setBlock = g_signal_connect(d->widget, "changed", G_CALLBACK(onChanged), d); uiDateTimePickerOnChanged(d, defaultOnChanged, NULL); return d; From 02fc3e267ebdd8702b443a021c74ee3b032417ec Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Sun, 13 May 2018 18:04:57 -0400 Subject: [PATCH 3/3] And fixed on OS X too. IIRC I handled it on Windows in a prior commit. --- darwin/datetimepicker.m | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/darwin/datetimepicker.m b/darwin/datetimepicker.m index d4424678..ed164855 100644 --- a/darwin/datetimepicker.m +++ b/darwin/datetimepicker.m @@ -6,6 +6,7 @@ struct uiDateTimePicker { NSDatePicker *dp; void (*onChanged)(uiDateTimePicker *, void *); void *onChangedData; + BOOL blockSendOnce; }; // TODO see if target-action works here or not; I forgot what cody271@ originally said @@ -54,6 +55,10 @@ struct uiDateTimePicker { v = (NSValue *) [timer userInfo]; d = (uiDateTimePicker *) [v pointerValue]; + if (d->blockSendOnce) { + d->blockSendOnce = NO; + return; + } (*(d->onChanged))(d, d->onChangedData); } @@ -105,6 +110,8 @@ void uiDateTimePickerSetTime(uiDateTimePicker *d, const struct tm *time) memcpy(&tmbuf, time, sizeof (struct tm)); t = mktime(&tmbuf); + // TODO get rid of the need for this + d->blockSendOnce = YES; [d->dp setDateValue:[NSDate dateWithTimeIntervalSince1970:t]]; }