[Shotwell] Final call for testing Shotwell 0.5

Martin Olsson mnemo at minimum.se
Sat Mar 6 15:12:51 PST 2010


0.5.0 is looking really good so far..  below are some new issues I found.
I'm testing using current Lucid bits so I used to have the issues that
Roman Yepishev posted about recently. Using Shotwell trunk as of now they
seem to be fixed which is great.

* What does the HIDE menu item do? I can see the images disappear alright but
where do they go and what do I use this feature for? Even after messing around
with it for several minutes, I don't really get it. (Update: a bit later while
browsing around the menu I found the "View::Hidden" thing and I understand it
now and it sort of makes sense. However, what about flashing and fading away
the message "Use View::Hidden to show hidden images" somewhere in the UI when
you first hide an image (conceptually sort of like how Firefox puts this yellow
banner at the top of the page and says "FYI; I just blocked a pop up for you" etc.
It could be just the first time you hide an image or maybe the first time in each
session, so that it doesn't get too annoying. Another approach would be to show a
small icon in the top left area of any "album" that has at least one hidden image;
this icon should say "Click here to show hidden images as well" or similar. If you
brainstorm a bit I'm sure you can come up with even better ways of cluing in the
user as to where their images go when you "hide" them. Consider for example the
special case where an event contains a single photo of a cat, thus that image
will now be used for the event thumbnail despite being hidden and if you open
that album you get an empty gray page which is a bit weird.

* Import some photos, right click the first photo and select "Set as Desktop Background",
press CTRL-ALT-D twice and verify that the image was set. Now click some other image and
select "Set as Desktop Background" on that one and again look at the desktop. Now the old
image will still be set as wallpaper. I suspect maybe this is because gconf doesn't emit a
"changed" event if you set the exact same value again, i.e:
picture_filename = /home/mnemo/.shotwell/wallpaper/wallpaper.jpg

* After looking briefly at the set wallpaper code I'd suggest these changes:
- in set_background() do "if (!set_string()) return false"
- the function set_background() should return bool so that you can do
  AppWindow.error_messag("txt") in set_desktop_background() like you
  already do in the catch there.

* In the English translation, when you open the context menu on a photo both
the "Modify Tags" and "Remove" items have keyboard accelerator "_m". Similar with
"Favorites" and "Fullscreen" in the View menu.

* File::Publish is the only menu item in the main menu which does not have a "_X"-style
keyboard accelerator.

* If I have firefox running and I select "Help::Contents" in shotwell the page loads
but the FF window is not raised (which typically means the user will not notice,
I thought it did nothing at first). gtk_show_uri() doesn't throw though so maybe
this is an GTK/Ubuntu bug (I've seen similar issues on Ubuntu before and discussions
about that the "allowed window raising policy" is these days). Maybe you'd want to
look into what's going on there or maybe deploy some sort of explicit "raise window"
workaround though because Shotwell users will suffer from this for sure.

* Import a photo, right click it and select "Modify tags" (note: image should have no prior tags)
and then type "blah" and press OK. Reproducible SEGV:
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7ba3ce9 in gee_collection_contains (self=0x0, item=0x94c8a0) at collection.c:158
158		return GEE_COLLECTION_GET_INTERFACE (self)->contains (self, item);
(gdb) bt
#0  0x00007ffff7ba3ce9 in gee_collection_contains (self=0x0, item=0x94c8a0) at collection.c:158
#1  0x00000000004f26c7 in modify_tags_command_construct (object_type=<value optimized out>, photo=<value optimized out>, new_tag_list=0xd76580) at src/Commands.c:4827
#2  0x0000000000422f4f in collection_page_on_modify_tags (action=<value optimized out>, self=<value optimized out>) at src/CollectionPage.c:3328
#3  _collection_page_on_modify_tags_gtk_action_callback (action=<value optimized out>, self=<value optimized out>) at src/CollectionPage.c:2020

* From a "UI clutter" perspective I don't see why you need both "Add tags" and "Modify tags"?

* Reproducible SIGABRT. Import three JPGs and right click the first one and select "Hide". The use CTRL-A to select all remaining photos and right click selecting DUPLICATE.
ERROR:src/CheckerboardLayout.c:2619:checkerboard_layout_repaint_item: assertion failed: (data_collection_contains (DATA_COLLECTION (self->priv->view), DATA_OBJECT (item)))
Program received signal SIGABRT, Aborted.
0x00007ffff1b5ea85 in *__GI_raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
64	../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
	in ../nptl/sysdeps/unix/sysv/linux/raise.c
#0  0x00007ffff1b5ea85 in *__GI_raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
#1  0x00007ffff1b62520 in *__GI_abort () at abort.c:92
#2  0x00007ffff1f10124 in IA__g_assertion_message (domain=<value optimized out>, file=<value optimized out>, line=<value optimized out>, func=0x51d200 "checkerboard_layout_repaint_item", message=0xee90d0 "assertion failed: (data_collection_contains (DATA_COLLECTION (self->priv->view), DATA_OBJECT (item)))") at /build/buildd/glib2.0-2.23.4/glib/gtestutils.c:1318
#3  0x00007ffff1f106a0 in IA__g_assertion_message_expr (domain=0x0, file=0x51caec "src/CheckerboardLayout.c", line=2619, func=0x51d200 "checkerboard_layout_repaint_item", expr=<value optimized out>) at /build/buildd/glib2.0-2.23.4/glib/gtestutils.c:1329
#4  0x0000000000439834 in checkerboard_layout_repaint_item (self=0xade120, item=0xed9250) at src/CheckerboardLayout.c:2619
#5  0x00007ffff259a4ee in IA__g_closure_invoke (closure=0xae98e0, return_value=0x0, n_param_values=2, param_values=0xee96a0, invocation_hint=0x7fffffffc390) at /build/buildd/glib2.0-2.23.4/gobject/gclosure.c:767
#6  0x00007ffff25b12d9 in signal_emit_unlocked_R (node=0x96bdc0, detail=<value optimized out>, instance=<value optimized out>, emission_return=<value optimized out>, instance_and_params=<value optimized out>) at /build/buildd/glib2.0-2.23.4/gobject/gsignal.c:3243
#7  0x00007ffff25b2b36 in IA__g_signal_emit_valist (instance=0xad29c0, signal_id=<value optimized out>, detail=0, var_args=0x7fffffffc5b0) at /build/buildd/glib2.0-2.23.4/gobject/gsignal.c:2976
#8  0x00007ffff25b2e5d in IA__g_signal_emit_by_name (instance=0xad29c0, detailed_signal=<value optimized out>) at /build/buildd/glib2.0-2.23.4/gobject/gsignal.c:3070
#9  0x00000000004ac5af in view_collection_notify_item_view_altered (self=0xad29c0, view=0xed9250) at src/DataCollection.c:3409
#10 view_collection_internal_notify_view_altered (self=0xad29c0, view=0xed9250) at src/DataCollection.c:4791
#11 0x00000000004a7ac4 in data_view_real_notify_view_altered (self=0xed9250) at src/DataObject.c:2137
#12 0x0000000000438409 in checkerboard_item_real_notify_membership_changed (base=<value optimized out>, collection=0xad29c0) at src/CheckerboardLayout.c:1020
#13 0x00000000004b4c98 in data_collection_internal_add_many (self=0xad29c0, objects=<value optimized out>, monitor=0, monitor_target=<value optimized out>) at src/DataCollection.c:1997
#14 data_collection_add_many (self=0xad29c0, objects=<value optimized out>, monitor=0, monitor_target=<value optimized out>) at src/DataCollection.c:2074
#15 0x00000000004b523d in view_collection_add_sources (self=0xad29c0, added=<value optimized out>, monitor=0, monitor_target=0x0) at src/DataCollection.c:3723
#16 0x00007ffff259a4ee in IA__g_closure_invoke (closure=0xcaabf0, return_value=0x0, n_param_values=2, param_values=0x7fffdc000d30, invocation_hint=0x7fffffffc970) at /build/buildd/glib2.0-2.23.4/gobject/gclosure.c:767
#17 0x00007ffff25b12d9 in signal_emit_unlocked_R (node=0x92f8f0, detail=<value optimized out>, instance=<value optimized out>, emission_return=<value optimized out>, instance_and_params=<value optimized out>) at /build/buildd/glib2.0-2.23.4/gobject/gsignal.c:3243
#18 0x00007ffff25b2b36 in IA__g_signal_emit_valist (instance=0x7d60c0, signal_id=<value optimized out>, detail=0, var_args=0x7fffffffcb90) at /build/buildd/glib2.0-2.23.4/gobject/gsignal.c:2976
#19 0x00007ffff25b2e5d in IA__g_signal_emit_by_name (instance=0x7d60c0, detailed_signal=<value optimized out>) at /build/buildd/glib2.0-2.23.4/gobject/gsignal.c:3070
#20 0x00000000004ab680 in database_source_collection_real_notify_items_added (base=<value optimized out>, added=0xd74100) at src/DataCollection.c:3138
#21 0x00000000004b57c9 in data_collection_notify_items_added (self=0x7d60c0, object=<value optimized out>) at src/DataCollection.c:1687
#22 data_collection_add (self=0x7d60c0, object=<value optimized out>) at src/DataCollection.c:2032
#23 0x0000000000471a4c in library_photo_duplicate (self=<value optimized out>, error=<value optimized out>) at src/Photo.c:4728
#24 0x00000000004edccc in duplicate_multiple_photos_command_real_execute_on_source (base=0xe1a470, source=<value optimized out>) at src/Commands.c:3717
#25 0x00000000004ef75d in multiple_data_source_command_execute_on_source (self=0xe1a470, exec=<value optimized out>, can_cancel=<value optimized out>, todo=<value optimized out>, completed=0xd744c0) at src/Commands.c:2320
#26 multiple_data_source_command_execute_all (self=0xe1a470, exec=<value optimized out>, can_cancel=<value optimized out>, todo=<value optimized out>, completed=0xd744c0) at src/Commands.c:2399
#27 0x00000000004ede94 in duplicate_multiple_photos_command_real_execute (base=<value optimized out>) at src/Commands.c:3697
#28 0x00000000004e8b10 in command_execute (self=0x829a40, command=0xe1a470) at src/CommandManager.c:220
#29 command_manager_execute (self=0x829a40, command=0xe1a470) at src/CommandManager.c:390
#30 0x000000000042127c in collection_page_on_duplicate_photo (action=<value optimized out>, self=<value optimized out>) at src/CollectionPage.c:3390
#31 _collection_page_on_duplicate_photo_gtk_action_callback (action=<value optimized out>, self=<value optimized out>) at src/CollectionPage.c:1913

* Switching between photos are a bit slow. I have a quad core 2.8ghz with 8GB RAM,
speed raided 10K RPM discs and 12MB CPU cache; still it routinely takes >500ms to
switch to the next image. Not sure what's going on there. Also when I import photos
I can see them flash by extremely fast, like 10 images per second fast; so why does
it have to be so slow to switch between images in the photo album (i.e. open a photo
in full view and then pressing LEFT and RIGHT arrows). For example try holding down
the RIGHT key (and try it in Picasa too). I think it would be useful to hit this with
gprof/oprofile because something is fishy there and long term of course you could
pre-render/load the JPGs (and maybe even add progressive loading even though I hate that)
like Picasa does (which I assume you don't right now?). I want Shotwell to feel extremely
light-weight so that when I try to find that special image that I want to show someone,
then bottle-neck should be how fast _I_ can browse/inspect the images not how fast the
machine is. Also note that if I launch a terminal with "htop" and mark it as "always on
top" and the hold down the RIGHT key so make Shotwell constantly switch to the next
image, it does not tax my CPU nor my HDD at 100% (not even a single core is saturated)
so maybe there is something cheezy goign on with keyboard repeat rate or similar?

* Double click any photo (from an event with multiple photos) to bring it up in
full view. Then super quickly hit the RIGHT keyboard key twice. Shotwell only
moves to the next image, not two images forward. This is really annoying if you
want to quickly skip past that particular one image when you had too much to drink
or whatever.

* Download and unpack these two images to a separate dir:
http://temp.minimum.se/shotwell_crashers/12.tgz
Launch with "rm -rf rm -rf ~/.shotwell ; SHOTWELL_LOG=1 gdbr ./shotwell"
and import from that dir, press OK when import finishes and immediately after
you press OK you will get a reproducible SEGV with this stack:
Program received signal SIGSEGV, Segmentation fault.
0x00000000004b9961 in batch_import_on_import_file_completed (self=0xb012a0, j=0xa10b40) at src/BatchImport.c:1642
1642			gee_collection_add (GEE_COLLECTION (self->priv->manifest->imported), photo);
(gdb) bt
#0  0x00000000004b9961 in batch_import_on_import_file_completed (self=0xb012a0, j=0xa10b40) at src/BatchImport.c:1642
#1  0x00000000004b8ff6 in _batch_import_on_import_file_completed_completion_callback (job=0xa10b40, self=0xb012a0) at src/BatchImport.c:1548
#2  0x0000000000544666 in background_job_on_notify_completion (self=0xa10b40) at src/Workers.c:566
#3  0x000000000054440a in _background_job_on_notify_completion_gsource_func (self=0xa10b40) at src/Workers.c:535
#4  0x00007ffff1ee9df2 in g_main_dispatch (context=0x84db20) at /build/buildd/glib2.0-2.23.4/glib/gmain.c:1960

* Launch Shotwell using "rm -rf ~/.shotwell ; SHOTWELL_LOG=1 gdbr ./shotwell" and import
the photos from this tarball: http://temp.minimum.se/shotwell_crashers/catbug.tgz
Click "Photos", select bug.jpg and then Events::NewEvent. At this point the bug gets
sort under the 1970 event node which is unintuitive (unless you know that unix date zero
is at 1970) but this is not something that makes sense for an end-user. How about having
a special event tree node for "Unknown Year" or something like that?

* Launch Shotwell using "rm -rf ~/.shotwell ; SHOTWELL_LOG=1 gdbr ./shotwell" and import
the photos from this tarball: http://temp.minimum.se/shotwell_crashers/catbug.tgz
Click "Photos", select cat.jpg and then Events::NewEvent. At this point the event tree
first expands but is then automatically collapsed again and it leaves me in this weird
state where no new event node has been added at all to the event node tree? In the terminal
I can see this (below) but it's unclear to me _why_ Shotwell destroys the event "Event" ?
[DBG] LibraryWindow.vala:221: Creating new event page for Event 2
[DBG] Event.vala:192: Destroying event Event [1/6] Event 1

* Are you aware that you're generating _extremely_ deep stacks during modest to large
imports (which will most likely give you a stackoverflow for imports of a certain size
and up)? I've seen cases where Shotwell used stacks 40000 frames deep. In these cases
the frames follow the following repeating pattern, i.e:

#9  0x0000000000476896 in spin_event_loop () at src/util.c:1138
#10 0x0000000000431ba2 in thumbnail_cache_import_thumbnails (photo_id=0x7fffffda4bd0, thumbnails=0x1b6188c0, force=1, error=0x7fffffda4be8) at src/ThumbnailCache.c:779
#11 0x0000000000472620 in library_photo_import (photo_row=0x16cfb68, thumbnails=0x1b6188c0, photo=0x7fffffda4c28) at src/Photo.c:4513
#12 0x000000000047b4ee in batch_import_on_import_file_completed (job=<value optimized out>, self=<value optimized out>) at src/BatchImport.c:1639
#13 _batch_import_on_import_file_completed_completion_callback (job=<value optimized out>, self=<value optimized out>) at src/BatchImport.c:1548
#14 0x00000000004d3411 in background_job_on_notify_completion (self=<value optimized out>) at src/Workers.c:566
#15 _background_job_on_notify_completion_gsource_func (self=<value optimized out>) at src/Workers.c:535
#16 0x00007ffff1ee9df2 in g_main_dispatch (context=0x7a5b20) at /build/buildd/glib2.0-2.23.4/glib/gmain.c:1960
#17 IA__g_main_context_dispatch (context=0x7a5b20) at /build/buildd/glib2.0-2.23.4/glib/gmain.c:2513
#18 0x00007ffff1eedc38 in g_main_context_iterate (context=0x7a5b20, block=<value optimized out>, dispatch=<value optimized out>, self=<value optimized out>) at /build/buildd/glib2.0-2.23.4/glib/gmain.c:2591
#19 0x00007ffff1eede1c in IA__g_main_context_iteration (context=0x7a5b20, may_block=1) at /build/buildd/glib2.0-2.23.4/glib/gmain.c:2654
#20 0x00007ffff52047d1 in gtk_main_iteration () from /usr/lib/libgtk-x11-2.0.so.0
#21 0x0000000000476896 in spin_event_loop () at src/util.c:1138
#22 0x0000000000431ba2 in thumbnail_cache_import_thumbnails (photo_id=0x7fffffda4e40, thumbnails=0x7fffd4664860, force=1, error=0x7fffffda4e58) at src/ThumbnailCache.c:779
#23 0x0000000000472620 in library_photo_import (photo_row=0x16cfa48, thumbnails=0x7fffd4664860, photo=0x7fffffda4e98) at src/Photo.c:4513
#24 0x000000000047b4ee in batch_import_on_import_file_completed (job=<value optimized out>, self=<value optimized out>) at src/BatchImport.c:1639
#25 _batch_import_on_import_file_completed_completion_callback (job=<value optimized out>, self=<value optimized out>) at src/BatchImport.c:1548
#26 0x00000000004d3411 in background_job_on_notify_completion (self=<value optimized out>) at src/Workers.c:566
#27 _background_job_on_notify_completion_gsource_func (self=<value optimized out>) at src/Workers.c:535
#28 0x00007ffff1ee9df2 in g_main_dispatch (context=0x7a5b20) at /build/buildd/glib2.0-2.23.4/glib/gmain.c:1960
#29 IA__g_main_context_dispatch (context=0x7a5b20) at /build/buildd/glib2.0-2.23.4/glib/gmain.c:2513
#30 0x00007ffff1eedc38 in g_main_context_iterate (context=0x7a5b20, block=<value optimized out>, dispatch=<value optimized out>, self=<value optimized out>) at /build/buildd/glib2.0-2.23.4/glib/gmain.c:2591
#31 0x00007ffff1eede1c in IA__g_main_context_iteration (context=0x7a5b20, may_block=1) at /build/buildd/glib2.0-2.23.4/glib/gmain.c:2654
#32 0x00007ffff52047d1 in gtk_main_iteration () from /usr/lib/libgtk-x11-2.0.so.0
#33 0x0000000000476896 in spin_event_loop () at src/util.c:1138

* When I start with a deleted ~/.shotwell and using SHOTWELL_LOG=1, then it says:
[DBG] DatabaseTables.vala:277: Database version -1 create by app version (null)
...is that supposed to be "created" maybe? And maybe a special message should be
printed when a new database is created instead of saying "app version (null)" ?

* If you try to publish to Picasa Web Albums and select publish to a new album
and you enter a single space character as the name, then it says "Service returned
HTTP status code 400". I think there should be a "START OVER" or "BACK" button on
this dialog page. Also I think you should prevent the user from pressing Publish
if trim(album_name)="". Also using the name "<h6>INJECTION" didn't work, maybe
some people will actually try stuff like "My <HAPPY> Birthday!" or whatever since
they don't know "<" and ">" is special chars so maybe Shotwell should warm about
that too?



		Martin



Jim Nelson wrote:
> Hello all,
> 
> Just to get the word out, we're rapidly moving toward wrapping up Shotwell
> 0.5.0 for release in the coming week.  As I've mentioned before, we have
> several new notable features we're excited about, including:
> 
> * Picasa Web publishing
> * Tags as another way of organizing your collection
> * Printing
> * Adjust photos dates and times, both to a single moment and shifting
> several forward and backward in time
> 
> We've fixed a number of the bugs you all reported in the last round of
> testing -- thanks so much!  We'd still like you to bang on Shotwell and put
> it through its paces.  We need people to pull the latest revision in trunk
> and try it out.  If you're interested, follow the directions here
> forgetting the source and building it:
> 
> http://trac.yorba.org/wiki/ShotwellInstallation
> 
> If you find bugs or issues -- anything that seems odd or wrong -- please
> feel free to report them here on the mailing list or via our Trac ticketing
> system at:
> 
> http://trac.yorba.org/
> 
> We're also always looking for translators to assist us in making Shotwell a
> world-class product.  If you're interested, please visit our Transifex page
> to get started:
> 
> http://www.transifex.net/projects/p/shotwell/
> 
> Thanks for your continued support!
> 
> -- Jim Nelson
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> Shotwell mailing list
> Shotwell at lists.yorba.org
> http://lists.yorba.org/cgi-bin/mailman/listinfo/shotwell




More information about the Shotwell mailing list