Description | Download | Changes | Home

xzgv

(xzgv window)

Description

xzgv is a picture viewer for X, with a thumbnail-based file selector. It uses GTK+ and Imlib 1.x. Most file formats are supported, and the thumbnails used are compatible with xv, zgv, and the Gimp.

xzgv differs from other picture viewers for X in that it uses one window for both the file selector and viewer, it (unlike xv) allows both scrolling and fit-to-window methods of viewing large pictures, and it (unlike xv and some others) doesn't ever mangle the picture's aspect ratio without you telling it to. It also provides extensive keyboard support; if you prefer using the keyboard, this is probably the best viewer for you. But it doesn't skimp on the mousey stuff, either - you can click on a picture to view it, drag the picture around to scroll (or use the scrollbars), it has menus, all that. So anyway, it's just terribly great. :-)

xzgv has a fair amount in common with my original svgalib-based zgv.


Download

The current version is 0.8, available from ibiblio.

WARNING: There is a known vulnerability in xzgv 0.8 (and all previous versions) such that suitably-constructed images can be made to run arbitrary commands (as the user) when viewed with xzgv. This has the potential to cause serious trouble, so I strongly recommend applying this patch (with e.g. "patch -p0 <xzgv*.diff") before compiling. This is intended as a temporary measure until I can put together a more comprehensive fix (which would be complicated and isn't likely to happen soon), but should be effective in the meantime.


Changes

This excerpt from NEWS lists the changes from xzgv 0.7 onwards.

Changes in xzgv 0.8

New features

Added support for the Exif orientation tag (Exif in this context is a form of JPEG). If you enable the "Use Exif Orientation" option in the viewer (or `exif-orient' config/option), it'll compensate for the (e.g.) digital camera's orientation when viewing, so pictures taken with the camera side-on will display the way you would probably want them to. However, since this differs from how most *other* programs will see the files - which are, after all, carefully constructed to be compatible with JFIF/JPEG files - and has the potential to be extremely confusing if you don't know exactly what's going on, it's not enabled by default. Thanks to Fraser Wright for suggesting this feature.


Bugfixes

Broken GIFs could overrun a buffer previously - fixed.

Added call to gtk_set_locale() which should hopefully avoid problems when GTK+'s default font is set to something which isn't ASCII-friendly. Thanks to Alexander Pohoyda for this one.

Fixed JPEG segfault bug on files which were corrupted after the image itself. Thanks to Aaron Brick for spotting this one.

Fixed long-standing bug with interpolation, which could have resulted in segfaults (though it's hard to say if it ever actually did).

Stopped selector getting permanently hidden if two middle-button presses were too close together. Thanks to José Luis González González for spotting this.

No longer sets background colour to black for mono PNG files, where this may cause problems. This change was ported from zgv; thanks to Morten Bo Johansen for spotting it there.


Other changes

Added 9/0 keys as yet another way of doing file untag/tag. These are last-ditch alternatives for keyboards where -/= don't make sense (some non-US/UK keyboards), and where keypad -/+ aren't easily accessible (e.g. laptops). Thanks to Szabó, Balázs for inspiring this one.



Changes in xzgv 0.7

New features

Now adapts rendering method for big images. When the number of pixels in the image exceeds the value set by image-bigness-threshold (as set in config file or on command-line, defaulting to 2 million pixels), it's drawn piece-by-piece on demand rather than all-at-once. The all-at-once behaviour is worth keeping around for smaller images, as it gives much nicer scrolling - but for big images it's just impractical, hence this feature.

Added a builtin TIFF reader (libtiff-based); TIFFs should be read more quickly now.

Also uses builtin JPEG reader (libjpeg-based) for all JPEG reading now (not just thumbnails), which is a tiny bit faster. A new command-line and config file option `careful-jpeg' lets you enable `fancy upsampling', the disabling of which is why Imlib's reader was previously faster. (I wouldn't have chosen this as the default if I'd known, but enabling it means a 10% slowdown. :-/)

Added support for PRF (ported from zgv), which is basically a kind of extrapolated version of my old mrf format - unlike mrf, PRF supports greyscale and colour. Thanks to Brian Raiter for both devising the format, and writing the reference implementation readprf.c is heavily based on.

Recursive thumbnail update no longer reads all thumbnails before doing updates - it now only bothers to read visible thumbnails. This makes the `fast-recursive-update' option rather less useful, as it's nearly that fast already. :-)

Added choice of timestamps to use when sorting in time/date order - you can now choose between mtime (default), ctime, and atime. You can switch with alt-shift-m/c/a, or from the selector menu's Directory/Time & Date Type submenu, or with `sort-timestamp-type' option (on command-line or in config file). Thanks for Wolfram Kleff for suggesting this.

You can now move to the next/previous tagged file with `/' and `?' respectively (or equivalent menu options). When used in the viewer, this also views the file.

Toggling all tags is now possible, with Alt-o or Tagging/Toggle All.

Added `delete-single-prompt' option (on command-line and in config file) so you can disable the confirmation prompt when deleting a file, rather like zgv's `nodelprompt'. Thanks to Martin Bialasinski for suggesting this.

Added help menus. Currently just runs info on the relevant node - pretty crude, but better than nothing. :-)

Keyboard navigation additions - you can now use shifted cursor keys as an alternative means of paging up/down/left/right in the viewer, and ^u/^v/^a/^e are supported as alternatives to Page Up/Page Down and Home/End in both the selector and the viewer.

Any `Menu' key you might have can now be used to show the selector/viewer menus, just as right-clicking or pressing F10 does.


Bugfixes

A fix for certain unusual GIFs (with an abnormally large code size - larger than even non-LZW GIFs need), which previously caused xzgv to segfault. Thanks to Lenart Janos (in particular), Josip Rodin, Chris Lawrence, and Andy Mortimer for all helping with this in one way or another.

Changed make install's `install -m' invocations to do plain install and change permissions after (with chmod). Thanks to Steven Bankowitz for reminding me of `-m' being a problem on things like Solaris.

Replaced make install's ifeq/ifneq with shell equivalent, which turns out to be sufficient (if uglier). This should avoid the need to use GNU make. Thanks to Frank Pohl for spotting this problem.

Previously, the GIF/PNG/mrf file readers failed to notice the problem images larger than 32767 in either dimension would cause (by being bigger than an X window can handle), leading to a segfault - they now give an error.

Fixed bug where (while thumbnails were being loaded) doing things like holding down space to storm through N images got it very confused indeed.

Concerted attempt to nail all the remaining recursion problems (essentially, it could previously get confused if you told it to do certain things twice, and it saw the second request while dealing with the first). Not perfect though, as the protections are independent (do a mirror and flip at about the same time, and it'll mess up), so this needs a better fix eventually.

Previously, when you scaled down as far as it would go, it would never let you scale down again in the same way, due to breaking an anti-recursion measure. Fixed that.

`-lz' was missing from src/Makefile. I usually got away with this, but it did break in some cases (perhaps with Imlib 1.9.10?). Thanks to Gabor Z. Papp for pointing this out.

The alternative up/down movement keys in the selector (j and k) should now work the same way cursor up/down do.

Focus is now returned to selector when changing dir, making the past-position action clearer when using the mouse (i.e. if you go down into a dir and then back up, the keyboard cursor will show which dir you just left). Previously, if you'd viewed an image before changing dir with the mouse, focus would have remained on the image.

Now does cursor past-position save/restore `around' recursive update.

As must be traditional by now, I found a bug almost immediately after the (0.6) release. :-) Previously you could still toggle thin-rows while running in the `xzgv file(s)' way, which was silly and made things look strange (but was otherwise harmless).

Fixed redraw-related position problem. (In 0.6, try going to the end of the selector's list, pressing `v', then pressing `v' again - the row positioning is slightly wrong.)


Other changes

Rendering (and fallback file-reading) is now indirected through the new backend.c, which should now be the only part of xzgv dependent on Imlib 1.x (well, apart from src/Makefile). This should make it easier to switch backends, or to support multiple backends. I've also added most of a gdk-pixbuf backend, but I've not been too impressed with the performance, and there are some inconvenient omissions which explain the current, uh, `partialness'. :-)

Now makes sure a page of thumbnails is visible even when doing non-recursive update - previously doing such an update before all thumbnails had been read in would show blank spots during the update (unlike the now-usual xzgv behaviour of loading onscreen thumbnails asap). This only seems to slow it down fractionally (by about 0.5% in a large dir full of small files in thin-rows mode), so I think it's worth it to get the consistency.

Various changes to the selector and viewer menus, in an attempt to tidy things up a bit.

`make install' permissions are now Debian-ish, i.e. explicitly marked as writeable by root (rather than implicitly so ;-)), and all world-readable.

No longer includes the version number in the window title.


Last updated 2004 Nov 3