Skip to content

Commit 8c3d4a6

Browse files
committed
fix background across new-image
1 parent c51d0fd commit 8c3d4a6

File tree

3 files changed

+130
-106
lines changed

3 files changed

+130
-106
lines changed

TODO

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
- test save / restore of "background"
1+
- seeing unfixable dirty rows sometimes
22

3+
happened in a row containing a region as a subobject
34

5+
are we updating a row while it's also being computed? can this race?
46

7+
we should modify the model and queue a scan and recomp, but not update
8+
the heap or mark the row dirty
59

610

711

8-
- seeing unfixable dirty rows sometimes
912

10-
happened in a row containing a region as a subobject
11-
12-
are we updating a row while it's also being computed? can this race?
1313

1414
- get judder with rotate and images smaller than the window
1515

src/displaybar.c

Lines changed: 124 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ struct _Displaybar {
5959
*/
6060
Tilesource *tilesource;
6161

62+
/* Not a ref ... the imageui win is displaying.
63+
*/
64+
Imageui *imageui;
65+
6266
GtkWidget *action_bar;
6367
GtkWidget *gears;
6468
GtkWidget *page;
@@ -71,6 +75,7 @@ struct _Displaybar {
7175
guint changed_sid;
7276
guint tiles_changed_sid;
7377
guint page_changed_sid;
78+
guint imageui_changed_sid;
7479

7580
/* Keep view settings on new image.
7681
*/
@@ -98,67 +103,63 @@ static void
98103
displaybar_save_view_settings(Displaybar *displaybar)
99104
{
100105
Tilesource *tilesource = displaybar->tilesource;
101-
Imageui *imageui = imagewindow_get_imageui(displaybar->win);
106+
Imageui *imageui = displaybar->imageui;
102107
ViewSettings *view_settings = &displaybar->view_settings;
103108

104-
if (!tilesource ||
105-
!imageui) {
106-
view_settings->valid = FALSE;
107-
return;
108-
}
109-
109+
if (tilesource &&
110+
imageui) {
110111
#ifdef DEBUG
111-
printf("displaybar_save_view_settings:\n");
112+
printf("displaybar_save_view_settings:\n");
112113
#endif /*DEBUG*/
113114

114-
g_object_get(tilesource,
115-
"mode", &view_settings->mode,
116-
"scale", &view_settings->scale,
117-
"offset", &view_settings->offset,
118-
"page", &view_settings->page,
119-
"falsecolour", &view_settings->falsecolour,
120-
"log", &view_settings->log,
121-
"icc", &view_settings->icc,
122-
"active", &view_settings->active,
123-
NULL);
115+
g_object_get(tilesource,
116+
"mode", &view_settings->mode,
117+
"scale", &view_settings->scale,
118+
"offset", &view_settings->offset,
119+
"page", &view_settings->page,
120+
"falsecolour", &view_settings->falsecolour,
121+
"log", &view_settings->log,
122+
"icc", &view_settings->icc,
123+
"active", &view_settings->active,
124+
NULL);
124125

125-
g_object_get(imageui,
126-
"background", &view_settings->background,
127-
NULL);
126+
g_object_get(imageui,
127+
"background", &view_settings->background,
128+
NULL);
128129

129-
view_settings->valid = TRUE;
130+
view_settings->valid = TRUE;
131+
}
130132
}
131133

132134
static void
133135
displaybar_apply_view_settings(Displaybar *displaybar)
134136
{
135-
Tilesource *tilesource = displaybar->tilesource;
136-
Imageui *imageui = imagewindow_get_imageui(displaybar->win);
137137
ViewSettings *view_settings = &displaybar->view_settings;
138138

139-
if (!view_settings->valid)
140-
return;
141-
139+
if (view_settings->valid) {
142140
#ifdef DEBUG
143-
printf("displaybar_apply_view_settings:\n");
141+
printf("displaybar_apply_view_settings:\n");
144142
#endif /*DEBUG*/
145143

146-
if (tilesource)
147-
g_object_set(tilesource,
148-
"mode", view_settings->mode,
149-
"scale", view_settings->scale,
150-
"offset", view_settings->offset,
151-
"page", view_settings->page,
152-
"falsecolour", view_settings->falsecolour,
153-
"log", view_settings->log,
154-
"icc", view_settings->icc,
155-
"active", view_settings->active,
156-
NULL);
157-
158-
if (imageui)
159-
g_object_set(imageui,
160-
"background", view_settings->background,
161-
NULL);
144+
Tilesource *tilesource = displaybar->tilesource;
145+
if (tilesource)
146+
g_object_set(tilesource,
147+
"mode", view_settings->mode,
148+
"scale", view_settings->scale,
149+
"offset", view_settings->offset,
150+
"page", view_settings->page,
151+
"falsecolour", view_settings->falsecolour,
152+
"log", view_settings->log,
153+
"icc", view_settings->icc,
154+
"active", view_settings->active,
155+
NULL);
156+
157+
Imageui *imageui = displaybar->imageui;
158+
if (imageui)
159+
g_object_set(imageui,
160+
"background", view_settings->background,
161+
NULL);
162+
}
162163
}
163164

164165
static void
@@ -168,38 +169,54 @@ displaybar_tilesource_changed(Tilesource *tilesource, Displaybar *displaybar)
168169
printf("displaybar_tilesource_changed:\n");
169170
#endif /*DEBUG*/
170171

171-
g_assert(tilesource == displaybar->tilesource);
172+
if (tilesource) {
173+
g_assert(tilesource == displaybar->tilesource);
172174

173-
if (TSLIDER(displaybar->scale)->value != tilesource->scale) {
174-
TSLIDER(displaybar->scale)->value = tilesource->scale;
175-
tslider_changed(TSLIDER(displaybar->scale));
176-
}
175+
if (TSLIDER(displaybar->scale)->value != tilesource->scale) {
176+
TSLIDER(displaybar->scale)->value = tilesource->scale;
177+
tslider_changed(TSLIDER(displaybar->scale));
178+
}
177179

178-
if (TSLIDER(displaybar->offset)->value != tilesource->offset) {
179-
TSLIDER(displaybar->offset)->value = tilesource->offset;
180-
tslider_changed(TSLIDER(displaybar->offset));
181-
}
180+
if (TSLIDER(displaybar->offset)->value != tilesource->offset) {
181+
TSLIDER(displaybar->offset)->value = tilesource->offset;
182+
tslider_changed(TSLIDER(displaybar->offset));
183+
}
182184

183-
gtk_spin_button_set_range(GTK_SPIN_BUTTON(displaybar->page),
184-
0, tilesource->n_pages - 1);
185-
gtk_widget_set_sensitive(displaybar->page,
186-
tilesource->n_pages > 1 &&
187-
tilesource->mode == TILESOURCE_MODE_MULTIPAGE);
185+
gtk_spin_button_set_range(GTK_SPIN_BUTTON(displaybar->page),
186+
0, tilesource->n_pages - 1);
187+
gtk_widget_set_sensitive(displaybar->page,
188+
tilesource->n_pages > 1 &&
189+
tilesource->mode == TILESOURCE_MODE_MULTIPAGE);
188190

189-
displaybar_save_view_settings(displaybar);
191+
displaybar_save_view_settings(displaybar);
192+
}
190193
}
191194

192195
static void
193196
displaybar_page_changed(Tilesource *tilesource, Displaybar *displaybar)
194197
{
195198
#ifdef DEBUG
196-
printf("dm1Gisplaybar_page_changed:\n");
199+
printf("displaybar_page_changed:\n");
197200
#endif /*DEBUG*/
198201

199-
g_assert(tilesource == displaybar->tilesource);
202+
if (tilesource) {
203+
g_assert(tilesource == displaybar->tilesource);
204+
205+
gtk_spin_button_set_value(GTK_SPIN_BUTTON(displaybar->page),
206+
tilesource->page);
207+
208+
displaybar_save_view_settings(displaybar);
209+
}
210+
}
211+
212+
static void
213+
displaybar_imageui_changed(Imageui *imageui, Displaybar *displaybar)
214+
{
215+
#ifdef DEBUG
216+
printf("displaybar_imageui_changed:\n");
217+
#endif /*DEBUG*/
200218

201-
gtk_spin_button_set_value(GTK_SPIN_BUTTON(displaybar->page),
202-
tilesource->page);
219+
g_assert(imageui == displaybar->imageui);
203220

204221
displaybar_save_view_settings(displaybar);
205222
}
@@ -214,23 +231,17 @@ displaybar_disconnect(Displaybar *displaybar)
214231

215232
VIPS_UNREF(displaybar->tilesource);
216233
}
234+
235+
if (displaybar->imageui) {
236+
FREESID(displaybar->imageui_changed_sid, displaybar->imageui);
237+
displaybar->imageui = NULL;
238+
}
217239
}
218240

219-
/* Imagewindow has a new image, eg. after < > in titlebar.
220-
*/
221241
static void
222-
displaybar_imagewindow_new_image(Imagewindow *win, Displaybar *displaybar)
242+
displaybar_set_tilesource(Displaybar *displaybar, Tilesource *new_tilesource)
223243
{
224-
#ifdef DEBUG
225-
printf("displaybar_imagewindow_new_image:\n");
226-
#endif /*DEBUG*/
227-
228-
displaybar_disconnect(displaybar);
229-
230-
Tilesource *new_tilesource = imagewindow_get_tilesource(win);
231244
if (new_tilesource) {
232-
/* Set new source.
233-
*/
234245
displaybar->changed_sid = g_signal_connect(new_tilesource,
235246
"changed",
236247
G_CALLBACK(displaybar_tilesource_changed), displaybar);
@@ -243,15 +254,42 @@ displaybar_imagewindow_new_image(Imagewindow *win, Displaybar *displaybar)
243254

244255
displaybar->tilesource = new_tilesource;
245256
g_object_ref(new_tilesource);
257+
}
258+
}
246259

247-
if (displaybar->preserve)
248-
displaybar_apply_view_settings(displaybar);
249-
else {
250-
/* Init displaybar from new source.
251-
*/
252-
displaybar_tilesource_changed(new_tilesource, displaybar);
253-
displaybar_page_changed(new_tilesource, displaybar);
254-
}
260+
static void
261+
displaybar_set_imageui(Displaybar *displaybar)
262+
{
263+
Imageui *imageui = imagewindow_get_imageui(displaybar->win);
264+
265+
displaybar->imageui = imageui;
266+
if (imageui)
267+
displaybar->imageui_changed_sid = g_signal_connect(imageui,
268+
"changed",
269+
G_CALLBACK(displaybar_imageui_changed), displaybar);
270+
}
271+
272+
/* Imagewindow has a new image, eg. after < > in titlebar.
273+
*/
274+
static void
275+
displaybar_imagewindow_new_image(Imagewindow *win, Displaybar *displaybar)
276+
{
277+
#ifdef DEBUG
278+
printf("displaybar_imagewindow_new_image:\n");
279+
#endif /*DEBUG*/
280+
281+
displaybar_disconnect(displaybar);
282+
283+
displaybar_set_tilesource(displaybar, imagewindow_get_tilesource(win));
284+
displaybar_set_imageui(displaybar);
285+
286+
if (displaybar->preserve)
287+
displaybar_apply_view_settings(displaybar);
288+
else {
289+
/* Init displaybar from new source.
290+
*/
291+
displaybar_tilesource_changed(displaybar->tilesource, displaybar);
292+
displaybar_page_changed(displaybar->tilesource, displaybar);
255293
}
256294
}
257295

@@ -267,25 +305,10 @@ displaybar_imagewindow_changed(Imagewindow *win, Displaybar *displaybar)
267305

268306
displaybar_disconnect(displaybar);
269307

270-
Tilesource *new_tilesource = imagewindow_get_tilesource(win);
271-
if (new_tilesource) {
272-
/* Set new source.
273-
*/
274-
displaybar->changed_sid = g_signal_connect(new_tilesource,
275-
"changed",
276-
G_CALLBACK(displaybar_tilesource_changed), displaybar);
277-
displaybar->tiles_changed_sid = g_signal_connect(new_tilesource,
278-
"tiles-changed",
279-
G_CALLBACK(displaybar_tilesource_changed), displaybar);
280-
displaybar->page_changed_sid = g_signal_connect(new_tilesource,
281-
"page-changed",
282-
G_CALLBACK(displaybar_page_changed), displaybar);
283-
284-
displaybar->tilesource = new_tilesource;
285-
g_object_ref(new_tilesource);
308+
displaybar_set_tilesource(displaybar, imagewindow_get_tilesource(win));
309+
displaybar_set_imageui(displaybar);
286310

287-
displaybar_apply_view_settings(displaybar);
288-
}
311+
displaybar_apply_view_settings(displaybar);
289312
}
290313

291314
static void

src/imageui.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,7 @@ imageui_set_property(GObject *object,
372372
case PROP_BACKGROUND:
373373
g_object_set_property(G_OBJECT(imageui->imagedisplay),
374374
"background", value);
375+
imageui_changed(imageui);
375376
break;
376377

377378
case PROP_ZOOM:

0 commit comments

Comments
 (0)