Sync to GQview 1.5.9 release.
authorJohn Ellis <johne@verizon.net>
Sat, 26 Feb 2005 00:13:35 +0000 (00:13 +0000)
committerJohn Ellis <johne@verizon.net>
Sat, 26 Feb 2005 00:13:35 +0000 (00:13 +0000)
########
 DO NOT BASE ENHANCEMENTS OR TRANSLATION UPDATES ON CODE IN THIS CVS!
 This CVS is never up to date with current development and is provided
 solely for reference purposes, please use the latest official release
 package when making any changes or translation updates.
########

175 files changed:
po/ChangeLog
po/POTFILES.in
po/ar.po [new file with mode: 0644]
po/bg.po [new file with mode: 0644]
po/cs.po [new file with mode: 0644]
po/da.po [new file with mode: 0644]
po/de.po
po/es.po
po/et.po [new file with mode: 0644]
po/fi.po [new file with mode: 0644]
po/fr.po
po/hu.po [new file with mode: 0644]
po/id.po [new file with mode: 0644]
po/it.po [new file with mode: 0644]
po/ja.po
po/nl.po [new file with mode: 0644]
po/no.po [new file with mode: 0644]
po/pl.po [new file with mode: 0644]
po/pt_BR.po
po/ro.po [new file with mode: 0644]
po/ru.po
po/sk.po
po/sl.po [new file with mode: 0644]
po/sv.po [new file with mode: 0644]
po/th.po [new file with mode: 0644]
po/tr.po
po/uk.po [new file with mode: 0644]
po/vi.po [new file with mode: 0644]
po/zh_CN.GB2312.po [new file with mode: 0644]
po/zh_TW.po [new file with mode: 0644]
src/Makefile.am
src/bar_exif.c [new file with mode: 0644]
src/bar_exif.h [new file with mode: 0644]
src/bar_info.c [new file with mode: 0644]
src/bar_info.h [new file with mode: 0644]
src/bar_sort.c [new file with mode: 0644]
src/bar_sort.h [new file with mode: 0644]
src/cache.c [new file with mode: 0644]
src/cache.h [new file with mode: 0644]
src/cache_maint.c [new file with mode: 0644]
src/cache_maint.h [new file with mode: 0644]
src/cellrenderericon.c [new file with mode: 0644]
src/cellrenderericon.h [new file with mode: 0644]
src/collect-dlg.c [new file with mode: 0644]
src/collect-dlg.h [new file with mode: 0644]
src/collect-io.c [new file with mode: 0644]
src/collect-io.h [new file with mode: 0644]
src/collect-table.c [new file with mode: 0644]
src/collect-table.h [new file with mode: 0644]
src/collect.c [new file with mode: 0644]
src/collect.h [new file with mode: 0644]
src/config.c [deleted file]
src/dnd.c
src/dnd.h [new file with mode: 0644]
src/dupe.c [new file with mode: 0644]
src/dupe.h [new file with mode: 0644]
src/editors.c [new file with mode: 0644]
src/editors.h [new file with mode: 0644]
src/exif.c [new file with mode: 0644]
src/exif.h [new file with mode: 0644]
src/filelist.c
src/filelist.h [new file with mode: 0644]
src/fileops.c [deleted file]
src/fullscreen.c [new file with mode: 0644]
src/fullscreen.h [new file with mode: 0644]
src/globals.c
src/gqview.h
src/icons/Makefile.am
src/icons/collect.xpm [new file with mode: 0644]
src/icons/config.xpm [new file with mode: 0644]
src/icons/dialog.xpm [new file with mode: 0644]
src/icons/folder_closed.png [new file with mode: 0644]
src/icons/folder_locked.png [new file with mode: 0644]
src/icons/folder_open.png [new file with mode: 0644]
src/icons/folder_up.png [new file with mode: 0644]
src/icons/gqview_logo.png [new file with mode: 0755]
src/icons/icon.xpm [new file with mode: 0644]
src/icons/icon_config.xpm [deleted file]
src/icons/icon_home.xpm [deleted file]
src/icons/icon_reload.xpm [deleted file]
src/icons/icon_zoom_fit.xpm [deleted file]
src/icons/icon_zoom_in.xpm [deleted file]
src/icons/icon_zoom_norm.xpm [deleted file]
src/icons/icon_zoom_out.xpm [deleted file]
src/icons/img_unknown.xpm [deleted file]
src/icons/marker.xpm [new file with mode: 0644]
src/icons/scroller.png [new file with mode: 0644]
src/icons/sheet_broken.png [new file with mode: 0644]
src/icons/tools.xpm [new file with mode: 0644]
src/icons/view.xpm [new file with mode: 0644]
src/image-load.c [new file with mode: 0644]
src/image-load.h [new file with mode: 0644]
src/image-overlay.c [new file with mode: 0644]
src/image-overlay.h [new file with mode: 0644]
src/image.c
src/image.h
src/img-main.c [deleted file]
src/img-view.c
src/img-view.h [new file with mode: 0644]
src/info.c [new file with mode: 0644]
src/info.h [new file with mode: 0644]
src/intl.h
src/layout.c [new file with mode: 0644]
src/layout.h [new file with mode: 0644]
src/layout_config.c [new file with mode: 0644]
src/layout_config.h [new file with mode: 0644]
src/layout_image.c [new file with mode: 0644]
src/layout_image.h [new file with mode: 0644]
src/layout_util.c [new file with mode: 0644]
src/layout_util.h [new file with mode: 0644]
src/logo.h [deleted file]
src/main.c
src/md5-util.c [new file with mode: 0644]
src/md5-util.h [new file with mode: 0644]
src/menu.c
src/menu.h [new file with mode: 0644]
src/pathsel.c [deleted file]
src/pixbuf_util.c [new file with mode: 0644]
src/pixbuf_util.h [new file with mode: 0644]
src/preferences.c [new file with mode: 0644]
src/preferences.h [new file with mode: 0644]
src/print.c [new file with mode: 0644]
src/print.h [new file with mode: 0644]
src/rcfile.c
src/rcfile.h [new file with mode: 0644]
src/remote.c [new file with mode: 0644]
src/remote.h [new file with mode: 0644]
src/search.c [new file with mode: 0644]
src/search.h [new file with mode: 0644]
src/similar.c [new file with mode: 0644]
src/similar.h [new file with mode: 0644]
src/slideshow.c
src/slideshow.h [new file with mode: 0644]
src/tabcomp.c [deleted file]
src/tabcomp.xpm [deleted file]
src/thumb.c
src/thumb.h [new file with mode: 0644]
src/thumb_standard.c [new file with mode: 0644]
src/thumb_standard.h [new file with mode: 0644]
src/typedefs.h [new file with mode: 0644]
src/ui_bookmark.c [new file with mode: 0644]
src/ui_bookmark.h [new file with mode: 0644]
src/ui_fileops.c [new file with mode: 0644]
src/ui_fileops.h [new file with mode: 0644]
src/ui_help.c [new file with mode: 0644]
src/ui_help.h [new file with mode: 0644]
src/ui_menu.c [new file with mode: 0644]
src/ui_menu.h [new file with mode: 0644]
src/ui_misc.c [new file with mode: 0644]
src/ui_misc.h [new file with mode: 0644]
src/ui_pathsel.c [new file with mode: 0644]
src/ui_pathsel.h [new file with mode: 0644]
src/ui_spinner.c [new file with mode: 0644]
src/ui_spinner.h [new file with mode: 0644]
src/ui_spinner.png [new file with mode: 0755]
src/ui_tabcomp.c [new file with mode: 0644]
src/ui_tabcomp.h [new file with mode: 0644]
src/ui_tabcomp.png [new file with mode: 0644]
src/ui_tree_edit.c [new file with mode: 0644]
src/ui_tree_edit.h [new file with mode: 0644]
src/ui_utildlg.c [new file with mode: 0644]
src/ui_utildlg.h [new file with mode: 0644]
src/utildlg.c [deleted file]
src/utildlg.h [deleted file]
src/utilops.c
src/utilops.h [new file with mode: 0644]
src/view_dir_list.c [new file with mode: 0644]
src/view_dir_list.h [new file with mode: 0644]
src/view_dir_tree.c [new file with mode: 0644]
src/view_dir_tree.h [new file with mode: 0644]
src/view_file_icon.c [new file with mode: 0644]
src/view_file_icon.h [new file with mode: 0644]
src/view_file_list.c [new file with mode: 0644]
src/view_file_list.h [new file with mode: 0644]
src/window.c [deleted file]

index e69de29..677cf4d 100644 (file)
@@ -0,0 +1,10 @@
+2002-04-25  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.38.
+
+2002-01-27  gettextize  <bug-gnu-utils@gnu.org>
+
+       * Makefile.in.in: Upgrade to gettext-0.10.38.
+       * cat-id-tbl.c: Remove file.
+       * stamp-cat-id: Remove file.
+
index c7d1d08..0ba30b2 100644 (file)
@@ -1,16 +1,36 @@
-./src/config.c
-./src/dnd.c
+./src/bar_info.c
+./src/bar_exif.c
+./src/bar_sort.c
+./src/cache_maint.c
+./src/collect.c
+./src/collect-dlg.c
+./src/collect-table.c
+./src/dupe.c
+./src/editors.c
+./src/exif.c
 ./src/filelist.c
-./src/fileops.c
+./src/fullscreen.c
 ./src/image.c
-./src/img-main.c
+./src/image-overlay.c
 ./src/img-view.c
+./src/info.c
+./src/layout.c
+./src/layout_config.c
+./src/layout_image.c
+./src/layout_util.c
 ./src/main.c
 ./src/menu.c
-./src/pathsel.c
+./src/preferences.c
+./src/print.c
 ./src/rcfile.c
-./src/tabcomp.c
+./src/search.c
 ./src/thumb.c
-./src/utildlg.c
+./src/ui_bookmark.c
+./src/ui_help.c
+./src/ui_pathsel.c
+./src/ui_tabcomp.c
 ./src/utilops.c
-./src/window.c
+./src/view_dir_list.c
+./src/view_dir_tree.c
+./src/view_file_icon.c
+./src/view_file_list.c
diff --git a/po/ar.po b/po/ar.po
new file mode 100644 (file)
index 0000000..cb8ddfc
--- /dev/null
+++ b/po/ar.po
@@ -0,0 +1,3537 @@
+# translation of ar.po to 
+# translation of ar.po to
+# translation of ar.po to
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR John Ellis, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ar\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2004-10-19 16:58-0400\n"
+"Last-Translator: Youssef Assad\n"
+"Language-Team:  <youssef@devcabal.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.3\n"
+"X-Poedit-Language: Arabic\n"
+"X-Poedit-Country: EGYPT\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "أدوات"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "بُؤرة"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+#, fuzzy
+msgid "Keyword Presets"
+msgstr "الكلمات الدليلية"
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr "الكلمات الدليلية"
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "إسم الملف:"
+
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "تاريخ الملف"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr "الكلمات الدليلية"
+
+#: src/bar_info.c:1095
+msgid "Comment:"
+msgstr "تعليق:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr "أضف الكلمات التحليلية الى الملف"
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr "استبدل الكلمات التحليلية فى الملف"
+
+#: src/bar_info.c:1130
+msgid "Save comment now"
+msgstr "احفظ التعليق الآن"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "البطاقة"
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "الاسم"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "القيمة"
+
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "الصيغة"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "العناصر"
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "الوصف"
+
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "Exif"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "الواجهة المتطورة"
+
+#: src/bar_sort.c:218
+msgid "Unlink failed"
+msgstr "فشل حذف الوصل"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr "فشل الوصل"
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"هذا الدليل: \n"
+"%s \n"
+" موجود بالفعل."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "المجموعة فارغة"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"فشل حفظ المجموعة:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "الحفظ فشل مع الأسف المطلق"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "أضف علامة"
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "مجاميع"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "الإسم:"
+
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "مدير الترتيب"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "دﻻئل"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "مجاميع"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "انسخ"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "حرك"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr "وصل"
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d الصور"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "الغى الاختيار"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "الغاء الصورة الأخيرة"
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "منتهى"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "تجرى الآن قراءة بيانات مدى التطابق"
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "تنظيف النسخ المصغرة للصور"
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "حذف النسخ المصغرة للصور القديمة"
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+msgid "Invalid folder"
+msgstr "دليل خاطئ"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "احتفظ بالنماذج المصغّرة للصور"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "رقم البداية"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "دليل:"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "الغى الاختيار"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "دليل خاطئ"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "يجرى..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "تنظيف النسخ المصغرة للصور"
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "نظّف مخزون الملفات المؤقتة"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"هذا الأمر يحذف جميع النماذج المصغّرة من الصور المخزونة. \n"
+"هل تريد الإستمرار؟"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "بحث الصور - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview شاشة كاملة"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "عمل"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "امسح"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "احتفظ بالنماذج المصغّرة للصور"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "عرص النماذج المصغرة للصور"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "عد التسمية "
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "بدون اسم"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "بدون اسم (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - GQview مجموعة"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "اغلق المجموعة"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"المجموعة قد تم تعديلها.\n"
+"هل تريد حفظها؟"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"المكان المحدد:\n"
+"%s\n"
+"دليل. المجموعة ملف و ليست دليلا."
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "اسم الملف غير سليم"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "احفظ الملف بدلا من الملف الاخر"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "حفظ الملف مكان الملف الموجود الحالى"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "احفظ الملف بدلا من الملف الاخر"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "احفظ المجموعة"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "افتح مجموعة"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "اضف للمجموعة"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "أضف"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "ملفات المجموعة"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "المجموعة فارغة"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "المجموعة فارغة. تم وقف عملية الحفظ."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "فارغ"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%dالصور (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d الصور"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "تحميل نماذج الصور المصغرة"
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "اعرض"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "اعرض فى نافذة جديدة"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "احذف"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "اضف من القائمة"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "اضف من المجموعة"
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "اختر الكل"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "الغى الاختيار"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "الخواص"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "إنسخ..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "حرك..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "أعد تسمية..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "إحذف..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "إعرض إسم الملف على هيئة نص"
+
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "إحفظ المجموعة"
+
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "إحفظ المجموعة بإسم..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "ابحث عن النسخ المطابقة..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/ملف/إبحث..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "القائمة المسقوطة تحوى أدلة"
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "أضف محتويات"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "أضف محتويات "
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "تجاهل الدلائل"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "الغى"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "اسقط الملفات للمقارنة بينهم"
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d ملفات"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d ملفات مطابقة وجدت فى %d ملفات"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[المجموعة 1]"
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr ""
+"تجرى الآن قراءة البصمة الخاصة  لفحص حدوث الأخطاء في الإرسال أو   التّخزين ..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "تجرى الآن قراءة أبعاد الصورة"
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "تجرى الآن قراءة بيانات مدى التطابق"
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "تجرى الآن المقارنة..."
+
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "تجرى الآن عملية التصنيف..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "إختر الملفات المطابقة من المجموعة الأولى"
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "إختر الملفات المطابقة من المجموعة الثانية"
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "أضف إلى مجموعة جديدة"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "إمسح"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "غغلق النافذة"
+
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "%d ( ملفات (المجموعة الثانية"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "الحجم"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "التاريخ"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "الأبعاد"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr " البصمة لفحص حدوث الأخطاء في الإرسال أو   التّخزين ..."
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "المسار"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "درجة تطابق (عالية)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "درجة تطابق"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "درجة تطابق (منخفضة)"
+
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "درجة تطابق (حسب الطلب)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "ابحث عن الملفات المطابقة - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "قارن مع: "
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "قارن حسب:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "النسخ المصغرة للصور"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "قارن بين مجموعتين من الصور"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "در الjpeg بإتجاه عقرب الساعة "
+
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "در الjpeg بعكس إتجاه عقرب الساعة "
+
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "وقف..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "حرر الناتج من الأمر"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "الناتج من %s"
+
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"فشل تنفيذ الأمر:\n"
+"%s\n"
+
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "انهاء بأمر المستخدم"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "غير معلوم"
+
+#: src/exif.c:113
+msgid "top left"
+msgstr "أعلى يسار"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "أعلى يمين"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "أسفل يمين"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "أسفل يسار"
+
+#: src/exif.c:117
+msgid "left top"
+msgstr "يسار أعلى"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "يمين أعلى"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "يمين أسفل"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "يسار أسفل"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "بوصة"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "سنتيمتر"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "متوسط"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "موزون وسط"
+
+#: src/exif.c:142
+msgid "spot"
+msgstr "spot"
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr "multi-spot"
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr "multi-segment"
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "partial"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "آخر"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "غير معرّف"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "يدوى"
+
+#: src/exif.c:153
+msgid "normal"
+msgstr "عادى"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "بُؤرة"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "الدرفة"
+
+#: src/exif.c:156
+msgid "creative"
+msgstr "مبدع"
+
+#: src/exif.c:157
+msgid "action"
+msgstr "عمل"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "صورة بالطول"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "صورة بالعرض"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "ضوء النهار"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "إضاءة فلورسنت"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "tungsten (منير)"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "فلاش"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "لا"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "نعم"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr "نعم, غير مكتشف عن طريق  الستروب الومّاض"
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr "نعم, مكتشف عن طريق  الستروب الومّاض"
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "وصف الصورة"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "التوجيه"
+
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "حقوق الطبع و النشر"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "برنامج التعرض"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "درجة الحساسية ISO"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "تاريخ الأصل"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "تارسخ الترقيم"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "سرعة الدرفة"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "بُؤرة"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "تحيّز التعرّض"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "بعد الموضوع المصوّر عن الكاميرا"
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "نمط القياس"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "مصدر الإضاءة"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "فلاش"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "الطول ا لبؤرى"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "العرض"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "الإرتفاع"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "كاميرا"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "نقاء الصورة"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "اللانهاية"
+
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "النمط:"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "شغّال"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "واقف"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "آلى"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr "غير مكتشف عن طريق  الستروب الومّاض"
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr "مكتشف عن طريق  الستروب الومّاض"
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "معالجة إحمرار العيون"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "نقطة"
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d بايت"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f ك"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f  ميجابايت"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f  جيجابايت"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview شاشة كاملة"
+
+#: src/fullscreen.c:397
+msgid "Full size"
+msgstr "الحجم الكامل"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr "الشاشة"
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr "سطح الشاشة"
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "اجعل حجم الصورة مناسبة لحجم النافذة"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr "سطح الشاشة الحالية"
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr "الشاشة الحالية"
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "ضخّم"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "صغّر (عكس ضخّم)"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "اعرض الصورة بالحجم الفعلى"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "اعرض الصورة بالحجم المناسب لحجم النافذة"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "استخدم الصورة كخلفية"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "اوقف عرض الشرائح"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "استكمل عرض الشرائح"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "ازقف عرض الشرائح مؤقتاًً"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "ابدأ عرض الشرائح"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "استخدم نافذة عادية للعرض"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "استخدم الشاشة كاملة للعرض"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "اغلق النافذة"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "حجم الملف: "
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "الأبعاد: "
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "شفاف: "
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "حجم الصورة: "
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "نسبة الضغط: "
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "تاريخ الملف"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "الصاحب:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "المجموعة:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "عام"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "صورة %d من %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "خواص الصورة - GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "صاعد"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr "عرض شرائح"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr "موقوف مؤقتا"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d ملفات (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d ملفات %s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d ملفات %s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(غير مصرّح للقراءة) %s  بايتات"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s بايتات"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s بايتات"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview أدوات"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "أدوات"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "ملفات"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "صورة"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(جرّ لتغير الترتيب)"
+
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "إخف قائمة الملفات"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "فى %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "فى (مجهول)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "فارغ"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/ملف"
+
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "حرر"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "عدّل"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/مساعدة"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/ملف/نافذة جديدة"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "إحفظ المجموعة"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "افتح مجموعة"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/ملف/افتح ملف إستخدم مؤخرا"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "جارى البحث..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/ملف/إبحث..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "دليل جديد..."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "النقاء"
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "در  بإتجاه عقرب الساعة"
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "در عكس  إتجاه عقرب الساعة"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "در 180 درجة"
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "إعكس الصورة كالمرآه"
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "إعكس الصورة من أعلى إلى أسفل"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "اختر الكل"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "الغى الاختيار"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "الخواص:"
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/اعرض/اعرض الصورة بالحجم المناسب لحجم النافذة"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "استخدم الشاشة كاملة للعرض"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "إخف قائمة الملفات"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "اوقف عرض الشرائح"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "انعش"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/مساعدة/عن"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/مساعدة/إختصارات لوحة المفاتيح"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/مساعدة/مذكرات الإصدارة"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/مساعدة/عن"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "النسخ المصغرة للصور"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/اعرض/شجرة"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/اعرض/افصل شباك عرض الملفات فى نافذة مستقلة"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/اعرض/خبئ شريط الأدوات"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "الكلمات الدليلية"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/اعرض/معلومات الEXIF"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "مدير الترتيب"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/اعرض/عرض اسماء الملفات"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "الأيقون:"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "عرص النماذج المصغرة للصور"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "اذهب إلى الدليل الرءيسى الخاص بالمستخدم"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "انعش قائمة الملفات"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "ضخّم"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "صغّر (عكس ضخّم)"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "اجعل حجم الصورة مناسبة لحجم النافذة"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "اعرض الصورة بالحجم الحقيقى"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "الإعدادات"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "افصل الأدوات فى نافذة مستقلة"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "مساعدة - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "سطر الأوامر"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "حمّل الصورة القادمة قبل عرضها"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "الغاء الصورة الأخيرة"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "الغاء الصورة الأخيرة"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "استخدم نافذة عادية للعرض"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "استخدم نافذة عادية للعرض"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "استخدم نافذة عادية للعرض"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "اوقف عرض الشرائح"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "ابدأ عرض الشرائح"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "اوقف عرض الشرائح"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "ابدأ عرض الشرائح"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview أدوات"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr "عد تسمية الملف:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "اعرض فى نافذة جديدة"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"استخدام: [مسار] [خيارات] \n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "الخيارات المتاحة هى:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           اعرض الأدوات بشكل إجبارى\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        خبئ الأدوات بشكل إجبارى\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           إبدأ البرنامج ليمﻷ الشاشة كاملة\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            ابدأ فى نمط عرض الشرائح\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr "  -l, --list                 افتح نافذة مجموعة \n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr "  -l, --list                 افتح نافذة مجموعة \n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    عرض البيانات التنقيحية\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              أذكر رقم الإصدارة\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 غعرض هذه الرسالة\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"خاطئ أو مهمل: %s\n"
+"استخدم --help لعرض الخيارات\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "انشاء دليل gqview الخاص: %s \n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "فشل انشاء الدليل: %s \n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "الدليل الرءيسى الخاص بالمستخدم"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "سطح مكتب الحاسب"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - خروج"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "عن - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"لم يتم حفظ بعض المجاميع التى تغيرت.  \n"
+"هل تريد الخروج؟"
+
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "رتّب حسب حجم الملف"
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "رتّب حسب تاريخ الملف"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "غير مرتّب"
+
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "رتّب حسب المسار"
+
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "رتّب حسب العدد"
+
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "رتّب حسب إسم الملف"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "رتّب"
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "در 180 درجة"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "الأقرب (أسوأ نقاء فى أسرع وقت)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "بلاط"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "ثنائيّ"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "رائع (افضل نقاء مع أطول وقت)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr " لا شيئ "
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "عادى"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "الأفضل"
+
+#: src/preferences.c:498 src/print.c:365
+#, fuzzy
+msgid "Custom"
+msgstr "آلى"
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "رد المرشحات إلى حالاتهم الإفتراضية"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"هذا الأمر يرد المرشحات إلى حالاتهم الإفتراضية. \n"
+"هل تريد الإستمرار؟"
+
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "ردّ المحرر إلى الحالة الإفتراضية"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"هذا الأمر يردّ المحرر إلى الحالة الإفتراضية. \n"
+"هل تريد الإستمرار؟"
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "نظّف الملفات المحذوفة من سلّة المهملات"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "هذا الأمر ينظّف الملفات المحذوفة من سلّة المهملات"
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview شاشة كاملة"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "رقم البداية"
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "اذهب إلى الدليل الرءيسى الخاص بالمستخدم"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "استخدم الحالى"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "الحجم:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "النقاء:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "احتفظ بالنماذج المصغّرة للصور"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "احتفظ بالنماذج المصغّرة للصور فى .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "استخدم النماذج المصغّرة من برنامج xvpics إن وجد (قراءة فقط)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "عرض شرائح"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "مدّة التأخيربين الصورة و الأخرى (ثوانى):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "عشوائى"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "كرّر"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "ضخّم"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "نمط تربيك الصورة:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "ضخّم (مرور مزدوج)"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "اسمح بزيادة حجم الصورة عند اعطاء أمر التضخيم لملاءمة حجم النافذة"
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "الدرجات التزايدية للتضخيم:"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "عند إختيار صورة جديدة:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "اعرض الصورة بالحجم الحقيقى لها"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "أترك خيار التضخيم كما كان من قبل"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "أضف"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "خلفية سوداء"
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "استمرّ"
+
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "أنعش عند تحميل صورة أخرى"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "حمّل الصورة القادمة قبل عرضها"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "در الصورة تلقائيا بواسطة المعلومات التابعة لExif"
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "نوافذ"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "رقم البداية"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "تذكر مواقع النوافذ"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "تذكر حالة الأدوات (منفصلة فى نافذة منفصلة أو مخفى)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr ""
+"عدّل أبعاد النفذة لملاءمة حجم الصورة عندما تكون الأدوات منفصلة عن النافذة "
+"الرئيسية أو مخفاه"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "تحديد حجم النافذة عند تعديل أبعادها تلقائيا (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "التخطيط"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "الترشيح"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "عرض الدﻻئل و الملفات التى تبدأ بنقطة . "
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "ترتيب الملفات و الدلائل حسب أحجام حروف الإسم"
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "اعمل دون ترشيح الملفات"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "تاريخ الملف"
+
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "ترشيح"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "الإفتراضات"
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "المحرّرون"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "إسم القائمة"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "متطور"
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "استخدم الشاشة كاملة للعرض"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "حجم الصورة: "
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "غحذف"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "أكّد حذف الملفات"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "مكّن زر الDelete"
+
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "حذف آمن"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "الحدّ الأعلى (ميجابايت):"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "عرض"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "إختيار مستطيل"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "الدخول فى الدﻻئل فى العرض الشجرى للملفات"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "إعادة تسمية الملفات فى موضعها"
+
+#: src/preferences.c:1200
+#, fuzzy
+msgid "Navigation"
+msgstr "عمل"
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "التحريك التقدمى للوحة المفاتيح"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "عجلة الفأرة تحرّك الصورة"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "عتبة التطابق عند إستخدام بحث التطابق  حسب الطلب:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "حجم الذاكرة غير المرئية المخصصة للصور (ميجابايت للصورة):"
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "عن - GQview"
+
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"حقوق الطبع و النشر (c) %s John Ellis\n"
+"الموقع: %s\n"
+"بريد إلكترونى: %s\n"
+"\n"
+"أصدرت تحت رخصة General Public License: GPL"
+
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "أسماء من ساعدوا فى التنفيذ:"
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "الغى الاختيار"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+#, fuzzy
+msgid "Default printer"
+msgstr "الإفتراضات"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr ""
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "حجم الصورة: "
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+#, fuzzy
+msgid "centimeters"
+msgstr "سنتيمتر"
+
+#: src/print.c:353
+#, fuzzy
+msgid "inches"
+msgstr "بوصة"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+#, fuzzy
+msgid "Portrait"
+msgstr "صورة بالطول"
+
+#: src/print.c:360
+#, fuzzy
+msgid "Landscape"
+msgstr "صورة بالعرض"
+
+#: src/print.c:366
+#, fuzzy
+msgid "Letter"
+msgstr "سنتيمتر"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, fuzzy, c-format
+msgid "page %d of %d"
+msgstr "صورة %d من %d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "العرض الأولي"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "يوجد ملف بهذا الإسم %s"
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "ترشيح"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+msgid "Details"
+msgstr "التفاصيل"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "عن - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "الصيغة"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "التوجيه"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "الوصف"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "إسم الملف"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "بدون اسم"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "شغّال"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "رتّب"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "حجم الصورة: "
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "بُؤرة"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+#, fuzzy
+msgid "Right:"
+msgstr "الإرتفاع"
+
+#: src/print.c:3432
+#, fuzzy
+msgid "Top:"
+msgstr "المجموعة:"
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "إلى:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "ترشيح"
+
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr ""
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "ترشيح:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "تاريخ الملف"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "تذكر مواقع النوافذ"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "خطأ فى عملية حفظ ملف الإعدادات: %s \n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "دليل:"
+
+#: src/search.c:201
+msgid "comments"
+msgstr "تعليقات"
+
+#: src/search.c:202
+msgid "results"
+msgstr "نتائج"
+
+#: src/search.c:206
+msgid "contains"
+msgstr "يحتوى على"
+
+#: src/search.c:207
+msgid "is"
+msgstr "هو"
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr "يساوى"
+
+#: src/search.c:212
+msgid "less than"
+msgstr "أقلّ من"
+
+#: src/search.c:213
+msgid "greater than"
+msgstr "أكثر من"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr "ما بين"
+
+#: src/search.c:219
+msgid "before"
+msgstr "قبل"
+
+#: src/search.c:220
+msgid "after"
+msgstr "بعد"
+
+#: src/search.c:225
+msgid "match all"
+msgstr "وفّق مع كلّ الشروط"
+
+#: src/search.c:226
+msgid "match any"
+msgstr "وفّق مع أى من الشروط"
+
+#: src/search.c:227
+msgid "exclude"
+msgstr "إستثن"
+
+#: src/search.c:277
+#, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d ملفات (%s, %d)"
+
+#: src/search.c:284
+#, c-format
+msgid "%s, %d files"
+msgstr "%s, %d ملفات"
+
+#: src/search.c:301
+msgid "Searching..."
+msgstr "جارى البحث..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr "الملف لم يوجد"
+
+#: src/search.c:2094
+msgid "Please enter an existing file for image content."
+msgstr "أدخل ملف حالى للبحث:"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr "الدليل لم يوجد"
+
+#: src/search.c:2141
+msgid "Please enter an existing folder to search."
+msgstr "أدخل دليل حالى للبحث:"
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr "بحث الصور - GQview"
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "بحث"
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr "بحث تلقائى داخل كل الدلائل"
+
+#: src/search.c:2617
+msgid "File name"
+msgstr "إسم الملف"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr "وفّق حجم الحروف فى البحث"
+
+#: src/search.c:2627
+msgid "File size is"
+msgstr "حجم الملف"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+msgid "and"
+msgstr "و"
+
+#: src/search.c:2639
+msgid "File date is"
+msgstr "تاريخ الملف"
+
+#: src/search.c:2656
+msgid "Image dimensions are"
+msgstr "أبعاد الصورة"
+
+#: src/search.c:2676
+msgid "Image content is"
+msgstr "محتوى الصورة"
+
+#: src/search.c:2682
+#, no-c-format
+msgid "% similar to"
+msgstr "% مثل"
+
+#: src/search.c:2751
+msgid "Rank"
+msgstr "الرتبة"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr ""
+"فشل فى تحميل النموذج المصغّر للصورة. يجرى الآن محاولة إعادة تكوين للملف. \n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "فشل عملية حفظ قائمة تاريخ إستخدام البرنامج إلى %s \n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "مسار مفضّل جديد"
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "حرّر المسار المفضّل"
+
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "المسار:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "الأيقون:"
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "الغى الاختيار"
+
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "الخواص:"
+
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "إلى أعلى"
+
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "غلى أسفل"
+
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "إحذف"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"فشل تحميل: \n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "فشل عملية إعادة تسمية الملف %s إلى %s."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr "فشل عملية حذف الملف %s."
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "فشل حذف الملف"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "غحذف الملف"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"سيتم الآن حذف الملف: \n"
+"%s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "عد تسمية"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "ضف مسار مفضّل"
+
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "احذف"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "دليل جديد..."
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"فشل عملية إنشاء الدليل: \n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+msgid "Error creating folder"
+msgstr "خطأ فى عملية إنشاء الدليل"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "جميع الملفات"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "اعرض الملفات و الدﻻئل المخفية"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "ترشيح:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "اختر الكل"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "جميع الملفات"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "حفظ الملف مكان الملف الموجود الحالى"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "حفظ الملف مكان الملف الموجود الحالى"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "حفظ الملف مكان الملف الموجود الحالى"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "استثنى الكل"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "استثنى"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "خطأ فى عملية نقل الملف من مكان إلى آخر."
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "دليل جديد..."
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "عد التسمية تلقائيا"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "عد التسمية "
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "الملف الذى تريد نسخه هو نفس الملف الذى تنسخ إليه"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"فشل نسخ الملف:\n"
+"%s \n"
+"إلى نفسه"
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "الملف الذى تريد تحريكه هو نفس الملف الذى تحرّك إليه"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"فشل تحريك الملف:\n"
+"%s \n"
+"إلى نفسه"
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "استمرّ"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "فشل نسخ الملف"
+
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"فشل عملية نسخ الملف:\n"
+"%s\n"
+"إلى:\n"
+"%s\n"
+"اثناء عملية نسخ متعدّدة."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "خطأ فى عملية نقل الملف من مكان إلى آخر."
+
+#: src/utilops.c:636
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"فشل عملية تحريك الملف:\n"
+"%s\n"
+"إلى:\n"
+"%s\n"
+"اثناء عملية تحريك متعدّدة."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "الملف المصدر هو الملف المهدف"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "الملف المصدر هو الملف المهدف. تم إلغاء العملية."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"فشل عملية نسخ الملف:\n"
+"%s\n"
+"إلى:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"فشل تحريك:\n"
+"%s\n"
+"إلى:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "مسار خاطئ"
+
+#: src/utilops.c:900
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"عندما ترغب فى العمل مع عدة ملفات رجاء\n"
+"إختيار دليل و ليس ملف."
+
+#: src/utilops.c:905
+msgid "Please select an existing folder."
+msgstr "رجاء إختيار دليل صحيح و موجود."
+
+#: src/utilops.c:956
+msgid "Copy - GQview"
+msgstr "انسخ - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "انسخ"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr "عد تسمية الملف:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "انسخ عدة ملفات إلى:"
+
+#: src/utilops.c:970
+msgid "Move - GQview"
+msgstr "حرّك - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "حرّك"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr "عد تسمية الملف:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "حرّك عدة ملفات إلى:"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "إسم الملف"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "الملف المصدر هو الملف المهدف"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "فشل عملية الحذف"
+
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "فشل فى حذف ملف قديم من سلة المهملات"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+msgid "Could not create folder"
+msgstr "فشل عملية إنشاء الدليل"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "العملية غير مصرح بها"
+
+#: src/utilops.c:1212
+#, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"فشل عملية إنشاء دليل سلّة المهملات\n"
+"\"%s\""
+
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "إلغ خاصية الحذف الآمن"
+
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "حذف آمن: %s"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"فشل عملية حذف الملف:\n"
+"%s\n"
+"هل ترغب فى الإستمرار فى عملية الحذف المتعدّدة؟"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr "ملف %d من %d"
+
+#: src/utilops.c:1416
+msgid "Delete files - GQview"
+msgstr "ملفات محذوفة - GQview"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "عد تسمية عدّة ملفات:"
+
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "راجع %d ملفات"
+
+#: src/utilops.c:1494
+msgid "Delete file - GQview"
+msgstr "احذف الملف - GQview"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "غحذف الملف"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"فشل عملية إعادة تسمية الملف:\n"
+"%s\n"
+"إلى:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "خطأ فى عملية إعادة تسمية الملف"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"فشل عملية إعادة التسمية التلقائية مع المجموعة \n"
+" المختارة. يوجد ملف أو أكثر يطابق إسمه \n"
+" إسماً فى القائمة الناتجة.\n"
+
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"خطأ فى عملية إعادة تسمية\n"
+"%s\n"
+"الرقم هو %d."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+msgid "Rename - GQview"
+msgstr "عد التسمية - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "عد تسمية عدّة ملفات:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "الأسم الأصلى"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "الأسم الأصلى"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "عد تسمية:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "بداية الكتابة"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "رقم البداية"
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "نهاية الكتابة"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "التبطين:"
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"خطأ فى عملية إعادة تسمية\n"
+"%s\n"
+"إلى:\n"
+" %s."
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr "عد تسمية الملف:"
+
+#: src/utilops.c:2311
+#, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"هذا الدليل: \n"
+"%s \n"
+" موجود بالفعل."
+
+#: src/utilops.c:2312
+msgid "Folder exists"
+msgstr "هذا الدليل موجود بالفعل"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"هذا المسار: \n"
+"%s \n"
+"موجود فعلاً لكنه ملف."
+
+#: src/utilops.c:2369
+msgid "New folder - GQview"
+msgstr "دليل جديد - GQview"
+
+#: src/utilops.c:2372
+#, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"تم إنشاء دليل فى: \n"
+"%s \n"
+"بإسم: "
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "دليل جديد"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "غيّر المسار إلى الأعلى"
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "عرض شرائح"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "عرض شرائح يشمل الدﻻئل المتواجدة تحت المسار المختار"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "ابحث عن الملفات المطابقة..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr ""
+"ابحث عن الملفات المطابقة بما يشمل الملفات التى هى بداخل الدﻻئل المتواجدة تحت "
+"المسار المختار"
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "دليل جديد..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "اعرض على هيئة شجرة"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "انعش"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "رتب"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "اعرض فى هيئة أيقونات"
+
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "اعرض النماذج المصغّرة للصور"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"إسم الملفّ خاطئ: \n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "حذف النسخ المصغرة للصور"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/ملف/اقطع"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/ملف/مجموعة جديدة"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/ملف/افتح مجموعة"
+
+#~ msgid "/File/sep1"
+#~ msgstr "/ملف/فاصل1"
+
+#~ msgid "/File/_Search..."
+#~ msgstr "/ملف/إبحث..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/ملف/إبحث عن ملفات مطابقة..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/ملف/فاصل2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/ملف/إبحث..."
+
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/ملف/دليل جديد..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/ملف/فاصل3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/ملف/انسخ..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/ملف/حرّك..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/ملف/اعد تسمية..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/ملف/احذف..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/ملف/فاصل4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/ملف/اغلق النافذة"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/ملف/خروج"
+
+#~ msgid "/_Edit"
+#~ msgstr "/حرّر"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/حرّر/اقطع1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/حرّر/محرّر1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/حرّر/محرّر2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/حرّر/محرّر3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/حرّر/محرّر4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/حرّر/محرّر5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/حرّر/محرّر6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/حرّر/محرّر7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/حرّر/محرّر8"
+
+#~ msgid "/Edit/editor9"
+#~ msgstr "/حرّر/محرّر9"
+
+#~ msgid "/Edit/editor0"
+#~ msgstr "/حرّر/محرّر0"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/حرّر/فاصل1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/حرّر/عدّل"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/حرّر/خواص"
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/حرّر/عدّل/اقطع1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/حرّر/عدّل/دربإتجاه عقرب الساعة"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/حرّر/عدّل/دربعكس إتجاه عقرب الساعة"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/حرّر/عدّل/در180 درجة"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/حرّر/عدّل/إعكس كالمرآه"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/حرّر/عدّل/اعكس من اعلى إلى أسفل"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/حرّر/فاصل2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/حرّر/اختر الجميع"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/حرّر/ﻻ تختار شئ"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/حرّر/فاصل3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/حرّر/خيارات"
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/حرّر/فاصل4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/حرّر/استخدم الصورة كخلفية للكمبيوتر"
+
+#~ msgid "/_View"
+#~ msgstr "/اعرض"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/اعرض/اقطع1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/اعرض/ضخّم"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/اعرض/صغّر"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/اعرض/اعرض الصورة بالحجم الحقيقى"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/اعرض/فاصل1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/اعرض/نماذج مصغّرة للصور"
+
+#~ msgid "/View/I_cons"
+#~ msgstr "/اعرض/أيقونات"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/اعرض/فاصل2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/اعرض/استخدم الشاشة كاملة لعرض الصور"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/اعرض/فاصل3"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/اعرض/خبئ شباك عرض الملفات"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/اعرض/فاصل4"
+
+#, fuzzy
+#~ msgid "/View/_Keywords"
+#~ msgstr "الكلمات الدليلية"
+
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/اعرض/مدير الترتيب"
+
+#~ msgid "/View/sep5"
+#~ msgstr "/اعرض/فاصل5"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/اعرض/شغّل أو اوقف عرض الشرائح"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/اعرض/أنعش عرض الملفات"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/مساعدة/اقطع1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/مساعدة/فاصل1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "إعداد GQview"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/حرّر/احذف النماذج القديمة المصغرة للصور"
+
+#~ msgid "path"
+#~ msgstr "المسار"
+
+#~ msgid "Save"
+#~ msgstr "احفظ"
+
+#~ msgid "Close"
+#~ msgstr "أغلق"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "احفظ المجموعة مع الغاء القديم:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "احفظ المجموعة باسم:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "افتح مجموعة من:"
+
+#~ msgid "Open"
+#~ msgstr "افتح"
+
+#~ msgid "Append collection from:"
+#~ msgstr "اضف للمجموعة من:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "خروج"
+
+#~ msgid "Exit"
+#~ msgstr "خروج"
+
+#~ msgid "Ok"
+#~ msgstr "موافق"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "دليل خاطئ"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "اذهب إلى هذا الدليل عند بداية التشغيل:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "ضخّم (قياس):"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "وضع نوافذ الحوارات تحت الفأر:"
+
+#~ msgid "Include files of type:"
+#~ msgstr "أنواع الملفات المعمول بها:"
+
+#~ msgid "Remove"
+#~ msgstr "احذف"
+
+#~ msgid "Add"
+#~ msgstr "ضف"
+
+#~ msgid "Command Line"
+#~ msgstr "سطر الأوامر"
+
+#~ msgid "Help"
+#~ msgstr "مساعدة"
+
+#~ msgid "Full screen size:"
+#~ msgstr "حجم الشاشة الكاملة:"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "حجم الملف: "
+
+#, fuzzy
+#~ msgid "Width:"
+#~ msgstr "العرض"
+
+#, fuzzy
+#~ msgid "Height:"
+#~ msgstr "الإرتفاع"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "حذف الملف: \n"
+#~ "%s\n"
+#~ "و حفظ الملف: \n"
+#~ "%s بدﻻ منه"
+
+#~ msgid "Yes"
+#~ msgstr "نعم"
+
+#~ msgid "Yes to all"
+#~ msgstr "نعم للجميع"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "هل تريد حذف الملف:\n"
+#~ "%s\n"
+#~ "و إستبداله بالملف:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "انسخ الملف:\n"
+#~ "%s\n"
+#~ "إلى:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "حرّك الملف:\n"
+#~ "%s\n"
+#~ "إلى:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "سيتم الآن حذف عدّة ملفات..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "هل تريد حذف الملف:\n"
+#~ "%s\n"
+#~ "عن طريق إعادة تسمية الملف:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "إلى:"
+
+#~ msgid "Create"
+#~ msgstr "انشئ"
+
+#~ msgid "Image details"
+#~ msgstr "تفاصيل الصورة"
+
+#~ msgid "/View/Image _details"
+#~ msgstr "/اعرض/تفاصيل الصورة"
+
+#~ msgid "Initial directory"
+#~ msgstr "الدليل المبدأى"
+
+#~ msgid "Full screen ignores window manager"
+#~ msgstr "تشغيل البرنامج فى الشاشة الكاملة تتجاهل مدير النوافذ"
+
+#~ msgid "New Directory"
+#~ msgstr "دليل جديد"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "فشل إنشاء الدليل: \n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "فشل إنشاء الدليل"
diff --git a/po/bg.po b/po/bg.po
new file mode 100644 (file)
index 0000000..d71eed7
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,3573 @@
+# Bulgarian translation of gqview.
+# Copyright (C) 2004 John Ellis
+# This file is distributed under the same license as the gqview package.
+# Vladimir Petrov <vladux@mail.bg>, 2004.
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview 1.5.0patch\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2004-03-22 02:17+0200\n"
+"Last-Translator: Vladimir Petrov <vladux@mail.bg>\n"
+"Language-Team: Bulgarian <bg@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Инструменти"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "бленда"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+#, fuzzy
+msgid "Keyword Presets"
+msgstr "Ключови думи"
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr "Ключови думи"
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Име на файла:"
+
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Дата на файла:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr "Ключови думи:"
+
+#: src/bar_info.c:1095
+msgid "Comment:"
+msgstr "Коментари:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr "Добавяне на ключовите думи към избраните файлове"
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+"Добавяне на ключовите думи към избраните файлове, заменяйки досега "
+"съществуващите."
+
+#: src/bar_info.c:1130
+msgid "Save comment now"
+msgstr "Запазване на коментарите веднага"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "Етикет"
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Име"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "Стойност"
+
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "Формат"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "Елементи"
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "Описание"
+
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "Exif"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "Подробен изглед"
+
+#: src/bar_sort.c:218
+msgid "Unlink failed"
+msgstr "Неуспешно развръзване"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr "Неуспешно свързване"
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Директорията:\n"
+"%s\n"
+"вече съществува."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Празна колекция"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Неуспешно запазване на колекцията:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Неуспешно запазване"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "Добавяне на отметка"
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Колекции"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "Име:"
+
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "Манипулатор за подреждане"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "Папки"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Колекции"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Копиране"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Местене"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr "Свързване"
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d изображения"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Отказ от всички"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "Отмяна за последното изображение"
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "извършено"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Четене на данни за прилика..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Изчистване на умалени изображения..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Изчистване на стари умалени изображения..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Невалидно файлово име"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Кеширане на умалени изображения"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Начален номер"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "Папка:"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Отказ от всички"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Невалидно файлово име"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "действа..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Изчистване на умалени изображения..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Изчистване на кеша"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Това ще премахне всички умалени изображения които\n"
+"са събрани на диска, продължаване?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "Търсене на изображения - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview на цял екран"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "действие"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "Изчистване"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "Кеширане на умалени изображения"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "Показване на умалени изображения"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "Преименуване"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Неозаглавена"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Неозаглавена (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - GQview колекция"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Затваряне на колекция"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Колекцията е променена.\n"
+"Запазване?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Посоченият път:\n"
+"%s\n"
+"е директория, колекциите са файлове"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Невалидно файлово име"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Презаписване на файла"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Презаписване на файла"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Презаписване"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Запазване на колекция"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Отваряне на колекция"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Прибавяне към колекция"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Прибавяне"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Файлове - Колекции"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Празна колекция"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Текущата колекция е празна, запазването е прекратено."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Празна"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d изображения (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d изображения"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Зареждане на умалени..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "Пре_глед"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "Преглед в _нов прозорец"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "_Премахване"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Добавяне от файловия списък"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Добавяне от колекция..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Избор на всички"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Отказ от всички"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "Сво_йства"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "_Копиране..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "_Местене..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "_Преименуване..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "_Изтриване..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "Показване име на _файл"
+
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "Запазване на колек_цията"
+
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "Запазване на колекцията кат_о..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "Откриване на _дубликати..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Файл/_Търсене..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "Пуснатият списък съдържа директории."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "_Добавяне на съдържанията им"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "_Рекурсивно добавяне на съдържанията им"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "_Пропускане на директориите"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Отказ"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Пускане на файлове за сравнение."
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d файла"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d съвпадения намерени в %d файла"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[набор 1]"
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Четене на контролни суми..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Четене на размери..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Четене на данни за прилика..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Сравнение..."
+
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "Подреждане..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "Избиране на п_ървите от всяка група дубликати"
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "Избиране на _останалите от всяка група дубликати"
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Добавяне към нова колекция"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "_Изчистване"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "_Затваряне на прозореца"
+
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "%d файла (набор 2)"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Големина"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Дата"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Размери"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Контролна сума"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Път"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Прилика (висока)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Прилика"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Прилика (ниска)"
+
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Прилика (клиентска)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Откриване на дубликати - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Сравняване с:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Сравняване чрез:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Умалени изображения"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Сравняване на два набора файлове"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "Завъртане на JPEG по часовниковата стрелка"
+
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "Завъртане на JPEG обратно на часовниковата стрелка"
+
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "спиране..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "Резултати от команда за редакция"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "Изход на %s"
+
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Неуспешно задействане на командата:\n"
+"%s\n"
+
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "спряно от потребител"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "неизвестно"
+
+#: src/exif.c:113
+msgid "top left"
+msgstr "горе ляво"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "горе дясно"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "долу дясно"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "долу ляво"
+
+#: src/exif.c:117
+msgid "left top"
+msgstr "ляво горе"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "дясно горе"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "дясно долу"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "ляво долу"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "инч"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "сантиметра"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "усреднено"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "центрирано претеглено"
+
+#: src/exif.c:142
+msgid "spot"
+msgstr "спотово"
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr "многоспотово"
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr "многосегментно"
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "частично"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "друго"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "неопределена"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "ръчна"
+
+#: src/exif.c:153
+msgid "normal"
+msgstr "обикновена"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "бленда"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "затвор"
+
+#: src/exif.c:156
+msgid "creative"
+msgstr "творческа"
+
+#: src/exif.c:157
+msgid "action"
+msgstr "действие"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "портретна"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "пейзажна"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "дневна светлина"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "флуоресцентен"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "волфрам (нажежаема жичка)"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "светкавица"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "не"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "да"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr "да, не е доловено чрез стробиране"
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr "да, доловено е чрез стробиране"
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "Описание на изображението"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "Ориентация"
+
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "Авторски права"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "Настройка на експозицията"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "Чувствителност според ISO"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "Дата на оригинала"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "Дата на цифровизиране"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "Скорост на затвора"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "Бленда"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "Отклонение на експозицията"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "Отдалеченост на предмета"
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "Метод на измерване"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "Източник на светлина"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "Светкавица"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "Фокусно разстояние"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "Ширина"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "Височина"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "Камера"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "Разделителна способност"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "безкрайност"
+
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "метод:"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "включено"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "изключено"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "автоматично"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr "не е доловено чрез стробиране"
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr "доловено е чрез стробиране"
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "намаляване на \"червени очи\""
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "точки"
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d байта"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f КБ"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f МБ"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f ГБ"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview на цял екран"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Големина на файла:"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Вместване на изображението в прозореца"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "_Увеличаване на мащаба"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "Н_амаляване на мащаба"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "Мащаб _1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "Вместване на изображението в _прозореца"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "Поставяне _като тапет"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "_Спиране на прожекция"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "_Продължаване на про_жекция"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "Пауза на про_жекция"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "Започване на про_жекция"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "Излизане от _цял екран"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "_Цял екран"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "_Затваряне на прозореца"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "Големина на файла:"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Размери:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Прозиращ:"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Големина на изображението:"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Съотношение на компресията:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Дата на файла:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Притежател:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Група:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Общи"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "Изображение %d от %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Свойства на изображението - GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Възходящо"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Прожекция"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Пауза"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d файла (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d файла %s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d файла%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(няма право за четене) %s байта"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s байта"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s байта"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "Инструменти на GQview"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Инструменти"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "Файлове"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Изображение"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(пренареждането се извършва чрез влачене)"
+
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "_Скриване на файлов списък"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "чрез %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "в (непознат)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Празна"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Файл"
+
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "_Редактиране"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "На_гласяване"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/_Помощ"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Файл/Нов _прозорец"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "Запазване на колек_цията"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Отваряне на колекция"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Файл/Отваряне на п_редишни"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Претърсване..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Файл/_Търсене..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "_Нова папка..."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Качество"
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "Завъртане _по часовниковата стрелка"
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "Завъртане _обратно на часовниковата стрелка"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Завъртане на _180 градуса"
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "О_гледално"
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "О_бръщане"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Избор на всички"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Отказ от всички"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "Сво_йства..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Изглед/Увеличаване _до вместване"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "_Цял екран"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "_Скриване на файлов списък"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "_Спиране на прожекция"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "_Опресняване"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Помощ/_Относно"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Помощ/_Кратки клавиши"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Помощ/_Бележки относно изданието"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Помощ/_Относно"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Умалени изображения"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Изглед/Д_ървовиден"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Изглед/\"_Плаващ\" файлов списък"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Изглед/Скрита _лента с инструменти"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "Ключови думи"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Изглед/Exif д_анни"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Манипулатор за подреждане"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Изглед/_Списък"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Икона:"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Показване на умалени изображения"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Преминаване в домашната директория"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Опресняване на файловия списък"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Увеличаване на мащаба"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Намаляване на мащаба"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Вместване на изображението в прозореца"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Установяване на мащаб 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Избор на настройки"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Разделяне на елементите"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Помощ - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Команден ред"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Презареждане на следващото изображение"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "Отмяна за последното изображение"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Отмяна за последното изображение"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "Излизане от _цял екран"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "Излизане от _цял екран"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "Излизане от _цял екран"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "_Спиране на прожекция"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "Започване на про_жекция"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "_Спиране на прожекция"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "Започване на про_жекция"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "Инструменти на GQview"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr "Преименуване на файла:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Преглед в _нов прозорец"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr "Употреба: gqview [опции] [път]\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "валидни опции са:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           налагане на показване на инструментите\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        налагане на скриване на инструментите\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           пускане в режим цял екран\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            пускане в режим прожекция\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+"  -l, --list                 отваряне на прозорец за колекции за командния "
+"ред\n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+"  -l, --list                 отваряне на прозорец за колекции за командния "
+"ред\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    включване на изход за дебъг\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              извеждане на информация за версията\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 показване на това съобщение\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"невалидно или пренебрегнато: %s\n"
+"Използвай --help за показване на опциите\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Създаване на директория на GQview:%s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Не може да бъде създадена директория:%s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Домашна директория"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "Десктоп"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - изход"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "Относно - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Променяни са колекции.\n"
+"Изход все пак?"
+
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "Подреждане по големина"
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "Подреждане по дата"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Неподредени"
+
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "Подреждане по път"
+
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "Подреждане по номер"
+
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "Подреждане по име"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Подреждане"
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "Завъртане на _180 градуса"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Приблизително (най-лошото, но най-бързо)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Мозаично"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Билинейно"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Превъзходно (най-доброто, но най-бавно)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Няма"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Нормално"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Най-добро"
+
+#: src/preferences.c:498 src/print.c:365
+#, fuzzy
+msgid "Custom"
+msgstr "автоматично"
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "Установяване на филтрите"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Това ще установи настройките на филтрите по подразбиране.\n"
+"Продължение?"
+
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "Установяване на редакторите"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Това ще установи командите за редакторите по подразбиране.\n"
+"Продължение?"
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "Изчистване на боклука"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "Това ще премахне съдържанието на боклука."
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - преименуване"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "Начален номер"
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Преминаване в домашната директория"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Използване на текущата"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Големина:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Качество:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Кеширане на умалени изображения"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Кеширане на умалени изображения в .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr ""
+"Използване на xvpics умалени изображения когато бъдат открити (само четене)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Прожекция"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Задържане до смяна на изображението (секунди):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Произволно"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "С повторение"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Увеличаване на мащаба"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Метод на размиване:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Двупътно мащабиране"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Допускане на уголемяване на изображението при мащабиране до вместване."
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Стъпка на промяна на мащаба:"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Когато е избрано ново изображение:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Да се мащабира към оригиналната големина"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Да се запази мащаба от предишната настройка"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Прибавяне"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Черен фон"
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Продължение"
+
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "Опресняване при смяна на файл"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Презареждане на следващото изображение"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Автоматично завъртане използвайки Exif информацията"
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Прозорци"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Начален номер"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Помнене на положението на прозорците"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Помнене на състоянието на инструментите (отделени/залепени)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr ""
+"Приспособяване на прозореца към изображението когато инструментите са скрити/"
+"отделени"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Ограничение на размера при автоматично оразмеряване на прозорец (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Разположение"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Филтриране"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Показване на елементи които започват с точка"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "Сортиране с чувствителност към регистъра"
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Забрана за филтриране на файлове"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Дата на файла:"
+
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "Филтър"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "По подразбиране"
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Редактори"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "номер"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Име на меню"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "За напреднали"
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "_Цял екран"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Големина на изображението:"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Изтриване"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Подтвърждаване за изтриване на файл"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Разрешаване на клавиша Delete"
+
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "Безопасно изтриване"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Максимална големина (МБ)"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Преглед"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Правоъгълен избор"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Спускане в папките в дървовидния изглед"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Преименуване на място"
+
+#: src/preferences.c:1200
+#, fuzzy
+msgid "Navigation"
+msgstr "действие"
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Прогресивно плъзгане от клавиатурата"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Колелото на мишката плъзга изображението"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "Клиентски праг на приликата:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Размер на извънекранния кеш (МБ за изображение):"
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "Относно - GQview"
+
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Авторски права (c) %s John Ellis\n"
+"уеб-страница: %s\n"
+"електронна поща: %s\n"
+"\n"
+"Разпространява се под GNU General Public License"
+
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "Заслуги..."
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Отказ от всички"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+#, fuzzy
+msgid "Default printer"
+msgstr "По подразбиране"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr ""
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Големина на изображението:"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+#, fuzzy
+msgid "centimeters"
+msgstr "сантиметра"
+
+#: src/print.c:353
+#, fuzzy
+msgid "inches"
+msgstr "инч"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+#, fuzzy
+msgid "Portrait"
+msgstr "портретна"
+
+#: src/print.c:360
+#, fuzzy
+msgid "Landscape"
+msgstr "пейзажна"
+
+#: src/print.c:366
+#, fuzzy
+msgid "Letter"
+msgstr "сантиметра"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, fuzzy, c-format
+msgid "page %d of %d"
+msgstr "Изображение %d от %d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "Преглед"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "Вече съществува файл с име %s."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Филтър"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+msgid "Details"
+msgstr "Подробности"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "Относно - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Формат"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Ориентация"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Описание"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Файлове"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Неозаглавена"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "включено"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Подреждане"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Големина на изображението:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "бленда"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+#, fuzzy
+msgid "Right:"
+msgstr "Височина"
+
+#: src/print.c:3432
+#, fuzzy
+msgid "Top:"
+msgstr "Група:"
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "на:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Филтър"
+
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr ""
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Филтър:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Дата на файла:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Помнене на положението на прозорците"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "грешка при запазване на конфигурационен файл: %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Папка:"
+
+#: src/search.c:201
+msgid "comments"
+msgstr "коментарите"
+
+#: src/search.c:202
+msgid "results"
+msgstr "резултатите"
+
+#: src/search.c:206
+msgid "contains"
+msgstr "чиито имена съдържат"
+
+#: src/search.c:207
+msgid "is"
+msgstr "с име"
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr "равни на"
+
+#: src/search.c:212
+msgid "less than"
+msgstr "по-малки от"
+
+#: src/search.c:213
+msgid "greater than"
+msgstr "по-големи от"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr "между"
+
+#: src/search.c:219
+msgid "before"
+msgstr "преди"
+
+#: src/search.c:220
+msgid "after"
+msgstr "след"
+
+#: src/search.c:225
+msgid "match all"
+msgstr "всички от които съответстват"
+
+#: src/search.c:226
+msgid "match any"
+msgstr "някои от които съответстват"
+
+#: src/search.c:227
+msgid "exclude"
+msgstr "никоя от които не съответства"
+
+#: src/search.c:277
+#, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d файла (%s, %d)"
+
+#: src/search.c:284
+#, c-format
+msgid "%s, %d files"
+msgstr "%s, %d файла"
+
+#: src/search.c:301
+msgid "Searching..."
+msgstr "Претърсване..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr "Файлът не е открит"
+
+#: src/search.c:2094
+msgid "Please enter an existing file for image content."
+msgstr "Моля въведи съществуващ файл за съдържание на изображението."
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr "Папката не е открита"
+
+#: src/search.c:2141
+msgid "Please enter an existing folder to search."
+msgstr "Моля въведи съществуваща папка за претърсване."
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr "Търсене на изображения - GQview"
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Претърсване на"
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr "рекурсивно"
+
+#: src/search.c:2617
+msgid "File name"
+msgstr "Файлове"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr "отчитайки регистъра"
+
+#: src/search.c:2627
+msgid "File size is"
+msgstr "Файлове с големини"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+msgid "and"
+msgstr "и"
+
+#: src/search.c:2639
+msgid "File date is"
+msgstr "Файлове с дати"
+
+#: src/search.c:2656
+msgid "Image dimensions are"
+msgstr "Изображения с размери"
+
+#: src/search.c:2676
+msgid "Image content is"
+msgstr "Изображения със съдържание"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "подобно на"
+
+#: src/search.c:2751
+msgid "Rank"
+msgstr "Класиране"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr ""
+"Неуспешно зареждане на умалено изображение от кеша, опит за пресъздаване.\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Невъзможно е да бъдат записани списъците с историята в: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "Нова отметка"
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "Редактиране на отметка"
+
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "Път:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "Икона:"
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Отказ от всички"
+
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "Сво_йства..."
+
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "_Повдигане"
+
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "_Спускане"
+
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "_Махане"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Невъзможно е да се зареди:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Неуспешно преименуване на %s в %s."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Невъзможно е да бъде изтрит файлът:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Неуспешно изтриване на файл"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Изтриване на файл"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Относно изтриването на файла:\n"
+" %s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "_Преименуване"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "Добавяне на _отметка"
+
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "_Изтриване"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "_Нова папка..."
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Невъзможно е да бъде създадена директорията:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Грешка при създаването на директория"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Всички файлове"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Показване на скрити"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Филтър:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Избор на всички"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "Всички файлове"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Презаписване на файла"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Презаписване на файла"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Презаписване на файла"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Пропускане на всички"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Пропускане"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Грешка при местене на файл"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "_Нова папка..."
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Автоматично преименуване"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Преименуване"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Източникът за копиране съвпада с целта"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Невъзможно е да бъде копиран файлът:\n"
+"%s\n"
+"върху себе си."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Източникът за местене съвпада с целта"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Невъзможно е да бъде преместен файлът:\n"
+"%s\n"
+"върху себе си."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Продължение"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Грешка при копирането на файл"
+
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Невъзможно е да бъде копиран файлът:\n"
+"%s\n"
+"в:\n"
+"%s\n"
+"по време на копиране на група файлове."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Грешка при местене на файл"
+
+#: src/utilops.c:636
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Невъзможно е да бъде преместен файлът:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"по време на местене на група файлове."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Източникът съвпада с целта"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Източникът и целта са еднакви, операцията е прекъсната."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Невъзможно е да бъде копиран файлът:\n"
+"%s\n"
+"в:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Невъзможно е да бъде преместен файлът:\n"
+"%s\n"
+"в:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Невалидна цел"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"При действие с група файлове избирай\n"
+"директория, а не файл, моля."
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Моля избери съществуваща директория"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Помощ - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "_Копиране"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr "Преименуване на файла:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "Копиране на група файлове в:"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Помощ - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "_Местене"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr "Преименуване на файла:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Местене на група файлове към:"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Файлове"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Източникът съвпада с целта"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Неуспешно изтриване"
+
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "Невъзможно е да бъде премахнат стар файл от директорията за боклук"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Не може да бъде създадена директория"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "Отказано право"
+
+#: src/utilops.c:1212
+#, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Невъзможен е достъпът или създаването на директория за боклук.\n"
+"\"%s\""
+
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "Изключване на безопасно изтриване"
+
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "Безопасно изтриване: %s"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Невъзможно е да бъде изтрит файлът:\n"
+" %s\n"
+" Продължение на изтриването на групата файлове?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr "Файл %d от %d"
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Изтриване на файлове"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Преименуване на група файлове:"
+
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "Преглед на %d файла"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Изтриване на файл"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Изтриване на файл"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Невъзможно е да бъде преименуван файлът:\n"
+"%s\n"
+" на:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Грешка при преименуване на файл"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Не е възможно автоматично преименуване с ибрания \n"
+"набор числа, имената на един или повече файла съществуват \n"
+"така, че съвпадат с новополучения списък.\n"
+
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"Неуспешно преименуване на\n"
+"%s\n"
+"Числото бе %d."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Помощ - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "Преименуване на група файлове:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "Първоначално име"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Първоначално име"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "Преименуване:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Начало на текста"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "Начален номер"
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Край на текста"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "Допълване:"
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Невъзможно е да бъде преименуван файлът:\n"
+"%s\n"
+"на:\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr "Преименуване на файла:"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Директорията:\n"
+"%s\n"
+"вече съществува."
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Папки"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"Пътят:\n"
+"%s\n"
+"вече съществува като файл."
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Помощ - GQview"
+
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Създаване на директория в:\n"
+"%s\n"
+"с име:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "нова_папка"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "_Обратно към родителската"
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "_Прожекция"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Рекурсивна прожекция"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "Откриване на _дубликати..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Рекурсивно откриване на дубликати..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "_Нова папка..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "_Дървовиден изглед"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "_Опресняване"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "_Подреждане"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "Изглед като _икони"
+
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "Пока_зване на умалени изображения"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Невалидно име на файл:\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "Изчистване на умалени изображения"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/Файл/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/Файл/_Нова колекция"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Файл/_Отваряне на колекция..."
+
+#~ msgid "/File/sep1"
+#~ msgstr "/Файл/sep1"
+
+#~ msgid "/File/_Search..."
+#~ msgstr "/Файл/_Търсене..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Файл/Откриване на _дубликати..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Файл/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Файл/_Търсене..."
+
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Файл/_Нова папка..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Файл/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Файл/_Копиране..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Файл/_Местене..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Файл/_Преименуване..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Файл/_Изтриване..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Файл/sep4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/Файл/_Затваряне на прозореца"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Файл/Из_ход"
+
+#~ msgid "/_Edit"
+#~ msgstr "/_Редактиране"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Редактиране/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Редактиране/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Редактиране/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Редактиране/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Редактиране/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Редактиране/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Редактиране/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Редактиране/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Редактиране/editor8"
+
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Редактиране/editor1"
+
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Редактиране/editor0"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Редактиране/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Редактиране/_Нагласяване"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Редактиране/Сво_йства"
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Редактиране/Нагласяване/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Редактиране/Нагласяване/Завъртане _по часовниковата стрелка"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr ""
+#~ "/Редактиране/Нагласяване/Завъртане _обратно на часовниковата стрелка"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Редактиране/Нагласяване/Завъртане на 1_80 градуса"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Редактиране/Нагласяване/О_гледално"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Редактиране/Нагласяване/О_бръщане"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Редактиране/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Редактиране/Избор на _всички"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Редактиране/О_тказ от всички"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Редактиране/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Редактиране/На_стройки..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Редактиране/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Редактиране/Поставяне _като тапет"
+
+#~ msgid "/_View"
+#~ msgstr "/_Изглед"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Изглед/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Изглед/_Увеличаване на мащаба"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Изглед/_Намаляване на мащаба"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Изглед/Мащаб _1:1"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Изглед/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Изглед/С у_малени изображения"
+
+#~ msgid "/View/I_cons"
+#~ msgstr "/Изглед/_Икони"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Изглед/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Изглед/_Цял екран"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Изглед/sep"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Изглед/Ск_рит файлов списък"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/Изглед/sep4"
+
+#, fuzzy
+#~ msgid "/View/_Keywords"
+#~ msgstr "Ключови думи"
+
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Изглед/_Манипулатор за подреждане"
+
+#~ msgid "/View/sep5"
+#~ msgstr "/Изглед/sep1"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Изглед/Пускане на про_жекция"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Изглед/Опресн_яване на списъците"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Помощ/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Помощ/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "Конфигурация на GQview"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Редактиране/Пре_махване на стари умалени изображения"
+
+#~ msgid "path"
+#~ msgstr "пътя"
+
+#~ msgid "Save"
+#~ msgstr "Запазване"
+
+#~ msgid "Close"
+#~ msgstr "Затваряне"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Презаписване на файла - колекция:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "Запазване на колекция като:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "Отваряне на колекция от:"
+
+#~ msgid "Open"
+#~ msgstr "Отваряне"
+
+#~ msgid "Append collection from:"
+#~ msgstr "Прибавяне към колекция от:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Изход"
+
+#~ msgid "Exit"
+#~ msgstr "Изход"
+
+#~ msgid "Ok"
+#~ msgstr "Да"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Невалидно файлово име"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "При стартиране директорията да бъде сменена с:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Мащабиране:"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Поставяне на диалозите под мишката"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Включване на файлове от типа:"
+
+#~ msgid "Remove"
+#~ msgstr "Премахване"
+
+#~ msgid "Add"
+#~ msgstr "Добавяне"
+
+#~ msgid "Command Line"
+#~ msgstr "Команден ред"
+
+#~ msgid "Help"
+#~ msgstr "Помощ"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "_Цял екран"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Големина на файла:"
+
+#, fuzzy
+#~ msgid "Width:"
+#~ msgstr "Ширина"
+
+#, fuzzy
+#~ msgid "Height:"
+#~ msgstr "Височина"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Презаписване на файла:\n"
+#~ " %s\n"
+#~ " с:\n"
+#~ " %s"
+
+#~ msgid "Yes"
+#~ msgstr "Да"
+
+#~ msgid "Yes to all"
+#~ msgstr "Да, всички"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Презаписване на файла:\n"
+#~ "%s\n"
+#~ " с:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Копиране на файл:\n"
+#~ "%s\n"
+#~ "в:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Местене на файл:\n"
+#~ "%s\n"
+#~ "в:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Относно изтриването на група файлове..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Презаписване на файла:\n"
+#~ "%s\n"
+#~ "чрез преименуване на:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "на:"
+
+#~ msgid "Create"
+#~ msgstr "Създаване"
+
+#~ msgid "Initial directory"
+#~ msgstr "Начална директория"
+
+#~ msgid "New Directory"
+#~ msgstr "Нова директория"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Невъзможно е да бъде създадена директорията:\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "Грешка при създаването на директория"
+
+#~ msgid "Image details"
+#~ msgstr "Подробности за изображението"
+
+#~ msgid "/View/Image _details"
+#~ msgstr "/Изглед/Подробности _за изображение"
+
+#~ msgid "Add contents"
+#~ msgstr "Добавяне на съдържанията им"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "Рекурсивно добавяне на съдържанията им"
+
+#~ msgid "Skip directories"
+#~ msgstr "_Пропускане на директориите"
+
+#~ msgid "Invalid directory"
+#~ msgstr "Невалидна директория"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - копиране"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - местене"
+
+#~ msgid "Directory exists"
+#~ msgstr "Директорията съществува"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - нова директория"
diff --git a/po/cs.po b/po/cs.po
new file mode 100644 (file)
index 0000000..677f37d
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,3593 @@
+# gqview cs.po
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# Jan Raska <jan_raska@hotmail.com>, 2001, 2004
+# Aktualizace Michal Bukovjan <bukm@centrum.cz>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: 1.3.9\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2004-02-10 08:31+0100\n"
+"Last-Translator: Jan Raska <jan_raska@hotmail.com>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Nástroje"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "závìrkou"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Název souboru:"
+
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Datum souboru:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Porovnat s:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Ulo¾it sbírku"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "Znaèka"
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Název"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "Hodnota"
+
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "Formát"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "Prvky"
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "Popis"
+
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "Exif"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "Roz¹íøený pohled"
+
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Chyba pøi odstraòování"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Adresáø:\n"
+"%s\n"
+"ji¾ existuje."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Prázdná sbírka"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Selhalo ulo¾ení sbírky:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Ulo¾ení selhalo"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "Pøidat zálo¾ku"
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Sbírky"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "Název:"
+
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "Správce tøídìní"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "Adresáøe"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Sbírky"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Kopírovat"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Pøesunout"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d obrázkù"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Zru¹it výbìr"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "Zpìt poslední obrázek"
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "¾ádná"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Naèítám údaje o podobnosti..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Odstraòuji náhledy..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Èistím staré náhledy..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Neplatný název souboru"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Cache náhledù"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Poè. èíslo"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "Adresáø:"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Zru¹it výbìr"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Neplatný název souboru"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "zpracovávám..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Odstraòuji náhledy..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Vyèistit cache"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Hodláte odstranit v¹echny náhledy, které máte\n"
+"na disku. Chcete pokraèovat?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "Vlastnosti obrázku - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview celá obrazovka"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "akce"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "Vyèistit"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "Cache náhledù"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "Zobrazit náhledy"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "Pøejmenovat"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Nepojmenovaný"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Nepojmenovaný (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - Sbírka GQview"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Uzavøít sbírku"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Sbírka byla zmìnìna.\n"
+"Ulo¾it?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Zadaná cesta:\n"
+"%s\n"
+"je adresáø, sbírky jsou soubory"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Neplatný název souboru"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Pøepsat soubor"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Pøepsat soubor"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Pøepsat"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Ulo¾it sbírku"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Otevøít sbírku"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Pøipojit sbírku"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Pøipojit"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Soubory sbírek"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Prázdná sbírka"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Aktuální sbírka je prázdná, ulo¾ení pøeru¹eno."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Prázdná"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d obrázkù (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d obrázkù"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Nahrávám náhledy..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "_Zobrazit"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "_Zobrazit v novém oknì"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "O_dstranit"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Pøipojit ze seznamu souborù"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Pøipojit ze sbírky..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Vybrat v¹e"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Zru¹it výbìr"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "Vlast_nosti"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "_Kopírovat..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "_Pøesunout..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "Pøe_jmenovat..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "O_dstranit..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "_Zobrazit název souboru"
+
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "_Ulo¾it sbírku"
+
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "Ulo¾it sbírku j_ako..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "Najít d_uplikáty..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/File/Pøe_jmenovat..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "Pøeta¾ený seznam obsahuje adresáøe."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "_Pøidat obsah"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "Pøidat obsah _rekurzivnì"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "Pøe_skoèit adresáøe"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Zru¹it"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Pøetáhnìte zde soubory pro jejich porovnání."
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "souborù: %d"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "Nalezeno %d shod v %d souborech."
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[nastavit 1]"
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Naèítám kontrolní souèty..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Naèítám rozmìry..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Naèítám údaje o podobnosti..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Porovnávám..."
+
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "Tøídím..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "Vybrat skupinu duplikátù _1"
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "Vybrat skupinu duplikátù _2"
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Pøidat do nové sbírky"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "_Vyèistit"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "_Zavøít okno"
+
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "souborù: %d"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Velikosti"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Data"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Rozmìrù"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Kontrolního souètu"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Cesty"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Podobnosti (vysoké)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Podobnosti"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Podobnosti (malé)"
+
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Podobnosti (vlastní)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Najít duplikáty - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Porovnat s:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Porovnat podle:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Náhledy"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Porovnat dvì sady souborù"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "Rotace jpeg vpravo"
+
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "Rotace jpeg vlevo"
+
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "Zastavuji..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "Upravit výsledky pøíkazu"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "Výstup z %s"
+
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Nelze provést pøíkaz:\n"
+"%s\n"
+
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "zastaveno u¾ivatelem"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "(neznámý)"
+
+#: src/exif.c:113
+msgid "top left"
+msgstr "nahoøe vlevo"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "nahoøe vpravo"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "dole vpravo"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "dole vlevo"
+
+#: src/exif.c:117
+msgid "left top"
+msgstr "vlevo nahoøe"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "vpravo nahoøe"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "vpravo dole"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "vlevo dole"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "palec"
+
+#
+# Konektory pro externí blesky: kolejnice typu Hot-shoe: komunikace s
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "centimetr"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "prùmìr"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "vyvá¾ení støedu"
+
+#: src/exif.c:142
+msgid "spot"
+msgstr "bodové"
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr "více bodové"
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr "více segmentové"
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "èásteèné"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "ostatní"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "nedefinováno"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "ruènì"
+
+#: src/exif.c:153
+msgid "normal"
+msgstr "normálnì"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "závìrkou"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "clonou"
+
+#: src/exif.c:156
+msgid "creative"
+msgstr "tvùrèí"
+
+#: src/exif.c:157
+msgid "action"
+msgstr "akce"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "portrét"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "krajina"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "denní svìtlo"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "záøivka"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "¾árovka"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "blesk"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "ne"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "ano"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr "ano, nedetekováno synchronizací"
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr "ano, detekováno synchronizací"
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "Popis obrázku"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "Orientace"
+
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "Autorská práva"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "Expozice"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "Citlivost ISO"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "Datum originálu"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "Datum digitalizace"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "Rychlost závìrky"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "Clona"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "Korekce expozice"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "Ostøení"
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "Mìøení svìtla"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "Zdroj svìtla"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "Blesk"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "Ohnisková vzdálenost"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "©íøka"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "Délka"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "Fotoaparát"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "Rozli¹ení"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "nekoneèno"
+
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "re¾im:"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "zapnuto"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "vypnuto"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "automatika"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr "nedetekován synchronizací"
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr "detekován synchronizací"
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "korekce èervených oèí"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "bodù"
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "bajtù: %d"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f K"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview celá obrazovka"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Velikost souboru:"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Pøizpùsobit velikosti okna"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "Z_vìt¹it"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "Z_men¹it"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "Zobrazení _1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "Pøizpùsobit do _okna"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "Nastavit jako _pozadí"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "Zastavit _slideshow"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "Pokraèovat ve _slideshow"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "_Pozastavit slideshow"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "_Spustit slideshow"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "U_konèit zobrazení na celou obrazovku"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "Ce_lá obrazovka"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "_Zavøít okno"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "Velikost souboru:"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Rozmìry:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Transparentní:"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Velikost obrázku:"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Kompresní pomìr:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Datum souboru:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Vlastník:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Skupina:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "V¹eobecné"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "Obrázek %d z %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Vlastnosti obrázku - GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Vzestupnì"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Slideshow"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Pozastavené"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, souborù: %d (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, souborù: %d %s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "souborù: %d %s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(chybí právo ke ètení) %s bajtù"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ?) %s bajtù"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d) %s bajtù"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "Nástroje GQview"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Nástroje"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "Soubory"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Obrázek"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(poøadí zmìníte pøeta¾ením)"
+
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "Sk_rýt seznam souborù"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "v %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "v (neznámém)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Prázdná"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Soubor"
+
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "Úpr_avy"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "O_toèit"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/Nápo_vìda"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Soubor/No_vé okno"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "_Ulo¾it sbírku"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Otevøít sbírku"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Soubor/O_tevøít nedávné"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Tøídím..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/File/Pøe_jmenovat..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "_Nový adresáø..."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Kvalita"
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "Rotace vp_ravo"
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "Rotace v_levo"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Rotace o 1_80"
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "_Zrcadlit"
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "Pøe_klopit"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Vybrat v¹e"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Zru¹it výbìr"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "_Vlastnosti..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Zobrazení/Do _okna"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "Ce_lá obrazovka"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Sk_rýt seznam souborù"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "Zastavit _slideshow"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "_Obnovit"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Nápovìda/_O programu"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Nápovìda/_Klávesové zkratky"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Nápovìda/_Poznámky k verzi"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Nápovìda/_O programu"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Náhledy"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Zobrazení/S_trom"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Zobrazení/_Plovoucí seznam souborù"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Zobrazení/Skrýt _nástrojovou li¹tu"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "/Zobrazení/I_kony"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Zobrazení/E_xif údaje"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Správce tøídìní"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Zobrazení/S_eznam"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Ikona:"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Zobrazit náhledy"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Pøejít do domovského adresáø"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Obnovit seznam souborù"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Zvìt¹it"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Zmen¹it"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Pøizpùsobit velikosti okna"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Nastavit zobrazení 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Nastavit volby"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Plovoucí ovládání"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Nápovìda - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Pøíkazový øádek"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Pøedèítat dal¹í obrázek"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "Zpìt poslední obrázek"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Zpìt poslední obrázek"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "U_konèit zobrazení na celou obrazovku"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "U_konèit zobrazení na celou obrazovku"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "U_konèit zobrazení na celou obrazovku"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "Zastavit _slideshow"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "_Spustit slideshow"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "Zastavit _slideshow"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "_Spustit slideshow"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "Nástroje GQview"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr "Pøejmenovat soubor:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "_Zobrazit v novém oknì"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Pou¾ití: gqview [volby] [cesta]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "platné volby jsou:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t  --with-tools           zobrazit nástroje\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        skrýt nástroje\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           zaèít v celoobrazovkovém re¾imu\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            zaèít v slideshow re¾imu\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr "  -l, --list                 otevøít okno sbírky do pøíkazové øádky\n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr "  -l, --list                 otevøít okno sbírky do pøíkazové øádky\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    povolit ladící výstup\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              vytisknout informace o verzi\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 zobrazit tuto zprávu\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"neplatný nebo ignorovaný: %s\n"
+"Pou¾ijte --help pro volby\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Vytvoøit GQview adresáø:%s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Nelze vytvoøit adresáø:%s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Domù"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "Plocha"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - konec"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "O programu - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Sbírka byla zmìnìna.\n"
+"Opravdu skonèit?"
+
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "Tøídit podle velikosti"
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "Tøídit podle data"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Netøídìno"
+
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "Tøídit podle cesty"
+
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "Tøídit podle èísla"
+
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "Tøídit podle názvu"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Tøídit"
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "Rotace o 1_80"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Nejbli¾¹í (nejhor¹í, ale nejrychlej¹í)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Dla¾dice"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilineárnì"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Hyper (nejlep¹í, ale nejpomalej¹í)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "®ádná"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normální"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Nejlep¹í"
+
+#: src/preferences.c:498 src/print.c:365
+#, fuzzy
+msgid "Custom"
+msgstr "automatika"
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "Vynulovat filtry"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Hodláte obnovit filtry souborù na výchozí hodnoty.\n"
+"Chcete pokraèovat?"
+
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "Obnovit editory"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Hodláte nastavit editaèní pøíkazy na výchozí hodnoty.\n"
+"Chcete pokraèovat?"
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "Vysypat ko¹"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "Toto odstraní obsah z ko¹e."
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - pøejmenování"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "Poè. èíslo"
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Pøejít do domovského adresáø"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Pou¾ít aktuální"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Velikost:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Kvalita:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Cache náhledù"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Cache náhledù do souborù .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Pou¾ít náhledy xvpics, pokud jsou nalezeny (jen pro ètení)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Slideshow"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Poèkat mezi zmìnami obrázkù (v sekundách):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Náhodnì"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Opakovat"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Zvìt¹it"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Metoda rozptylu:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Zvìt¹ení na dva prùchody"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Povolit zvìt¹ení obrázku na velikost okna."
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Krok zvìt¹ení:"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Pokud je vybrán nový obrázek:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Zobrazit v pùvodní velikosti"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Ponechat zvìt¹ení na pøedchozím nastavení"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Pøipojit"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Èerné pozadí"
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Pokraèovat"
+
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "Obnovit zmìnu v souboru"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Pøedèítat dal¹í obrázek"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Automatické otoèení obrázku podle údaje z Exif"
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Okna"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Poè. èíslo"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Zapamatovat si pozice oken"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Zapamatovat si stav nástrojù (plovoucí/skryté)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "Pøizpùsobit okno obrázku, pokud jsou nástroje skryté/plovoucí"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Omezit velikost, pokud se okno automaticky pøizpùsobuje (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Rozvr¾ení"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filtrování"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Zobrazit polo¾ky zaèínající teèkou"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "Pøi tøídìní rozli¹ovat velikost písmem"
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Vypnout filtrování souborù"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Datum souboru:"
+
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "Maska"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "Výchozí"
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Editory"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Název menu"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "Roz¹íøené"
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "Ce_lá obrazovka"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Velikost obrázku:"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Odstranit"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Potvrdit odstranìní souboru"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Povolit klávesu Delete"
+
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "Bezpeèné mazání"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Maximální velikost (MB)"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Zobrazení"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Obdélníkový výbìr "
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Zobrazit adresáøe ve stromu"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Pøejmenovat na místì"
+
+#: src/preferences.c:1200
+#, fuzzy
+msgid "Navigation"
+msgstr "akce"
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Postupné posouvání klávesnicí"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Koleèko my¹i posouvá obrázek"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "U¾ivatelský práh podobnosti:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Velikost mimoobrazovkové cache (MB na obrázek):"
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "O programu - GQview"
+
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"web: %s\n"
+"email: %s\n"
+"\n"
+"©íøeno pod V¹eobecnou veøejnou licencí GNU"
+
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "Kredity..."
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Zru¹it výbìr"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+#, fuzzy
+msgid "Default printer"
+msgstr "Výchozí"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr ""
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Velikost obrázku:"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#
+# Konektory pro externí blesky: kolejnice typu Hot-shoe: komunikace s
+#: src/print.c:352
+#, fuzzy
+msgid "centimeters"
+msgstr "centimetr"
+
+#: src/print.c:353
+#, fuzzy
+msgid "inches"
+msgstr "palec"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+#, fuzzy
+msgid "Portrait"
+msgstr "portrét"
+
+#: src/print.c:360
+#, fuzzy
+msgid "Landscape"
+msgstr "krajina"
+
+#
+# Konektory pro externí blesky: kolejnice typu Hot-shoe: komunikace s
+#: src/print.c:366
+#, fuzzy
+msgid "Letter"
+msgstr "centimetr"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, fuzzy, c-format
+msgid "page %d of %d"
+msgstr "Obrázek %d z %d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "Náhled"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "Soubor se názvem %s ji¾ existuje."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Maska"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Výchozí"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "O programu - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Formát"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Orientace"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Popis"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Název souboru:"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Nepojmenovaný"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "zapnuto"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Tøídit"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Velikost obrázku:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "závìrkou"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+#, fuzzy
+msgid "Right:"
+msgstr "Délka"
+
+#: src/print.c:3432
+#, fuzzy
+msgid "Top:"
+msgstr "Skupina:"
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "na:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Maska"
+
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr ""
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Maska:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Datum souboru:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Zapamatovat si pozice oken"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "Chyba pøi ukládání souboru s nastavením: %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Adresáø:"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Prvky"
+
+#: src/search.c:202
+#, fuzzy
+msgid "results"
+msgstr "Výchozí"
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Pokraèovat"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+msgid "greater than"
+msgstr ""
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "Data"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, souborù: %d (%s, %d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%s, souborù: %d %s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Tøídím..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Prosím vyberte existující adresáø"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Prosím vyberte existující adresáø"
+
+#: src/search.c:2570
+#, fuzzy
+msgid "Image search - GQview"
+msgstr "Vlastnosti obrázku - GQview"
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Tøídím..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Název souboru:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Velikost souboru:"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Náhodnì"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Datum souboru:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Popis obrázku"
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Pøidat obsah"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Podobnosti"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Náhodnì"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr ""
+"Selhalo naèítání náhledù obrázkù z cache, pokus o opìtovné vytvoøení.\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Nelze zapsat historii do: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "Nová zálo¾ka"
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "Upravit zálo¾ky"
+
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "Cesta:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "Ikona:"
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Zru¹it výbìr"
+
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "_Vlastnosti..."
+
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "Pøesunout nahor_u"
+
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "Pøesunout _dolù"
+
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "O_dstranit"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Nelze naèíst:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Nelze pøejmenovat %s na %s."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Nelze odstranit soubor:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Odstranìní souboru selhalo"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Odstranit soubor"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Bude odstranìn soubor:\n"
+" %s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "Pøe_jmenovat"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "Pøid_at zálo¾ku"
+
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "O_dstranit"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "_Nový adresáø..."
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Nelze vytvoøit nový adresáø:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Chyba pøi vytváøení adresáøe"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "V¹echny soubory"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Zobrazit skryté"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Maska:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Vybrat v¹e"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "V¹echny soubory"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Pøepsat soubor"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Pøepsat soubor"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Pøepsat soubor"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Pøeskoèit v¹echny"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Pøeskoèit"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Chyby pøi pøesunování souboru"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "_Nový adresáø..."
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Automaticky pøejmenovat"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Pøejmenovat"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Zdroj pro kopírování se shoduje s cílem."
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Nelze kopírovat soubor:\n"
+"%s\n"
+"na sebe sama."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Zdroj pro pøesun se shoduje s cílem."
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Nelze pøesunout soubor:\n"
+"%s\n"
+"na sebe sama."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Pokraèovat"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Chyba pøi kopírování souboru"
+
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Nelze kopírovat soubor:\n"
+"%s\n"
+"do:\n"
+"%s\n"
+"bìhem vícenásobného kopírování souboru."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Chyby pøi pøesunování souboru"
+
+#: src/utilops.c:636
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Nelze pøesunout soubor:\n"
+"%s\n"
+"do:\n"
+"%s\n"
+"bìhem vícenásobného pøesunu souboru."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Zdroj je toto¾ný s cílem"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Zdroj a cíl jsou toto¾né, operace stornována."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Nelze kopírovat soubor:\n"
+"%s\n"
+"do:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Nelze pøesunout soubor:\n"
+"%s\n"
+"do:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Neplatný cíl"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"Pokud pracujete s více soubory, vyberte prosím\n"
+"adresáø, nikoliv soubor."
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Prosím vyberte existující adresáø"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Nápovìda - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "_Kopírovat"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr "Pøejmenovat soubor:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "Kopírovat více souborù do:"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Nápovìda - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "_Pøesunout"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr "Pøejmenovat soubor:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Pøesunout více souborù do:"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Název souboru:"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Zdroj je toto¾ný s cílem"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Chyba pøi odstraòování"
+
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "Nelze odstranit staré soubory z ko¹e"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Nelze vytvoøit adresáø"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "Pøístup odepøen"
+
+#: src/utilops.c:1212
+#, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Nelze vytvoøit nebo pou¾ít ko¹.\n"
+"\\\"%s\\\""
+
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "Vypnout bezpeèné mazání"
+
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "Bezpeèné mazání: %s"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Nelze odstranit soubor:\n"
+" %s\n"
+" Pokraèovat ve vícenásobném odstranìní souborù?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr "Soubor %d z %d"
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Odstranit soubory"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Pøejmenovat více souborù:"
+
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "Ohodnoceno souborù: %d"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Odstranit soubor"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Odstranit soubor"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Nelze pøejmenovat soubor:\n"
+"%s\n"
+" na:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Chyba pøi pøejmenování souboru"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Nelze automaticky pøejmenovat s tímto\n"
+"poèáteèním èíslem, existuje jeden nebo více\n"
+"souborù, jejich¾ názvy jsou obsa¾eny v\n"
+"cílovém seznamu názvù.\n"
+
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"Nelze pøejmenovat\n"
+"%s\n"
+"Èíslo bylo %d."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Nápovìda - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "Pøejmenovat více souborù:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "Pùvodní název"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Pùvodní název"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "Pøejmenovat:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Zaèátek textu"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "Poè. èíslo"
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Konec textu"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "Doplnìní:"
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Nelze pøejmenovat soubor:\n"
+"%s\n"
+"na:\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr "Pøejmenovat soubor:"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Adresáø:\n"
+"%s\n"
+"ji¾ existuje."
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Adresáøe"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"Cesta:\n"
+"%s\n"
+"ji¾ existuje jako soubor."
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Nápovìda - GQview"
+
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Vytvoøit adresáø v:\n"
+"%s\n"
+"s názvem:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "nový_adresáø"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "O úroveò _vý¹e"
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "_Slideshow"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Slideshow rekurzivnì"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "Najít d_uplikáty..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Najít duplikáty rekurzivnì..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "_Nový adresáø..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "Zobrazit jako s_trom"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "_Obnovit"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "_Tøídit"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "Zobrazit jako _ikony"
+
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "Zobrazit ná_hledy"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Neplatný název souboru:\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "Vyèistit náhledy"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/Soubor/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/Soubor/_Nová sbírka"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Soubor/_Otevøít sbírku..."
+
+#~ msgid "/File/sep1"
+#~ msgstr "/Soubor/sep1"
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/File/Pøe_jmenovat..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Soubor/Najít d_uplikáty..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Soubor/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/File/Pøe_jmenovat..."
+
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Soubor/Nový _adresáø..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Soubor/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Soubor/_Kopírovat..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/File/_Pøesunout..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/File/Pøe_jmenovat..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Soubor/O_dstranit..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Soubor/sep4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/Soubor/_Zavøít okno"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Soubor/_Konec"
+
+#~ msgid "/_Edit"
+#~ msgstr "/Ú_pravy"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Úpravy/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Úpravy/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Úpravy/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Úpravy/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Úpravy/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Úpravy/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Úpravy/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Úpravy/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Úpravy/editor8"
+
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Úpravy/editor9"
+
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Úpravy/editor0"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Úpravy/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Úpravy/O_toèit"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Úpravy/Vlast_nosti..."
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Úpravy/Otoèit/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Úpravy/Otoèit/Otoèit vp_ravo"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Úpravy/Otoèit/Otoèit v_levo"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Úpravy/Otoèit/Otoèit 1_80"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Úpravy/Otoèit/_Zrcadlit"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Úpravy/Otoèit/Pøe_klopit"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Úpravy/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Úpravy/Vybr_at v¹e"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Úpravy/Z_ru¹it výbìr"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Úpravy/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Úpravy/Nastav_ení..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Úpravy/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Úpravy/Nastavit jako _pozadí"
+
+#~ msgid "/_View"
+#~ msgstr "/_Zobrazit"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Zobrazení/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Zobrazení/Z_vìt¹it"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Zobrazení/Z_men¹it"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Zobrazení/Zobrazit _1:1"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Zobrazení/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Zobrazení/Ná_hledy"
+
+#~ msgid "/View/I_cons"
+#~ msgstr "/Zobrazení/I_kony"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Zobrazení/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Zobrazení/Ce_lá obrazovka"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Zobrazení/sep3"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Zobrazení/Sk_rýt seznam souborù"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/Zobrazení/sep4"
+
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Zobrazení/Správce tøí_dìní"
+
+#~ msgid "/View/sep5"
+#~ msgstr "/Zobrazení/sep5"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Zobrazení/Pøepnout _slideshow"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Zobrazení/O_bnovit seznamy"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Nápovìda/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Nápovìda/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "Nastavení programu GQview"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Úpravy/O_dstranit staré náhledy"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Cesty"
+
+#~ msgid "Save"
+#~ msgstr "Ulo¾it"
+
+#~ msgid "Close"
+#~ msgstr "Zavøít"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Pøepsat soubor se sbírkou:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "Ulo¾it sbírku jako:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "Otevøít sbírku z:"
+
+#~ msgid "Open"
+#~ msgstr "Otevøít"
+
+#~ msgid "Append collection from:"
+#~ msgstr "Pøipojit sbírku z:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Konec"
+
+#~ msgid "Exit"
+#~ msgstr "Konec"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Neplatný název souboru"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Po startu pøejít do adresáøe:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Zvìt¹ení (¹kálování):"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Umístit dialog pod my¹"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Zahrnout soubory typu:"
+
+#~ msgid "Remove"
+#~ msgstr "Odstranit"
+
+#~ msgid "Add"
+#~ msgstr "Pøidat"
+
+#~ msgid "Command Line"
+#~ msgstr "Pøíkazový øádek"
+
+#~ msgid "Help"
+#~ msgstr "Nápovìda"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "Ce_lá obrazovka"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Velikost souboru:"
+
+#, fuzzy
+#~ msgid "Width:"
+#~ msgstr "©íøka"
+
+#, fuzzy
+#~ msgid "Height:"
+#~ msgstr "Délka"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Pøepsat soubor:\n"
+#~ " %s\n"
+#~ " souborem:\n"
+#~ " %s"
+
+#~ msgid "Yes"
+#~ msgstr "Ano"
+
+#~ msgid "Yes to all"
+#~ msgstr "Ano pro v¹echny"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Pøepsat soubor:\n"
+#~ "%s\n"
+#~ " souborem:\n"
+#~ "%s "
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Kopírovat soubor:\n"
+#~ "%s\n"
+#~ "do:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Pøesunout soubor:\n"
+#~ "%s\n"
+#~ "do:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Bude odstranìno více souborù..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Pøepsat soubor:\n"
+#~ "%s\n"
+#~ "s pøejmenováním:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "na:"
+
+#~ msgid "Create"
+#~ msgstr "Vytvoøit"
+
+#~ msgid "Initial directory"
+#~ msgstr "Poèáteèní adresáø"
+
+#~ msgid "New Directory"
+#~ msgstr "Nový adresáø"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Nelze vytvoøit nový adresáø:\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "Chyba pøi vytváøení adresáøe"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "Popis obrázku"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/Zobrazení/Pøepnout _slideshow"
+
+#~ msgid "Add contents"
+#~ msgstr "Pøidat obsah"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "Pøidat obsah rekurzivnì"
+
+#~ msgid "Skip directories"
+#~ msgstr "Pøeskoèit adresáøe"
+
+#~ msgid "Invalid directory"
+#~ msgstr "Neplatný adresáø"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - kopírování"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - pøesun"
+
+#~ msgid "Directory exists"
+#~ msgstr "Adresáø existuje"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - nový adresáø"
+
+#~ msgid "Misc."
+#~ msgstr "Ostatní"
diff --git a/po/da.po b/po/da.po
new file mode 100644 (file)
index 0000000..ba1d5cc
--- /dev/null
+++ b/po/da.po
@@ -0,0 +1,3625 @@
+# GQview in Danish.
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# Birger Langkjer <birger.langkjer@image.dk>, 2001.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview-0.99.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2001-11-24 21:25+0100\n"
+"Last-Translator: Birger Langkjer <birger.langkjer@image.dk>\n"
+"Language-Team: Danish <sslug-locale@sslug.dk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Fliser"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "Dato"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+#, fuzzy
+msgid "Filename:"
+msgstr "Omdøb:"
+
+#: src/bar_info.c:1007 src/info.c:360
+#, fuzzy
+msgid "File date:"
+msgstr "Filter:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Sammenlign med:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Gem samling"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr ""
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Navn"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr ""
+
+#: src/bar_exif.c:426
+#, fuzzy
+msgid "Format"
+msgstr "Normal"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr ""
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr ""
+
+#: src/bar_exif.c:549 src/info.c:105
+#, fuzzy
+msgid "Exif"
+msgstr "Afslut"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr ""
+
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Filsletning mislykkedes"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr "Fil ved navn %s findes allerede."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Tom samling"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Kunne ikke gemme samlingen:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Gem mislykkedes"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr ""
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Samlinger"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+#, fuzzy
+msgid "Name:"
+msgstr "Navn"
+
+#: src/bar_sort.c:569
+#, fuzzy
+msgid "Sort Manager"
+msgstr "Sortér efter navn"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+#, fuzzy
+msgid "Folders"
+msgstr "Fliser"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Samlinger"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Kopiér"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Flyt"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d billeder"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Vælg ingen"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr ""
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+#, fuzzy
+msgid "done"
+msgstr "Ingen"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Læser lighedsdata..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Rydder miniaturer..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Udrenser gamle miniaturer..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Ugyldigt filnavn"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Gem miniaturer"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Dato"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+#, fuzzy
+msgid "Folder:"
+msgstr "Fliser"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Vælg ingen"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Ugyldigt filnavn"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+#, fuzzy
+msgid "running..."
+msgstr "Sammenligner..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Rydder miniaturer..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Ryd mellemlager"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Dette vil slette alle miniaturer, der\n"
+"er blevet gemt på disken, fortsæt?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "Hjælp - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview fuldskærm"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "Samlinger"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "Ryd"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "Gem miniaturer"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "Gem miniaturer"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "Omdøb"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Unavngivet"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Unavngivet (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - GQview samling"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Luk samling"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Samlingen er blevet ændret.\n"
+"Gem først?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Angivede stinavn:\n"
+"%s\n"
+"er en mappe, samlinger er filer"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Ugyldigt filnavn"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Overskriv fil"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Overskriv fil"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Overskriv"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Gem samling"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Åbn samling"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Tilføj samling"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Tilføj"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Samlingsfiler"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Tom samling"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Denne samling er tom, gem er aflyst."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Tom"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d billeder (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d billeder"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Indlæser miniaturer..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+#, fuzzy
+msgid "_View"
+msgstr "/_Vis"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+#, fuzzy
+msgid "View in _new window"
+msgstr "Vis i nyt vindue"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+#, fuzzy
+msgid "Rem_ove"
+msgstr "Fjern"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Tilføj fra filliste"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Tilføj fra samling..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Vælg alle"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Vælg ingen"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+#, fuzzy
+msgid "_Properties"
+msgstr "/Redigér/_Indstillinger"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+#, fuzzy
+msgid "_Copy..."
+msgstr "Kopiér..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+#, fuzzy
+msgid "_Move..."
+msgstr "Flyt..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+#, fuzzy
+msgid "_Rename..."
+msgstr "Omdøb..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+#, fuzzy
+msgid "_Delete..."
+msgstr "Slet..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+#, fuzzy
+msgid "Show filename _text"
+msgstr "Vis skjulte"
+
+#: src/collect-table.c:813
+#, fuzzy
+msgid "_Save collection"
+msgstr "Gem samling"
+
+#: src/collect-table.c:815
+#, fuzzy
+msgid "Save collection _as..."
+msgstr "Gem samling som..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+#, fuzzy
+msgid "_Find duplicates..."
+msgstr "Find dubletter..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Filer/_Omdøb..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "Denne liste indeholder mapper."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+#, fuzzy
+msgid "_Add contents"
+msgstr "Tilføj indhold"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+#, fuzzy
+msgid "Add contents _recursive"
+msgstr "Tilføj indhold med mapper"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "Udelad mapper"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Annullér"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Træk og slip mapper her for at sammenligne dem."
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d filer"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d ligheder fundet i %d filer"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr ""
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr ""
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Tjekker dimensioner..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Læser lighedsdata..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Sammenligner..."
+
+#: src/dupe.c:1535
+#, fuzzy
+msgid "Sorting..."
+msgstr "Sammenligner..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr ""
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr ""
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Føj til ny samling"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+#, fuzzy
+msgid "C_lear"
+msgstr "Ryd"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+#, fuzzy
+msgid "Close _window"
+msgstr "Luk vindue"
+
+#: src/dupe.c:2382
+#, fuzzy, c-format
+msgid "%d files (set 2)"
+msgstr "%d filer%s"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Størrelse"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Dato"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Dimensioner"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr ""
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Sti"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Lighed (stor)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Lighed"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Lighed (lav)"
+
+#: src/dupe.c:2598
+#, fuzzy
+msgid "Similarity (custom)"
+msgstr "Lighed (lav)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Find dubletter - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Sammenlign med:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Sammenlign ved:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Miniaturer"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Sammenlign to sæt filer"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "Gimp'en"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+#, fuzzy
+msgid "Rotate jpeg clockwise"
+msgstr "Rotér med uret"
+
+#: src/editors.c:59
+#, fuzzy
+msgid "Rotate jpeg counterclockwise"
+msgstr "Rotér mod uret"
+
+#: src/editors.c:104
+#, fuzzy
+msgid "stopping..."
+msgstr "Sammenligner..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr ""
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr ""
+
+#: src/editors.c:303
+#, fuzzy, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Kunne ikke indlæse:\n"
+"%s"
+
+#: src/editors.c:414
+#, fuzzy
+msgid "stopped by user"
+msgstr "Sortér efter nummer"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+#, fuzzy
+msgid "unknown"
+msgstr "i (ukendt)..."
+
+#: src/exif.c:113
+#, fuzzy
+msgid "top left"
+msgstr "Slet"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr ""
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr ""
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr ""
+
+#: src/exif.c:117
+#, fuzzy
+msgid "left top"
+msgstr "Slet"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr ""
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr ""
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr ""
+
+#: src/exif.c:127
+msgid "inch"
+msgstr ""
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr ""
+
+#: src/exif.c:140
+msgid "average"
+msgstr ""
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr ""
+
+#: src/exif.c:142
+msgid "spot"
+msgstr ""
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr ""
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr ""
+
+#: src/exif.c:145
+msgid "partial"
+msgstr ""
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr ""
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr ""
+
+#: src/exif.c:152
+msgid "manual"
+msgstr ""
+
+#: src/exif.c:153
+#, fuzzy
+msgid "normal"
+msgstr "Normal"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr ""
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr ""
+
+#: src/exif.c:156
+#, fuzzy
+msgid "creative"
+msgstr "Opret"
+
+#: src/exif.c:157
+msgid "action"
+msgstr ""
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr ""
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr ""
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr ""
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr ""
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr ""
+
+#: src/exif.c:168
+msgid "flash"
+msgstr ""
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr ""
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+#, fuzzy
+msgid "yes"
+msgstr "Ja"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr ""
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr ""
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr ""
+
+#: src/exif.c:292
+#, fuzzy
+msgid "Orientation"
+msgstr "Dimensioner"
+
+#: src/exif.c:303
+#, fuzzy
+msgid "Copyright"
+msgstr "Kopiér"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr ""
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr ""
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr ""
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr ""
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr ""
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr ""
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr ""
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr ""
+
+#: src/exif.c:323
+#, fuzzy
+msgid "Metering mode"
+msgstr "Ditheringsmetode:"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr ""
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr ""
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr ""
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr ""
+
+#: src/exif.c:337
+msgid "Height"
+msgstr ""
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr ""
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr ""
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr ""
+
+#: src/exif.c:1479
+#, fuzzy
+msgid "mode:"
+msgstr "Fliser"
+
+#: src/exif.c:1483 src/utilops.c:1234
+#, fuzzy
+msgid "on"
+msgstr "Ingen"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr ""
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr ""
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr ""
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr ""
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr ""
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr ""
+
+#: src/filelist.c:513
+#, fuzzy, c-format
+msgid "%d bytes"
+msgstr "%d filer"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr ""
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr ""
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr ""
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview fuldskærm"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Fliser"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Pas til vindue"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+#, fuzzy
+msgid "Zoom _in"
+msgstr "Zoom ind"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+#, fuzzy
+msgid "Zoom _out"
+msgstr "Zoom ud"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+#, fuzzy
+msgid "Zoom _1:1"
+msgstr "Zoom 1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+#, fuzzy
+msgid "Fit image to _window"
+msgstr "Pas til vindue"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+#, fuzzy
+msgid "Set as _wallpaper"
+msgstr "Brug som baggrund"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+#, fuzzy
+msgid "_Stop slideshow"
+msgstr "Stop billedserie"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+#, fuzzy
+msgid "Continue slides_how"
+msgstr "Fortsæt billedserie"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+#, fuzzy
+msgid "Pause slides_how"
+msgstr "Afbryd billedserie"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+#, fuzzy
+msgid "_Start slideshow"
+msgstr "Start billedserie"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+#, fuzzy
+msgid "Exit _full screen"
+msgstr "Forlad fuldskærm"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+#, fuzzy
+msgid "_Full screen"
+msgstr "Fuldskærm"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+#, fuzzy
+msgid "C_lose window"
+msgstr "Luk vindue"
+
+#: src/info.c:361
+#, fuzzy
+msgid "File size:"
+msgstr "Fliser"
+
+#: src/info.c:363
+#, fuzzy
+msgid "Dimensions:"
+msgstr "Dimensioner"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr ""
+
+#: src/info.c:365 src/print.c:3371
+#, fuzzy
+msgid "Image size:"
+msgstr "Billede"
+
+#: src/info.c:367
+#, fuzzy
+msgid "Compress ratio:"
+msgstr "Sammenlign med:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Filter:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr ""
+
+#: src/info.c:371
+msgid "Group:"
+msgstr ""
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Generelt"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr ""
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr ""
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr ""
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Billedserie"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Afbrudt"
+
+#: src/layout.c:358
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%d filer (%d)%s"
+
+#: src/layout.c:365
+#, fuzzy, c-format
+msgid "%s, %d files%s"
+msgstr "%d filer%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d filer%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr ""
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s byte"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s byte"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview værktøjer"
+
+#: src/layout_config.c:57
+#, fuzzy
+msgid "Tools"
+msgstr "Fliser"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+#, fuzzy
+msgid "Files"
+msgstr "Fliser"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Billede"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr ""
+
+#: src/layout_image.c:770
+#, fuzzy
+msgid "Hide file _list"
+msgstr "Vis/skjul filliste"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "i %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "i (ukendt)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Tom"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Filer"
+
+#: src/layout_util.c:749 src/menu.c:91
+#, fuzzy
+msgid "_Edit"
+msgstr "/Redigér"
+
+#: src/layout_util.c:750 src/menu.c:248
+#, fuzzy
+msgid "_Adjust"
+msgstr "Tilpas"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/_Hjælp"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Filer/_Ny samling"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "Gem samling"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Åbn samling"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Filer/Åbn _nylige"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Sammenligner..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Filer/_Omdøb..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "Hjælp - GQview"
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Kvalitet"
+
+#: src/layout_util.c:779 src/menu.c:194
+#, fuzzy
+msgid "_Rotate clockwise"
+msgstr "Rotér med uret"
+
+#: src/layout_util.c:780 src/menu.c:197
+#, fuzzy
+msgid "Rotate _counterclockwise"
+msgstr "Rotér mod uret"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Rotér 180"
+
+#: src/layout_util.c:782 src/menu.c:203
+#, fuzzy
+msgid "_Mirror"
+msgstr "Spejl"
+
+#: src/layout_util.c:783 src/menu.c:206
+#, fuzzy
+msgid "_Flip"
+msgstr "Omvendt"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Vælg alle"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Vælg ingen"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "/Redigér/_Indstillinger"
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Vis/_Zoom to vindue"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "Fuldskærm"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Vis/skjul filliste"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "Stop billedserie"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "Genindlæs"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Hjælp/Om"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Hjælp/_Tastaturgenveje"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Hjælp/_Versionsinfo"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Hjælp/Om"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Miniaturer"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Vis/sep3"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Vis/_Løsriv filliste"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Vis/tear1"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "Dimensioner"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Vis/_Genindlæs lister"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Sortér efter navn"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Vis/_Genindlæs lister"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Dimensioner"
+
+#: src/layout_util.c:1083
+#, fuzzy
+msgid "Show thumbnails"
+msgstr "Gem miniaturer"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Gå til hjemmemappe"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Genindlæs filliste"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Zoom ind"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Zoom ud"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Pas til vindue"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Vælg zoom 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Ændr indstillinger"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Løsriv kontrolpanel"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Hjælp - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Kommandolinje"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Indlæs næste billede"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "%d billeder"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Indlæs næste billede"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "Forlad fuldskærm"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "Forlad fuldskærm"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "Forlad fuldskærm"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "Stop billedserie"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "Start billedserie"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "Stop billedserie"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "Start billedserie"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview værktøjer"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr "Omdøb:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Vis i nyt vindue"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Brug: gqview [tilvalg] [sti]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "gyldige tilvalg er:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr ""
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr ""
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           start i fuldskærmsmodus\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            start i billedseriemodus\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+
+#: src/main.c:951
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr ""
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              vis versionsinformation\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 vis denne hjælpetekst\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"Ugyldig eller ignoreret: %s\n"
+"Brug --help for at se tilvalg\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Opretter GQview mappe:%s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Kunne ikke oprette mappe:%s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Hjem"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+#, fuzzy
+msgid "Desktop"
+msgstr "til:"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - afslut"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr " - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Samlinger er blevet ændret.\n"
+"Afslut alligevel?"
+
+#: src/menu.c:115
+#, fuzzy
+msgid "Sort by size"
+msgstr "Sortér efter størrelse"
+
+#: src/menu.c:118
+#, fuzzy
+msgid "Sort by date"
+msgstr "Sortér efter dato"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Usorteret"
+
+#: src/menu.c:124
+#, fuzzy
+msgid "Sort by path"
+msgstr "Sortér efter sti"
+
+#: src/menu.c:127
+#, fuzzy
+msgid "Sort by number"
+msgstr "Sortér efter nummer"
+
+#: src/menu.c:131
+#, fuzzy
+msgid "Sort by name"
+msgstr "Sortér efter navn"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Sortér"
+
+#: src/menu.c:200
+#, fuzzy
+msgid "Rotate _180"
+msgstr "Rotér 180"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Nærmest (dårligst, men hurtigst)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Fliser"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Biliniær"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Super (bedst, men langsomst)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Ingen"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normal"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Bedst"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr ""
+
+#: src/preferences.c:662 src/preferences.c:665
+#, fuzzy
+msgid "Reset filters"
+msgstr "Slet filer"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:699 src/preferences.c:702
+#, fuzzy
+msgid "Reset editors"
+msgstr "Slet filer"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:727 src/preferences.c:730
+#, fuzzy
+msgid "Clear trash"
+msgstr "Ryd mellemlager"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr ""
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - omdøb"
+
+#: src/preferences.c:824
+msgid "Startup"
+msgstr ""
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Gå til hjemmemappe"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Brug nuværende"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Størrelse:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Kvalitet:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Gem miniaturer"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Gem miniaturer in .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Brug xvpics miniaturer, hvis de er der"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Billedserie"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Sekunder før næste billede vises:"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Tilfældig"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Gentag"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Zoom ind"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Ditheringsmetode:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr ""
+
+#: src/preferences.c:895
+#, fuzzy
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Udvid billeder, så de passer i vinduet"
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr ""
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Når et nyt billede er valgt:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Zoom til oprindelig størrelse"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Samme zoomindstilling som før"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Tilføj"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr ""
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Fortsæt"
+
+#: src/preferences.c:924
+#, fuzzy
+msgid "Refresh on file change"
+msgstr "Genindlæs filliste"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Indlæs næste billede"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr ""
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Vinduer"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Dato"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Husk vinduesplaceringer"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr ""
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr ""
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr ""
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr ""
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filtrering"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr ""
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr ""
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr ""
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Filter:"
+
+#: src/preferences.c:1008
+#, fuzzy
+msgid "Filter"
+msgstr "Filter:"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr ""
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Redigerer"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Menunavn"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr ""
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "Fuldskærm"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Billede"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Slet"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Bekræft slet billede"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Tillad delete-knap"
+
+#: src/preferences.c:1158
+#, fuzzy
+msgid "Safe delete"
+msgstr "Bekræft slet billede"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Fliser"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Vis"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Firkantet markering"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr ""
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr ""
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr ""
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr ""
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr ""
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+#, fuzzy
+msgid "Custom similarity threshold:"
+msgstr "Brugerfiltyper:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr ""
+
+#: src/preferences.c:1291
+#, fuzzy
+msgid "About - GQview"
+msgstr " - GQview"
+
+#: src/preferences.c:1304
+#, fuzzy, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Ophavsret (c) 2003 by John Ellis\n"
+"http://gqview.sourceforge.net\n"
+"gqview@users.sourceforge.net\n"
+"\n"
+"Udgivet under GNU General Public License"
+
+#: src/preferences.c:1322
+#, fuzzy
+msgid "Credits..."
+msgstr "/Redigér/_Indstillinger"
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Vælg ingen"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr ""
+
+#: src/print.c:138
+#, fuzzy
+msgid "Custom printer"
+msgstr "Brugerfiltyper:"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Billede"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr ""
+
+#: src/print.c:353
+msgid "inches"
+msgstr ""
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr ""
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr ""
+
+#: src/print.c:366
+msgid "Letter"
+msgstr ""
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, c-format
+msgid "page %d of %d"
+msgstr ""
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr ""
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, fuzzy, c-format
+msgid "A file with name %s already exists."
+msgstr "Filnavnet %s eksisterer allerede."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Filter:"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Slet filer"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr " - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Normal"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Dimensioner"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Dimensioner"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Omdøb:"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Unavngivet"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "Ingen"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Sortér"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Billede"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "Filter:"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr ""
+
+#: src/print.c:3432
+msgid "Top:"
+msgstr ""
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "til:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Filter:"
+
+#: src/print.c:3450
+#, fuzzy
+msgid "Custom printer:"
+msgstr "Brugerfiltyper:"
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Filter:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Filter:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Husk vinduesplaceringer"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "fejl ved gemning af konfigfil: %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Fliser"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Tilføj indhold"
+
+#: src/search.c:202
+msgid "results"
+msgstr ""
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Fortsæt"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+#, fuzzy
+msgid "greater than"
+msgstr "Lav miniaturer"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "Filter:"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%d filer (%d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%d filer%s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Sammenligner..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+msgid "Please enter an existing file for image content."
+msgstr ""
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+msgid "Please enter an existing folder to search."
+msgstr ""
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr ""
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Sammenligner..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Omdøb:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Fliser"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Tilfældig"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Filter:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Tjekker dimensioner..."
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Tilføj indhold"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Lighed"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Tilfældig"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr ""
+
+#: src/ui_bookmark.c:148
+#, fuzzy, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr ""
+"Kunne ikke oprette mappen:\n"
+"%s"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr ""
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+#, fuzzy
+msgid "Edit Bookmark"
+msgstr "Redigerer"
+
+#: src/ui_bookmark.c:612
+#, fuzzy
+msgid "Path:"
+msgstr "Sti"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr ""
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Vælg ingen"
+
+#: src/ui_bookmark.c:718
+#, fuzzy
+msgid "_Properties..."
+msgstr "/Redigér/_Indstillinger"
+
+#: src/ui_bookmark.c:720
+#, fuzzy
+msgid "Move _up"
+msgstr "Flyt"
+
+#: src/ui_bookmark.c:722
+#, fuzzy
+msgid "Move _down"
+msgstr "Flyt"
+
+#: src/ui_bookmark.c:724
+#, fuzzy
+msgid "_Remove"
+msgstr "Fjern"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Kunne ikke indlæse:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr ""
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Kunne ikke slette fil:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Filsletning mislykkedes"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Slet fil"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Vil nu slette filen:\n"
+"%s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+#, fuzzy
+msgid "_Rename"
+msgstr "Omdøb"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+#, fuzzy
+msgid "Add _Bookmark"
+msgstr "Redigerer"
+
+#: src/ui_pathsel.c:636
+#, fuzzy
+msgid "_Delete"
+msgstr "Slet"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "Hjælp - GQview"
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Kunne ikke oprette mappen:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Fejl ved mappeoprettelse"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Alle filer"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Vis skjulte"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filter:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Vælg alle"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "Alle filer"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Overskriv fil"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Overskriv fil"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Overskriv fil"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Udelad"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Udelad"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Fejl ved filflytning"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "Hjælp - GQview"
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+#, fuzzy
+msgid "Auto rename"
+msgstr "Menunavn"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Omdøb"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr ""
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr ""
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Fortsæt"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Fejl ved filkopiering"
+
+#: src/utilops.c:631
+#, fuzzy, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Kunne ikke kopiere filen:\n"
+"%s\n"
+"til:\n"
+"%s"
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Fejl ved filflytning"
+
+#: src/utilops.c:636
+#, fuzzy, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Kunne ikke flytte filen:\n"
+"%s\n"
+"til:\n"
+"%s"
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr ""
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr ""
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Kunne ikke kopiere filen:\n"
+"%s\n"
+"til:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Kunne ikke flytte filen:\n"
+"%s\n"
+"til:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr ""
+
+#: src/utilops.c:900
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+
+#: src/utilops.c:905
+msgid "Please select an existing folder."
+msgstr ""
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Hjælp - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+#, fuzzy
+msgid "_Copy"
+msgstr "Kopiér"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr "Omdøb:"
+
+#: src/utilops.c:964
+msgid "Copy multiple files"
+msgstr ""
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Hjælp - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+#, fuzzy
+msgid "_Move"
+msgstr "Flyt"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr "Omdøb:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Slet fil"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Omdøb:"
+
+#: src/utilops.c:996
+msgid "Choose the destination folder."
+msgstr ""
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr ""
+
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr ""
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Kunne ikke oprette mappe"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr ""
+
+#: src/utilops.c:1212
+#, fuzzy, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Kunne ikke oprette mappen:\n"
+"%s"
+
+#: src/utilops.c:1216
+#, fuzzy
+msgid "Turn off safe delete"
+msgstr "Bekræft slet billede"
+
+#: src/utilops.c:1234
+#, fuzzy, c-format
+msgid "Safe delete: %s"
+msgstr "Bekræft slet billede"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr ""
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Slet filer"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Slet fil"
+
+#: src/utilops.c:1438
+#, fuzzy, c-format
+msgid "Review %d files"
+msgstr "%d filer"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Slet fil"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Slet fil"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Fejl ved navngivning af fil"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Hjælp - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "Omdøb:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr ""
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Omdøb:"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "Omdøb:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr ""
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr ""
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr ""
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr ""
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Kunne ikke omdøbe filen:\n"
+"%s\n"
+"til:\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr "Omdøb:"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr "Fil ved navn %s findes allerede."
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Fliser"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Hjælp - GQview"
+
+#: src/utilops.c:2372
+#, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr ""
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr ""
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+#, fuzzy
+msgid "_Slideshow"
+msgstr "Billedserie"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Medtag mapper i billedserie"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+#, fuzzy
+msgid "Find _duplicates..."
+msgstr "Find dubletter..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Find dubletter også i mapper..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr ""
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+#, fuzzy
+msgid "View as _tree"
+msgstr "/Vis/F_uldskærm"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+#, fuzzy
+msgid "Re_fresh"
+msgstr "Genindlæs"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+#, fuzzy
+msgid "_Sort"
+msgstr "Sortér"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+#, fuzzy
+msgid "View as _icons"
+msgstr "Dimensioner"
+
+#: src/view_file_list.c:421
+#, fuzzy
+msgid "Show _thumbnails"
+msgstr "Gem miniaturer"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Ugyldigt filnavn:\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "Udrens miniaturer"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/Filer/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/Filer/_Ny samling"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Filer/Å_bn samling..."
+
+#~ msgid "/File/sep1"
+#~ msgstr "/Filer/sep1"
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/Filer/_Omdøb..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Filer/_Find dubletter..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Filer/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Filer/_Omdøb..."
+
+#, fuzzy
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Filer/_Slet..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Filer/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Filer/_Kopiér..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Filer/_Flyt..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Filer/_Omdøb..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Filer/_Slet..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Filer/sep4"
+
+#, fuzzy
+#~ msgid "/File/C_lose window"
+#~ msgstr "Luk vindue"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Filer/_Afslut"
+
+#~ msgid "/_Edit"
+#~ msgstr "/Redigér"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Redigér/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Redigér/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Redigér/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Redigér/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Redigér/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Redigér/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Redigér/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Redigér/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Redigér/editor8"
+
+#, fuzzy
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Redigér/editor1"
+
+#, fuzzy
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Redigér/editor1"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Redigér/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Redigér/J_ustér"
+
+#, fuzzy
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Redigér/_Indstillinger"
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Redigér/J_ustér/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Redigér/Justér/_Rotér med uret"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Redigér/Justér/Rotér _mod uret"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Redigér/Justér/Rotér 1_80"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Redigér/Justér/_Spejl"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Redigér/Justér/_Omvendt"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Redigér/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Redigér/Vælg _alle"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Redigér/Vælg i_ngen"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Redigér/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Redigér/_Indstillinger"
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Redigér/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Redigér/Vælg som _baggrund"
+
+#~ msgid "/_View"
+#~ msgstr "/_Vis"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Vis/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Vis/Zoom _ind"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Vis/Zoom _ud"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Vis/Zoom _1:1"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Viv/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Vis/_Miniaturer"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Vis/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Vis/F_uldskærm"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Vis/sep3"
+
+#, fuzzy
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Vis/_Skjul filiste"
+
+#, fuzzy
+#~ msgid "/View/sep4"
+#~ msgstr "/Viv/sep1"
+
+#, fuzzy
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Vis/Zoom _ind"
+
+#, fuzzy
+#~ msgid "/View/sep5"
+#~ msgstr "/Viv/sep1"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Vis/Som _billedserie"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Vis/_Genindlæs lister"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Hjælp/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Hjælp/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "GQview konfiguration"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Redigér/_Fjern gamle miniaturer"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Sti"
+
+#~ msgid "Save"
+#~ msgstr "Gem"
+
+#~ msgid "Close"
+#~ msgstr "Luk"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Overskriv samlingsfil:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "Gem samling som:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "Åbn samling fra:"
+
+#~ msgid "Open"
+#~ msgstr "Åbn"
+
+#~ msgid "Append collection from:"
+#~ msgstr "Tilføj samling fra:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Afslut"
+
+#~ msgid "Exit"
+#~ msgstr "Afslut"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Ugyldigt filnavn"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Ved start, begynd i denne mappe:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Zoom (skalering):"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Inkludér filer af typen:"
+
+#~ msgid "Remove"
+#~ msgstr "Fjern"
+
+#~ msgid "Command Line"
+#~ msgstr "Kommandolinje"
+
+#, fuzzy
+#~ msgid "Help"
+#~ msgstr "/_Hjælp"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "Fuldskærm"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Fliser"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Overskriv filen:\n"
+#~ " %s\n"
+#~ " med:\n"
+#~ " %s"
+
+#~ msgid "Yes"
+#~ msgstr "Ja"
+
+#~ msgid "Yes to all"
+#~ msgstr "Ja til alt"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Overskriv filen:\n"
+#~ "%s\n"
+#~ " med:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Kopiér fil:\n"
+#~ "%s\n"
+#~ "til:"
+
+#~ msgid "to:"
+#~ msgstr "til:"
+
+#~ msgid "Create"
+#~ msgstr "Opret"
+
+#~ msgid "Initial directory"
+#~ msgstr "Startmappe"
+
+#~ msgid "New Directory"
+#~ msgstr "Ny mappe"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Kunne ikke oprette mappen:\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "Fejl ved mappeoprettelse"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/Vis/Som _billedserie"
+
+#~ msgid "Add contents"
+#~ msgstr "Tilføj indhold"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "Tilføj indhold med mapper"
+
+#~ msgid "Skip directories"
+#~ msgstr "Udelad mapper"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - kopiér"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - flyt"
+
+#~ msgid "Directory exists"
+#~ msgstr "Mappen eksisterer"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - ny mappe"
+
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/Filer/Opret _mappe..."
+
+#~ msgid "Edit"
+#~ msgstr "Redigér"
+
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "Indsæt træk og slip-filer ved markøren"
+
+#, fuzzy
+#~ msgid "Date:"
+#~ msgstr "Dato"
+
+#, fuzzy
+#~ msgid "top"
+#~ msgstr "til:"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview kører: %s\n"
+
+#~ msgid "Electric Eyes"
+#~ msgstr "Elektroniske Øjne"
+
+#~ msgid "Apply"
+#~ msgstr "Anvend"
+
+#~ msgid "format: [.foo;.bar]"
+#~ msgstr "format: [.foo;.bar]"
index a82ecac..1272703 100644 (file)
--- a/po/de.po
+++ b/po/de.po
-# gqmpeg de.po file.
-# Copyright (C) 1999 John Ellis.
-# Matthias Warkus <mawa@iname.com>, 1999.
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: gqmpeg-0.6.3a\n"
-"POT-Creation-Date: 2000-04-13 15:57-0400\n"
-"PO-Revision-Date: 1999-08-15 23:47+02:00\n"
-"Last-Translator: Matthias Warkus <mawa@iname.com>\n"
-"Language-Team: Me and my monkey <mawa@iname.com>\n"
+"Project-Id-Version: gqview-1.3.9\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2004-02-04 01:10+0100\n"
+"Last-Translator: Danny Milosavljevic <danny_milo@yahoo.com>\n"
+"Language-Team: fixme\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/config.c:307
-msgid "GQview configuration"
-msgstr "GQview-Konfiguration"
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
 
-#: src/config.c:319
-msgid "Ok"
-msgstr "OK"
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Werkzeuge"
 
-#: src/config.c:324
-msgid "Apply"
+#: src/bar_info.c:32
+msgid "People"
 msgstr ""
 
-#: src/config.c:329 src/utildlg.c:145 src/utilops.c:444 src/utilops.c:754
-#: src/utilops.c:885 src/utilops.c:983
-msgid "Cancel"
-msgstr "Abbrechen"
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
 
-#: src/config.c:343
-msgid "General"
-msgstr "Allgemein"
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
 
-#: src/config.c:351
-msgid "Initial directory"
-msgstr "Anfängliches Verzeichnis"
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "Blendenöffnung"
 
-#: src/config.c:361
-msgid "On startup, change to this directory:"
-msgstr "Beim Start in dieses Verzeichnis wechseln:"
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
 
-#: src/config.c:373
-msgid "Use current"
-msgstr "Aktuelle benutzen"
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
 
-#: src/config.c:379
-msgid "Confirm file delete"
-msgstr "Dateilöschung bestätigen"
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
 
-#: src/config.c:381
-msgid "Remember tool state (float/hidden)"
-msgstr "An Werkzeugstatus erinnern (schwebend/verborgen)"
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
 
-#: src/config.c:383
-msgid "Remember window positions"
-msgstr "An Fensterpositionen erinnern"
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Dateiname:"
 
-#: src/config.c:385
-msgid "Slide show"
-msgstr "Diavorführung"
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Dateidatum:"
 
-#: src/config.c:398
-msgid "Delay before image change (seconds):"
-msgstr "Verzögerung vor Bildwechsel (Sekunden):"
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
 
-#: src/config.c:411
-msgid "Random"
-msgstr "Zufall"
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Vergleiche mit:"
 
-#: src/config.c:413
-msgid "Repeat"
-msgstr "Wiederholung"
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
 
-#: src/config.c:420
-msgid "Image"
-msgstr "Bild"
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
 
-#: src/config.c:428
-msgid "When new image is selected:"
-msgstr "Wenn neues Bild ausgewählt wird:"
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
 
-#: src/config.c:438
-msgid "Zoom to original size"
-msgstr "Zu Ausgangsgröße zoomen"
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Sammlung speichern"
 
-#: src/config.c:444 src/img-view.c:306 src/menu.c:473 src/menu.c:547
-#: src/menu.c:587 src/menu.c:678
-msgid "Fit image to window"
-msgstr "Bild in Fenster einpassen"
+# "Last-Translator: Thomas Klausner <wiz@danbala.tuwien.ac.at>\n"
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "Markierung"
 
-#: src/config.c:450
-msgid "Leave Zoom at previous setting"
-msgstr "Zoom bei vorheriger Einstellung belassen"
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Name"
 
-#: src/config.c:457
-msgid "Fit window to image when tools are hidden/floating"
-msgstr "Bild in Fenster einpassen wenn Werkzeuge verborgen sind / schweben"
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "Wert"
 
-#: src/config.c:464
-msgid "Limit size when auto-sizing window"
-msgstr "Größe begrenzen bei der automatischen Fenstergrößenanpassung"
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "Format"
 
-#: src/config.c:474 src/menu.c:477
-msgid "Thumbnails"
-msgstr "Indexbilder"
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "Elemente"
 
-#: src/config.c:490
-msgid "Size:"
-msgstr "Größe:"
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "Beschreibung"
 
-#: src/config.c:519
-msgid "Cache thumbnails"
-msgstr "Indexbilder cachen"
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "Exif"
 
-#: src/config.c:521
-msgid "Use xvpics thumbnails when found (read only)"
-msgstr "xvpics-Indexbilder benutzen, wenn gefunden (nur Lesezugriff)"
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "Erweiterte Ansicht"
 
-#: src/config.c:524
-msgid "Progressive keyboard scrolling"
-msgstr "Gleichmäßiges Tastaturrollen"
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Löschen fehlgeschlagen"
 
-#: src/config.c:526
-msgid "Mouse wheel scrolls image"
+#: src/bar_sort.c:298
+msgid "Link failed"
 msgstr ""
 
-#: src/config.c:533
-msgid "Filtering"
-msgstr "Filtern"
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Der Ordner:\n"
+"%s\n"
+"existiert bereits."
 
-#: src/config.c:542
-msgid "Show entries that begin with a dot"
-msgstr "Einträge zeigen, die mit einem Punkt beginnen"
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Sammlung leer"
 
-#: src/config.c:544
-msgid "Disable File Filtering"
-msgstr "Dateifiltern abschalten"
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Kann Sammlung nicht speichern:\n"
+"%s"
 
-#: src/config.c:546
-msgid "Include files of type:"
-msgstr "Dateien dieses Typ einschließen:"
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Speichern fehlgeschlagen"
 
-#: src/config.c:596
-msgid "Custom file types:"
-msgstr "Selbstdefinierte Dateitypen::"
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "Lesezeichen hinzufügen"
 
-#: src/config.c:609
-msgid "format: [.foo;.bar]"
-msgstr "Format: [.foo;.bar]"
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Sammlungen"
 
-#: src/config.c:618
-msgid "External Editors"
-msgstr "Externe Editoren:"
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "Name:"
 
-#: src/config.c:630
-msgid "#"
-msgstr "Nr. "
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "Sortierleiste"
 
-#: src/config.c:633
-msgid "Menu name"
-msgstr "Menüname"
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "Ordner"
 
-#: src/config.c:636
-msgid "Command Line"
-msgstr "Kommandozeile"
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Sammlungen"
 
-#: src/config.c:666 src/menu.c:500
-msgid "About"
-msgstr "Info"
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Kopieren"
 
-#: src/config.c:682
-#, fuzzy, c-format
-msgid ""
-"GQview %s\n"
-"\n"
-"Copyright (c) 2000 by John Ellis\n"
-"http://gqview.sorceforge.net\n"
-"or http://gqview.netpedia.net\n"
-"gqview@email.com\n"
-"\n"
-"Released under the GNU Public License"
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Verschieben"
+
+#: src/bar_sort.c:600
+msgid "Link"
 msgstr ""
-"QGview %s\n"
-"\n"
-"Copyright (C) 1999 by John Ellis\n"
-"http://gqview.netpedia.net\n"
-"gqview@email.com\n"
-"\n"
-"Freigegeben unter der GNU General Public License"
 
-#: src/filelist.c:51
-msgid " Slideshow"
-msgstr " Diavorführung"
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d Bilder"
 
-#: src/filelist.c:55
-#, c-format
-msgid "%d files (%d)%s"
-msgstr "%d Dateien (%d)%s"
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Keine Auswahl"
 
-#: src/filelist.c:57
-#, c-format
-msgid "%d files%s"
-msgstr "%d Dateien%s"
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "Letztes Bild rückgängig machen"
 
-#: src/filelist.c:1025
-msgid "Loading thumbs..."
-msgstr "Lade Indexbilder..."
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "fertig"
 
-#: src/image.c:66
-#, c-format
-msgid "( ? x ? ) %d bytes"
-msgstr "( ? x ? ) %d Bytes"
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Lese Ähnlichkeitsdaten"
 
-#: src/image.c:68
-#, c-format
-msgid "( %d x %d ) %d bytes"
-msgstr "( %d x %d ) %d Bytes"
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Lösche Indexbilder..."
 
-#: src/img-main.c:247
-msgid "GQview full screen"
-msgstr "GQview Vollbild"
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Entferne alte Indexbilder..."
 
-#: src/img-view.c:303 src/menu.c:470 src/menu.c:544 src/menu.c:584
-#: src/menu.c:674
-msgid "Zoom in"
-msgstr "Einzoomen"
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
 
-#: src/img-view.c:304 src/menu.c:471 src/menu.c:545 src/menu.c:585
-#: src/menu.c:676
-msgid "Zoom out"
-msgstr "Wegzoomen"
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Ungültiger Dateiname"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
 
-#: src/img-view.c:305 src/menu.c:472 src/menu.c:546 src/menu.c:586
-msgid "Zoom 1:1"
-msgstr "Zoom 1:1"
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Indexbilder zwischenspeichern"
 
-#. edit menu
-#: src/img-view.c:309 src/menu.c:457 src/menu.c:519 src/menu.c:550
-#: src/menu.c:590
-msgid "Edit"
-msgstr "Bearbeiten"
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Anfangsnr. "
 
-#: src/img-view.c:314 src/menu.c:446 src/menu.c:526 src/menu.c:557
-#: src/menu.c:595
-msgid "Copy..."
-msgstr "Kopieren..."
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "Ordner:"
 
-#: src/img-view.c:315 src/menu.c:447 src/menu.c:527 src/menu.c:558
-#: src/menu.c:596
-msgid "Move..."
-msgstr "Verschieben..."
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Keine Auswahl"
 
-#: src/img-view.c:316 src/menu.c:448 src/menu.c:528 src/menu.c:559
-#: src/menu.c:597
-msgid "Rename..."
-msgstr "Umbenennen.."
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Ungültiger Dateiname"
 
-#: src/img-view.c:317 src/menu.c:449 src/menu.c:529 src/menu.c:560
-#: src/menu.c:598
-msgid "Delete..."
-msgstr "Löschen..."
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
 
-#: src/img-view.c:320
-msgid "Close window"
-msgstr "Fenster schließen"
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
 
-#: src/main.c:90 src/main.c:119
-#, c-format
-msgid "GQview running: %s\n"
-msgstr "GQview läuft: %s\n"
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "läuft..."
 
-#: src/main.c:330
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Lösche Indexbilder..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Lösche Zwischenspeicher"
+
+#: src/cache_maint.c:1113
 msgid ""
-"Usage: gqview [options] [path]\n"
-"\n"
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
 msgstr ""
-"Verwendung: gqview [optionen] [pfad]\n"
-"\n"
+"Dies wird alle Indexbilder die auf der Platte\n"
+"sind löschen. Wirklich weitermachen?"
 
-#: src/main.c:331
-msgid "valid options are:\n"
-msgstr "Gültige Optionen sind:\n"
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "Bildeigenschaften - GQView"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
 
-#: src/main.c:332
+#: src/cache_maint.c:1177
 #, fuzzy
-msgid "  +t, --with-tools           force show of tools\n"
-msgstr "  +t, +tools                 Anzeige der Werkzeuge erzwingen\n"
+msgid "GQview thumbnail cache"
+msgstr "GQview Vollbild"
 
-#: src/main.c:333
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
 #, fuzzy
-msgid "  -t, --without-tools        force hide of tools\n"
-msgstr "  -t, -tools                 Verbergen der Werkzeuge erzwingen\n"
+msgid "Location:"
+msgstr "Sammlungen"
 
-#: src/main.c:334
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
 #, fuzzy
-msgid "  -f, --fullscreen           start in full screen mode\n"
-msgstr "  -t, -tools                 Verbergen der Werkzeuge erzwingen\n"
+msgid "Clean up"
+msgstr "Löschen"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
 
-#: src/main.c:335
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
 #, fuzzy
-msgid "  -s, --slideshow            start in slideshow mode\n"
-msgstr "  -t, -tools                 Verbergen der Werkzeuge erzwingen\n"
+msgid "Delete all cached thumbnails."
+msgstr "Indexbilder zwischenspeichern"
 
-#: src/main.c:336
+#: src/cache_maint.c:1197
 #, fuzzy
-msgid "  --debug                    turn on debug output\n"
-msgstr "  -debug                     Diagnoseausgabe einschalten\n"
+msgid "Shared thumbnail cache"
+msgstr "Indexbilder anzeigen"
 
-#: src/main.c:337
+#: src/cache_maint.c:1220
 #, fuzzy
-msgid ""
-"  -h, --help                 show this message\n"
-"\n"
-msgstr ""
-"  -help                Diese Meldung\n"
-"\n"
+msgid "Render"
+msgstr "Umbenennen"
 
-#: src/main.c:342
-#, c-format
-msgid ""
-"invalid or ignored: %s\n"
-"Use -help for options\n"
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
 msgstr ""
-"Ungültig oder ignoriert: %s\n"
-"Benutzen Sie -help für Optionen\n"
 
-#: src/main.c:369
-msgid "The Gimp"
-msgstr "The Gimp"
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
 
-#: src/main.c:372
-msgid "Electric Eyes"
-msgstr "Electric Eyes"
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
 
-#: src/main.c:375
-msgid "XV"
-msgstr "XV"
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Unbenannt"
 
-#: src/main.c:378
-msgid "Xpaint"
-msgstr "Xpaint"
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Unbekannt (%d)"
 
-#: src/menu.c:373
+#: src/collect.c:980
 #, c-format
-msgid "in %s..."
-msgstr "in %s..."
+msgid "%s - GQview Collection"
+msgstr "%s - GQview Sammlung"
 
-#: src/menu.c:375
-msgid "in (unknown)..."
-msgstr "in (unbekannt)..."
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Schließe Sammlung"
 
-#: src/menu.c:394
-msgid "Options..."
-msgstr "Optionen..."
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Sammlung wurde verändert.\n"
+"Zuerst speichern?"
 
-#: src/menu.c:396
-msgid "Remove old thumbnails"
-msgstr "Alte Indexbilder entfernen"
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
 
-#: src/menu.c:398 src/menu.c:410 src/menu.c:422
-msgid "Set as wallpaper"
+# gqview de.po file.
+# Copyright (C) 2000 Free Software Foundation, Inc.
+# Christian Ullrich <quiana@quiana.net>, 2001.
+#
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
 msgstr ""
+"Angegebener Pfad:\n"
+"%s\n"
+"ist ein Ordner, Sammlungen sind Dateien"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Ungültiger Dateiname"
 
-#. file menu
-#: src/menu.c:440
-msgid "File"
-msgstr "Datei"
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Datei überschreiben"
 
-#: src/menu.c:444
-msgid "Create Dir..."
-msgstr "Verzeichnis anlegen..."
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Datei überschreiben"
 
-#: src/menu.c:451
-msgid "Exit"
-msgstr "Beenden"
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Überschreiben"
 
-#. view menu
-#: src/menu.c:466
-msgid "View"
-msgstr "Ansicht"
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Sammlung speichern"
 
-#: src/menu.c:476 src/menu.c:563
-msgid "Full screen"
-msgstr "Vollbild"
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Öffne Sammlung"
 
-#: src/menu.c:485
-msgid "Refresh Lists"
-msgstr "Listen auffrischen"
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Füge Sammlung an"
 
-#: src/menu.c:486
-msgid "(Un)Float file list"
-msgstr "Dateiliste schweben lassen / einfangen"
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Anhängen"
 
-#: src/menu.c:487 src/menu.c:562
-msgid "(Un)Hide file list"
-msgstr "Dateiliste verbergen / hervorholen"
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Sammlungsdateien"
 
-#: src/menu.c:490
-msgid "Toggle slideshow"
-msgstr "Diavorführung an/aus"
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Sammlung leer"
 
-#. help menu
-#: src/menu.c:496
-msgid "Help"
-msgstr "Hilfe"
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Die derzeitige Sammlung ist leer, speichern abgebrochen."
 
-#: src/menu.c:523 src/menu.c:554
-msgid "View in new window"
-msgstr "In neuem Fenster anzeigen"
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Leer"
 
-#: src/menu.c:531
-msgid "Refresh"
-msgstr "Auffrischen"
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d Bilder (%d)"
 
-#: src/menu.c:601
-msgid "Exit full screen"
-msgstr "Vollbild verlassen"
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d Bilder"
 
-#: src/menu.c:661
-msgid "Create thumbnails"
-msgstr "Indexbilder erzeugen"
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Lade Indexbilder..."
 
-#: src/menu.c:670
-msgid "Change to home directory"
-msgstr "Ins Heimverzeichnis wechseln"
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "_Ansicht"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "In _neuem Fenster anzeigen"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "Entfernen"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Anfügen der Dateiliste"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Anfügen aus Sammlung..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Wähle alle aus"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Keine Auswahl"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "_Eigenschaften"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "_Kopieren..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "_Verschieben..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "_Umbenennen..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "Löschen..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "Dateinamen anzeigen"
+
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "Sammlung _speichern"
+
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "Sammlung speichern _als..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "_Finde Duplikate..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Datei/_Umbenennen.."
 
-#: src/menu.c:672
-msgid "Refresh file list"
-msgstr "Dateiliste auffrischen"
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "Weggefallene Liste enthölt Ordner."
 
-#: src/menu.c:680
-msgid "Set zoom 1:1"
-msgstr "Zoom auf 1:1 setzen"
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "Inhalt hinzufügen"
 
-#: src/menu.c:682
-msgid "Configure options"
-msgstr "Optionen konfigurieren"
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "Inhalt _rekursiv hinzufügen"
 
-#: src/menu.c:684
-msgid "Float Controls"
-msgstr "Kontrollen schweben lassen"
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "Über_springe Ordner"
 
-#: src/rcfile.c:132
-#, c-format
-msgid "error saving config file: %s\n"
-msgstr "Fehler beim Speichern von Konfigurationsdatei: %s\n"
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Abbrechen"
 
-#: src/thumb.c:127 src/thumb.c:151
-#, c-format
-msgid "create dir failed: %s\n"
-msgstr "Anlegen von Verzeichnis fehlgeschlagen: %s\n"
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Dateien herziehen um sie zu vergleichen."
 
-#: src/thumb.c:233
+#: src/dupe.c:100
 #, c-format
-msgid "Unable to delete dir: %s\n"
-msgstr "Kann Verzeichnis nicht löschen: %s\n"
+msgid "%d files"
+msgstr "%d Dateien"
 
-#: src/thumb.c:249
+#: src/dupe.c:104
 #, c-format
-msgid "failed to delete:%s\n"
-msgstr "Kann nicht löschen: %s\n"
+msgid "%d matches found in %d files"
+msgstr "%d Treffer gefunden in %d Dateien"
 
-#: src/utildlg.c:68
-msgid "     Ok     "
-msgstr "     OK     "
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[menge 1]"
 
-#: src/utilops.c:166
-msgid "Source to copy matches destination"
-msgstr ""
-
-#: src/utilops.c:167
-#, fuzzy, c-format
-msgid ""
-"Unable to copy file:\n"
-"%s\n"
-"to itself."
-msgstr "Kann Datei nicht löschen:\n"
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Lese Prüfsumme..."
 
-#: src/utilops.c:171
-msgid "Source to move matches destination"
-msgstr ""
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Lese Dimensionen..."
 
-#: src/utilops.c:172
-#, fuzzy, c-format
-msgid ""
-"Unable to move file:\n"
-"%s\n"
-"to itself."
-msgstr "Kann Datei nicht umbenennen:\n"
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Lese Ähnlichkeitsdaten"
 
-#: src/utilops.c:175 src/utilops.c:231 src/utilops.c:516
-msgid "Continue"
-msgstr "Fortsetzen"
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Vergleiche..."
 
-#: src/utilops.c:182
-#, fuzzy, c-format
-msgid ""
-"Overwrite file:\n"
-" %s\n"
-" with:\b %s"
-msgstr "Datei überschreiben:\n"
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "Sortiere..."
 
-#: src/utilops.c:183 src/utilops.c:289 src/utilops.c:651 src/utilops.c:835
-msgid "Overwrite file"
-msgstr "Datei überschreiben"
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "Duplikate der Gruppe _1 auswählen"
 
-#: src/utilops.c:186
-msgid "Skip"
-msgstr "Überspringen"
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "Duplikate der Gruppe _2 auswählen"
 
-#: src/utilops.c:187
-msgid "Yes to all"
-msgstr "Ja zu allen"
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Füge zu neuer Sammlung hinzu"
 
-#: src/utilops.c:188
-msgid "Yes"
-msgstr "Ja"
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "Löschen"
 
-#: src/utilops.c:222 src/utilops.c:317
-#, fuzzy
-msgid "Error copying file"
-msgstr "Fehler beim Umbenennen von Datei"
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "Fenster s_chließen"
 
-#: src/utilops.c:223
+#: src/dupe.c:2382
 #, c-format
-msgid ""
-"Unable to copy file:\n"
-"%sto:\n"
-"%s\n"
-" during multiple file copy."
-msgstr ""
+msgid "%d files (set 2)"
+msgstr "%d Dateien (menge 2)"
 
-#: src/utilops.c:227 src/utilops.c:322
-#, fuzzy
-msgid "Error moving file"
-msgstr "Fehler beim Umbenennen von Datei"
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Größe"
 
-#: src/utilops.c:228
-#, fuzzy, c-format
-msgid ""
-"Unable to move file:\n"
-"%sto:\n"
-"%s\n"
-" during multiple file move."
-msgstr ""
-"\n"
-" während Verschieben mehrerer Dateien."
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Datum"
 
-#: src/utilops.c:282
-msgid "Source matches destination"
-msgstr ""
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Dimensionen"
 
-#: src/utilops.c:283
-msgid "Source and destination are the same, operation cancelled."
-msgstr ""
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Prüfsumme"
 
-#: src/utilops.c:288
-#, fuzzy, c-format
-msgid ""
-"Overwrite file:\n"
-"%s\n"
-" with:\n"
-"%s"
-msgstr "Datei überschreiben:\n"
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Pfad"
 
-#: src/utilops.c:292 src/utilops.c:654 src/utilops.c:838
-msgid "Overwrite"
-msgstr "Überschreiben"
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Ähnlichkeit (hoch)"
 
-#: src/utilops.c:318
-#, fuzzy, c-format
-msgid ""
-"Unable to copy file:\n"
-"%s\n"
-"to:\n"
-"%s"
-msgstr "Kann Datei nicht löschen:\n"
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Ähnlichkeit"
 
-#: src/utilops.c:323
-#, fuzzy, c-format
-msgid ""
-"Unable to move file:\n"
-"%s\n"
-"to:\n"
-"%s"
-msgstr "Kann Datei nicht umbenennen:\n"
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Ähnlichkeit (niedrig)"
 
-#: src/utilops.c:367
-msgid "Invalid destination"
-msgstr "Ungültiges Ziel"
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Ähnlichkeit (benutzerdefiniert)"
 
-#: src/utilops.c:367
-msgid ""
-"When operating with multiple files, please select\n"
-" a directory, not file."
-msgstr ""
-"Beim Umgang mit mehreren Dateien, bitte ein\n"
-" Verzeichnis, keine Datei wählen."
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Finde Duplikate - GQview"
 
-#: src/utilops.c:369
-msgid "Invalid directory"
-msgstr "Ungültiges Verzeichnis"
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Vergleiche mit:"
 
-#: src/utilops.c:369
-msgid "Please select an existing directory"
-msgstr "Bitte wählen Sie ein existierendes Verzeichnis"
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Vergleiche nach:"
 
-#: src/utilops.c:427
-msgid "GQview - copy"
-msgstr "GQview - Kopieren"
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Indexbilder"
 
-#: src/utilops.c:428
-msgid "Copy"
-msgstr "Kopieren"
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Vergleiche zwei Dateimengen"
 
-#: src/utilops.c:430
-#, c-format
-msgid ""
-"Copy file:\n"
-"%s\n"
-"to:"
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "Rotiere im Uhrzeigersinn"
+
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "Rotiere entgegen dem Uhrzeigersinn"
+
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "Halte an..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "Ergebnis der Bearbeitung"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "Ausgabe von %s"
+
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Kann Kommando nicht ausführen:\n"
+"%s\n"
+
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "Abbruch durch Benutzer"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "unbekannt"
+
+#: src/exif.c:113
+msgid "top left"
+msgstr "Links oben"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "Rechts oben"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "Rechts unten"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "Links unten"
+
+#: src/exif.c:117
+msgid "left top"
+msgstr "Links oben"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "Rechts oben"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "Rechts unten"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "Links unten"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "Zoll"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "zentimeter"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "Durchschnitt"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr ""
+
+#: src/exif.c:142
+msgid "spot"
+msgstr ""
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr ""
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr ""
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "Teilweise"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "Anderes"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "Nicht angegeben"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "Manuell"
+
+#: src/exif.c:153
+msgid "normal"
+msgstr "normal"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "Blendenöffnung"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "Blendenverschluss"
+
+#: src/exif.c:156
+msgid "creative"
+msgstr ""
+
+#: src/exif.c:157
+msgid "action"
+msgstr ""
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "Hochformat"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "Querformat"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "Tageslicht"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "Flourescezlicht"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "Wolfram (weißglühend)"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "Blitz"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "Nein"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "Ja"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr ""
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr ""
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "Bildbeschreibung"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "Ausrichtung"
+
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "Lizenz"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "Belichtungsprogramm"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "ISO Empfindlichkeit"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "Originaldatum"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "Digitalisierungsdatum"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "Verschlußgeschw."
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "Blendenöffnung"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "Belichtungs-Bias"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "Objektentfernung"
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "Messmethode"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "Lichtquelle"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "Blitz"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "Brennweite"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "Breite"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "Höhe"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "Auflösung"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr ""
+
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "Modus:"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "ein"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "aus"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "automatisch"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr ""
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr ""
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "Rote Augen-Effekt vermindern"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "Punkt"
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d Bytes"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f K"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview Vollbild"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Dateigröße:"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Bild in Fenster einpassen"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "Vergrößern"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "Verkleinern"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "Originalgröße"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "Bild in Fenster einpassen"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "Als Hindergrundbild verwenden"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "Diavorführung beenden"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "Diavorführung fortsetzen"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "Diavorführung pausieren"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "Diavorführung starten"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "Vollbildmodus verlassen"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "Vollbildmodus"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "Fenster sch_ließen"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "Dateigröße:"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Dimensionen:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Transparent:"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Bildgröße"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Komprimierungsfaktor:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Dateidatum:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Besitzer:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Gruppe:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Allgemein"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "Bild %d von %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Bildeigenschaften - GQView"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Aufsteigend"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Diavorführung"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Pausiert"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d Dateien (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d Dateien%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d Dateien%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(keine Leserlaubnis) %s Bytes"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s Bytes"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s Bytes"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview-Werkzeuge"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Werkzeuge"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "Dateien"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Bild"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(ziehen zum Ändern der Reihenfolge)"
+
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "Datei_liste verbergen"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "in %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "in (unbekannt)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Leer"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Datei"
+
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "_Bearbeiten"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "Justieren"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/_Hilfe"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Datei/Neues _Fenster"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "Sammlung _speichern"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Öffne Sammlung"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Datei/Öffne letzte"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Sortiere..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Datei/_Umbenennen.."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "_Neuer Ordner..."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Qualität"
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "Rotiere im Uhrzeigersinn"
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "Rotiere entgegen dem Uhrzeigersinn"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Rotiere 180°"
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "Spiegeln"
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "Wasserspiegelung"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Wähle alle aus"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Keine Auswahl"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "Eigenschaften..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Ansicht/An Fenstergröße anpassen"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "Vollbildmodus"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Datei_liste verbergen"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "Diavorführung beenden"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "Auffrischen"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Hilfe/Über"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Hilfe/_Tastenkürzel"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Hilfe/_Information über diese Version"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Hilfe/Über"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Indexbilder"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Ansicht/Baum"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Ansicht/Dateiliste schweben lassen"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Ansicht/Werkzeugliste verbergen"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "/Ansicht/I_cons"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Ansicht/Exif-Daten"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Sortierleiste"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Ansicht/Liste"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Symbol:"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Indexbilder anzeigen"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Ins Heimverzeichnis wechseln"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Dateiliste auffrischen"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Vergrößern"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Verkleinern"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Bild in Fenster einpassen"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Zoom auf 1:1 setzen"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Einstellungen bearbeiten"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Kontrollen schweben lassen"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Hilfe - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Kommandozeile"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Nächstes Bild vorladen"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "Letztes Bild rückgängig machen"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Letztes Bild rückgängig machen"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "Vollbildmodus verlassen"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "Vollbildmodus verlassen"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "Vollbildmodus verlassen"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "Diavorführung beenden"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "Diavorführung starten"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "Diavorführung beenden"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "Diavorführung starten"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview-Werkzeuge"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr "Datei umbenennen:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "In _neuem Fenster anzeigen"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Aufruf: gqview [Optionen] [Pfad]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "Gültige Optionen sind:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           Anzeige der Werkzeuge erzwingen\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        Verbergen der Werkzeuge erzwingen\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, -fullscreen            Starte im Vollbildmodus\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            Starte im Diavorführungsmodus\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+"  -l, --list                 öffne Sammlungsfenster für "
+"Befehlszeilenargumente\n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+"  -l, --list                 öffne Sammlungsfenster für "
+"Befehlszeilenargumente\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                     Diagnoseausgabe einschalten\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              Zeige Versionsnummer\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 Diese Meldung\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"Ungültig oder ignoriert: %s\n"
+"Benutzen Sie --help für Optionen\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Erstelle GQview Ordner:%s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Konnte Ordner nicht anlegen:%s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Pos1"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "Desktop"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - Beenden"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "Über - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Sammlungen wurden verändert.\n"
+"Trotzdem beenden?"
+
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "Sortieren nach Größe"
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "Sortieren nach Datum"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Unsortiert"
+
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "Sortieren nach Pfad"
+
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "Sortieren nach Zahl"
+
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "Sortieren nach Name"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Sortieren"
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "Rotiere 180°"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Sparsam (schlecht, aber schnell)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Kacheln"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilinear"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Hyper (sehr gut, aber langsam)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Keine"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "normal"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Bestes"
+
+#: src/preferences.c:498 src/print.c:365
+#, fuzzy
+msgid "Custom"
+msgstr "automatisch"
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "Filter entfernen"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Die Filter werden auf die Standardeinstellungen zurückgesetzt.\n"
+"Fortfahren?"
+
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "Bearbeitungsbefehle löschen"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Die Bearbeitungsbefehle werden auf die Standardeinstellungen zurückgesetzt.\n"
+"Fortfahren?"
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "Lösche Müll"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr ""
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - Umbenennen"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "Anfangsnr. "
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Ins Heimverzeichnis wechseln"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Aktuelles benutzen"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Größe:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Qualität:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Indexbilder zwischenspeichern"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Indexbilder nach .thumbnails zwischenspeichern"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "xvpics-Indexbilder benutzen, wenn gefunden (nur Lesezugriff)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Diavorführung"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Verzögerung vor Bildwechsel (Sekunden):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Zufall"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Wiederholung"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Vergrößern"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Ditheringmethode:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Zoom in zwei Durchgängen"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Bild wenn nötig auch vergrößern, damit Zoomstufe erreicht werden kann"
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Zoomzunahme:"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Wenn neues Bild ausgewählt wird:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Zu Ausgangsgröße zoomen"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Zoom bei vorheriger Einstellung belassen"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Anhängen"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Schwarzer Hintergrund"
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Fortsetzen"
+
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "Dateiliste bei Änderung aktualisieren"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Nächstes Bild vorladen"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Automatisch nach Exif-Daten rotieren"
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Fenster"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Anfangsnr. "
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Fensterpositionen merken"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Werkzeugstatus merken (schwebend/verborgen)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "Bild in Fenster einpassen wenn Werkzeuge verborgen/schwebend sind"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Größe begrenzen bei automat. Anpassung (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Layout"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filtern"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Einträge anzeigen, die mit einem Punkt beginnen"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "Groß- und Kleinschreibung beim Sortieren beachten"
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Dateifiltern abschalten"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Dateidatum:"
+
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "Filter"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "Standardeinstellungen"
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Bearbeitungsprogramme"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "Nr. "
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Menüname"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "Erweitert"
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "Vollbildmodus"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Bildgröße"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Löschen"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Dateilöschung bestätigen"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Entfernentaste zum Löschen verwenden"
+
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "Papierkorb"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Maximalgröße (MB)"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Ansicht"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Rechteckige Auswahl"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Steige in Baumansicht in Ordner hinunter"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Sofortiges umbenennen"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr ""
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Gleichmäßiges Tastaturrollen"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Mausrad bewegt Bild"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "Selbstdefinierte Ähnlichkeitsschwelle:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Zwischenspeichergröße (MB pro Bild):"
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "Über - GQview"
+
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright (C) %s John Ellis\n"
+"Web: %s\n"
+"E-Mail: %s\n"
+"\n"
+"Freigegeben unter der GNU General Public License"
+
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "Mitwirkende..."
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Keine Auswahl"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+#, fuzzy
+msgid "Default printer"
+msgstr "Standardeinstellungen"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr ""
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Bildgröße"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+#, fuzzy
+msgid "centimeters"
+msgstr "zentimeter"
+
+#: src/print.c:353
+#, fuzzy
+msgid "inches"
+msgstr "Zoll"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+#, fuzzy
+msgid "Portrait"
+msgstr "Hochformat"
+
+#: src/print.c:360
+#, fuzzy
+msgid "Landscape"
+msgstr "Querformat"
+
+#: src/print.c:366
+#, fuzzy
+msgid "Letter"
+msgstr "zentimeter"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, fuzzy, c-format
+msgid "page %d of %d"
+msgstr "Bild %d von %d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "Vorschau"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "Datei %s existiert bereits."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Filter"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Standardeinstellungen"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "Über - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Format"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Ausrichtung"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Beschreibung"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Dateiname:"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Unbenannt"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "ein"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Sortieren"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Bildgröße"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "Blendenöffnung"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+#, fuzzy
+msgid "Right:"
+msgstr "Höhe"
+
+#: src/print.c:3432
+#, fuzzy
+msgid "Top:"
+msgstr "Gruppe:"
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "in:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Filter"
+
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr ""
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Filter:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Dateidatum:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Fensterpositionen merken"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "Fehler beim Speichern der Konfigurationsdatei: %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Ordner:"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Elemente"
+
+#: src/search.c:202
+#, fuzzy
+msgid "results"
+msgstr "Standardeinstellungen"
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Fortsetzen"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+msgid "greater than"
+msgstr ""
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "Datum"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d Dateien (%s, %d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%s, %d Dateien%s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Sortiere..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Bitte wählen Sie einen existierenden Ordner"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Bitte wählen Sie einen existierenden Ordner"
+
+#: src/search.c:2570
+#, fuzzy
+msgid "Image search - GQview"
+msgstr "Bildeigenschaften - GQView"
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Sortiere..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Dateiname:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Dateigröße:"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Zufall"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Dateidatum:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Bildbeschreibung"
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Inhalt hinzufügen"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Ähnlichkeit"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Zufall"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr ""
+"Laden des Indexbildes aus Zwischenspeicher ist fehlgeschlagen, erstelle "
+"neu.\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Kann Historyliste nicht schreiben: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "Neues Lesezeichen"
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "Lesezeichen bearbeiten"
+
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "Pfad:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "Symbol:"
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Keine Auswahl"
+
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "Eigenschaften..."
+
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "Nach _oben"
+
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "Nach _unten"
+
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "Entfe_rnen"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Kann Datei nicht laden:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Kann Datei %s nicht in %s umbenennen."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Kann Datei nicht löschen:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Dateilöschen fehlgeschlagen"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Datei löschen"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Werde Datei löschen:\n"
+" %s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "Umbenennen"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "Lesezeichen hinzufügen"
+
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "_Löschen"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "_Neuer Ordner..."
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Kann Ordner nicht anlegen:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Fehler beim Anlegen des Ordners"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Alle Dateien"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Versteckte anzeigen"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filter:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Wähle alle aus"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "Alle Dateien"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Datei überschreiben"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Datei überschreiben"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Datei überschreiben"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Alle überspringen"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "überspringen"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Fehler beim Verschieben der Datei"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "_Neuer Ordner..."
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Automat. Umbenennen"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Umbenennen"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Zu kopierende Quelle stimmt mit Ziel überein"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Kann Datei nicht kopieren:\n"
+"%s\n"
+"(in sich selbst)."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Zu verschiebende Quelle stimmt mit Ziel überein"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Kann Datei nicht verschieben:\n"
+"%s\n"
+"(in sich selbst)."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Fortsetzen"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Fehler beim Umbenennen von Datei"
+
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Kann Datei nicht kopieren:\n"
+"%s\n"
+"nach:\n"
+"%s\n"
+" - passiert während des verschiebens mehrerer Dateien."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Fehler beim Verschieben der Datei"
+
+#: src/utilops.c:636
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Kann Datei nicht verschieben:\n"
+"%s\n"
+"nach:\n"
+"%s\n"
+" - passiert während Verschieben mehrerer Dateien."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Quelle und Ziel sind gleich"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Quelle und Ziel ist gleich, Vorgang abgebrochen."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Kann Datei nicht kopieren:\n"
+"%s\n"
+"nach:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Kann Datei nicht verschieben:\n"
+"%s\n"
+"nach:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Ungültiges Ziel"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
 msgstr ""
+"Beim Umgang mit mehreren Dateien bitte einen\n"
+" Ordner, keine Datei wählen."
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Bitte wählen Sie einen existierenden Ordner"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Hilfe - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "_Kopieren"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr "Datei umbenennen:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr " Kopiere mehrere Dateien nach:"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Hilfe - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "_Verschieben"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr "Datei umbenennen:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Verschiebe mehrere Dateien nach:"
 
-#: src/utilops.c:432
-#, fuzzy, c-format
-msgid ""
-"Copy multiple files from:\n"
-"%s\n"
-"to:"
-msgstr " mehrere Dateien von:\n"
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Dateiname:"
 
-#: src/utilops.c:436
-msgid "GQview - move"
-msgstr "GQview - Verschieben"
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Quelle und Ziel sind gleich"
 
-#: src/utilops.c:437
-msgid "Move"
-msgstr "Verschieben"
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Löschen fehlgeschlagen"
+
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "Kann vorige Datei nicht aus dem Müll entfernen"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Konnte Ordner nicht anlegen"
 
-#: src/utilops.c:439
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "Zugriff verweigert"
+
+#: src/utilops.c:1212
 #, c-format
 msgid ""
-"Move file:\n"
-"%s\n"
-"to:"
+"Unable to access or create the trash folder.\n"
+"\"%s\""
 msgstr ""
+"Kann nicht auf Müll-Ordner zugreifen.\n"
+"\"%s\""
 
-#: src/utilops.c:441
-#, fuzzy, c-format
-msgid ""
-"Move multiple files from:\n"
-"%s\n"
-"to:"
-msgstr " mehrere Dateien von:\n"
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "Bestätigung vor Dateiläschungen abschalten"
 
-#: src/utilops.c:514
-#, fuzzy, c-format
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "Papierkorb: %s"
+
+#: src/utilops.c:1276
+#, c-format
 msgid ""
 "Unable to delete file:\n"
 " %s\n"
 " Continue multiple delete operation?"
 msgstr ""
-"\n"
-"Mehrfaches Löschen fortsetzen?"
-
-#: src/utilops.c:515 src/utilops.c:521
-msgid "Delete failed"
-msgstr "Löschen fehlgeschlagen"
-
-#: src/utilops.c:520 src/utilops.c:565
-#, fuzzy, c-format
-msgid ""
-"Unable to delete file:\n"
-"%s"
-msgstr "Kann Datei nicht löschen:\n"
+"Kann Datei nich löschen:\n"
+" %s\n"
+" Mit den anderen Dateien fortsetzen?"
 
-#: src/utilops.c:550
-msgid "Delete files"
-msgstr "Dateien löschen"
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr "Datei %d von %d"
 
-#: src/utilops.c:550
-msgid "About to delete multiple files..."
-msgstr "Werde mehrere Dateien löschen..."
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Dateien löschen"
 
-#: src/utilops.c:551 src/utilops.c:596
-msgid "Delete"
-msgstr "Löschen"
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Mehrere Dateien umbenennen:"
 
-#: src/utilops.c:566
-msgid "File deletion failed"
-msgstr "Dateilöschen fehlgeschlagen"
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "%d Dateien ansehen"
 
-#: src/utilops.c:594
-#, fuzzy, c-format
-msgid ""
-"About to delete the file:\n"
-" %s"
-msgstr "Werde Datei löschen:\n"
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Datei löschen"
 
-#: src/utilops.c:595
-msgid "Delete file"
-msgstr "Datei löschen"
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Datei löschen"
 
-#: src/utilops.c:650 src/utilops.c:834
-#, fuzzy, c-format
-msgid ""
-"Overwrite file:\n"
-"%s\n"
-"by renaming:\n"
-"%s"
-msgstr "Datei überschreiben:\n"
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
 
-#: src/utilops.c:663
-#, fuzzy, c-format
+#: src/utilops.c:1661
+#, c-format
 msgid ""
 "Unable to rename file:\n"
 "%s\n"
 " to:\n"
 "%s"
-msgstr "Kann Datei nicht umbenennen:\n"
+msgstr ""
+"Kann Datei nicht umbenennen:\n"
+"%s\n"
+" nach:\n"
+"%s"
 
-#: src/utilops.c:664 src/utilops.c:847
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
 msgid "Error renaming file"
 msgstr "Fehler beim Umbenennen von Datei"
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "GQview - rename"
-msgstr "GQview - Umbenennen"
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Kann Auswahl nicht automatisch umbenennen.\n"
+"Es gibt Dateien mit den Namen bereits, die\n"
+"in der sich ergebenden Namenliste auch auftauchen.\n"
+
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"Kann Datei\n"
+"%s\n"
+"nicht umbenennen. Die Nummer ist %d."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Hilfe - GQview"
 
-#: src/utilops.c:754
-msgid "Rename multiple files:"
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
 msgstr "Mehrere Dateien umbenennen:"
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "Rename"
-msgstr "Umbenennen"
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "Originalname"
 
-#: src/utilops.c:790
-msgid "Rename:"
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Originalname"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
 msgstr "Umbenennen:"
 
-#: src/utilops.c:799
-msgid "to:"
-msgstr "in:"
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Textanfang"
 
-#: src/utilops.c:846
-#, fuzzy, c-format
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "Anfangsnr. "
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Textende"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "Auffüllen:"
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
 msgid ""
 "Unable to rename file:\n"
 "%s\n"
 "to:\n"
 "%s"
-msgstr "Kann Datei nicht umbenennen:\n"
+msgstr ""
+"Kann Datei nicht umbenennen:\n"
+"%s\n"
+"nach:\n"
+"%s"
 
-#: src/utilops.c:884
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr "Datei umbenennen:"
+
+#: src/utilops.c:2311
 #, fuzzy, c-format
 msgid ""
-"Rename file:\n"
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Der Ordner:\n"
 "%s\n"
-"to:"
-msgstr "Datei umbenennen:\n"
+"existiert bereits."
 
-#: src/utilops.c:928
-#, fuzzy, c-format
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Ordner"
+
+#: src/utilops.c:2317
+#, c-format
 msgid ""
 "The path:\n"
 "%s\n"
 "already exists as a file."
 msgstr ""
-"\n"
-" existiert bereits als Datei."
+"Dieser Pfad:\n"
+"%s\n"
+"existiert bereits als Datei."
 
-#: src/utilops.c:929
-msgid "Could not create directory"
-msgstr "Konnte Verzeichnis nicht anlegen"
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Hilfe - GQview"
 
-#: src/utilops.c:934
+#: src/utilops.c:2372
 #, fuzzy, c-format
 msgid ""
-"The directory:\n"
+"Create folder in:\n"
 "%s\n"
-"already exists."
+"named:"
 msgstr ""
-"\n"
-" existiert bereits"
+"Ordner anlegen in:\n"
+"%s\n"
+"Name:"
 
-#: src/utilops.c:935
-msgid "Directory exists"
-msgstr "Verzeichnis existiert"
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "Neuer Ordner"
 
-#: src/utilops.c:942
-#, fuzzy, c-format
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "Einen Ordner rauf"
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "Diavorführung"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Diavorführung rekursiv"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "Finde Duplikate..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Finde Duplikate rekuriv..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "_Neuer Ordner..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "Baumansicht"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "Auffrischen"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "_Sortieren"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "_Iconansicht"
+
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "Indexbilder anzeigen"
+
+#: src/view_file_list.c:447
+#, c-format
 msgid ""
-"Unable to create directory:\n"
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Ungültiger Dateiname:\n"
 "%s"
-msgstr "Kann Verzeichnis nicht anlegen:\n"
 
-#: src/utilops.c:943
-msgid "Error creating directory"
-msgstr "Fehler beim Anlegen von Verzeichnis"
+#~ msgid "Purge thumbnails"
+#~ msgstr "Entferne Indexbilder"
 
-#: src/utilops.c:982
-#, fuzzy, c-format
-msgid ""
-"Create directory in:\n"
-"%s\n"
-"named:"
-msgstr "Verzeichnis anlegen in:\n"
+#~ msgid "/File/tear1"
+#~ msgstr "/_Datei/tear1"
 
-#: src/utilops.c:983
-msgid "GQview - new directory"
-msgstr "GQview - Neues Verzeichnis"
+#~ msgid "/File/_New collection"
+#~ msgstr "/Datei/_Neue Sammlung"
 
-#: src/utilops.c:983
-msgid "Create"
-msgstr "Erzeugen"
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Datei/Ö_ffne Sammlung..."
 
-#: src/window.c:151
-msgid "GQview Tools"
-msgstr "GQview-Werkzeuge"
+#~ msgid "/File/sep1"
+#~ msgstr "/Datei/sep1"
 
 #, fuzzy
-#~ msgid ""
-#~ "Overwrite file:\n"
-#~ "%s\n"
-#~ "with:\n"
-#~ "%s"
-#~ msgstr "Datei überschreiben:\n"
+#~ msgid "/File/_Search..."
+#~ msgstr "/Datei/_Umbenennen.."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Datei/Finde _Duplikate..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Datei/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Datei/_Umbenennen.."
+
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Datei/Ordner anlegen..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Datei/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Datei/_Kopieren..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Datei/Verschieben..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Datei/_Umbenennen.."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Datei/_Löschen..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Datei/sep4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/Datei/Fenster sch_ließen"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Datei/B_eenden"
+
+#~ msgid "/_Edit"
+#~ msgstr "/_Bearbeiten"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Bearbeiten/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Bearbeiten/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Bearbeiten/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Bearbeiten/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Bearbeiten/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Bearbeiten/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Bearbeiten/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Bearbeiten/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Bearbeiten/editor8"
+
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Bearbeiten/editor9"
+
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Bearbeiten/editor0"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Bearbeiten/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Bearbeiten/_Justieren"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Bearbeiten/_Eigenschaften..."
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Bearbeiten/Justieren/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Bearbeiten/Justieren/_Rotiere im Uhrzeigersinn"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Bearbeiten/Justieren/R_otiere entgegen dem Uhrzeigersinn"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Bearbeiten/Justieren/Rotiere 1_80"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Bearbeiten/Justieren/_Spiegeln"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Bearbeiten/Justieren/_Wasserspiegelung"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Bearbeiten/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Bearbeiten/Alle auswählen"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Bearbeiten/_Keine Auswahl"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Bearbeiten/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Bearbeiten/_Einstellungen..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Bearbeiten/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Bearbeiten/Als _Hintergrundbild verwenden"
+
+#~ msgid "/_View"
+#~ msgstr "/_Ansicht"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Ansicht/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Ansicht/Vergrößern"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Ansicht/Verkleinern"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Ansicht/Originalgröße"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Ansicht/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Ansicht/Indexbilder"
+
+#~ msgid "/View/I_cons"
+#~ msgstr "/Ansicht/I_cons"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Ansicht/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Ansicht/V_ollbild"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Ansicht/sep3"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Ansicht/Dateiliste verbergen"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/Ansicht/sep4"
+
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Ansicht/Sortierleiste"
+
+#~ msgid "/View/sep5"
+#~ msgstr "/Ansicht/sep5"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Ansicht/Diavorführung an - aus"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Ansicht/Listen auffr_ischen"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Hilfe/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Hilfe/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "GQview-Konfiguration"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Bearbeiten/_Alte Indexbilder entfernen"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Pfad"
 
 #~ msgid "Save"
 #~ msgstr "Speichern"
 
-#~ msgid "Save settings on exit"
-#~ msgstr "Einstellungen beim Beenden speichern"
+#~ msgid "Close"
+#~ msgstr "Schließen"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Sammlungsdatei überschreiben:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "Sammlung speichern unter..."
+
+#~ msgid "Open collection from:"
+#~ msgstr "Öffne Sammlung von:"
+
+#~ msgid "Open"
+#~ msgstr "Öffne"
+
+#~ msgid "Append collection from:"
+#~ msgstr "Füge Sammlung an von:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Beenden"
+
+#~ msgid "Exit"
+#~ msgstr "Beenden"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Ungültiger Dateiname"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Beim Start in diesen Ordner wechseln:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Zoom (Skalierung)"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Platziere Dialoge unter Maus"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Dateien dieses Typ einschließen:"
+
+#~ msgid "Remove"
+#~ msgstr "Entfernen"
 
-#~ msgid "Save options"
-#~ msgstr "Optionen speichern..."
+#~ msgid "Add"
+#~ msgstr "Hinzufügen"
 
-#~ msgid "copy"
-#~ msgstr "Kopieren"
+#~ msgid "Command Line"
+#~ msgstr "Kommandozeile"
 
-#~ msgid "move"
-#~ msgstr "Verschieben"
+#~ msgid "Help"
+#~ msgstr "Hilfe"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "Vollbildmodus"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Dateigröße:"
+
+#, fuzzy
+#~ msgid "Width:"
+#~ msgstr "Breite"
+
+#, fuzzy
+#~ msgid "Height:"
+#~ msgstr "Höhe"
 
 #~ msgid ""
-#~ "\n"
+#~ "Overwrite file:\n"
+#~ " %s\n"
 #~ " with:\n"
+#~ " %s"
 #~ msgstr ""
-#~ "\n"
+#~ "Datei überschreiben:\n"
+#~ " %s\n"
 #~ " mit:\n"
+#~ " %s"
 
-#~ msgid "Error "
-#~ msgstr "Fehler "
-
-#~ msgid "ing file"
-#~ msgstr "von Datei"
+#~ msgid "Yes"
+#~ msgstr "Ja"
 
-#~ msgid "Unable to "
-#~ msgstr "Kann nicht "
-
-#~ msgid " file:\n"
-#~ msgstr " Datei:\n"
+#~ msgid "Yes to all"
+#~ msgstr "Ja zu allen"
 
 #~ msgid ""
-#~ "\n"
-#~ " to:\n"
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
 #~ msgstr ""
-#~ "\n"
-#~ " nach:\n"
+#~ "Datei überschreiben:\n"
+#~ "%s\n"
+#~ " mit:\n"
+#~ "%s"
 
 #~ msgid ""
-#~ "\n"
+#~ "Copy file:\n"
+#~ "%s\n"
 #~ "to:"
 #~ msgstr ""
-#~ "\n"
+#~ "Kopiere Datei:\n"
+#~ "%s\n"
 #~ "nach:"
 
 #~ msgid ""
-#~ "\n"
-#~ " by renaming:\n"
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
 #~ msgstr ""
-#~ "\n"
-#~ " beim Umbenennen:\n"
+#~ "Verschiebe Datei:\n"
+#~ "%s\n"
+#~ "nach:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Lösche mehrere Dateien..."
 
 #~ msgid ""
-#~ "\n"
-#~ " to:"
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
 #~ msgstr ""
-#~ "\n"
-#~ " in:"
+#~ "Datei überschreiben:\n"
+#~ "%s\n"
+#~ "durch Umbenennen von:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "in:"
+
+#~ msgid "Create"
+#~ msgstr "Erzeugen"
 
-#~ msgid "The path:\n"
-#~ msgstr "Der Pfad:\n"
+#~ msgid "Initial directory"
+#~ msgstr "Anfängsverzeichnis"
 
-#~ msgid "The directory:\n"
-#~ msgstr "Das Verzeichnis:\n"
+#~ msgid "New Directory"
+#~ msgstr "Neuer Ordner"
 
 #~ msgid ""
-#~ "\n"
-#~ " named:"
+#~ "Unable to create directory:\n"
+#~ "%s"
 #~ msgstr ""
-#~ "\n"
-#~ " genannt:"
+#~ "Kann Ordner nicht anlegen:\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "Fehler beim Anlegen des Ordners"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "Bildbeschreibung"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/Ansicht/Diavorführung an - aus"
+
+#~ msgid "Add contents"
+#~ msgstr "Inhalt hinzufügen"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "Inhalt rekursiv hinzufügen"
+
+#~ msgid "Skip directories"
+#~ msgstr "Ordner überspringen"
+
+#~ msgid "Invalid directory"
+#~ msgstr "Ungültiger Ordner"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - Kopieren"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - Verschieben"
+
+#~ msgid "Directory exists"
+#~ msgstr "Ordner existiert"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - Neuer Ordner"
+
+#~ msgid "Misc."
+#~ msgstr "Verschiedenes"
index c690207..48199ab 100644 (file)
--- a/po/es.po
+++ b/po/es.po
-# GQview es.po file
-# (Mensajes de GQview en español)
+# Spanish messages for GQview
 # Copyright (C) 2000 Rodrigo Sancho Senosiain
+# Copyright (C) 2003, 2004, 2005 Ariel Fermani
 # Rodrigo Sancho Senosiain <ruy_ikari@bigfoot.com>, 2000.
+# Ariel Fermani <the_end@bbs.frc.utn.edu.ar>, 2003, 2004, 2005.
 #
+msgid ""
+msgstr ""
+"Project-Id-Version: GQview 1.5.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2005-01-17 00:37-0300\n"
+"Last-Translator: Ariel Fermani <the_end@bbs.frc.utn.edu.ar>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr "Favorito"
+
+#: src/bar_info.c:31
+msgid "Todo"
+msgstr "Hacer"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr "Gente"
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr "Lugares"
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr "Arte"
+
+#: src/bar_info.c:35
+msgid "Nature"
+msgstr "Naturaleza"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr "Bienes"
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr "Preajustes de palabras clave"
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr "Lista de palabras clave favoritas"
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr "Palabras clave"
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Nombre del archivo:"
+
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Fecha del archivo:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr "Palabras clave:"
+
+#: src/bar_info.c:1095
+msgid "Comment:"
+msgstr "Comentario:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr "Editar lista de palabras clave favoritas"
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr "Añadir palabras clave a los archivos seleccionados"
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+"Añadir palabras clave a los archivos seleccionados reemplazando las ya "
+"existentes"
+
+#: src/bar_info.c:1130
+msgid "Save comment now"
+msgstr "Guardar comentario ahora"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "Etiqueta"
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Nombre"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "Valor"
+
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "Formato"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "Elementos"
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "Descripción"
+
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "Exif"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "Vista avanzada"
+
+#: src/bar_sort.c:218
+msgid "Unlink failed"
+msgstr "Falló el desenlazado"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr "Falló el enlazado"
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"La carpeta:\n"
+"%s\n"
+"ya existe."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Colección vacía"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Fallo al guardar la colección:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Fallo al guardar"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "Añadir marcador"
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Colecciones"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "Nombre:"
+
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "Clasificador"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "Carpetas"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Colecciones"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Copiar"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Mover"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr "Enlazar"
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d imágenes"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Selección"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "Deshacer última imagen"
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "listo"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Leyendo datos de similitud..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Borrando miniaturas..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Purgando miniaturas viejas..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+msgid "Invalid folder"
+msgstr "Carpeta no válida"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr "La carpeta especificada no se puede encontrar."
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+msgid "Create thumbnails"
+msgstr "Crear miniaturas"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+msgid "S_tart"
+msgstr "_Iniciar"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "Carpeta:"
+
+#: src/cache_maint.c:845
+msgid "Select folder"
+msgstr "Seleccionar carpeta"
+
+#: src/cache_maint.c:849
+msgid "Include subfolders"
+msgstr "Incluir subcarpetas"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr "Almacenar miniaturas donde se encuentran las imágenes de origen"
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr "haga clic en Iniciar para comenzar"
+
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "ejecutándose..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Borrando miniaturas..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Borrar caché"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Esto borrará todas las miniaturas que\n"
+"fueron guardadas en el disco; ¿continuar?"
+
+#: src/cache_maint.c:1163
+msgid "Cache Maintenance - GQview"
+msgstr "Mantenimiento de caché - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr "Mantenimiento de caché y datos"
+
+#: src/cache_maint.c:1177
+msgid "GQview thumbnail cache"
+msgstr "Caché de miniaturas de GQview"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+msgid "Location:"
+msgstr "Ubicación:"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+msgid "Clean up"
+msgstr "Limpiar"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr "Borrar miniaturas huérfanas o desactualizadas."
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+msgid "Delete all cached thumbnails."
+msgstr "Borrar todo el caché de miniaturas."
+
+#: src/cache_maint.c:1197
+msgid "Shared thumbnail cache"
+msgstr "Caché de miniaturas compartido"
+
+#: src/cache_maint.c:1220
+msgid "Render"
+msgstr "Renderizar"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr "Renderizar miniaturas para una carpeta específica."
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+#, fuzzy
+msgid "Remove orphaned keywords and comments."
+msgstr "Borrar miniaturas huérfanas o desactualizadas."
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Sin_nombre"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Sin_nombre (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - Colección GQview"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Cerrar colección"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"La colección ha sido modificada.\n"
+"¿Guardar primero?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr "_Desechar"
+
+#: src/collect-dlg.c:58
+#, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Ruta especificada:\n"
+"%s\n"
+"es una carpeta, las colecciones son archivos"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Nombre de archivo no válido"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Sobreescribir archivo"
+
+#: src/collect-dlg.c:73
+msgid "Overwrite existing file?"
+msgstr "¿Sobreescribir archivo existente?"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+msgid "_Overwrite"
+msgstr "_Sobreescribir"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Guardar colección"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Abrir colección"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Añadir colección"
+
+#: src/collect-dlg.c:185
+msgid "_Append"
+msgstr "_Añadir"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Archivos de colección"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Colección vacía"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "La colección actual está vacía. Operación de guardar abortada."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Vacía"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d imágenes (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d imágenes"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Cargando miniaturas..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "_Ver"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "Ver en una ventana _nueva"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "_Quitar"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Añadir desde lista de archivos"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Añadir desde colección..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Seleccionar todo"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Seleccionar nada"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "_Propiedades"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "_Copiar..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "_Mover..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "_Renombrar..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "_Borrar..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "M_ostrar nombres de archivos"
+
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "_Guardar colección"
+
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "G_uardar colección como..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "Buscar _duplicados..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+msgid "Print..."
+msgstr "Imprimir..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+msgid "Dropped list includes folders."
+msgstr "La lista soltada incluye carpetas"
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "_Añadir contenido"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "Añadir contenido _recursivamente"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+msgid "_Skip folders"
+msgstr "_Ignorar carpetas"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Arrastre y suelte archivos para compararlos."
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d archivos"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d aciertos encontrados en %d archivos"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[conjunto 1]"
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Leyendo sumas de verificación..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Leyendo dimensiones..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Leyendo datos de similitud..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Comparando..."
+
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "Ordenando..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "Seleccionar duplicados del grupo _1"
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "Seleccionar duplicados del grupo _2"
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Añadir a nueva colección"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "_Vaciar"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "_Cerrar ventana"
+
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "%d archivos (conjunto 2)"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Tamaño"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Fecha"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Dimensiones"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Suma de verificación"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Ruta"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Similitud (alta)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Similitud"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Similitud (baja)"
+
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Similitud (personalizada)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Buscar duplicados - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Comparar con:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Comparar por:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Miniaturas"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Comparar dos conjuntos de archivos"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "El Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "Rotar JPEG (sentido horario)"
+
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "Rotar JPEG (sentido antihorario)"
+
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "deteniendo..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "Resultados del comando de edición"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "Salida de %s"
+
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Fallo al ejecutar comando:\n"
+"%s\n"
+
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "detenido por el usuario"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "desconocido -da"
+
+#: src/exif.c:113
+msgid "top left"
+msgstr "izquierda superior"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "derecha superior"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "derecha inferior"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "izquierda inferior"
+
+#: src/exif.c:117
+msgid "left top"
+msgstr "superior izquierda"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "superior derecha"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "inferior derecha"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "inferior izquierda"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "pulgada"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "centímetro"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "promedio"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "ponderado al centro"
+
+#: src/exif.c:142
+msgid "spot"
+msgstr "luz direccional"
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr "luz multidireccional"
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr "multisegmento"
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "parcial"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "otro"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "no definido"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "manual"
+
+#: src/exif.c:153
+msgid "normal"
+msgstr "normal"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "apertura"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "obturador"
+
+#: src/exif.c:156
+msgid "creative"
+msgstr "creativo"
+
+#: src/exif.c:157
+msgid "action"
+msgstr "acción"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "retrato"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "paisaje"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "luz de día"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "fluorescente"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "tungsteno (incandescente)"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "flash"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "no"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "sí"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr "sí, no detectado"
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr "sí, detectado"
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "Descripción de la imagen"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "Orientación"
+
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "Copyright"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "Programa de exposición"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "Sensibilidad ISO"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "Fecha del original"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "Fecha de la digitalización"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "Velocidad de exposición"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "Apertura"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "Margen de exposición"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "Distancia al sujeto"
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "Modo de medición"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "Fuente de luz"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "Flash"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "Longitud focal"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "Ancho"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "Alto"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "Cámara"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "Resolución"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "infinito"
+
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "modo:"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "activado"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "desactivado"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "auto"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr "no detectado"
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr "detectado"
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "reducción de ojos rojos"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "puntos"
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d bytes"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f KB"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview a pantalla completa"
+
+#: src/fullscreen.c:397
+msgid "Full size"
+msgstr "de tamaño natural"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr "Monitor"
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr "Pantalla"
+
+#: src/fullscreen.c:644
+msgid "Stay above other windows"
+msgstr "Mantener encima de otras ventanas"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr "Pantalla activa"
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr "Monitor activo"
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "_Zoom acercar"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "Z_oom alejar"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "Zoom _1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "A_justar imagen a la ventana"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "_Establecer como fondo de escritorio"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "_Detener diapositivas"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "Contin_uar diapositivas"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "Pa_usar diapositivas"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "_Iniciar diapositivas"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "_Salir de pantalla completa"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "Pan_talla completa"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "Cerrar _ventana"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "Tamaño del archivo:"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Dimensiones:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Transparencia:"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Tamaño de la imagen:"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Ratio de compresión:"
+
+#: src/info.c:368
+msgid "File type:"
+msgstr "Tipo de archivo:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Dueño:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Grupo:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "General"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "Imagen %d de %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Propiedades de la imagen - GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Ascendente"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Diapositivas"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Pausado"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d archivos (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d archivos%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d archivos%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(sin permiso de lectura) %s bytes"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s bytes"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s bytes"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "Herramientas GQView"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Herramientas"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "Archivos"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Imagen"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(arrastre para cambiar el orden)"
+
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "Esconder _lista de archivos"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "en %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "en (desconocido)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Vacía"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Archivo"
+
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "_Editar"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "_Ajustar"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/A_yuda"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Archivo/_Nueva ventana"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "_Guardar colección"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Abrir colección"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Archivo/Abrir r_eciente"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Buscando..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "Imprimir..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "N_ueva carpeta..."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "salir"
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "_Rotar en sentido horario"
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "Rotar en sentido _antihorario"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Rotar _180°"
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "Reflejar _horizontalmente"
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "Reflejar _verticalmente"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Seleccionar todo"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Seleccionar nada"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "_Propiedades..."
+
+#: src/layout_util.c:788
+#, fuzzy
+msgid "_Thumbnail maintenance..."
+msgstr "/Editar/_Mantenimiento de miniaturas..."
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Ver/Zoom a_justado"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "Pantalla completa"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Esconder _lista de archivos"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "conmutar diapositivas"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "_Actualizar"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Ayuda/_Contenidos..."
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Ayuda/Atajos de _teclado"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Ayuda/Notas de esta _versión"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Ayuda/_Acerca de..."
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Miniaturas"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Ver/Ár_bol"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Ver/_Lista de archivos flotante"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Ver/Esconder _barra de herramientas"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "Palabras clave"
+
+#: src/layout_util.c:812
 #, fuzzy
+msgid "E_xif data"
+msgstr "/Ver/Datos E_xif"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Clasificador"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Ver/Lis_ta"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Ícono:"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Mostrar miniaturas"
+
+#: src/layout_util.c:1085
+msgid "Change to home folder"
+msgstr "Cambiar a la carpeta de inicio"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Actualizar lista de archivos"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Zoom acercar"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Zoom alejar"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Ajustar imagen a la ventana"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Poner zoom a 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Configurar opciones"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Controles flotantes"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Ayuda - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Línea de comandos"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+msgid "next image"
+msgstr "siguiente imagen"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr "anterior imagen"
+
+#: src/main.c:529
+msgid "first image"
+msgstr "primera imagen"
+
+#: src/main.c:530
+msgid "last image"
+msgstr "última imagen"
+
+#: src/main.c:531
+msgid "toggle full screen"
+msgstr "conmutar pantalla completa"
+
+#: src/main.c:532
+msgid "start full screen"
+msgstr "iniciar pantalla completa"
+
+#: src/main.c:533
+msgid "stop full screen"
+msgstr "detener pantalla completa"
+
+#: src/main.c:534
+msgid "toggle slide show"
+msgstr "conmutar diapositivas"
+
+#: src/main.c:535
+msgid "start slide show"
+msgstr "iniciar diapositivas"
+
+#: src/main.c:536
+msgid "stop slide show"
+msgstr "detener diapositivas"
+
+#: src/main.c:537
+msgid "start recursive slide show"
+msgstr "iniciar diapositivas en forma recursiva"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr "establecer tiempo entre diapositivas (en segundos)"
+
+#: src/main.c:539
+msgid "show tools"
+msgstr "mostrar herramientas"
+
+#: src/main.c:540
+msgid "hide tools"
+msgstr "esconder herramientas"
+
+#: src/main.c:541
+msgid "quit"
+msgstr "salir"
+
+#: src/main.c:542
+msgid "open file"
+msgstr "abrir archivo"
+
+#: src/main.c:543
+msgid "open file in new window"
+msgstr "abrir archivo en una ventana nueva"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr "Lista de comandos remotos:\n"
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr "GQview remoto no está ejecutándose; iniciando..."
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr "GQview remoto no está disponible\n"
+
+#: src/main.c:944
 msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
 msgstr ""
-"Project-Id-Version: gqview 0.8.0\n"
-"POT-Creation-Date: 2000-04-13 15:57-0400\n"
-"PO-Revision-Date: 2000-04-08 22:47+0200\n"
-"Last-Translator: Rodrigo Sancho Senosiain <ruy_ikari@bigfoot.com>\n"
-"Language-Team: Yo mismo con mi mecanismo <ruy_ikari@bigfoot.com>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-"Content-Transfer-Encoding: 8bit\n"
+"Uso: gqview [opciones] [ruta]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "Opciones válidas son:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           forzar que se vean las herramientas\n"
 
-#: src/config.c:307
-msgid "GQview configuration"
-msgstr "Configuración de GQview"
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        forzar que se oculten las herramientas\n"
 
-#: src/config.c:319
-msgid "Ok"
-msgstr "Ok"
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           comenzar en modo pantalla completa\n"
 
-#: src/config.c:324
-msgid "Apply"
-msgstr "Aplicar"
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            comenzar en modo diapositivas\n"
 
-#: src/config.c:329 src/utildlg.c:145 src/utilops.c:444 src/utilops.c:754
-#: src/utilops.c:885 src/utilops.c:983
-msgid "Cancel"
-msgstr "Cancelar"
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+"  -l, --list                 abrir ventana de colecciones para la línea de "
+"comandos\n"
 
-#: src/config.c:343
-msgid "General"
-msgstr "General"
+#: src/main.c:951
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+"  -r, --remote               enviar los comandos siguientes a la ventana "
+"abierta\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr "  -rh,--remote-help          mostrar lista de comandos remotos\n"
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    activar mensajes de depuración\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              mostrar información de versión\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 mostrar este mensaje\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"No válido o ignorado: %s\n"
+"Utilice --help para ver las opciones\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Creando directorio GQview: %s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "No se puede crear el directorio: %s\n"
 
-#: src/config.c:351
-msgid "Initial directory"
-msgstr "Directorio inicial"
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Carpeta de inicio"
 
-#: src/config.c:361
-msgid "On startup, change to this directory:"
-msgstr "Al iniciar, cambiar a este directorio:"
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "Escritorio"
 
-#: src/config.c:373
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "Salir - GQview"
+
+#: src/main.c:1156
+msgid "Quit GQview"
+msgstr "Salir de GQview"
+
+#: src/main.c:1156
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Algunas colecciones han sido modificadas.\n"
+"¿Salir de todos modos?"
+
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "Ordenar por tamaño"
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "Ordenar por fecha"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Desordenados"
+
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "Ordenar por ruta"
+
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "Ordenar por número"
+
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "Ordenar por nombre"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Ordenar"
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "Rotar _180°"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Más cercano (el peor, pero el más rápido)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Cuadros"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilineal"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Hiper (el mejor, pero el más lento)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Ninguno"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normal"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "El mejor"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr "Presonalizado"
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "Reiniciar filtros"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Esto reiniciará los filtros de archivos a lo predeterminado.\n"
+"¿Continuar?"
+
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "Reiniciar editores"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Esto reiniciará los comandos de edición a lo predeterminado.\n"
+"¿Continuar?"
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "Borrar basura"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "Esto borrará el contenido de la carpeta de basura."
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview a pantalla completa"
+
+#: src/preferences.c:824
+msgid "Startup"
+msgstr "Inicio"
+
+#: src/preferences.c:826
+msgid "Change to folder:"
+msgstr "Cambiar a la carpeta:"
+
+#: src/preferences.c:837
 msgid "Use current"
-msgstr "Usar el actual"
+msgstr "Utilizar la actual"
 
-#: src/config.c:379
-msgid "Confirm file delete"
-msgstr "Confirmar el borrado de ficheros"
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Tamaño:"
 
-#: src/config.c:381
-msgid "Remember tool state (float/hidden)"
-msgstr "Recordar el estado de las herramientas (flotante/escondida)"
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Calidad:"
 
-#: src/config.c:383
-msgid "Remember window positions"
-msgstr "Recordar las posiciones de las ventanas"
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Caché de miniaturas"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr "Utilizar caché de miniaturas compartido"
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Hacer caché de miniaturas en .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Utilizar miniaturas xvpics si se encuentran (sólo lectura)"
 
-#: src/config.c:385
+#: src/preferences.c:864
 msgid "Slide show"
-msgstr "Pase de diapositivas"
+msgstr "Diapositivas"
+
+#: src/preferences.c:867
+msgid "Delay between image change:"
+msgstr "Espera entre cambio de imagen:"
 
-#: src/config.c:398
-msgid "Delay before image change (seconds):"
-msgstr "Espera antes del cambio de imagen (en segundos):"
+#: src/preferences.c:867
+msgid "seconds"
+msgstr "segundos"
 
-#: src/config.c:411
+#: src/preferences.c:873
 msgid "Random"
-msgstr "Aleatorio"
+msgstr "Aleatorias"
 
-#: src/config.c:413
+#: src/preferences.c:874
 msgid "Repeat"
-msgstr "Repetir"
+msgstr "Repetitivas"
 
-#: src/config.c:420
-msgid "Image"
-msgstr "Imagen"
+#: src/preferences.c:884
+msgid "Zoom"
+msgstr "Zoom"
 
-#: src/config.c:428
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Método de entramado:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Zoom de doble pasada"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Permitir agrandar la imagen para ajustarla a la ventana"
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Incremento del zoom:"
+
+#: src/preferences.c:904
 msgid "When new image is selected:"
 msgstr "Cuando se selecciona una nueva imagen:"
 
-#: src/config.c:438
+#: src/preferences.c:907
 msgid "Zoom to original size"
-msgstr "Hacer zoom al tamaño original"
+msgstr "Hacer zoom al tamaño original"
 
-#: src/config.c:444 src/img-view.c:306 src/menu.c:473 src/menu.c:547
-#: src/menu.c:587 src/menu.c:678
-msgid "Fit image to window"
-msgstr "Ajustar imagen a la ventana"
-
-#: src/config.c:450
+#: src/preferences.c:913
 msgid "Leave Zoom at previous setting"
-msgstr "Dejar el zoom en la configuración anterior"
+msgstr "Dejar el zoom en la configuración anterior"
 
-#: src/config.c:457
-msgid "Fit window to image when tools are hidden/floating"
-msgstr ""
-"Ajustar ventana a la imagen cuando las herramientas están escondidas o "
-"flotando"
+#: src/preferences.c:917
+msgid "Appearance"
+msgstr "Apariencia"
 
-#: src/config.c:464
-msgid "Limit size when auto-sizing window"
-msgstr "Tamaño límite cuando se redimensione la ventana"
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Fondo negro"
 
-#: src/config.c:474 src/menu.c:477
-msgid "Thumbnails"
-msgstr "Mini-imágenes"
+#: src/preferences.c:922
+msgid "Convenience"
+msgstr "Conveniencia"
 
-#: src/config.c:490
-msgid "Size:"
-msgstr "Tamaño:"
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "Actualizar cuando se cambian archivos"
 
-#: src/config.c:519
-msgid "Cache thumbnails"
-msgstr "Cache de mini-imágenes"
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Precargar siguiente imagen"
 
-#: src/config.c:521
-msgid "Use xvpics thumbnails when found (read only)"
-msgstr "Usar mini-imágenes xvpics si se encuentran (sólo lectura) "
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Rotación automática de la imagen utilizando la información Exif"
 
-#: src/config.c:524
-msgid "Progressive keyboard scrolling"
-msgstr "Desplazamiento progresivo con el teclado"
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Ventanas"
 
-#: src/config.c:526
-msgid "Mouse wheel scrolls image"
+#: src/preferences.c:940
+msgid "State"
+msgstr "Estado"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Recordar las posiciones de las ventanas"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Recordar el estado de las herramientas (flotantes/escondidas)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
 msgstr ""
+"Ajustar ventana a la imagen cuando las herramientas están escondidas o "
+"flotando"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Tamaño límite cuando se auto-redimensione la ventana (%):"
 
-#: src/config.c:533
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Disposición"
+
+#: src/preferences.c:973
 msgid "Filtering"
 msgstr "Filtrado"
 
-#: src/config.c:542
+#: src/preferences.c:978
 msgid "Show entries that begin with a dot"
 msgstr "Mostrar entradas que comiencen con un punto"
 
-#: src/config.c:544
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "Ordenar teniendo en cuenta mayúsculas y minúsculas"
+
+#: src/preferences.c:983
 msgid "Disable File Filtering"
-msgstr "Desactivar filtrado de ficheros"
+msgstr "Desactivar filtrado de archivos"
 
-#: src/config.c:546
-msgid "Include files of type:"
-msgstr "Incluir ficheros de tipo:"
+#: src/preferences.c:986
+msgid "File types"
+msgstr "Tipos de archivo"
 
-#: src/config.c:596
-msgid "Custom file types:"
-msgstr "Personalizar tipos de ficheros:"
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "Filtro"
 
-#: src/config.c:609
-msgid "format: [.foo;.bar]"
-msgstr "formato: [.pepe;.fulanito]"
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "Predeterminados"
 
-#: src/config.c:618
-msgid "External Editors"
-msgstr "Editores externos"
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Editores"
 
-#: src/config.c:630
+#: src/preferences.c:1072
 msgid "#"
-msgstr ""
+msgstr ""
 
-#: src/config.c:633
+#: src/preferences.c:1075
 msgid "Menu name"
-msgstr "Nombre en el menú"
+msgstr "Nombre en el menú"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "Avanzado"
+
+#: src/preferences.c:1138
+msgid "Full screen"
+msgstr "Pantalla completa"
+
+#: src/preferences.c:1146
+msgid "Smooth image flip"
+msgstr "Transición de imágenes suave"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr "Deshabilitar salvapantalla"
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Borrar"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Confirmar el borrado de archivos"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Activar tecla Suprimir"
+
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "Borrado seguro"
+
+#: src/preferences.c:1176
+msgid "Maximum size:"
+msgstr "Tamaño máximo:"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr "MB"
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Ver"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr "Comportamiento"
 
-#: src/config.c:636
-msgid "Command Line"
-msgstr "Línea de órdenes"
+#: src/preferences.c:1191
+msgid "Rectangular selection in icon view"
+msgstr "Selección rectangular en vista de íconos"
 
-#: src/config.c:666 src/menu.c:500
-msgid "About"
-msgstr "Acerca de"
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Descender carpetas en vista de árbol"
 
-#: src/config.c:682
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Renombrar in situ"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr "Navegación"
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Desplazamiento progresivo con el teclado"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Utilizar ratón con rueda para desplazar la imagen"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr "Misceláneos"
+
+#: src/preferences.c:1209
+#, fuzzy
+msgid "Store keywords and comments local to source images"
+msgstr "Almacenar miniaturas donde se encuentran las imágenes de origen"
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "Umbral de similitud personalizado:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Tamaño de caché no visible (MB por imagen):"
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "Acerca de... - GQview"
+
+#: src/preferences.c:1304
 #, c-format
 msgid ""
 "GQview %s\n"
 "\n"
-"Copyright (c) 2000 by John Ellis\n"
-"http://gqview.sorceforge.net\n"
-"or http://gqview.netpedia.net\n"
-"gqview@email.com\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
 "\n"
-"Released under the GNU Public License"
+"Released under the GNU General Public License"
 msgstr ""
 "GQview %s\n"
 "\n"
-"Copyright (c) 2000 por John Ellis\n"
-"http://gqview.sorceforge.net\n"
-"o http://gqview.netpedia.net\n"
-"gqview@email.com\n"
+"Copyright (c) %s John Ellis\n"
+"Sitio web: %s\n"
+"E-mail: %s\n"
 "\n"
-"Lanzado bajo la Licencia Pública GNU"
+"Publicado bajo la Licencia Pública General GNU"
 
-#: src/filelist.c:51
-msgid " Slideshow"
-msgstr " Pase de diapositivas"
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "Créditos..."
+
+#: src/print.c:111
+msgid "Selection"
+msgstr "Selección"
+
+#: src/print.c:112
+msgid "All"
+msgstr "Todo"
 
-#: src/filelist.c:55
+#: src/print.c:123
+msgid "One image per page"
+msgstr "Una imagen por página"
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr "Hoja de prueba"
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr "Impresora predeterminada"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr "Impresora personalizada"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr "Archivo PostScript"
+
+#: src/print.c:140
+msgid "Image file"
+msgstr "Archivo de imagen"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr "jpeg, baja calidad"
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr "jpeg, calidad normal"
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr "jpeg, alta calidad"
+
+#: src/print.c:350 src/print.c:3201
+msgid "points"
+msgstr "puntos"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr "milímetros"
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr "centímetros"
+
+#: src/print.c:353
+msgid "inches"
+msgstr "pulgadas"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr "Retrato"
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr "Paisaje"
+
+#: src/print.c:366
+msgid "Letter"
+msgstr "Carta"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr "Legal"
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr "Ejecutivo"
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr "Sobre Nº 10"
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr "Sobre Nº 9"
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr "Sobre C4"
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr "Sobre C5"
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr "Sobre C6"
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr "Foto 6x4"
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr "Foto 8x10"
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr "Tarjeta postal"
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr "Tabloide"
+
+#: src/print.c:544
 #, c-format
-msgid "%d files (%d)%s"
-msgstr "%d ficheros (%d)%s"
+msgid "page %d of %d"
+msgstr "Página %d de %d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "Vista previa"
 
-#: src/filelist.c:57
+#: src/print.c:1044
 #, c-format
-msgid "%d files%s"
-msgstr "%d fichero%s"
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
 
-#: src/filelist.c:1025
-msgid "Loading thumbs..."
-msgstr "Cargando mini-imágenes..."
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "Ya existe un archivo con el nombre %s."
 
-#: src/image.c:66
+#: src/print.c:1074 src/print.c:1543
 #, c-format
-msgid "( ? x ? ) %d bytes"
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
 msgstr ""
 
-#: src/image.c:68
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr "Página %d"
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Impresora"
+
+#: src/print.c:1990
 #, c-format
-msgid "( %d x %d ) %d bytes"
+msgid "An error occured printing to %s."
 msgstr ""
 
-#: src/img-main.c:247
-msgid "GQview full screen"
-msgstr "GQview a pantalla completa"
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Predeterminados"
 
-#: src/img-view.c:303 src/menu.c:470 src/menu.c:544 src/menu.c:584
-#: src/menu.c:674
-msgid "Zoom in"
-msgstr "Zoom dentro"
+#: src/print.c:2587 src/print.c:3332
+msgid "Print - GQview"
+msgstr "Imprimir - GQview"
 
-#: src/img-view.c:304 src/menu.c:471 src/menu.c:545 src/menu.c:585
-#: src/menu.c:676
-msgid "Zoom out"
-msgstr "Zoom fuera"
+#: src/print.c:2591
+#, fuzzy, c-format
+msgid "Printing %d pages to %s."
+msgstr "Imprimiendo %d páginas en %s..."
+
+#: src/print.c:2691
+msgid "Format:"
+msgstr "Formato:"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr "Unidades:"
+
+#: src/print.c:2810
+msgid "Orientation:"
+msgstr "Orientación:"
+
+#: src/print.c:2942
+msgid "Destination:"
+msgstr "Destino:"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Nombre del archivo"
+
+#: src/print.c:3079
+msgid "Unlimited"
+msgstr "Sin límite"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr "Mostrar"
+
+#: src/print.c:3199
+msgid "Font"
+msgstr "Fuente"
+
+#: src/print.c:3359
+msgid "Source"
+msgstr "Fuente"
+
+#: src/print.c:3375
+msgid "Proof size:"
+msgstr "Tamaño de la imagen de prueba:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr "Texto"
+
+#: src/print.c:3401
+msgid "Paper"
+msgstr "Papel"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr "Márgenes"
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr "Izquierdo:"
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr "Derecho:"
 
-#: src/img-view.c:305 src/menu.c:472 src/menu.c:546 src/menu.c:586
-msgid "Zoom 1:1"
-msgstr "Zoom 1:1"
+#: src/print.c:3432
+msgid "Top:"
+msgstr "Superior:"
 
-#. edit menu
-#: src/img-view.c:309 src/menu.c:457 src/menu.c:519 src/menu.c:550
-#: src/menu.c:590
-msgid "Edit"
-msgstr "Editar"
+#: src/print.c:3435
+msgid "Bottom:"
+msgstr "Inferior:"
 
-#: src/img-view.c:314 src/menu.c:446 src/menu.c:526 src/menu.c:557
-#: src/menu.c:595
-msgid "Copy..."
-msgstr "Copiar..."
+#: src/print.c:3444
+msgid "Printer"
+msgstr "Impresora"
 
-#: src/img-view.c:315 src/menu.c:447 src/menu.c:527 src/menu.c:558
-#: src/menu.c:596
-msgid "Move..."
-msgstr "Mover..."
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr "Impresora personalizada:"
 
-#: src/img-view.c:316 src/menu.c:448 src/menu.c:528 src/menu.c:559
-#: src/menu.c:597
-msgid "Rename..."
-msgstr "Renombrar..."
+#: src/print.c:3459
+msgid "File:"
+msgstr "Archivo:"
 
-#: src/img-view.c:317 src/menu.c:449 src/menu.c:529 src/menu.c:560
-#: src/menu.c:598
-msgid "Delete..."
-msgstr "Borrar..."
+#: src/print.c:3468
+msgid "File format:"
+msgstr "Formato del archivo:"
 
-#: src/img-view.c:320
-msgid "Close window"
-msgstr "Cerrar ventana"
+#: src/print.c:3473
+msgid "DPI:"
+msgstr "PPP:"
 
-#: src/main.c:90 src/main.c:119
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Recordar las posiciones de las ventanas"
+
+#: src/rcfile.c:185
 #, c-format
-msgid "GQview running: %s\n"
-msgstr ""
+msgid "error saving config file: %s\n"
+msgstr "error al guardar archivo de configuración: %s\n"
 
-#: src/main.c:330
-msgid ""
-"Usage: gqview [options] [path]\n"
-"\n"
-msgstr ""
-"Uso: gqview [opciones] [camino]\n"
-"\n"
+#: src/search.c:200
+msgid "folder"
+msgstr "carpeta"
 
-#: src/main.c:331
-msgid "valid options are:\n"
-msgstr "opciones válidas son:\n"
+#: src/search.c:201
+msgid "comments"
+msgstr "comentarios"
 
-#: src/main.c:332
-msgid "  +t, --with-tools           force show of tools\n"
-msgstr "  +t, --with-tools           forzar que se vean las herramientas\n"
+#: src/search.c:202
+msgid "results"
+msgstr "resultados"
 
-#: src/main.c:333
-msgid "  -t, --without-tools        force hide of tools\n"
-msgstr "  -t, --without-tools        forzar que se oculten las herramientas\n"
+#: src/search.c:206
+msgid "contains"
+msgstr "contiene"
 
-#: src/main.c:334
-msgid "  -f, --fullscreen           start in full screen mode\n"
-msgstr "  -f, --fullscreen           comenzar en modo a pantalla completa\n"
+#: src/search.c:207
+msgid "is"
+msgstr "es"
 
-#: src/main.c:335
-msgid "  -s, --slideshow            start in slideshow mode\n"
-msgstr ""
-"  -s, --slideshow            comenzar en modo de pase de diapositivas\n"
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr "igual a"
 
-#: src/main.c:336
-msgid "  --debug                    turn on debug output\n"
-msgstr "  --debug                    activar mensajes de depuración\n"
+#: src/search.c:212
+msgid "less than"
+msgstr "menor que"
 
-#: src/main.c:337
-msgid ""
-"  -h, --help                 show this message\n"
-"\n"
-msgstr ""
-"  -h, --help                 mostrar este mensaje\n"
-"\n"
+#: src/search.c:213
+msgid "greater than"
+msgstr "mayor que"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr "entre"
+
+#: src/search.c:219
+msgid "before"
+msgstr "antes del"
+
+#: src/search.c:220
+msgid "after"
+msgstr "después del"
+
+#: src/search.c:225
+msgid "match all"
+msgstr "concuerdan con todo"
+
+#: src/search.c:226
+msgid "match any"
+msgstr "concuerdan con cualquiera"
+
+#: src/search.c:227
+msgid "exclude"
+msgstr "no incluyen"
+
+#: src/search.c:277
+#, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d archivos (%s, %d)"
 
-#: src/main.c:342
+#: src/search.c:284
 #, c-format
-msgid ""
-"invalid or ignored: %s\n"
-"Use -help for options\n"
-msgstr ""
-"no válido o ignorado : %s\n"
-"Use -help para ver las opciones\n"
+msgid "%s, %d files"
+msgstr "%s, %d archivos"
 
-#: src/main.c:369
-msgid "The Gimp"
-msgstr "El Gimp"
+#: src/search.c:301
+msgid "Searching..."
+msgstr "Buscando..."
 
-#: src/main.c:372
-msgid "Electric Eyes"
-msgstr "Ojos eléctricos"
+#: src/search.c:2093
+msgid "File not found"
+msgstr "No se encontró el archivo"
 
-#: src/main.c:375
-msgid "XV"
+#: src/search.c:2094
+msgid "Please enter an existing file for image content."
 msgstr ""
+"Por favor, introduzca un archivo existente para el contenido de la imagen."
 
-#: src/main.c:378
-msgid "Xpaint"
-msgstr ""
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr "No se encontró la carpeta"
 
-#: src/menu.c:373
-#, c-format
-msgid "in %s..."
-msgstr "en %s..."
+#: src/search.c:2141
+msgid "Please enter an existing folder to search."
+msgstr "Por favor, introduzca una carpeta existente para buscar."
 
-#: src/menu.c:375
-msgid "in (unknown)..."
-msgstr "en (desconocido)..."
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr "Búsqueda de imagen - GQview"
 
-#: src/menu.c:394
-msgid "Options..."
-msgstr "Opciones..."
+#: src/search.c:2599
+msgid "Search:"
+msgstr "Buscar en:"
 
-#: src/menu.c:396
-msgid "Remove old thumbnails"
-msgstr "Borrar mini-imágenes viejas"
+#: src/search.c:2613
+msgid "Recurse"
+msgstr "Incluir subcarpetas"
 
-#: src/menu.c:398 src/menu.c:410 src/menu.c:422
-msgid "Set as wallpaper"
-msgstr "Poner como imagen de escritorio"
+#: src/search.c:2617
+msgid "File name"
+msgstr "Nombre del archivo"
 
-#. file menu
-#: src/menu.c:440
-msgid "File"
-msgstr "Fichero"
+#: src/search.c:2623
+msgid "Match case"
+msgstr "Distinguir mayúsculas y minúsculas"
 
-#: src/menu.c:444
-msgid "Create Dir..."
-msgstr "Crear directorio..."
+#: src/search.c:2627
+msgid "File size is"
+msgstr "Tamaño del archivo"
 
-#: src/menu.c:451
-msgid "Exit"
-msgstr "Salir"
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+msgid "and"
+msgstr "y"
 
-#. view menu
-#: src/menu.c:466
-msgid "View"
-msgstr "Ver"
+#: src/search.c:2639
+msgid "File date is"
+msgstr "Fecha del archivo"
 
-#: src/menu.c:476 src/menu.c:563
-msgid "Full screen"
-msgstr "Pantalla completa"
+#: src/search.c:2656
+msgid "Image dimensions are"
+msgstr "Dimensiones de la imagen"
 
-#: src/menu.c:485
-msgid "Refresh Lists"
-msgstr "Refrescar listas"
+#: src/search.c:2676
+msgid "Image content is"
+msgstr "Contenido de la imagen"
 
-#: src/menu.c:486
-msgid "(Un)Float file list"
-msgstr "Poner/quitar lista de ficheros como flotante"
+#: src/search.c:2682
+#, no-c-format
+msgid "% similar to"
+msgstr "% similar a"
 
-#: src/menu.c:487 src/menu.c:562
-msgid "(Un)Hide file list"
-msgstr "Esconder/Mostrar lista de ficheros"
+# 'Rank' hace referencia al porcentaje de similitud entre dos imágenes, es
+# decir el 'Grado de similitud', o directamente 'Similitud'.
+#: src/search.c:2751
+msgid "Rank"
+msgstr "Similitud"
 
-#: src/menu.c:490
-msgid "Toggle slideshow"
-msgstr "Conmutar pase de diapositivas"
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "No se pudo cargar miniatura desde el caché; intentando recrearla.\n"
 
-#. help menu
-#: src/menu.c:496
-msgid "Help"
-msgstr "Ayuda"
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "No se pudo escribir listas de historia a: %s\n"
 
-#: src/menu.c:523 src/menu.c:554
-msgid "View in new window"
-msgstr "Ver en una ventana nueva"
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "Nuevo marcador"
 
-#: src/menu.c:531
-msgid "Refresh"
-msgstr "Refrescar"
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "Editar marcador"
 
-#: src/menu.c:601
-msgid "Exit full screen"
-msgstr "Salir de pantalla completa"
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "Ruta:"
 
-#: src/menu.c:661
-msgid "Create thumbnails"
-msgstr "Crear mini-imágenes"
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "Ícono:"
 
-#: src/menu.c:670
-msgid "Change to home directory"
-msgstr "Cambiar al direcorio home"
+#: src/ui_bookmark.c:627
+msgid "Select icon"
+msgstr "Seleccionar ícono"
 
-#: src/menu.c:672
-msgid "Refresh file list"
-msgstr "Refrescar lista de ficheros"
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "_Propiedades..."
 
-#: src/menu.c:680
-msgid "Set zoom 1:1"
-msgstr "Poner zoom a 1:1"
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "_Subir"
 
-#: src/menu.c:682
-msgid "Configure options"
-msgstr "Configurar opciones"
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "_Bajar"
 
-#: src/menu.c:684
-msgid "Float Controls"
-msgstr "Controles flotantes"
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "_Quitar"
 
-#: src/rcfile.c:132
+#: src/ui_help.c:111
 #, c-format
-msgid "error saving config file: %s\n"
-msgstr "error al guardar fichero de configuración: %s\n"
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"No se pudo cargar:\n"
+"%s"
 
-#: src/thumb.c:127 src/thumb.c:151
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
 #, c-format
-msgid "create dir failed: %s\n"
-msgstr "fallo al crear directorio: %s\n"
+msgid "Failed to rename %s to %s."
+msgstr "Fallo al renombrar %s a %s."
 
-#: src/thumb.c:233
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
 #, c-format
-msgid "Unable to delete dir: %s\n"
-msgstr "Incapaz de borrar directorio: %s\n"
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"No se pudo borrar archivo:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Falló el borrado de archivo"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Borrar archivo"
 
-#: src/thumb.c:249
+#: src/ui_pathsel.c:535
 #, c-format
-msgid "failed to delete:%s\n"
-msgstr "fallo al borrar: %s\n"
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"A punto de borrar el archivo:\n"
+"%s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "_Renombrar"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "_Añadir marcador"
 
-#: src/utildlg.c:68
-msgid "     Ok     "
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "_Borrar"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+msgid "New folder"
+msgstr "Nueva carpeta"
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
 msgstr ""
+"No se pudo crear carpeta:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+msgid "Error creating folder"
+msgstr "Error al crear carpeta"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Todos los archivos"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Mostrar ocultos"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filtro:"
+
+#: src/ui_tabcomp.c:840
+msgid "Select path"
+msgstr "Seleccionar ruta"
+
+#: src/ui_tabcomp.c:856
+msgid "All files"
+msgstr "Todos los archivos"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Sobreescribir archivo"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+msgid "Overwrite file?"
+msgstr "¿Sobreescribir archivo?"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr "Reemplazar archivo existente por nuevo archivo."
 
-#: src/utilops.c:166
+#: src/utilops.c:480
+msgid "Overwrite _all"
+msgstr "Sobreescribir _todo"
+
+#: src/utilops.c:482
+msgid "S_kip all"
+msgstr "I_gnorar todos"
+
+#: src/utilops.c:483
+msgid "_Skip"
+msgstr "_Ignorar"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+msgid "Existing file"
+msgstr "Archivo existente"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+msgid "New file"
+msgstr "Nuevo archivo"
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Auto-renombrar"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Renombrar"
+
+#: src/utilops.c:543
 msgid "Source to copy matches destination"
-msgstr "Al intentar copiar, origen y destino son iguales"
+msgstr "Al intentar copiar, origen y destino son iguales."
 
-#: src/utilops.c:167
+#: src/utilops.c:544
 #, c-format
 msgid ""
 "Unable to copy file:\n"
 "%s\n"
 "to itself."
 msgstr ""
-"No puedo copiar fichero:\n"
+"No se pudo copiar archivo:\n"
 "%s\n"
-"a sí mismo."
+"sobre sí mismo."
 
-#: src/utilops.c:171
+#: src/utilops.c:548
 msgid "Source to move matches destination"
-msgstr "Al intentar mover, origen y destino son iguales"
+msgstr "Al intentar mover, origen y destino son iguales."
 
-#: src/utilops.c:172
+#: src/utilops.c:549
 #, c-format
 msgid ""
 "Unable to move file:\n"
 "%s\n"
 "to itself."
 msgstr ""
-"No puedo mover fichero:\n"
+"No se pudo mover archivo:\n"
 "%s\n"
-"a sí mismo."
-
-#: src/utilops.c:175 src/utilops.c:231 src/utilops.c:516
-msgid "Continue"
-msgstr "Continuar"
-
-#: src/utilops.c:182
-#, c-format
-msgid ""
-"Overwrite file:\n"
-" %s\n"
-" with:\b %s"
-msgstr ""
-"Sobreescribir fichero:\n"
-" %s\n"
-" con:\b %s"
+"sobre sí mismo."
 
-#: src/utilops.c:183 src/utilops.c:289 src/utilops.c:651 src/utilops.c:835
-msgid "Overwrite file"
-msgstr "Sobreescribir fichero"
-
-#: src/utilops.c:186
-msgid "Skip"
-msgstr "Saltar"
-
-#: src/utilops.c:187
-msgid "Yes to all"
-msgstr "Sí a todo"
-
-#: src/utilops.c:188
-msgid "Yes"
-msgstr "Sí"
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+msgid "Co_ntinue"
+msgstr "Co_ntinuar"
 
-#: src/utilops.c:222 src/utilops.c:317
+#: src/utilops.c:630 src/utilops.c:850
 msgid "Error copying file"
-msgstr "Error al copiar fichero"
+msgstr "Error al copiar archivo"
 
-#: src/utilops.c:223
+#: src/utilops.c:631
 #, c-format
 msgid ""
 "Unable to copy file:\n"
-"%sto:\n"
 "%s\n"
-" during multiple file copy."
+"to:\n"
+"%s\n"
+"during multiple file copy."
 msgstr ""
-"No pude copiar fichero:\n"
-"%s a:\n"
+"No se pudo copiar archivo:\n"
+"%s\n"
+"a:\n"
 "%s\n"
-" durante la copia de varios ficheros."
+"durante la copia de múltiples archivos."
 
-#: src/utilops.c:227 src/utilops.c:322
+#: src/utilops.c:635 src/utilops.c:855
 msgid "Error moving file"
-msgstr "Error al mover fichero"
+msgstr "Error al mover archivo"
 
-#: src/utilops.c:228
+#: src/utilops.c:636
 #, c-format
 msgid ""
 "Unable to move file:\n"
-"%sto:\n"
 "%s\n"
-" during multiple file move."
+"to:\n"
+"%s\n"
+"during multiple file move."
 msgstr ""
-"No pude mover fichero:\n"
-"%s a:\n"
+"No se pudo mover archivo:\n"
+"%s\n"
+"a:\n"
 "%s\n"
-" durante el movimiento de varios ficheros."
+"durante el movimiento de múltiples archivos."
 
-#: src/utilops.c:282
+#: src/utilops.c:774
 msgid "Source matches destination"
 msgstr "Origen y destino son iguales"
 
-#: src/utilops.c:283
+#: src/utilops.c:775
 msgid "Source and destination are the same, operation cancelled."
-msgstr "Origen y destino son iguales, operación cancelada."
-
-#: src/utilops.c:288
-#, c-format
-msgid ""
-"Overwrite file:\n"
-"%s\n"
-" with:\n"
-"%s"
-msgstr ""
-"Sobreescribir fichero:\n"
-"%s\n"
-" con:\n"
-"%s"
+msgstr "Origen y destino son iguales, operación cancelada."
 
-#: src/utilops.c:292 src/utilops.c:654 src/utilops.c:838
-msgid "Overwrite"
-msgstr "Sobreescribir"
-
-#: src/utilops.c:318
+#: src/utilops.c:851
 #, c-format
 msgid ""
 "Unable to copy file:\n"
@@ -595,12 +2722,12 @@ msgid ""
 "to:\n"
 "%s"
 msgstr ""
-"No pude copiar fichero:\n"
+"No se pudo copiar archivo:\n"
 "%s\n"
 "a:\n"
 "%s"
 
-#: src/utilops.c:323
+#: src/utilops.c:856
 #, c-format
 msgid ""
 "Unable to move file:\n"
@@ -608,195 +2735,219 @@ msgid ""
 "to:\n"
 "%s"
 msgstr ""
-"No pude mover fichero:\n"
+"No se pudo mover archivo:\n"
 "%s\n"
 "a:\n"
 "%s"
 
-#: src/utilops.c:367
+#: src/utilops.c:899
 msgid "Invalid destination"
-msgstr "Destino no válido"
+msgstr "Destino no válido"
 
-#: src/utilops.c:367
+#: src/utilops.c:900
 msgid ""
 "When operating with multiple files, please select\n"
-" a directory, not file."
+"a folder, not a file."
 msgstr ""
-"Cuando opere con varios ficheros, por favor seleccione\n"
-" un directorio, no un fichero."
+"Cuando opere con múltiples archivos, por favor\n"
+"seleccione una carpeta, no un archivo."
 
-#: src/utilops.c:369
-msgid "Invalid directory"
-msgstr "Directorio no válido"
+#: src/utilops.c:905
+msgid "Please select an existing folder."
+msgstr "Por favor, seleccione una carpeta existente."
 
-#: src/utilops.c:369
-msgid "Please select an existing directory"
-msgstr "Por favor, seleccione un directorio existente"
+#: src/utilops.c:956
+msgid "Copy - GQview"
+msgstr "Copiar - GQview"
 
-#: src/utilops.c:427
-msgid "GQview - copy"
-msgstr "GQview - copiar"
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "_Copiar"
 
-#: src/utilops.c:428
-msgid "Copy"
-msgstr "Copiar"
+#: src/utilops.c:960
+msgid "Copy file"
+msgstr "Copiar archivo"
 
-#: src/utilops.c:430
-#, c-format
-msgid ""
-"Copy file:\n"
-"%s\n"
-"to:"
-msgstr ""
-"Copiar fichero:\n"
-"%s\n"
-"a:"
+#: src/utilops.c:964
+msgid "Copy multiple files"
+msgstr "Copiar múltiples archivos"
 
-#: src/utilops.c:432
-#, c-format
-msgid ""
-"Copy multiple files from:\n"
-"%s\n"
-"to:"
-msgstr ""
-"Copiar varios ficheros de:\n"
-"%s\n"
-"a:"
+#: src/utilops.c:970
+msgid "Move - GQview"
+msgstr "Mover - GQview"
 
-#: src/utilops.c:436
-msgid "GQview - move"
-msgstr "GQview - mover"
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "_Mover"
 
-#: src/utilops.c:437
-msgid "Move"
-msgstr "Mover"
+#: src/utilops.c:974
+msgid "Move file"
+msgstr "Mover archivo"
+
+#: src/utilops.c:978
+msgid "Move multiple files"
+msgstr "Mover múltiples archivos"
+
+#: src/utilops.c:992 src/utilops.c:1502
+msgid "File name:"
+msgstr "Nombre del archivo:"
+
+#: src/utilops.c:996
+msgid "Choose the destination folder."
+msgstr "Elegir la carpeta de destino."
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Falló el borrado"
 
-#: src/utilops.c:439
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "No se pudo quitar archivo viejo de la carpeta de basura"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+msgid "Could not create folder"
+msgstr "No se puede crear la carpeta"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "Permiso denegado"
+
+#: src/utilops.c:1212
 #, c-format
 msgid ""
-"Move file:\n"
-"%s\n"
-"to:"
+"Unable to access or create the trash folder.\n"
+"\"%s\""
 msgstr ""
-"Mover fichero:\n"
-"%s\n"
-"a:"
+"No se pudo acceder o crear la carpeta de basura.\n"
+"\"%s\""
+
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "Desactivar borrado seguro"
 
-#: src/utilops.c:441
+#: src/utilops.c:1234
 #, c-format
-msgid ""
-"Move multiple files from:\n"
-"%s\n"
-"to:"
-msgstr ""
-"Mover varios ficheros de:\n"
-"%s\n"
-"a:"
+msgid "Safe delete: %s"
+msgstr "Borrado seguro: %s"
 
-#: src/utilops.c:514
+#: src/utilops.c:1276
 #, c-format
 msgid ""
 "Unable to delete file:\n"
 " %s\n"
 " Continue multiple delete operation?"
 msgstr ""
-"No pude borrar fichero:\n"
-" %s\n"
-" ¿Continuar con borrado de varios ficheros?"
-
-#: src/utilops.c:515 src/utilops.c:521
-msgid "Delete failed"
-msgstr "Falló el borrado"
+"No se pudo borrar archivo:\n"
+"%s\n"
+"¿Continuar con el borrado de múltiples archivos?"
 
-#: src/utilops.c:520 src/utilops.c:565
+#: src/utilops.c:1347
 #, c-format
-msgid ""
-"Unable to delete file:\n"
-"%s"
-msgstr ""
-"No pude borrar fichero:\n"
-"%s"
+msgid "File %d of %d"
+msgstr "Archivo %d de %d"
 
-#: src/utilops.c:550
-msgid "Delete files"
-msgstr "Borrar fichero"
+#: src/utilops.c:1416
+msgid "Delete files - GQview"
+msgstr "Borrar archivos - GQview"
 
-#: src/utilops.c:550
-msgid "About to delete multiple files..."
-msgstr "A punto de borrar varios ficheros..."
+#: src/utilops.c:1420
+msgid "Delete multiple files"
+msgstr "Borrar múltiples archivos"
 
-#: src/utilops.c:551 src/utilops.c:596
-msgid "Delete"
-msgstr "Borrar"
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "Revisar %d archivos"
 
-#: src/utilops.c:566
-msgid "File deletion failed"
-msgstr "Falló el borrado de fichero"
+#: src/utilops.c:1494
+msgid "Delete file - GQview"
+msgstr "Borrar archivo - GQview"
 
-#: src/utilops.c:594
-#, c-format
-msgid ""
-"About to delete the file:\n"
-" %s"
-msgstr ""
-"A punto de borrar el fichero:\n"
-" %s"
+#: src/utilops.c:1498
+msgid "Delete file?"
+msgstr "¿Borrar archivo?"
 
-#: src/utilops.c:595
-msgid "Delete file"
-msgstr "Borrar fichero"
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr "Reemplazar archivo existente por nuevo archivo."
 
-#: src/utilops.c:650 src/utilops.c:834
+#: src/utilops.c:1661
 #, c-format
 msgid ""
-"Overwrite file:\n"
+"Unable to rename file:\n"
 "%s\n"
-"by renaming:\n"
+" to:\n"
 "%s"
 msgstr ""
-"Sobreescribir fichero:\n"
+"No se pudo renombrar archivo:\n"
 "%s\n"
-"mediante renombrado:\n"
+"a:\n"
 "%s"
 
-#: src/utilops.c:663
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Error al renombrar archivo"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"No se puede auto-renombrar con el conjunto\n"
+"de números seleccionado; uno o más archivos\n"
+"existen y coinciden con la lista de nombres\n"
+"resultantes.\n"
+
+#: src/utilops.c:1809
 #, c-format
 msgid ""
-"Unable to rename file:\n"
+"Failed to rename\n"
 "%s\n"
-" to:\n"
-"%s"
+"The number was %d."
 msgstr ""
-"No pude renombrar fichero:\n"
+"Fallo al renombrar\n"
 "%s\n"
-" a:\n"
-"%s"
+"El número fue %d."
 
-#: src/utilops.c:664 src/utilops.c:847
-msgid "Error renaming file"
-msgstr "Error al renombrar fichero"
+#: src/utilops.c:2031 src/utilops.c:2249
+msgid "Rename - GQview"
+msgstr "Renombrar - GQview"
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "GQview - rename"
-msgstr "GQview - renombrar"
+#: src/utilops.c:2034
+msgid "Rename multiple files"
+msgstr "Renombrar múltiples archivos"
 
-#: src/utilops.c:754
-msgid "Rename multiple files:"
-msgstr "Renombrar varios ficheros:"
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "Nombre original"
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "Rename"
-msgstr "Renombrar"
+#: src/utilops.c:2110 src/utilops.c:2262
+msgid "Original name:"
+msgstr "Nombre original:"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+msgid "New name:"
+msgstr "Nuevo nombre:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Comienzo del texto"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "Nº inicial"
 
-#: src/utilops.c:790
-msgid "Rename:"
-msgstr "Renombrar:"
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Fin del texto"
 
-#: src/utilops.c:799
-msgid "to:"
-msgstr "a: "
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "Relleno:"
 
-#: src/utilops.c:846
+#: src/utilops.c:2207 src/view_file_list.c:459
 #, c-format
 msgid ""
 "Unable to rename file:\n"
@@ -804,84 +2955,311 @@ msgid ""
 "to:\n"
 "%s"
 msgstr ""
-"No pude renombrar fichero:\n"
+"No se pudo renombrar archivo:\n"
 "%s\n"
 "a:\n"
 "%s"
 
-#: src/utilops.c:884
+#: src/utilops.c:2252
+msgid "Rename file"
+msgstr "Renombrar archivo"
+
+#: src/utilops.c:2311
 #, c-format
 msgid ""
-"Rename file:\n"
+"The folder:\n"
 "%s\n"
-"to:"
+"already exists."
 msgstr ""
-"Renombrar fichero:\n"
+"La carpeta:\n"
 "%s\n"
-"a:"
+"ya existe."
+
+#: src/utilops.c:2312
+msgid "Folder exists"
+msgstr "La carpeta existe"
 
-#: src/utilops.c:928
+#: src/utilops.c:2317
 #, c-format
 msgid ""
 "The path:\n"
 "%s\n"
 "already exists as a file."
 msgstr ""
-"El camino:\n"
+"La ruta:\n"
 "%s\n"
-"ya existe como un fichero."
+"ya existe como un archivo."
 
-#: src/utilops.c:929
-msgid "Could not create directory"
-msgstr "No pude crear el directorio"
+#: src/utilops.c:2369
+msgid "New folder - GQview"
+msgstr "Nueva carpeta - GQview"
 
-#: src/utilops.c:934
+#: src/utilops.c:2372
 #, c-format
 msgid ""
-"The directory:\n"
+"Create folder in:\n"
 "%s\n"
-"already exists."
+"named:"
 msgstr ""
-"El directorio:\n"
+"Crear carpeta en:\n"
 "%s\n"
-"ya existe."
+"de nombre:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "Nueva_carpeta"
 
-#: src/utilops.c:935
-msgid "Directory exists"
-msgstr "El directorio existe"
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "_Subir un nivel"
 
-#: src/utilops.c:942
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "_Diapositivas"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Diapositivas en modo _recursivo"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "Bus_car duplicados..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "_Buscar duplicados recursivamente..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "N_ueva carpeta..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "_Ver como árbol"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "_Actualizar"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "_Ordenar"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "_Ver como íconos"
+
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "_Mostrar miniaturas"
+
+#: src/view_file_list.c:447
 #, c-format
 msgid ""
-"Unable to create directory:\n"
+"Invalid file name:\n"
 "%s"
 msgstr ""
-"No pude crear directorio:\n"
+"Nombre de archivo no válido:\n"
 "%s"
 
-#: src/utilops.c:943
-msgid "Error creating directory"
-msgstr "Error al crear directorio"
+#~ msgid "Purge thumbnails"
+#~ msgstr "Purgar miniaturas"
 
-#: src/utilops.c:982
-#, c-format
-msgid ""
-"Create directory in:\n"
-"%s\n"
-"named:"
-msgstr ""
-"Crear directorio en:\n"
-"%s\n"
-"llamado:"
+#~ msgid "/File/tear1"
+#~ msgstr "/Archivo/tear1"
 
-#: src/utilops.c:983
-msgid "GQview - new directory"
-msgstr "GQview - nuevo directorio"
+#~ msgid "/File/_New collection"
+#~ msgstr "/Archivo/Nueva _colección"
 
-#: src/utilops.c:983
-msgid "Create"
-msgstr "Crear"
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Archivo/Abrir c_olección..."
 
-#: src/window.c:151
-msgid "GQview Tools"
-msgstr "Herramientas GQView"
+#~ msgid "/File/sep1"
+#~ msgstr "/Archivo/sep1"
+
+#~ msgid "/File/_Search..."
+#~ msgstr "/Archivo/_Buscar..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Archivo/Buscar _duplicados..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Archivo/sep2"
+
+#~ msgid "/File/_Print..."
+#~ msgstr "/Archivo/_Imprimir..."
+
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Archivo/N_ueva carpeta..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Archivo/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Archivo/Co_piar..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Archivo/_Mover..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Archivo/_Renombrar..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Archivo/_Borrar..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Archivo/sep4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/Archivo/Cerrar _ventana"
+
+#~ msgid "/File/_Quit"
+#~ msgstr "/Archivo/_Salir"
+
+#~ msgid "/_Edit"
+#~ msgstr "/_Editar"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Editar/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Editar/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Editar/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Editar/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Editar/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Editar/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Editar/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Editar/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Editar/editor8"
+
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Editar/editor9"
+
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Editar/editor0"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Editar/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Editar/_Ajustar"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Editar/_Propiedades..."
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Editar/Ajustar/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Editar/Ajustar/_Rotar en sentido horario"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Editar/Ajustar/Rotar en sentido _antihorario"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Editar/Ajustar/Rotar _180°"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Editar/Ajustar/Reflejar _horizontalmente"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Editar/Ajustar/Reflejar _verticalmente"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Editar/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Editar/Seleccionar _todo"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Editar/Seleccionar _nada"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Editar/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Editar/_Opciones..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Editar/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Editar/_Establecer como fondo de escritorio"
+
+#~ msgid "/_View"
+#~ msgstr "/_Ver"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Ver/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Ver/Zoom ac_ercar"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Ver/Z_oom alejar"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Ver/_Zoom 1:1"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Ver/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Ver/_Miniaturas"
+
+#~ msgid "/View/I_cons"
+#~ msgstr "/Ver/Íco_nos"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Ver/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Ver/_Pantalla completa"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Ver/sep3"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Ver/Esconder lista de arc_hivos"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/Ver/sep4"
+
+#~ msgid "/View/_Keywords"
+#~ msgstr "/Ver/Palabras cla_ve"
+
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Ver/Clas_ificador"
+
+#~ msgid "/View/sep5"
+#~ msgstr "/Ver/sep5"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Ver/Conmutar diapo_sitivas"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Ver/Actualiza_r lista"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Ayuda/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Ayuda/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "Configuración de GQview"
diff --git a/po/et.po b/po/et.po
new file mode 100644 (file)
index 0000000..9b1d7c2
--- /dev/null
+++ b/po/et.po
@@ -0,0 +1,3704 @@
+# GQview eesti keele tõlge.
+# Copyright (C) 2001-2002 Free Software Foundation, Inc.
+# Ilmar Kerm <ikerm@hot.ee>, 2001-2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GQView\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2002-07-31 15:40+0200\n"
+"Last-Translator: Ilmar Kerm <ikerm@hot.ee>\n"
+"Language-Team: Estonian <gnome-et@linux.ee>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-15\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 0.9.6\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Tööriistad"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "Kuupäev"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Faili nimi:"
+
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Faili kuupäev:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Võrdle millega:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Salvesta kollektsioon"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr ""
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Nimi"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr ""
+
+#: src/bar_exif.c:426
+#, fuzzy
+msgid "Format"
+msgstr "Normaalne"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr ""
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr ""
+
+#: src/bar_exif.c:549 src/info.c:105
+#, fuzzy
+msgid "Exif"
+msgstr "Välju"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr ""
+
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Kustutamine ebaõnnestus"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Kataloog:\n"
+"%s\n"
+"on juba olemas."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Kollektsioon on tühi"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Kollektsiooni salvestamine ebaõnnestus:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Salvestamine ebaõnnestus"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr ""
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Kollektsioonid"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+#, fuzzy
+msgid "Name:"
+msgstr "Nimi"
+
+#: src/bar_sort.c:569
+#, fuzzy
+msgid "Sort Manager"
+msgstr "Sorteeritud nime järgi"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+#, fuzzy
+msgid "Folders"
+msgstr "Failid"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Kollektsioonid"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Kopeeri"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Liiguta"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d pilti"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Tühista valik"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr ""
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+#, fuzzy
+msgid "done"
+msgstr "Puudub"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Loen sarnasuse andmeid..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Eemaldan pisipilte..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Puhastan vanad pisipildid..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Vigane failinimi"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Puhverda pisipildid"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Algus #"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+#, fuzzy
+msgid "Folder:"
+msgstr "Failid"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Tühista valik"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Vigane failinimi"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+#, fuzzy
+msgid "running..."
+msgstr "Võrdlen..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Eemaldan pisipilte..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Puhasta puhver"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"See valik eemaldab kettalt kõik sinna salvestatud\n"
+"pisipildid. Kas soovid jätkata?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "Pildi omadused - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview täisekraan"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "Kollektsioonid"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "Puhasta"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "Puhverda pisipildid"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "Näita pisipilte"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "Nimeta ümber"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Pealkirjata"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Pealkirjata (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - GQview kollektsioon"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Sulge kollektsioon"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Kollektsiooni on muudetud.\n"
+"Salvestada?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Märgitud tee:\n"
+"%s\n"
+"on kataloog, kollektsioonid on failid"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Vigane failinimi"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Kirjuta fail üle"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Kirjuta fail üle"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Kirjuta üle"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Salvesta kollektsioon"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Ava kollektsioon"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Lisa kollektsioon"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Lisa"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Kollektsioonide failid"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Kollektsioon on tühi"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Aktiivne kollektsioon on tühi, salvestamine katkestatud."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Tühi"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d pilti (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d pilti"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Laen pisipilte..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+#, fuzzy
+msgid "_View"
+msgstr "/_Vaade"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+#, fuzzy
+msgid "View in _new window"
+msgstr "Ava uues aknas"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+#, fuzzy
+msgid "Rem_ove"
+msgstr "Eemalda"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Lisa failide nimekirjast"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Lisa kollektsioonist..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Vali kõik"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Tühista valik"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+#, fuzzy
+msgid "_Properties"
+msgstr "Omadused"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+#, fuzzy
+msgid "_Copy..."
+msgstr "Kopeeri..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+#, fuzzy
+msgid "_Move..."
+msgstr "Liiguta..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+#, fuzzy
+msgid "_Rename..."
+msgstr "Muuda nime..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+#, fuzzy
+msgid "_Delete..."
+msgstr "Kustuta..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+#, fuzzy
+msgid "Show filename _text"
+msgstr "Näita peidetud faile"
+
+#: src/collect-table.c:813
+#, fuzzy
+msgid "_Save collection"
+msgstr "Salvesta kollektsioon"
+
+#: src/collect-table.c:815
+#, fuzzy
+msgid "Save collection _as..."
+msgstr "Salvesta kollektsioon kui..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+#, fuzzy
+msgid "_Find duplicates..."
+msgstr "Otsi duplikaadid..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Fail/_Nimeta ümber..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "Lohistatud nimekiri sisaldab katalooge."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+#, fuzzy
+msgid "_Add contents"
+msgstr "Lisa sisu"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+#, fuzzy
+msgid "Add contents _recursive"
+msgstr "Lisa sisu rekursiivselt"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "Jäta kataloogid vahele"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Loobu"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Lohista failid nende võrdlemiseks."
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d faili"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "Leiti %d ühtivust %d failis"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr ""
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Loen kontrollsummasid..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Loen mõõtmeid..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Loen sarnasuse andmeid..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Võrdlen..."
+
+#: src/dupe.c:1535
+#, fuzzy
+msgid "Sorting..."
+msgstr "Võrdlen..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr ""
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr ""
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Lisa uude kollektsiooni"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+#, fuzzy
+msgid "C_lear"
+msgstr "Puhasta"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+#, fuzzy
+msgid "Close _window"
+msgstr "Sulge aken"
+
+#: src/dupe.c:2382
+#, fuzzy, c-format
+msgid "%d files (set 2)"
+msgstr "%d faili%s"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Suurus"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Kuupäev"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Mõõtmed"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Kontrollsumma"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Kataloogitee"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Sarnasus (kõrge)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Sarnasus"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Sarnasus (madal)"
+
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Sarnasus (kohandatud)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Otsi duplikaadid - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Võrdle millega:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Võrdlemise alus:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Pisipildid"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Võrdle kaht failikomplekti"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+#, fuzzy
+msgid "Rotate jpeg clockwise"
+msgstr "Pööra päripäeva"
+
+#: src/editors.c:59
+#, fuzzy
+msgid "Rotate jpeg counterclockwise"
+msgstr "Pööra vastupäeva"
+
+#: src/editors.c:104
+#, fuzzy
+msgid "stopping..."
+msgstr "Võrdlen..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr ""
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr ""
+
+#: src/editors.c:303
+#, fuzzy, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Laadimine ebaõnnestus:\n"
+"%s"
+
+#: src/editors.c:414
+#, fuzzy
+msgid "stopped by user"
+msgstr "Sorteeritud numbri järgi"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+#, fuzzy
+msgid "unknown"
+msgstr "(tundmatus)..."
+
+#: src/exif.c:113
+#, fuzzy
+msgid "top left"
+msgstr "Kustuta"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr ""
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr ""
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr ""
+
+#: src/exif.c:117
+#, fuzzy
+msgid "left top"
+msgstr "Kustuta"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr ""
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr ""
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr ""
+
+#: src/exif.c:127
+msgid "inch"
+msgstr ""
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr ""
+
+#: src/exif.c:140
+msgid "average"
+msgstr ""
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr ""
+
+#: src/exif.c:142
+msgid "spot"
+msgstr ""
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr ""
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr ""
+
+#: src/exif.c:145
+msgid "partial"
+msgstr ""
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr ""
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr ""
+
+#: src/exif.c:152
+msgid "manual"
+msgstr ""
+
+#: src/exif.c:153
+#, fuzzy
+msgid "normal"
+msgstr "Normaalne"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr ""
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr ""
+
+#: src/exif.c:156
+#, fuzzy
+msgid "creative"
+msgstr "Loo"
+
+#: src/exif.c:157
+msgid "action"
+msgstr ""
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr ""
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr ""
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr ""
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr ""
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr ""
+
+#: src/exif.c:168
+msgid "flash"
+msgstr ""
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "ei"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "jah"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr ""
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr ""
+
+#: src/exif.c:289
+#, fuzzy
+msgid "Image description"
+msgstr "Vigane sihtkoht"
+
+#: src/exif.c:292
+#, fuzzy
+msgid "Orientation"
+msgstr "Mõõtmed:"
+
+#: src/exif.c:303
+#, fuzzy
+msgid "Copyright"
+msgstr "Kopeeri"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr ""
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr ""
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr ""
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr ""
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr ""
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr ""
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr ""
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr ""
+
+#: src/exif.c:323
+#, fuzzy
+msgid "Metering mode"
+msgstr "Virvtoonimise meetod:"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr ""
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr ""
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr ""
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr ""
+
+#: src/exif.c:337
+msgid "Height"
+msgstr ""
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr ""
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr ""
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr ""
+
+#: src/exif.c:1479
+#, fuzzy
+msgid "mode:"
+msgstr "Failid"
+
+#: src/exif.c:1483 src/utilops.c:1234
+#, fuzzy
+msgid "on"
+msgstr "Puudub"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr ""
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr ""
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr ""
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr ""
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr ""
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr ""
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d baiti"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f K"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: src/filelist.c:526
+#, fuzzy, c-format
+msgid "%.1f GB"
+msgstr "%.1f MB"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview täisekraan"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Faili suurus:"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Mahuta pilt aknasse"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+#, fuzzy
+msgid "Zoom _in"
+msgstr "Suurenda"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+#, fuzzy
+msgid "Zoom _out"
+msgstr "Vähenda"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+#, fuzzy
+msgid "Zoom _1:1"
+msgstr "Originaalsuurus"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+#, fuzzy
+msgid "Fit image to _window"
+msgstr "Mahuta pilt aknasse"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+#, fuzzy
+msgid "Set as _wallpaper"
+msgstr "Sea taustapildiks"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+#, fuzzy
+msgid "_Stop slideshow"
+msgstr "Lõpeta slaidiseanss"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+#, fuzzy
+msgid "Continue slides_how"
+msgstr "Jätka slaidiseanssi"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+#, fuzzy
+msgid "Pause slides_how"
+msgstr "Peata slaidiseanss"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+#, fuzzy
+msgid "_Start slideshow"
+msgstr "Alusta slaidiseanssi"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+#, fuzzy
+msgid "Exit _full screen"
+msgstr "Välju täisekraan-vaatest"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+#, fuzzy
+msgid "_Full screen"
+msgstr "Täisekraan-vaade"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+#, fuzzy
+msgid "C_lose window"
+msgstr "Sulge aken"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "Faili suurus:"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Mõõtmed:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Läbipaistev:"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Pildi suurus:"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Tihendussuhe:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Faili kuupäev:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Omanik:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Grupp:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Üldine"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr ""
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Pildi omadused - GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Tõusev järjestus"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Slaidiseanss"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Peatatud"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d faili (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d faili%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d faili%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(puudub lugemisõigus) %s baiti"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s baiti"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s baiti"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview tööriistad"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Tööriistad"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "Failid"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Pilt"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(järjekorra muutmiseks lohista kirjet)"
+
+#: src/layout_image.c:770
+#, fuzzy
+msgid "Hide file _list"
+msgstr "Peida failide nimekiri"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "%s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "(tundmatus)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Tühi"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Fail"
+
+#: src/layout_util.c:749 src/menu.c:91
+#, fuzzy
+msgid "_Edit"
+msgstr "/_Redaktor"
+
+#: src/layout_util.c:750 src/menu.c:248
+#, fuzzy
+msgid "_Adjust"
+msgstr "Kohanda"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/_Abi"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Fail/Uus ak_en"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "Salvesta kollektsioon"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Ava kollektsioon"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Fail/Ava _hiljutine"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Võrdlen..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Fail/_Nimeta ümber..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "Uus kataloog..."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Kvaliteet"
+
+#: src/layout_util.c:779 src/menu.c:194
+#, fuzzy
+msgid "_Rotate clockwise"
+msgstr "Pööra päripäeva"
+
+#: src/layout_util.c:780 src/menu.c:197
+#, fuzzy
+msgid "Rotate _counterclockwise"
+msgstr "Pööra vastupäeva"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Pööra 180"
+
+#: src/layout_util.c:782 src/menu.c:203
+#, fuzzy
+msgid "_Mirror"
+msgstr "Peegelda"
+
+#: src/layout_util.c:783 src/menu.c:206
+#, fuzzy
+msgid "_Flip"
+msgstr "Pööra ümber telje"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Vali kõik"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Tühista valik"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "Omadused"
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Vaade/_Mahuta aknasse"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "Täisekraan-vaade"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Peida failide nimekiri"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "Lõpeta slaidiseanss"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "Uuenda"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Abi/Programmist"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Abi/_Kiirklahvid"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Abi/_Tarkvara redaktsiooni märkused"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Abi/Programmist"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Pisipildid"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Vaade/_Puu"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Vaade/_Ujuv failide nimekiri"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Vaade/Peida _tööriistariba"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "/Vaade/_Ikoonid"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Vaade/_Uuenda nimekirju"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Sorteeritud nime järgi"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Vaade/_Uuenda nimekirju"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "/Vaade/_Ikoonid"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Näita pisipilte"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Mine kodukataloogi"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Uuenda failide nimekirja"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Suurenda"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Vähenda"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Mahuta pilt aknasse"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Näita pilti originaalsuuruses"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Programmi häälestus"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Ujuvuse kontroll"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Abi - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Käsurida"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Järgmise pildi eellaadimine"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "%d pilti"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Järgmise pildi eellaadimine"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "Välju täisekraan-vaatest"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "Välju täisekraan-vaatest"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "Välju täisekraan-vaatest"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "Lõpeta slaidiseanss"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "Alusta slaidiseanssi"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "Lõpeta slaidiseanss"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "Alusta slaidiseanssi"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview tööriistad"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr ""
+"Nimeta fail:\n"
+"%s\n"
+"ümber:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Ava uues aknas"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Kasutamine: gqview [häälestus] [kataloogitee]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "võimalikud häälestused:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           riistade näitamine\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        peida riistad\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           käivitu täisekraan-moodis\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            käivitu slaidiseanss-moodis\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr "  -l, --list                 ava käsureale kollektsiooni aken\n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr "  -l, --list                 ava käsureale kollektsiooni aken\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    väljasta debug infot\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              väljasta versiooni info\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 näita seda teadet\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"vigane või ignoreeritud: %s\n"
+"Häälestuste vaatamiseks kasuta --help\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Loon GQview kataloogi: %s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Ei saa luua kataloogi: %s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Kodu"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+#, fuzzy
+msgid "Desktop"
+msgstr "failiks:"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - väljumine"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "Abi - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Kollektsioone on muudetud.\n"
+"Väljuda sellegipoolest?"
+
+#: src/menu.c:115
+#, fuzzy
+msgid "Sort by size"
+msgstr "Sorteeirud suuruse järgi"
+
+#: src/menu.c:118
+#, fuzzy
+msgid "Sort by date"
+msgstr "Sorteeritud kuupäeva järgi"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Sorteerimata"
+
+#: src/menu.c:124
+#, fuzzy
+msgid "Sort by path"
+msgstr "Sorteeritud kataloogitee järgi"
+
+#: src/menu.c:127
+#, fuzzy
+msgid "Sort by number"
+msgstr "Sorteeritud numbri järgi"
+
+#: src/menu.c:131
+#, fuzzy
+msgid "Sort by name"
+msgstr "Sorteeritud nime järgi"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Sorteerimine"
+
+#: src/menu.c:200
+#, fuzzy
+msgid "Rotate _180"
+msgstr "Pööra 180"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Lähim (halvim, kuid kiireim)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Klotsid"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilineaarne"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Hyper (parim, kui aeglaseim)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Puudub"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normaalne"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Parim"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr ""
+
+#: src/preferences.c:662 src/preferences.c:665
+#, fuzzy
+msgid "Reset filters"
+msgstr "Kustuta failid"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:699 src/preferences.c:702
+#, fuzzy
+msgid "Reset editors"
+msgstr "Kustuta failid"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:727 src/preferences.c:730
+#, fuzzy
+msgid "Clear trash"
+msgstr "Puhasta puhver"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr ""
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - ümbernimetamine"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "Algus #"
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Mine kodukataloogi"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Kasuta aktiivset"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Suurus:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Kvaliteet:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Puhverda pisipildid"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Puhverda pisipildid faili .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Kasuta xvpics pisipilte, kui leitud (ainult lugemine)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Slaidiseanss"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Ooteaeg enne pildi vahetamist (sekundites):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Segamini"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Korduv"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Suurenda"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Virvtoonimise meetod:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Kaheosaline suurendus"
+
+#: src/preferences.c:895
+#, fuzzy
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Suurenda pilti, et see mahuks aknasse."
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Suurenduse samm:"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Uue pildi valikul:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Näita originaalsuuruses"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Ära muuda suurendust"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Lisa"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Must taust"
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Jätka"
+
+#: src/preferences.c:924
+#, fuzzy
+msgid "Refresh on file change"
+msgstr "Uuenda failide nimekirja"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Järgmise pildi eellaadimine"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr ""
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Aknad"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Algus #"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Jäta akende asukohad meelde"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Jäta riistade olekud meelde (ujuv/peidetud)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "Mahuta aken pildi ümber, kui riistad on peidetud või ujuvad"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Piira akna suurust automaatsel suurendamisel (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Paigutus"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filtreerimine"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Näita punktiga algavaid kirjeid"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr ""
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Blokeeri failide filtreerimine"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Faili kuupäev:"
+
+#: src/preferences.c:1008
+#, fuzzy
+msgid "Filter"
+msgstr "Filter:"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr ""
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Redaktorid"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Menüüs olev nimi"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr ""
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "Täisekraan-vaade"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Pildi suurus:"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Kustuta"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Küsi nõusolekut faili kustutamisel"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Luba 'Delete' klahv"
+
+#: src/preferences.c:1158
+#, fuzzy
+msgid "Safe delete"
+msgstr "Küsi nõusolekut faili kustutamisel"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Faili suurus:"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Vaade"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Ristkülikuline valik"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr ""
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Kohapeal ümbernimetamine"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr ""
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Progressiivne klaviatuuriga kerimine"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Hiire ratas kerib pilti"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "Kohandatud sarnasuse lävi:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Ekraanivälise puhvri suurus (MB/pilt):"
+
+#: src/preferences.c:1291
+#, fuzzy
+msgid "About - GQview"
+msgstr "Abi - GQview"
+
+#: src/preferences.c:1304
+#, fuzzy, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright (c) 2003 by John Ellis\n"
+"http://gqview.sourceforge.net\n"
+"gqview@users.sourceforge.net\n"
+"\n"
+"Avaldatud GNU Üldise Avaliku Litsentsi all"
+
+#: src/preferences.c:1322
+#, fuzzy
+msgid "Credits..."
+msgstr "Omadused"
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Tühista valik"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr ""
+
+#: src/print.c:138
+#, fuzzy
+msgid "Custom printer"
+msgstr "Näita ka nende tüüpidega faile:"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Pildi suurus:"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr ""
+
+#: src/print.c:353
+msgid "inches"
+msgstr ""
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr ""
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr ""
+
+#: src/print.c:366
+msgid "Letter"
+msgstr ""
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, c-format
+msgid "page %d of %d"
+msgstr ""
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr ""
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, fuzzy, c-format
+msgid "A file with name %s already exists."
+msgstr "Fail %s on juba olemas."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Filter:"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Kustuta failid"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "Abi - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Normaalne"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Mõõtmed:"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Vigane sihtkoht"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Faili nimi:"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Pealkirjata"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "Puudub"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Sorteerimine"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Pildi suurus:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "Filter:"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr ""
+
+#: src/print.c:3432
+#, fuzzy
+msgid "Top:"
+msgstr "Grupp:"
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "failiks:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Filter:"
+
+#: src/print.c:3450
+#, fuzzy
+msgid "Custom printer:"
+msgstr "Näita ka nende tüüpidega faile:"
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Filter:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Faili kuupäev:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Jäta akende asukohad meelde"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "viga konfiguratsioonifaili salvestamisel: %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Failid"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Lisa sisu"
+
+#: src/search.c:202
+msgid "results"
+msgstr ""
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Jätka"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+msgid "greater than"
+msgstr ""
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "Filter:"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d faili (%s, %d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%s, %d faili%s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Võrdlen..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Palun vali eksisteeriv kataloog"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Palun vali eksisteeriv kataloog"
+
+#: src/search.c:2570
+#, fuzzy
+msgid "Image search - GQview"
+msgstr "Pildi omadused - GQview"
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Võrdlen..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Faili nimi:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Faili suurus:"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Segamini"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Faili kuupäev:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Vigane sihtkoht"
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Lisa sisu"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Sarnasus"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Segamini"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "Puhvris oleva pisipildi laadimine ebaõnnestus, proovin luua uut.\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Ajaloonimekirjade kirjutamine ebaõnnestus: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr ""
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+#, fuzzy
+msgid "Edit Bookmark"
+msgstr "Redaktorid"
+
+#: src/ui_bookmark.c:612
+#, fuzzy
+msgid "Path:"
+msgstr "Kataloogitee"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr ""
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Tühista valik"
+
+#: src/ui_bookmark.c:718
+#, fuzzy
+msgid "_Properties..."
+msgstr "Omadused"
+
+#: src/ui_bookmark.c:720
+#, fuzzy
+msgid "Move _up"
+msgstr "Liiguta"
+
+#: src/ui_bookmark.c:722
+#, fuzzy
+msgid "Move _down"
+msgstr "Liiguta"
+
+#: src/ui_bookmark.c:724
+#, fuzzy
+msgid "_Remove"
+msgstr "Eemalda"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Laadimine ebaõnnestus:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Faili %s ümbernimetamine %s-ks ebaõnnestus."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Faili kustutamine ebaõnnestus:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Faili kustutamine ebaõnnestus"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Kustuta fail"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Kas soovid ikka kustutada faili\n"
+" %s?"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+#, fuzzy
+msgid "_Rename"
+msgstr "Nimeta ümber"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+#, fuzzy
+msgid "Add _Bookmark"
+msgstr "Redaktorid"
+
+#: src/ui_pathsel.c:636
+#, fuzzy
+msgid "_Delete"
+msgstr "Kustuta"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "Uus kataloog..."
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Ei saa luua kataloogi:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Viga kataloogi loomisel"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Kõik failid"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Näita peidetud faile"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filter:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Vali kõik"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "Kõik failid"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Kirjuta fail üle"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Kirjuta fail üle"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Kirjuta fail üle"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Jäta kõik vahele"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Jäta vahele"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Viga faili liigutamisel"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "Uus kataloog..."
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Automaatne ümbernimetamine"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Nimeta ümber"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Kopeerimise allikas ja sihtkoht ühtivad"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Ei saa kopeerida faili:\n"
+"%s\n"
+"iseendasse."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Liigutamise allikas ja sihtkoht ühtivad"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Ei saa liigutada faili:\n"
+"%s\n"
+"iseendasse."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Jätka"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Viga faili kopeerimisel"
+
+#: src/utilops.c:631
+#, fuzzy, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Ei saa kopeerida faili:\n"
+"%s failiks:\n"
+"%s\n"
+" mitme faili kopeerimise ajal."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Viga faili liigutamisel"
+
+#: src/utilops.c:636
+#, fuzzy, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Ei saa liigutada faili:\n"
+"%s failiks:\n"
+"%s\n"
+" mitme faili liigutamise ajal."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Allikas ja sihtkoht ühtivad"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Allikas ja sihtkoht ühtivad, operatsioonist loobuti."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Ei saa kopeerida faili:\n"
+"%s\n"
+"faili:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Ei saa liigutada faili:\n"
+"%s\n"
+"faili:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Vigane sihtkoht"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"Mitme failiga tegeledes palun vali kataloog,\n"
+" mitte fail."
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Palun vali eksisteeriv kataloog"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Abi - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+#, fuzzy
+msgid "_Copy"
+msgstr "Kopeeri"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr ""
+"Nimeta fail:\n"
+"%s\n"
+"ümber:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "Kopeeri failid kataloogi:"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Abi - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+#, fuzzy
+msgid "_Move"
+msgstr "Liiguta"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr ""
+"Nimeta fail:\n"
+"%s\n"
+"ümber:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Liiguta failid kataloogi"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Faili nimi:"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Allikas ja sihtkoht ühtivad"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Kustutamine ebaõnnestus"
+
+#: src/utilops.c:1124
+#, fuzzy
+msgid "Unable to remove old file from trash folder"
+msgstr ""
+"Ei saa liigutada faili:\n"
+"%s\n"
+"iseendasse."
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Kataloogi loomine ebaõnnestus"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr ""
+
+#: src/utilops.c:1212
+#, fuzzy, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Ei saa luua kataloogi:\n"
+"%s"
+
+#: src/utilops.c:1216
+#, fuzzy
+msgid "Turn off safe delete"
+msgstr "Küsi nõusolekut faili kustutamisel"
+
+#: src/utilops.c:1234
+#, fuzzy, c-format
+msgid "Safe delete: %s"
+msgstr "Küsi nõusolekut faili kustutamisel"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Ei saa kustutada faili:\n"
+" %s\n"
+" Jätkata teiste failide kustutamist?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr ""
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Kustuta failid"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Failide ümber nimetamine"
+
+#: src/utilops.c:1438
+#, fuzzy, c-format
+msgid "Review %d files"
+msgstr "%d faili"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Kustuta fail"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Kustuta fail"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Faili ümbernimetamine ebaõnnestus:\n"
+"%s\n"
+" failiks:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Viga faili ümbernimetamisel"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Ei saa teostada automaatset ümbernimetamist\n"
+"etteantud numbrijadaga, kuna tulemuste nimekirjast\n"
+"eksisteerib juba vähemalt üks fail.\n"
+
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"Faili %s ümbernimetamine\n"
+"ebaõnnestus.\n"
+"Number oli %d."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Abi - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "Failide ümber nimetamine"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr ""
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Faili nimi:"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "Nimeta ümber:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Alusta teksti"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "Algus #"
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Lõpeta tekst"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "Täidis:"
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Ei saa ümber nimetada faili:\n"
+"%s\n"
+"failiks:\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr ""
+"Nimeta fail:\n"
+"%s\n"
+"ümber:"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Kataloog:\n"
+"%s\n"
+"on juba olemas."
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Failid"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"Kataloogitee:\n"
+"%s\n"
+"juba eksisteerib failina."
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Abi - GQview"
+
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Loo kataloog:\n"
+"%s\n"
+"nimega:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "uus_kataloog"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr ""
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+#, fuzzy
+msgid "_Slideshow"
+msgstr "Slaidiseanss"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Rekursiivne slaidiseanss"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+#, fuzzy
+msgid "Find _duplicates..."
+msgstr "Otsi duplikaadid..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Rekursiivne duplikaatide otsimine..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+#, fuzzy
+msgid "_New folder..."
+msgstr "Uus kataloog..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+#, fuzzy
+msgid "View as _tree"
+msgstr "Näita kataloogipuud"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+#, fuzzy
+msgid "Re_fresh"
+msgstr "Uuenda"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+#, fuzzy
+msgid "_Sort"
+msgstr "Sorteerimine"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+#, fuzzy
+msgid "View as _icons"
+msgstr "Nimekiri ikoonidena"
+
+#: src/view_file_list.c:421
+#, fuzzy
+msgid "Show _thumbnails"
+msgstr "Näita pisipilte"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Vigane faili nimi:\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "Puhasta pisipildid"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/Fail/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/Fail/_Uus kollektsioon"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Fail/_Ava kollektsioon"
+
+#~ msgid "/File/sep1"
+#~ msgstr "/Fail/sep1"
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/Fail/_Nimeta ümber..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Fail/Otsi _duplikaate"
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Fail/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Fail/_Nimeta ümber..."
+
+#, fuzzy
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "Uus kataloog..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Fail/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Fail/Ko_peeri..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Fail/_Liiguta..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Fail/_Nimeta ümber..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Fail/Ku_stuta..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Fail/sep4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/Fail/_Sulge aken"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Fail/_Välju"
+
+#~ msgid "/_Edit"
+#~ msgstr "/_Redaktor"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Redaktor/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Redaktor/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Redaktor/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Redaktor/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Redaktor/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Redaktor/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Redaktor/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Redaktor/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Redaktor/editor8"
+
+#, fuzzy
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Redaktor/editor1"
+
+#, fuzzy
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Redaktor/editor1"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Redaktor/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Redaktor/_Kohanda"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Redaktor/_Omadused"
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Redaktor/Kohanda/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Redaktor/Kohanda/Pööra pä_ripäeva"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Redaktor/Kohanda/Pööra _vastupäeva"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Redaktor/Kohanda/Pööra _180"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Redaktor/Kohanda/_Peegelda"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Redaktor/Kohanda/Pööra ümber _telje"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Redaktor/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Redaktor/V_ali kõik"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Redaktor/Tühista _valik"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Redaktor/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Redaktor/_Häälestus"
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Redaktor/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Redaktor/Sea _taustapildiks"
+
+#~ msgid "/_View"
+#~ msgstr "/_Vaade"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Vaade/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Vaade/Suu_renda"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Vaade/_Vähenda"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Vaade/_Originaalsuurus"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Vaade/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Vaade/P_isipildid"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Vaade/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Vaade/_Täisekraan-vaade"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Vaade/sep3"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Vaade/P_eida failide nimekiri"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/Vaade/sep4"
+
+#, fuzzy
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Vaade/Suu_renda"
+
+#, fuzzy
+#~ msgid "/View/sep5"
+#~ msgstr "/Vaade/sep1"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Vaade/_Slaidiseanss"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Vaade/_Uuenda nimekirju"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Abi/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Abi/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "GQview konfiguratsioon"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Redaktor/_Eemalda vanad pisipildid"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Kataloogitee"
+
+#~ msgid "Save"
+#~ msgstr "Salvesta"
+
+#~ msgid "Close"
+#~ msgstr "Sulge"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Kas kirjutada kollektsioonide fail üle:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "Salvesta kollektsioon kui:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "Ava kollektsioon:"
+
+#~ msgid "Open"
+#~ msgstr "Ava"
+
+#~ msgid "Append collection from:"
+#~ msgstr "Lisa kollektsioon:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Välju"
+
+#~ msgid "Exit"
+#~ msgstr "Välju"
+
+#~ msgid "Ok"
+#~ msgstr "Sobib"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Vigane failinimi"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Käivitamisel näita seda kataloogi:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Suurendus (mastaapimine):"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Paiguta dialoogid hiire alla"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Näita faile tüüpidega:"
+
+#~ msgid "Remove"
+#~ msgstr "Eemalda"
+
+#~ msgid "Command Line"
+#~ msgstr "Käsurida"
+
+#, fuzzy
+#~ msgid "Help"
+#~ msgstr "/_Abi"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "Täisekraan-vaade"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Faili suurus:"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Kas kirjutada fail:\n"
+#~ " %s\n"
+#~ " üle failiga:\n"
+#~ " %s?"
+
+#~ msgid "Yes"
+#~ msgstr "Jah"
+
+#~ msgid "Yes to all"
+#~ msgstr "Jah kõigile"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Kas kirjutada fail:\n"
+#~ "%s\n"
+#~ " üle failiga:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Kopeeri fail:\n"
+#~ "%s\n"
+#~ "faili:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Liiguta fail:\n"
+#~ "%s\n"
+#~ "faili:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Infot mitme faili kustutamise kohta..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Kas kirjutada fail:%s üle ümbernimetamisega:\n"
+#~ "%s?"
+
+#~ msgid "to:"
+#~ msgstr "failiks:"
+
+#~ msgid "Create"
+#~ msgstr "Loo"
+
+#~ msgid "Initial directory"
+#~ msgstr "Algkataloog"
+
+#~ msgid "New Directory"
+#~ msgstr "Uus kataloog"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Ei saa luua kataloogi:\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "Viga kataloogi loomisel"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "Vigane sihtkoht"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/Vaade/_Slaidiseanss"
+
+#~ msgid "Add contents"
+#~ msgstr "Lisa sisu"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "Lisa sisu rekursiivselt"
+
+#~ msgid "Skip directories"
+#~ msgstr "Jäta kataloogid vahele"
+
+#~ msgid "Invalid directory"
+#~ msgstr "Vigane kataloog"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - kopeerimine"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - liigutamine"
+
+#~ msgid "Directory exists"
+#~ msgstr "Kataloog on juba olemas"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - uue kataloogi loomine"
+
+#~ msgid "Misc."
+#~ msgstr "Mitmesugust"
+
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/Fail/Loo _kataloog..."
+
+#~ msgid "Edit"
+#~ msgstr "Redaktor"
+
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "Fail lisatakse kursori asukohale"
+
+#~ msgid "File named %s already exists."
+#~ msgstr "Fail nimega %s on juba olemas."
+
+#, fuzzy
+#~ msgid "Date:"
+#~ msgstr "Kuupäev"
+
+#, fuzzy
+#~ msgid "top"
+#~ msgstr "failiks:"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview jooksutab: %s\n"
+
+#~ msgid "Electric Eyes"
+#~ msgstr "Electric Eyes"
+
+#~ msgid "Apply"
+#~ msgstr "Rakenda"
+
+#~ msgid "format: [.foo;.bar]"
+#~ msgstr "formaat: [.foo;.bar]"
diff --git a/po/fi.po b/po/fi.po
new file mode 100644 (file)
index 0000000..55279e4
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,4201 @@
+# GQview Finnish translation.
+# Copyright (C) 2001, 2002, 2003, 2004 Lauri Nurmi
+# Lauri Nurmi <lanurmi@iki.fi>, 2001-2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview 1.3.8\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2004-02-05 23:27+0200\n"
+"Last-Translator: Lauri Nurmi <lanurmi@iki.fi>\n"
+"Language-Team: Gnome Finnish Translation Team <gnome-fi-laatu@lists."
+"sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+# src/preferences.c:368
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Työkalut"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "aukko"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+# src/utilops.c:980
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Tiedostonimi:"
+
+# src/ui_pathsel.c:799
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Tiedoston päiväys:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+# src/dupe.c:1948
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Vertaa:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Tallenna kokoelma"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "Tunniste"
+
+# src/dupe.c:1652 src/dupe.c:1941
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Nimi"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "Arvo"
+
+# src/preferences.c:401
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "Muoto"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "Alkioita"
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "Kuvaus"
+
+# src/main.c:622
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "EXIF"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "Edistynyt näkymä"
+
+# src/utilops.c:664 src/utilops.c:676
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Poisto epäonnistui"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+# src/utilops.c:1144
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Kansio:\n"
+"%s\n"
+"on jo olemassa."
+
+# src/collect-dlg.c:206
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Tyhjä kokoelma"
+
+# src/collect-dlg.c:82 src/collect.c:1011
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Kokoelman tallennus ei onnistunut:\n"
+"%s"
+
+# src/collect-dlg.c:83 src/collect.c:1012
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Tallennus epäonnistui"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "Lisää kirjanmerkki"
+
+# src/preferences.c:897
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Kokoelmat"
+
+# src/dupe.c:1652 src/dupe.c:1941
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "Nimi:"
+
+# src/menu.c:526
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "Lajittelunhallinta"
+
+# src/preferences.c:368
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "Kansiot"
+
+# src/preferences.c:897
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Kokoelmat"
+
+# src/utilops.c:592
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Kopioi"
+
+# src/utilops.c:601
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Siirrä"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+# src/collect-table.c:86
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d kuvaa"
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Valinnat pois"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "Peru edellinen kuva"
+
+# src/preferences.c:400
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "valmis"
+
+# src/dupe.c:841
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Luetaan yhtäläisyystietoja..."
+
+# src/cache_maint.c:245
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Poistetaan pienoiskuvia..."
+
+# src/cache_maint.c:249
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Poistetaan vanhoja pienoiskuvia..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+# src/collect-dlg.c:59
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Virheellinen tiedostonimi"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+# src/preferences.c:603
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Säilytä pienoiskuvat"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Alku"
+
+# src/preferences.c:368
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "Kansio:"
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Valinnat pois"
+
+# src/collect-dlg.c:59
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Virheellinen tiedostonimi"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "ajetaan..."
+
+# src/cache_maint.c:245
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Poistetaan pienoiskuvia..."
+
+# src/preferences.c:163 src/preferences.c:604
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Tyhjennä välimuisti"
+
+# src/preferences.c:163
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Tämä toiminto poistaa kaikki levylle tallennetut\n"
+"pienoiskuvat, jatketaanko?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "Kuvan ominaisuudet - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+# src/fullscreen.c:117
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview-kokoruutu"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "toiminta"
+
+# src/dupe.c:1412 src/dupe.c:1570
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "Tyhjennä"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+# src/preferences.c:603
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "Säilytä pienoiskuvat"
+
+# src/preferences.c:603
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "Näytä pienoiskuvat"
+
+# src/ui_pathsel.c:437 src/ui_pathsel.c:460 src/utilops.c:944
+# src/utilops.c:1095
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "Nimeä uudelleen"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+# src/collect.c:329 src/image.c:1058
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Nimetön"
+
+# src/collect.c:333
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Nimetön (%d)"
+
+# src/collect.c:930
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - GQview-kokoelma"
+
+# src/collect.c:1048
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Sulje kokoelma"
+
+# src/collect.c:1048
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Kokoelmaa on muutettu.\n"
+"Tallennetaanko?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+# src/collect-dlg.c:58
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Annettu polku:\n"
+"%s\n"
+"on kansio, kokoelmat ovat tiedostoja"
+
+# src/collect-dlg.c:59
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Virheellinen tiedostonimi"
+
+# src/collect-dlg.c:69
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Korvaa tiedosto"
+
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Korvaa tiedosto"
+
+# src/collect-dlg.c:73 src/utilops.c:463 src/utilops.c:830 src/utilops.c:1036
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Korvaa"
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Tallenna kokoelma"
+
+# src/collect-dlg.c:172
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Avaa kokoelma"
+
+# src/collect-dlg.c:180
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Lisää kokoelma"
+
+# src/collect-dlg.c:182
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Lisää"
+
+# src/collect-dlg.c:194
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Kokoelmatiedostot"
+
+# src/collect-dlg.c:206
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Tyhjä kokoelma"
+
+# src/collect-dlg.c:206
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Nykyinen kokoelma on tyhjä, tallennus keskeytetty."
+
+# src/collect-table.c:78 src/menu.c:684
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Tyhjä"
+
+# src/collect-table.c:82
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d kuvaa (%d)"
+
+# src/collect-table.c:86
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d kuvaa"
+
+# src/collect-table.c:100 src/dupe.c:668 src/filelist.c:1813
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Ladataan pienoiskuvia..."
+
+# src/menu.c:753
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "_Näytä"
+
+# src/collect-table.c:620 src/dupe.c:1388 src/dupe.c:1560 src/img-view.c:801
+# src/menu.c:906 src/menu.c:964
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "Näytä _uudessa ikkunassa"
+
+# src/collect-table.c:622 src/dupe.c:1410 src/dupe.c:1568
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "P_oista"
+
+# src/collect-table.c:624
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Lisää tiedostoluettelosta"
+
+# src/collect-table.c:625
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Lisää kokoelmasta..."
+
+# src/collect-table.c:627 src/dupe.c:1391 src/dupe.c:1563
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Valitse kaikki"
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Valinnat pois"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "Ominaisuud_et"
+
+# src/collect-table.c:633 src/dupe.c:1401 src/img-view.c:804 src/menu.c:910
+# src/menu.c:969
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "_Kopioi..."
+
+# src/collect-table.c:634 src/dupe.c:1403 src/img-view.c:805 src/menu.c:912
+# src/menu.c:971
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "Sii_rrä..."
+
+# src/collect-table.c:635 src/dupe.c:1405 src/img-view.c:806 src/menu.c:914
+# src/menu.c:973
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "_Nimeä uudelleen..."
+
+# src/collect-table.c:636 src/dupe.c:1407 src/img-view.c:807 src/menu.c:916
+# src/menu.c:975
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "_Poista..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "_Näytä tiedostonimet"
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "_Tallenna kokoelma"
+
+# src/collect-table.c:642
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "T_allenna kokoelma nimellä..."
+
+# src/collect-table.c:644 src/menu.c:885
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "Etsi _kaksoiskappaleita..."
+
+# src/menu.c:721
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Tiedosto/Nime_ä uudelleen..."
+
+# src/collect-table.c:1818 src/dupe.c:2170
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "Pudotettu luettelo sisältää kansioita."
+
+# src/collect-table.c:1820 src/dupe.c:2172
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "_Lisää sisältö"
+
+# src/collect-table.c:1821 src/dupe.c:2173
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "Lisää sisältö myös _alikansioista"
+
+# src/collect-table.c:1822 src/dupe.c:2174
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "_Ohita kansiot"
+
+# src/collect-table.c:1824 src/dupe.c:2176 src/preferences.c:536
+# src/ui_utildlg.c:105
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Peru"
+
+# src/dupe.c:61
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Pudota tiedostoja vertailua varten."
+
+# src/dupe.c:67 src/dupe.c:1449
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d tiedostoa"
+
+# src/dupe.c:71
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%2$d tiedostosta löytynyt %1$d osumaa"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[ryhmä 1]"
+
+# src/dupe.c:775
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Luetaan tarkistussummia..."
+
+# src/dupe.c:807
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Luetaan ulottuvuuksia..."
+
+# src/dupe.c:841
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Luetaan yhtäläisyystietoja..."
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Verrataan..."
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "Lajitellaan..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "Valitse ryhmän _1 kaksoiskappaleet"
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "Valitse ryhmän _2 kaksoiskappaleet"
+
+# src/dupe.c:1398
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Lisää uuteen kokoelmaan"
+
+# src/dupe.c:1412 src/dupe.c:1570
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "T_yhjennä"
+
+# src/dupe.c:1415 src/dupe.c:1573 src/img-view.c:841
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "Sulje _ikkuna"
+
+# src/filelist.c:88
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "%d tiedostoa (ryhmä 2)"
+
+# src/dupe.c:1653 src/dupe.c:1942
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Koko"
+
+# src/dupe.c:1654 src/dupe.c:1943
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Päiväys"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Ulottuvuudet"
+
+# src/dupe.c:1656
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Tarkistussumma"
+
+# src/dupe.c:1657 src/dupe.c:1945
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Polku"
+
+# src/dupe.c:1658
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Yhtäläisyys (suuri)"
+
+# src/dupe.c:1659
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Yhtäläisyys"
+
+# src/dupe.c:1660
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Yhtäläisyys (vähäinen)"
+
+# src/dupe.c:1660
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Yhtäläisyys (mukautettu)"
+
+# src/dupe.c:1968
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Kaksoiskappaleiden etsintö - GQview"
+
+# src/dupe.c:1948
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Vertaa:"
+
+# src/dupe.c:2045
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Vertailuperuste:"
+
+# src/dupe.c:2054 src/preferences.c:586
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Pienoiskuvat"
+
+# src/dupe.c:2060
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Vertaa kahta tiedostoryhmää"
+
+# src/main.c:552
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "Gimp"
+
+# src/main.c:558
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+# src/main.c:561
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+# src/menu.c:572
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "Käännä jpeg-kuvaa myötäpäivään"
+
+# src/menu.c:575
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "Käännä jpeg-kuvaa vastapäivään"
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "pysähdytään..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "Muokkauskomennon tulokset"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "Ohjelman %s tuloste"
+
+# src/ui_help.c:191
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Komennon:\n"
+"%s ajaminen ei onnistunut.\n"
+
+# src/menu.c:522
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "käyttäjä pysäytti"
+
+# src/menu.c:432 src/menu.c:461
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "tuntematon"
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/exif.c:113
+msgid "top left"
+msgstr "ylin vasemmalla"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "ylin oikealla"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "alin oikealla"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "alin vasemmalla"
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/exif.c:117
+msgid "left top"
+msgstr "vasen ylimpänä"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "oikea ylimpänä"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "oikea alimpana"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "vasen alimpana"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "tuuma"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "senttimetri"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "keskimööröinen"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "keskipainotettu"
+
+#: src/exif.c:142
+msgid "spot"
+msgstr "piste"
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr "monipiste"
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr "monilohko"
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "osittainen"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "muu"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "määrittelemätön"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "käsikäyttöinen"
+
+# src/preferences.c:401
+#: src/exif.c:153
+msgid "normal"
+msgstr "normaali"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "aukko"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "suljin"
+
+# src/utilops.c:1216
+#: src/exif.c:156
+msgid "creative"
+msgstr "luova"
+
+#: src/exif.c:157
+msgid "action"
+msgstr "toiminta"
+
+# Nimenomaan näin, ei pysty ja vaaka.
+#: src/exif.c:158
+msgid "portrait"
+msgstr "muotokuva"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "maisema"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "päivänvalo"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "fluoresoiva"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "volframi (hehkuva)"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "salama"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "ei"
+
+# src/utilops.c:343
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "kyllä"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr "kyllä, ei sensorin havaitsema"
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr "kyllä, sensorin havaitsema"
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "Kuvaus"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "Suunta"
+
+# src/utilops.c:592
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "Tekijänoikeus"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "Valotusohjelma"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "ISO-herkkyys"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "Alkuperäinen päiväys"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "Digitointipäiväys"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "Valotusaika"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "Aukko"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "Valotuksen esiasetus"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "Kohteen etäisyys"
+
+# src/preferences.c:693
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "Mittaustapa"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "Valonlähde"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "Salama"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "Polttoväli"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "Leveys"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "Korkeus"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "Tarkkuus"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "äärettömyys"
+
+# src/preferences.c:368
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "tila:"
+
+# src/preferences.c:400
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "käytössä"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "ei käytössä"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "automaattinen"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr "ei sensorin havaitsema"
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr "sensorin havaitsema"
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "punasilmäisyyden vähennys"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "pistettä"
+
+# src/dupe.c:67 src/dupe.c:1449
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d tavua"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f kt"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f Mt"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f Gt"
+
+# src/fullscreen.c:117
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview-kokoruutu"
+
+# src/preferences.c:368
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Tiedoston koko:"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+# src/img-view.c:792 src/menu.c:947 src/menu.c:1083 src/preferences.c:716
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Sovita kuva ikkunaan"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+# src/img-view.c:789 src/menu.c:944 src/menu.c:1079
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "L_ähennä"
+
+# src/img-view.c:790 src/menu.c:945 src/menu.c:1081
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "L_oitonna"
+
+# src/img-view.c:791 src/menu.c:946
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "Suhde _1:1"
+
+# src/img-view.c:792 src/menu.c:947 src/menu.c:1083 src/preferences.c:716
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "Sovita kuva _ikkunaan"
+
+# src/img-view.c:797 src/menu.c:960
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "Aseta _taustakuvaksi"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "Lopeta dia_esitys"
+
+# src/img-view.c:816 src/menu.c:985
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "Jatka _diaesitystä"
+
+# src/img-view.c:820 src/img-view.c:827 src/menu.c:989 src/menu.c:995
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "Pysäytä _diaesitys"
+
+# src/img-view.c:825 src/menu.c:994
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "_Aloita diaesitys"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "Poistu k_okoruudusta"
+
+# src/img-view.c:837 src/menu.c:1001
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "K_okoruutu"
+
+# src/dupe.c:1415 src/dupe.c:1573 src/img-view.c:841
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "Su_lje ikkuna"
+
+# src/preferences.c:368
+#: src/info.c:361
+msgid "File size:"
+msgstr "Tiedoston koko:"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Ulottuvuudet:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Läpinäkyvä:"
+
+# src/preferences.c:676
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Kuvan koko:"
+
+# src/dupe.c:1948
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Pakkaussuhde:"
+
+# src/ui_pathsel.c:799
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Tiedoston päiväys:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Omistaja:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Ryhmä:"
+
+# src/preferences.c:551
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Yleiset"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "Kuva %d/%d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Kuvan ominaisuudet - GQview"
+
+# src/window.c:87
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Nouseva"
+
+# src/filelist.c:76
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Diaesitys"
+
+# src/filelist.c:80
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Pysäytetty"
+
+# src/filelist.c:86
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d tiedostoa (%s, %d)%s"
+
+# src/filelist.c:88
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d tiedostoa%s"
+
+# src/filelist.c:88
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d tiedostoa%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(ei lukuoikeutta) %s tavua"
+
+# src/window.c:379
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? × ? ) %s tavua"
+
+# src/window.c:383
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d × %d ) %s tavua"
+
+# src/window.c:234
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview-työkalut"
+
+# src/preferences.c:368
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Työkalut"
+
+# src/preferences.c:368
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "Tiedostot"
+
+# src/preferences.c:676
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Kuva"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(vedä järjestyksen vaihtamiseksi)"
+
+# src/menu.c:1010
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "Piilota _tiedostoluettelo"
+
+# src/menu.c:430 src/menu.c:457
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "Ohjelmassa %s..."
+
+# src/menu.c:432 src/menu.c:461
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "(tuntemattomassa)..."
+
+# src/collect-table.c:78 src/menu.c:684
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Tyhjä"
+
+# src/menu.c:709
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Tiedosto"
+
+# src/menu.c:726
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "_Muokkaa"
+
+# src/menu.c:626
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "_Säädä"
+
+# src/menu.c:771
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/_Ohje"
+
+# src/menu.c:711
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Tiedosto/_Uusi ikkuna"
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "_Tallenna kokoelma"
+
+# src/collect-dlg.c:172
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Avaa kokoelma"
+
+# src/menu.c:713
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Tiedosto/Avaa ä_skettäin käytetty"
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Lajitellaan..."
+
+# src/menu.c:721
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Tiedosto/Nime_ä uudelleen..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "_Uusi kansio..."
+
+# src/preferences.c:684
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Laatu"
+
+# src/menu.c:572
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "_Käännä myötäpäivään"
+
+# src/menu.c:575
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "Käännä _vastapäivään"
+
+# src/menu.c:578
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Käännä _180°"
+
+# src/menu.c:581
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "_Peilikuva"
+
+# src/menu.c:584
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "_Ylösalaisin"
+
+# src/collect-table.c:627 src/dupe.c:1391 src/dupe.c:1563
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Valitse kaikki"
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Valinnat pois"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "_Ominaisuudet..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+# src/menu.c:758
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Näytä/_Sovita"
+
+# src/img-view.c:837 src/menu.c:1001
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "K_okoruutu"
+
+# src/menu.c:1010
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Piilota _tiedostoluettelo"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "Lopeta dia_esitys"
+
+# src/menu.c:891 src/menu.c:920
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "Pä_ivitä"
+
+# src/menu.c:776
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Ohje/_Tietoja"
+
+# src/menu.c:773
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Ohje/_Pikanäppäimet"
+
+# src/menu.c:774
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Help/_Julkaisutietoja"
+
+# src/menu.c:776
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Ohje/_Tietoja"
+
+# src/dupe.c:2054 src/preferences.c:586
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Pienoiskuvat"
+
+# src/menu.c:768
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Näytä/P_uu"
+
+# src/menu.c:766
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Näytä/Tiedostoluettelon ke_llutus"
+
+# src/menu.c:754
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Näytä/Piilota ty_ökalurivi"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "/Näytä/Ku_vakkeet"
+
+# src/menu.c:765
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Näytä/E_XIF-tiedot"
+
+# src/menu.c:526
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Lajittelunhallinta"
+
+# src/menu.c:765
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Näytä/Lu_ettelo"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Kuvake:"
+
+# src/preferences.c:603
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Näytä pienoiskuvat"
+
+# src/menu.c:1075
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Siirry kotikansioon"
+
+# src/menu.c:1077
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Virkistä tiedostoluettelo"
+
+# src/img-view.c:789 src/menu.c:944 src/menu.c:1079
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Lähennä"
+
+# src/img-view.c:790 src/menu.c:945 src/menu.c:1081
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Loitonna"
+
+# src/img-view.c:792 src/menu.c:947 src/menu.c:1083 src/preferences.c:716
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Sovita kuva ikkunaan"
+
+# src/menu.c:1085
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Aseta suhde 1:1"
+
+# src/menu.c:1087
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Muuta asetuksia"
+
+# src/menu.c:1089
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Kelluta työkalut"
+
+# src/main.c:129
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Ohje - GQview"
+
+# src/main.c:743
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Komentorivi"
+
+# src/preferences.c:660
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Lataa seuraava kuva etukäteen"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "Peru edellinen kuva"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Peru edellinen kuva"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "Poistu k_okoruudusta"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "Poistu k_okoruudusta"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "Poistu k_okoruudusta"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "Lopeta dia_esitys"
+
+# src/img-view.c:825 src/menu.c:994
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "_Aloita diaesitys"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "Lopeta dia_esitys"
+
+# src/img-view.c:825 src/menu.c:994
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "_Aloita diaesitys"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+# src/window.c:234
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview-työkalut"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+# src/utilops.c:1090
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr "Nimeä uudelleen tiedosto:"
+
+# src/collect-table.c:620 src/dupe.c:1388 src/dupe.c:1560 src/img-view.c:801
+# src/menu.c:906 src/menu.c:964
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Näytä _uudessa ikkunassa"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+# src/main.c:457
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Käyttö: gqview [valitsimet] [polku]\n"
+"\n"
+
+# src/main.c:458
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "kelvolliset valitsimet ovat:\n"
+
+# src/main.c:459
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           näytä työkalut\n"
+
+# src/main.c:460
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        piilota työkalut\n"
+
+# src/main.c:461
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           käynnistä kokoruututilassa\n"
+
+# src/main.c:462
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            käynnistä diaesitystilassa\n"
+
+# src/main.c:463
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr "  -l, --list                 avaa kokoelmaikkuna komentoriville\n"
+
+# src/main.c:463
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr "  -l, --list                 avaa kokoelmaikkuna komentoriville\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+# src/main.c:464
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    näytä vianetsintäviestit\n"
+
+# src/main.c:465
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              näytä versiotiedot\n"
+
+# src/main.c:466
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 näytä tämä ohje\n"
+"\n"
+
+# src/main.c:471
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"epäkelpo tai hylätty: %s\n"
+"--help näyttää valitsimet\n"
+
+# src/main.c:533
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Luodaan GQview-kansiota: %s\n"
+
+# src/main.c:536
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Kansion luominen ei onnistunut:%s\n"
+
+# src/ui_pathsel.c:754
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Koti"
+
+# src/utilops.c:989
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "Työpöytä"
+
+# src/main.c:619
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - poistuminen"
+
+# src/main.c:129
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "Tietoja - GQview"
+
+# src/main.c:619
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Kokoelmia on muutettu.\n"
+"Lopetetaanko silti?"
+
+# src/menu.c:510
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "Lajittelu koon mukaan"
+
+# src/menu.c:513
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "Lajittelu päiväyksen mukaan"
+
+# src/menu.c:516
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Lajittelematon"
+
+# src/menu.c:519
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "Lajittelu polun mukaan"
+
+# src/menu.c:522
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "Lajittelu numeron mukaan"
+
+# src/menu.c:526
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "Lajittelu nimen mukaan"
+
+# src/menu.c:559
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Lajittele"
+
+# src/menu.c:578
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "Käännä _180°"
+
+# src/preferences.c:367
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Lähin (huonoin, mutta nopein)"
+
+# src/preferences.c:368
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Ruudut"
+
+# src/preferences.c:369
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilineaarinen"
+
+# src/preferences.c:370
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Hyper (paras, mutta hitain)"
+
+# src/preferences.c:400
+#: src/preferences.c:418
+msgid "None"
+msgstr "Ei mitään"
+
+# src/preferences.c:401
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normaali"
+
+# src/preferences.c:402
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Paras"
+
+#: src/preferences.c:498 src/print.c:365
+#, fuzzy
+msgid "Custom"
+msgstr "automaattinen"
+
+# src/utilops.c:707
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "Suodattimien oletukset"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Tämä palauttaa suodattimet oletusasetuksiin.\n"
+"Jatketaanko?"
+
+# src/utilops.c:707
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "Muokkainten oletukset"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Tämä palauttaa muokkauskomennot oletusasetuksiin.\n"
+"Jatketaanko?"
+
+# src/preferences.c:163 src/preferences.c:604
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "Roskakorin tyhjennys"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "Roskakorin sisältö poistetaan."
+
+# src/utilops.c:942 src/utilops.c:1091
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - uudelleennimeäminen"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "Alku"
+
+# src/menu.c:1075
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Siirry kotikansioon"
+
+# src/preferences.c:581
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Käytä nykyistä"
+
+# src/preferences.c:595
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Koko:"
+
+# src/preferences.c:597
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Laatu:"
+
+# src/preferences.c:603
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Säilytä pienoiskuvat"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+# src/preferences.c:610
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Tallenna pienoiskuvat kansioon .thumbnails"
+
+# src/preferences.c:613
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Käytä xvpics-pienoiskuvia jos löytyy (vain luku)"
+
+# src/preferences.c:615
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Diaesitys"
+
+# src/preferences.c:628
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Viive kuvien välissä (sekunteja):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+# src/preferences.c:645
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Satunnainen"
+
+# src/preferences.c:647
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Toisto"
+
+# src/img-view.c:789 src/menu.c:944 src/menu.c:1079
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Lähennä"
+
+# src/preferences.c:693
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Pehmennystapa:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Kaksivaiheinen suhteutus"
+
+# src/preferences.c:729
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Salli kuvan laajentaminen sen sovittamiseksi ikkunaan."
+
+# src/preferences.c:751
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Suhteen lisäys:"
+
+# src/preferences.c:700
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Kun uusi kuva on valittu:"
+
+# src/preferences.c:710
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Näytä kuva alkuperäisessä suhteessa"
+
+# src/preferences.c:722
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Jätä suhde edelliseen asetukseen"
+
+# src/collect-dlg.c:182
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Lisää"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Musta tausta"
+
+# src/utilops.c:328 src/utilops.c:394 src/utilops.c:668
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Jatka"
+
+# src/menu.c:1077
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "Virkistä tiedostoa vaihdettaessa"
+
+# src/preferences.c:660
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Lataa seuraava kuva etukäteen"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Käännä kuva automaattisesti EXIF-tietojen perusteella"
+
+# src/preferences.c:773
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Ikkunat"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Alku"
+
+# src/preferences.c:782
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Muista ikkunoiden sijainnit"
+
+# src/preferences.c:784
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Muista työkalujen tila (kelluva/piilotettu)"
+
+# src/preferences.c:787
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "Sovita ikkuna kuvan mukaan kun työkalut kelluvat/piilotettu"
+
+# src/preferences.c:794
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Rajoita ikkunan koko automattisessa koonmuutoksessa (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Näkymä"
+
+# src/preferences.c:812
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Suodatus"
+
+# src/preferences.c:821
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Näytä nimet, jotka alkavat pisteellä"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "Kirjainkoon huomioiva lajittelu"
+
+# src/preferences.c:823
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Ei tiedostojen suodatusta"
+
+# src/ui_pathsel.c:799
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Tiedoston päiväys:"
+
+# src/ui_pathsel.c:799
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "Suodatin"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "Oletukset"
+
+# src/preferences.c:915
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Muokkaus"
+
+# src/preferences.c:927
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+# src/preferences.c:930
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Valikkonimi"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "Lisäasetukset"
+
+# src/img-view.c:837 src/menu.c:1001
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "K_okoruutu"
+
+# src/preferences.c:676
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Kuvan koko:"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Poista"
+
+# src/preferences.c:667
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Varmista tiedoston poistaminen"
+
+# src/preferences.c:669
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Ota käyttöön Delete-näppäin"
+
+# src/preferences.c:667
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "Turvallinen poisto"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Enimmäiskoko (Mt)"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+# src/collect-table.c:619 src/dupe.c:1386 src/dupe.c:1558
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Näytä"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+# src/preferences.c:906
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Nelikulmiovalinta"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Laajenna kansiot puunäkymässä"
+
+# src/preferences.c:658
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Uudelleennimeäminen"
+
+#: src/preferences.c:1200
+#, fuzzy
+msgid "Navigation"
+msgstr "toiminta"
+
+# src/preferences.c:764
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Nopeutuva näppäimistövieritys"
+
+# src/preferences.c:766
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Hiiren rulla vierittää kuvaa"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+# src/preferences.c:875
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "Mukautetun yhtäläisyyden kynnys:"
+
+# src/preferences.c:735
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Ruudun ulkopuolisen välimuistin koko (Mt/kuva):"
+
+# src/main.c:129
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "Tietoja - GQview"
+
+# src/preferences.c:1041
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright © %s John Ellis\n"
+"www-sivu: %s\n"
+"sähköposti: %s\n"
+"\n"
+"Julkaistu GNU GPL -lisenssillä"
+
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "Muut tekijät..."
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Valinnat pois"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+#, fuzzy
+msgid "Default printer"
+msgstr "Oletukset"
+
+# src/preferences.c:875
+#: src/print.c:138
+#, fuzzy
+msgid "Custom printer"
+msgstr "Mukautetut tiedostotyypit:"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+# src/preferences.c:676
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Kuvan koko:"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+# src/main.c:561
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+#, fuzzy
+msgid "centimeters"
+msgstr "senttimetri"
+
+#: src/print.c:353
+#, fuzzy
+msgid "inches"
+msgstr "tuuma"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+# Nimenomaan näin, ei pysty ja vaaka.
+#: src/print.c:359
+#, fuzzy
+msgid "Portrait"
+msgstr "muotokuva"
+
+#: src/print.c:360
+#, fuzzy
+msgid "Landscape"
+msgstr "maisema"
+
+#: src/print.c:366
+#, fuzzy
+msgid "Letter"
+msgstr "senttimetri"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, fuzzy, c-format
+msgid "page %d of %d"
+msgstr "Kuva %d/%d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "Esikatselu"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+# src/ui_pathsel.c:307
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "Tiedosto %s on jo olemassa."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+# src/ui_pathsel.c:799
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Suodatin"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Oletukset"
+
+# src/main.c:129
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "Tietoja - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+# src/preferences.c:401
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Muoto"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Suunta"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Kuvaus"
+
+# src/utilops.c:980
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Tiedostonimi:"
+
+# src/collect.c:329 src/image.c:1058
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Nimetön"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+# src/preferences.c:400
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "käytössä"
+
+# src/menu.c:559
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Lajittele"
+
+# src/preferences.c:676
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Kuvan koko:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "aukko"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+#, fuzzy
+msgid "Right:"
+msgstr "Korkeus"
+
+#: src/print.c:3432
+#, fuzzy
+msgid "Top:"
+msgstr "Ryhmä:"
+
+# src/utilops.c:989
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "nimelle:"
+
+# src/ui_pathsel.c:799
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Suodatin"
+
+# src/preferences.c:875
+#: src/print.c:3450
+#, fuzzy
+msgid "Custom printer:"
+msgstr "Mukautetut tiedostotyypit:"
+
+# src/ui_pathsel.c:799
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Suodatin:"
+
+# src/ui_pathsel.c:799
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Tiedoston päiväys:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+# src/preferences.c:782
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Muista ikkunoiden sijainnit"
+
+# src/rcfile.c:132
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "virhe tallennettaessa asetustiedostoa: %s\n"
+
+# src/preferences.c:368
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Kansio:"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Alkioita"
+
+#: src/search.c:202
+#, fuzzy
+msgid "results"
+msgstr "Oletukset"
+
+# src/utilops.c:328 src/utilops.c:394 src/utilops.c:668
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Jatka"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+# src/menu.c:1066
+#: src/search.c:213
+#, fuzzy
+msgid "greater than"
+msgstr "Luo pienoiskuvat"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+# src/ui_pathsel.c:799
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "suodatin"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+# src/filelist.c:86
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d tiedostoa (%s, %d)%s"
+
+# src/filelist.c:88
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%s, %d tiedostoa%s"
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Lajitellaan..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+# src/utilops.c:544
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Valitse olemassaoleva kansio"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+# src/utilops.c:544
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Valitse olemassaoleva kansio"
+
+#: src/search.c:2570
+#, fuzzy
+msgid "Image search - GQview"
+msgstr "Kuvan ominaisuudet - GQview"
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Lajitellaan..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+# src/utilops.c:980
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Tiedostonimi:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+# src/preferences.c:368
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Tiedoston koko:"
+
+# src/preferences.c:645
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Satunnainen"
+
+# src/ui_pathsel.c:799
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Tiedoston päiväys:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Kuvaus"
+
+# src/collect-table.c:1820 src/dupe.c:2172
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Lisää sisältö"
+
+# src/dupe.c:1659
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Yhtäläisyys"
+
+# src/preferences.c:645
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Satunnainen"
+
+# src/thumb.c:268
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "Pienoiskuva ei latautunut, yritetään luoda uudelleen.\n"
+
+# src/ui_tabcomp.c:171
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Historialistojen kirjoitus ei onnistunut kohteeseen: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "Uusi kirjanmerkki"
+
+# src/preferences.c:915
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "Muokkaa kirjanmerkkiä"
+
+# src/dupe.c:1657 src/dupe.c:1945
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "Polku:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "Kuvake:"
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Valinnat pois"
+
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "_Ominaisuudet..."
+
+# src/utilops.c:601
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "Siirrä _ylös"
+
+# src/utilops.c:601
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "Siirrä _alas"
+
+# src/collect-table.c:622 src/dupe.c:1410 src/dupe.c:1568
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "_Poista"
+
+# src/ui_help.c:191
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Tiedoston:\n"
+"%s lataaminen ei onnistunut."
+
+# src/ui_pathsel.c:313
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Tiedoston nimeäminen %s -> %s epäonnistui."
+
+# src/ui_pathsel.c:343 src/utilops.c:675 src/utilops.c:727
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Tiedoston: %s\n"
+" poistaminen ei onnistunut."
+
+# src/ui_pathsel.c:344 src/utilops.c:728
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Tiedostojen poistaminen epäonnistui"
+
+# src/ui_pathsel.c:398 src/utilops.c:760
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Poista tiedosto"
+
+# src/ui_pathsel.c:397 src/utilops.c:759
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Tiedosto poistetaan:\n"
+" %s"
+
+# src/ui_pathsel.c:437 src/ui_pathsel.c:460 src/utilops.c:944
+# src/utilops.c:1095
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "Nimeä _uudelleen"
+
+# src/preferences.c:915
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "Lisää _kirjanmerkki"
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "_Poista"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "_Uusi kansio..."
+
+# src/ui_pathsel.c:517 src/utilops.c:1158
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Kansion luominen epäonnistui:\n"
+"%s"
+
+# src/ui_pathsel.c:518 src/utilops.c:1159
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Virhe kansion luonnissa"
+
+# src/ui_pathsel.c:697
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Kaikki tiedostot"
+
+# src/ui_pathsel.c:764
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Näytä piilotetut"
+
+# src/ui_pathsel.c:799
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Suodatin:"
+
+# src/collect-table.c:627 src/dupe.c:1391 src/dupe.c:1563
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Valitse kaikki"
+
+# src/ui_pathsel.c:697
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "Kaikki tiedostot"
+
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Korvaa tiedosto"
+
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Korvaa tiedosto"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Korvaa tiedosto"
+
+# src/utilops.c:345
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Ohita kaikki"
+
+# src/utilops.c:345
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Ohita"
+
+# src/utilops.c:387 src/utilops.c:495
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Virhe tiedoston siirrossa"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "_Uusi kansio..."
+
+# src/preferences.c:930
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Automaattinen uudelleennimeäminen"
+
+# src/ui_pathsel.c:437 src/ui_pathsel.c:460 src/utilops.c:944
+# src/utilops.c:1095
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Nimeä uudelleen"
+
+# src/utilops.c:316
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Kopioinnin lähde ja kohde ovat samat"
+
+# src/utilops.c:317
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Tiedoston %s kopiointi\n"
+"samaksi ei onnistunut."
+
+# src/utilops.c:321
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Siirron lähde ja kohde ovat samat"
+
+# src/utilops.c:322
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Tiedoston %s siirto\n"
+"samaksi ei onnistunut."
+
+# src/utilops.c:328 src/utilops.c:394 src/utilops.c:668
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Jatka"
+
+# src/utilops.c:382 src/utilops.c:490
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Virhe tiedoston kopioinnissa"
+
+# src/utilops.c:383
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Tiedoston:\n"
+"%s\n"
+"kopiointi kohteeseen:\n"
+"%s\n"
+"ei onnistunut monikopioinnissa."
+
+# src/utilops.c:387 src/utilops.c:495
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Virhe tiedoston siirrossa"
+
+# src/utilops.c:388
+#: src/utilops.c:636
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Tiedoston:\n"
+"%s\n"
+"siirto kohteeseen:\n"
+"%s\n"
+"ei onnistunut monisiirrossa."
+
+# src/utilops.c:450
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Lähde ja kohde ovat samat"
+
+# src/utilops.c:451
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Lähde ja kohde ovat samat, toiminto peruutettu."
+
+# src/utilops.c:491
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Tiedoston:\n"
+"%s\n"
+"kopiointi kohteeseen:\n"
+"%s ei onnistunut."
+
+# src/utilops.c:496
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Tiedoston:\n"
+"%s\n"
+"siirto kohteeseen:\n"
+"%s ei onnistunut."
+
+# src/utilops.c:539
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Virheellinen kohde"
+
+# src/utilops.c:540
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"Käsitellessä useata tiedostoa, tulee valita\n"
+"kansio, ei tiedostoa."
+
+# src/utilops.c:544
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Valitse olemassaoleva kansio"
+
+# src/main.c:129
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Ohje - GQview"
+
+# src/utilops.c:592
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "_Kopioi"
+
+# src/utilops.c:1090
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr "Nimeä uudelleen tiedosto:"
+
+# src/utilops.c:596
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "Kopioi useita tiedostoja kohteeseen:"
+
+# src/main.c:129
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Ohje - GQview"
+
+# src/utilops.c:601
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "_Siirrä"
+
+# src/utilops.c:1090
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr "Nimeä uudelleen tiedosto:"
+
+# src/utilops.c:605
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Siirrä useita tiedostoja kohteeseen:"
+
+# src/utilops.c:980
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Tiedostonimi:"
+
+# src/utilops.c:450
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Lähde ja kohde ovat samat"
+
+# src/utilops.c:664 src/utilops.c:676
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Poisto epäonnistui"
+
+# src/utilops.c:322
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "Vanhan tiedoston poisto roskakorikansiosta ei onnistunut."
+
+# src/utilops.c:1151
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Kansiota ei voitu luoda"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "Lupa evätty"
+
+# src/ui_pathsel.c:517 src/utilops.c:1158
+#: src/utilops.c:1212
+#, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Roskakorikansion käyttäminen tai luominen epäonnistui.\n"
+"\"%s\""
+
+# src/preferences.c:667
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "Älä käytä turvallista poistoa"
+
+# src/preferences.c:667
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "Turvallinen poisto: %s"
+
+# src/utilops.c:663
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Tiedoston:\n"
+" %s poisto ei onnistunut,\n"
+" jatketaanko tiedostojen poistamista?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr "Tiedosto %d/%d"
+
+# src/utilops.c:707
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Poista tiedostot"
+
+# src/utilops.c:942
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Nimeä uudelleen useita tiedostoja:"
+
+# src/dupe.c:67 src/dupe.c:1449
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "Tarkastele %d tiedostoa"
+
+# src/ui_pathsel.c:398 src/utilops.c:760
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Poista tiedosto"
+
+# src/ui_pathsel.c:398 src/utilops.c:760
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Poista tiedosto"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+# src/utilops.c:842
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Tiedoston %s\n"
+"nimeäminen nimelle:\n"
+"%s ei onnistunut."
+
+# src/filelist.c:811 src/filelist.c:817 src/filelist.c:823 src/utilops.c:845
+# src/utilops.c:1048
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Virhe nimettäessä tiedostoa"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Valitun numerojoukon perusteella ei voida\n"
+"nimetä automaattisesti uudelleen; yksi tai\n"
+"useampi olemassaoleva tiedostonimi vastaa\n"
+"kohdeluettelon nimiä.\n"
+
+# src/ui_pathsel.c:313
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"Tiedoston %s uudelleennimeäminen\n"
+"epäonnistui. Numero oli %d."
+
+# src/main.c:129
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Ohje - GQview"
+
+# src/utilops.c:942
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "Nimeä uudelleen useita tiedostoja:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "Alkuperöinen nimi"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Alkuperöinen nimi"
+
+# src/utilops.c:980
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "Nimeä uudelleen:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Alkuteksti"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "Alku"
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Lopputeksti"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "Tasaus:"
+
+# src/filelist.c:822 src/utilops.c:1047
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Ei voitu nimetä tiedostoa:\n"
+"%s\n"
+"nimelle:\n"
+"%s"
+
+# src/utilops.c:1090
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr "Nimeä uudelleen tiedosto:"
+
+# src/utilops.c:1144
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Kansio:\n"
+"%s\n"
+"on jo olemassa."
+
+# src/preferences.c:368
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Kansiot"
+
+# src/utilops.c:1150
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"Polku:\n"
+"%s\n"
+"on jo olemassa tiedostona."
+
+# src/main.c:129
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Ohje - GQview"
+
+# src/utilops.c:1211
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Luo kansioon:\n"
+"%s\n"
+"kansio:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "uusi_kansio"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "_Yläkansioon"
+
+# src/menu.c:879
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "_Diaesitys"
+
+# src/menu.c:881
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Diaesitys alikansiot mukana"
+
+# src/collect-table.c:644 src/menu.c:885
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "Etsi _kaksoiskappaleet..."
+
+# src/menu.c:887
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Etsi kaksoiskappaleet myös alikansioista..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "_Uusi kansio..."
+
+# src/menu.c:761
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "Näytä _puuna"
+
+# src/menu.c:891 src/menu.c:920
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "Pä_ivitä"
+
+# src/menu.c:559
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "_Lajittele"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "Näytä _kuvakkeina"
+
+# src/preferences.c:603
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "Näytä _pienoiskuvat"
+
+# src/filelist.c:810
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Virheellinen tiedostonimi:\n"
+"%s"
+
+# src/cache_maint.c:252
+#~ msgid "Purge thumbnails"
+#~ msgstr "Pienoiskuvien poisto"
+
+# src/menu.c:710
+#~ msgid "/File/tear1"
+#~ msgstr "/Tiedosto/tear1"
+
+# src/menu.c:711
+#~ msgid "/File/_New collection"
+#~ msgstr "/Tiedosto/Uusi k_okoelma"
+
+# src/menu.c:712
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Tiedosto/_Avaa kokoelma..."
+
+# src/menu.c:714
+#~ msgid "/File/sep1"
+#~ msgstr "/Tiedosto/sep1"
+
+# src/menu.c:721
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/Tiedosto/Nime_ä uudelleen..."
+
+# src/menu.c:715
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Tiedosto/_Etsi kaksoiskappaleet..."
+
+# src/menu.c:716
+#~ msgid "/File/sep2"
+#~ msgstr "/Tiedosto/sep2"
+
+# src/menu.c:721
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Tiedosto/Nime_ä uudelleen..."
+
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Tiedosto/Uusi ka_nsio..."
+
+# src/menu.c:718
+#~ msgid "/File/sep3"
+#~ msgstr "/Tiedosto/sep3"
+
+# src/menu.c:719
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Tiedosto/_Kopioi"
+
+# src/menu.c:720
+#~ msgid "/File/_Move..."
+#~ msgstr "/Tiedosto/Sii_rrä..."
+
+# src/menu.c:721
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Tiedosto/Nime_ä uudelleen..."
+
+# src/menu.c:722
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Tiedosto/_Poista..."
+
+# src/menu.c:723
+#~ msgid "/File/sep4"
+#~ msgstr "/Tiedosto/sep4"
+
+# src/dupe.c:1415 src/dupe.c:1573 src/img-view.c:841
+#~ msgid "/File/C_lose window"
+#~ msgstr "/Tiedosto/_Sulje ikkuna"
+
+# src/menu.c:724
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Tiedosto/_Lopeta"
+
+# src/menu.c:726
+#~ msgid "/_Edit"
+#~ msgstr "/_Muokkaa"
+
+# src/menu.c:727
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Muokkaa/tear1"
+
+# src/menu.c:728
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Muokkaa/editor1"
+
+# src/menu.c:729
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Muokkaa/editor2"
+
+# src/menu.c:730
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Muokkaa/editor3"
+
+# src/menu.c:731
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Muokkaa/editor4"
+
+# src/menu.c:732
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Muokkaa/editor5"
+
+# src/menu.c:733
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Muokkaa/editor6"
+
+# src/menu.c:734
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Muokkaa/editor7"
+
+# src/menu.c:735
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Muokkaa/editor8"
+
+# src/menu.c:728
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Muokkaa/editor9"
+
+# src/menu.c:728
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Muokkaa/editor0"
+
+# src/menu.c:736
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Muokkaa/sep1"
+
+# src/menu.c:737
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Muokkaa/_Säädä"
+
+# src/menu.c:748
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Muokkaa/_Ominaisuudet"
+
+# src/menu.c:738
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Muokkaa/Säädä/tear1"
+
+# src/menu.c:739
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Muokkaa/Säädä/Käännä _myötäpäivään"
+
+# src/menu.c:740
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Muokkaa/Säädä/Käännä _vastapäivään"
+
+# src/menu.c:741
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Muokkaa/Säädä/Käännä 1_80°"
+
+# src/menu.c:742
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Muokkaa/Säädä/_Peilikuva"
+
+# src/menu.c:743
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Muokkaa/Säädä/_Ylösalaisin"
+
+# src/menu.c:744
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Muokkaa/sep2"
+
+# src/menu.c:745
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Muokkaa/Valitse _kaikki"
+
+# src/menu.c:746
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Muokkaa/Poista _valinnat"
+
+# src/menu.c:747
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Muokkaa/sep3"
+
+# src/menu.c:748
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Muokkaa/_Asetukset..."
+
+# src/menu.c:750
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Muokkaa/sep4"
+
+# src/menu.c:751
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Muokkaa/As_eta taustakuvaksi"
+
+# src/menu.c:753
+#~ msgid "/_View"
+#~ msgstr "/_Näytä"
+
+# src/menu.c:754
+#~ msgid "/View/tear1"
+#~ msgstr "/Näytä/tear1"
+
+# src/menu.c:755
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Näytä/L_ähennä"
+
+# src/menu.c:756
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Näytä/L_oitonna"
+
+# src/menu.c:757
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Näytä/Suhde _1:1"
+
+# src/menu.c:759
+#~ msgid "/View/sep1"
+#~ msgstr "/Näytä/sep1"
+
+# src/menu.c:762
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Näytä/_Pienoiskuvat"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#~ msgid "/View/I_cons"
+#~ msgstr "/Näytä/Ku_vakkeet"
+
+# src/menu.c:764
+#~ msgid "/View/sep2"
+#~ msgstr "/Näytä/sep2"
+
+# src/menu.c:761
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Näytä/_Kokoruutu"
+
+# src/menu.c:768
+#~ msgid "/View/sep3"
+#~ msgstr "/Näytä/sep3"
+
+# src/menu.c:767
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Näytä/_Tiedostoluettelon piilotus"
+
+# src/menu.c:759
+#~ msgid "/View/sep4"
+#~ msgstr "/Näytä/sep4"
+
+# src/menu.c:755
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Näytä/L_ajittelunhallinta"
+
+# src/menu.c:759
+#~ msgid "/View/sep5"
+#~ msgstr "/Näytä/sep5"
+
+# src/menu.c:769
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Näytä/_Diaesitys"
+
+# src/menu.c:765
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Näytä/V_irkistä luettelot"
+
+# src/menu.c:772
+#~ msgid "/Help/tear1"
+#~ msgstr "/Ohje/tear1"
+
+# src/menu.c:775
+#~ msgid "/Help/sep1"
+#~ msgstr "/Ohje/sep1"
+
+# src/preferences.c:507
+#~ msgid "GQview configuration"
+#~ msgstr "GQview-asetukset"
+
+# src/menu.c:749
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Muokkaa/_Poista vanhat pienoiskuvat"
+
+# src/dupe.c:1657 src/dupe.c:1945
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Polku"
+
+# src/collect-dlg.c:167 src/collect.c:1052
+#~ msgid "Save"
+#~ msgstr "Tallenna"
+
+# src/collect.c:1053 src/ui_help.c:302
+#~ msgid "Close"
+#~ msgstr "Sulje"
+
+# src/collect-dlg.c:68
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Korvaa kokoelmatiedosto:\n"
+#~ "%s"
+
+# src/collect-dlg.c:166
+#~ msgid "Save collection as:"
+#~ msgstr "Tallenna kokoelma nimellä"
+
+# src/collect-dlg.c:173
+#~ msgid "Open collection from:"
+#~ msgstr "Avaa kokoelma:"
+
+# src/collect-dlg.c:174
+#~ msgid "Open"
+#~ msgstr "Avaa"
+
+# src/collect-dlg.c:181
+#~ msgid "Append collection from:"
+#~ msgstr "Lisää kokoelma:"
+
+# src/main.c:622
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Lopeta"
+
+# src/main.c:622
+#~ msgid "Exit"
+#~ msgstr "Lopeta"
+
+# src/preferences.c:165 src/preferences.c:523 src/ui_utildlg.c:208
+# src/utilops.c:220
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+# src/collect-dlg.c:59
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Virheellinen tiedostonimi"
+
+# src/preferences.c:569
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Siirry käynnistettäessä kansioon:"
+
+# src/preferences.c:695 src/preferences.c:697
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Suhde (skaalaus):"
+
+# src/preferences.c:805
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Sijoita dialogit hiiren alle"
+
+# src/preferences.c:825
+#~ msgid "Include files of type:"
+#~ msgstr "Näytä seuraavat tiedostotyypit:"
+
+# src/collect-table.c:622 src/dupe.c:1410 src/dupe.c:1568
+#~ msgid "Remove"
+#~ msgstr "Poista"
+
+#~ msgid "Add"
+#~ msgstr "Lisää"
+
+# src/preferences.c:933
+#~ msgid "Command Line"
+#~ msgstr "Komentorivi"
+
+# src/menu.c:771
+#~ msgid "Help"
+#~ msgstr "Ohje"
+
+# src/img-view.c:837 src/menu.c:1001
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "K_okoruutu"
+
+# src/preferences.c:368
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Tiedoston koko:"
+
+#, fuzzy
+#~ msgid "Width:"
+#~ msgstr "Leveys"
+
+#, fuzzy
+#~ msgid "Height:"
+#~ msgstr "Korkeus"
+
+# src/utilops.c:338
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Korvaa tiedosto:\n"
+#~ " %s\n"
+#~ " tiedostolla:\n"
+#~ " %s"
+
+# src/utilops.c:343
+#~ msgid "Yes"
+#~ msgstr "Kyllä"
+
+# src/utilops.c:344
+#~ msgid "Yes to all"
+#~ msgstr "Kyllä kaikkiin"
+
+# src/utilops.c:458
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Korvaa tiedosto:\n"
+#~ "%s\n"
+#~ " tiedostolla:\n"
+#~ "%s"
+
+# src/utilops.c:594
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Kopioi tiedosto:\n"
+#~ "%s\n"
+#~ "kohteeseen:"
+
+# src/utilops.c:603
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Siirrä tiedosto:\n"
+#~ "%s\n"
+#~ "kohteeseen:"
+
+# src/utilops.c:707
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Monen tiedoston poistaminen alkamassa..."
+
+# src/utilops.c:825 src/utilops.c:1031
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Korvaa tiedosto:\n"
+#~ "%s\n"
+#~ "nimeämällä uudelleen:\n"
+#~ "%s"
+
+# src/utilops.c:989
+#~ msgid "to:"
+#~ msgstr "nimelle:"
+
+# src/utilops.c:1216
+#~ msgid "Create"
+#~ msgstr "Luo"
+
+# src/preferences.c:559
+#~ msgid "Initial directory"
+#~ msgstr "Aloituskansio"
+
+# src/ui_pathsel.c:507 src/ui_pathsel.c:759
+#~ msgid "New Directory"
+#~ msgstr "Uusi kansio"
+
+# src/ui_pathsel.c:517 src/utilops.c:1158
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Kansion luominen epäonnistui:\n"
+#~ "%s"
+
+# src/ui_pathsel.c:518 src/utilops.c:1159
+#~ msgid "Error creating directory"
+#~ msgstr "Virhe kansion luonnissa"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "Kuvaus"
+
+# src/menu.c:769
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/Näytä/_Diaesitys"
+
+# src/collect-table.c:1820 src/dupe.c:2172
+#~ msgid "Add contents"
+#~ msgstr "Lisää sisältö"
+
+# src/collect-table.c:1821 src/dupe.c:2173
+#~ msgid "Add contents recursive"
+#~ msgstr "Lisää sisältö myös alikansioista"
+
+# src/collect-table.c:1822 src/dupe.c:2174
+#~ msgid "Skip directories"
+#~ msgstr "Ohita kansiot"
+
+# src/utilops.c:543
+#~ msgid "Invalid directory"
+#~ msgstr "Virheellinen kansio"
+
+# src/utilops.c:591
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - kopiointi"
+
+# src/utilops.c:600
+#~ msgid "GQview - move"
+#~ msgstr "GQview - siirto"
+
+# src/utilops.c:1145
+#~ msgid "Directory exists"
+#~ msgstr "Kansio on olemassa"
+
+# src/utilops.c:1212
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - uusi kansio"
+
+#~ msgid "Misc."
+#~ msgstr "Muut"
+
+# src/menu.c:717
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/Tiedosto/Luo _kansio"
+
+# src/menu.c:492
+#~ msgid "Edit"
+#~ msgstr "Muokkaa"
+
+# src/preferences.c:908
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "Lisää pudotetut tiedostot osoittimen kohdalle"
+
+# src/filelist.c:816
+#~ msgid "File named %s already exists."
+#~ msgstr "Tiedosto %s on jo olemassa."
+
+# src/dupe.c:1654 src/dupe.c:1943
+#~ msgid "Date:"
+#~ msgstr "Päiväys:"
+
+# src/utilops.c:989
+#, fuzzy
+#~ msgid "top"
+#~ msgstr "nimelle:"
+
+# src/main.c:146 src/main.c:176
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview käynnissä: %s\n"
+
+# kirjoitusvirhe on tahallinen, tekee taivutusmuodosta (lähes) oikean
+# src/main.c:555
+#~ msgid "Electric Eyes"
+#~ msgstr "Sähkösilm"
+
+# src/preferences.c:530
+#~ msgid "Apply"
+#~ msgstr "Toteuta"
+
+# src/preferences.c:888
+#~ msgid "format: [.foo;.bar]"
+#~ msgstr "muoto: [.foo;.bar]"
+
+#~ msgid "Load collection from:"
+#~ msgstr "Lataa kokoelma:"
+
+#~ msgid "Load"
+#~ msgstr "Lataa"
index d42c100..29fec1d 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
 # gqview fr.po file.
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Jean-pierre PEDRON <jppedron@club-internet.fr>, 2000.
 #
+# Last Translator :
+#  Éric Lassauge <lassauge@users.sourceforge.net>, 2001-2002, 2004-2005.
+# 
+# Created by Jean-Pierre Pedron <jppedron@club-internet.fr>, 2000.
+# Updated by Pascal Bleser <pascal.bleser@atosorigin.com>, 2003.
+# Updated by Nicolas Boos <nicolas.boos@wanadoo.fr>, 2003.
+# Updated by Nicolas Bonifas <nicolas_bonifas@users.sf.net>, 2003-2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview-1.5.6\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2005-01-10 11:36+0200\n"
+"Last-Translator: Éric Lassauge <lassauge@users.sourceforge.net>\n"
+"Language-Team: french\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr "Favoris"
+
+#: src/bar_info.c:31
+msgid "Todo"
+msgstr "A faire"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr "Personnes"
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr "Lieux"
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr "Art"
+
+#: src/bar_info.c:35
+msgid "Nature"
+msgstr "Nature"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr "Objets"
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr "Présélection de mots clés"
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr "Liste des mots clés favoris"
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr "Mots clés"
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Nom du fichier :"
+
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Date du fichier :"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr "Mots-clés :"
+
+#: src/bar_info.c:1095
+msgid "Comment:"
+msgstr "Commentaires :"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr "Editer la liste des mots clés favoris"
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr "Ajouter des mots clés aux fichiers sélectionnés"
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+"Ajouter des mots clés aux fichiers sélectionnés, en remplacant ceux existants"
+
+#: src/bar_info.c:1130
+msgid "Save comment now"
+msgstr "Enregistrer les commentaires"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "Repère"
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Nom"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "Valeur"
+
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "Format"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "Eléments"
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "Description"
+
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "Exif"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "Affichage avancé"
+
+#: src/bar_sort.c:218
+msgid "Unlink failed"
+msgstr "Echec de la suppression"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr "Echec du lien"
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Le dossier :\n"
+"%s\n"
+"existe déjà."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Collection vide"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Impossible d'enregistrer la collection :\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Erreur à l'enregistrement"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "Ajouter un signet"
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Collections"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "Nom : "
+
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "Trier par nom"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "Dossiers"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Collections"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Copier"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Déplacer"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr "Lien"
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d images"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Sélection"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "Annuler la dernière opération"
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "fini"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Lecture des données de similarité ..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Suppression des vignettes ..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Purge des anciennes vignettes ..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+msgid "Invalid folder"
+msgstr "Nom de dossier invalide"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr "Le dossier spécifiée est absent."
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+msgid "Create thumbnails"
+msgstr "Créer les vignettes"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+msgid "S_tart"
+msgstr "Dé_but"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "Dossier :"
+
+#: src/cache_maint.c:845
+msgid "Select folder"
+msgstr "Sélectionner un dossier"
+
+#: src/cache_maint.c:849
+msgid "Include subfolders"
+msgstr "Inclure les sous-dossiers"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr "Sauver les vignettes avec les images sources"
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr "cliquer sur Début pour démarrer"
+
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "en cours ..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Suppression des vignettes ..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Vider le cache"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Ceci va effacer toutes les vignettes\n"
+"présentes sur le disque, continuer ?"
+
+#: src/cache_maint.c:1163
+msgid "Cache Maintenance - GQview"
+msgstr "Maintenance du cache - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr "Maintenance des données et du cache"
+
+#: src/cache_maint.c:1177
+msgid "GQview thumbnail cache"
+msgstr "Cache GQview des vignettes"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+msgid "Location:"
+msgstr "Emplacement :"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+msgid "Clean up"
+msgstr "Nettoyage"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr "Eliminer les vignettes orphelines ou plus à jour."
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+msgid "Delete all cached thumbnails."
+msgstr "Effacer le contenu du cache des vignettes."
+
+#: src/cache_maint.c:1197
+msgid "Shared thumbnail cache"
+msgstr "Cache partagé des vignettes"
+
+#: src/cache_maint.c:1220
+msgid "Render"
+msgstr "Générer"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr "Générer les vignettes pour un dossier spécifique."
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+#, fuzzy
+msgid "Remove orphaned keywords and comments."
+msgstr "Eliminer les vignettes orphelines ou plus à jour."
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Sans_Titre"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Sans_Titre (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - Collection GQview"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Fermer collection"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"La collection a été modifiée.\n"
+"L'enregistrer avant ?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr "_Élimine"
+
+#: src/collect-dlg.c:58
+#, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Le chemin spécifié :\n"
+"%s\n"
+"est un dossier, les collections sont des fichiers"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Nom de fichier invalide"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Écraser fichier"
+
+#: src/collect-dlg.c:73
+msgid "Overwrite existing file?"
+msgstr "Écraser le fichier existant ?"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+msgid "_Overwrite"
+msgstr "_Écraser"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Enregistrer collection"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Ouvrir collection"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Ajouter à la collection"
+
+#: src/collect-dlg.c:185
+msgid "_Append"
+msgstr "_Ajouter"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Fichiers de collection"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Collection vide"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "La collection courante est vide, enregistrement annulé."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Vide"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d images (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d images"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Chargement des vignettes ..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "_Afficher"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "Afficher dans une _nouvelle fenêtre"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "_Effacer"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Ajouter à partir de la liste des fichiers"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Ajouter à partir de la collection ..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Tout sélectionner"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Désélectionner"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "_Propriétés"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "_Copier ..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "_Déplacer ..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "_Renommer ..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "_Supprimer ..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "Voir le _nom de fichier"
+
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "_Enregistrer collection"
+
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "Enregistrer collection _sous ..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "Rechercher les _fichiers en double ..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+msgid "Print..."
+msgstr "Imprimer ..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+msgid "Dropped list includes folders."
+msgstr "La liste ajoutée inclus des dossiers."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "_Ajouter le contenu"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "Ajouter le contenu _récursivement"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+msgid "_Skip folders"
+msgstr "Omettre les dossier_s"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Annuler"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Glisser des fichiers pour les comparer."
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d fichiers"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d correspondances dans %d fichiers"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[groupe 1]"
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Lecture des sommes de contrôle ..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Lecture des dimensions ..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Lecture des données de similarité ..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Comparaison ..."
+
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "Tri ..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "Sélectionner les doubles du groupe _1"
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "Sélectionner les doubles du groupe _2"
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Ajouter à la nouvelle collection"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "_Vider"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "Fermer la _fenêtre"
+
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "%d fichiers (groupe 2)"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Taille"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Date"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Dimensions"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Somme de contrôle"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Chemin"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Similarité (élevée)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Similarité"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Similarité (basse)"
+
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Similarité (spécifique)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Recherche des fichiers en double - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Comparer à :"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Comparer par :"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Vignettes"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Comparer deux jeux de fichiers"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "Rotation sens horaire"
+
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "Rotation sens anti-horaire"
+
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "arrêt ..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "Voir le résultat de la commande"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "Sortie de %s"
+
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Impossible de charger :\n"
+"%s\n"
+
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "arrêté par l'utilisateur"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "inconnu"
+
+#: src/exif.c:113
+msgid "top left"
+msgstr "haut gauche"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "haut droite"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "bas droite"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "bas gauche"
+
+#: src/exif.c:117
+msgid "left top"
+msgstr "gauche haut"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "droit haut"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "droit bas"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "gauche bas"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "pouces"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "centimètres"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "moyenne"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "pondération moyenne"
+
+#: src/exif.c:142
+msgid "spot"
+msgstr "point"
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr "plusieurs points"
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr "plusieurs segments"
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "partiel"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "autre"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "indéfini"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "manuel"
+
+#: src/exif.c:153
+msgid "normal"
+msgstr "normal"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "ouverture"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "obturateur"
+
+#: src/exif.c:156
+msgid "creative"
+msgstr "créatif"
+
+#: src/exif.c:157
+msgid "action"
+msgstr "action"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "portrait"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "paysage"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "lumière naturelle"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "fluorescent"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "tungstène"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "Flash :"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "non"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "oui"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr "oui, mais non détecté"
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr "oui, détecté"
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "Description de l'image"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "Orientation"
+
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "Copyright"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "Programme d'exposition"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "Sensibilité ISO"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "Date de prise de vue"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "Date de numérisation"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "Vitesse d'obturation"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "Ouverture"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "Polarisation d'exposition"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "Distance du sujet"
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "Méthode de mesure"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "Source de lumière"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "Flash"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "Distance focale"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "Largeur"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "Hauteur"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "Appareil"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "Résolution"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "infini"
+
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "mode :"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "on"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "off"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "auto"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr "non détecté"
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr "détecté"
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "anti-yeux rouges"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "point"
+
+# c-format
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d octets"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f Ko"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f Mo"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f Go"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview plein écran"
+
+#: src/fullscreen.c:397
+msgid "Full size"
+msgstr "Pleine taille"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr "Moniteur"
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr "Écran"
+
+#: src/fullscreen.c:644
+msgid "Stay above other windows"
+msgstr "Rester au dessus des autres fenêtres"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr "Écran actif"
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr "Moniteur actif"
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "Zoom a_vant"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "Zoom a_rrière"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "Taille réelle (_1:1)"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "Mettre à la taille de la _fenêtre"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "Utiliser comme _papier peint"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "_Stopper le diaporama"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "Reprendre le _diaporama"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "Suspendre le _diaporama"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "_Lancer le diaporama"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "Sortir du mode plein _écran"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "Plein _écran"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "Fermer _la fenêtre"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "Taille du fichier :"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Dimensions :"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Transparence :"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Taille de l'image :"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Taux de compression :"
+
+#: src/info.c:368
+msgid "File type:"
+msgstr "Type de fichier :"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Propriétaire :"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Groupe :"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Général"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "Image %d de %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Propriétés de l'image - GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Croissant"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Diaporama"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " En pause"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d fichiers (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d fichiers%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d fichiers%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(pas de permission en lecture) %s octets"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s octets"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s octets"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "Outils GQview"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Outils"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "Fichiers"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Image"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(glisser pour changer l'ordre)"
+
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "Masquer la _liste des fichiers"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "dans %s ..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "dans (inconnu) ..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Vide"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Fichier"
+
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "Édit_er"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "_Ajuster"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/_Aide"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Fichier/_Nouvelle fenêtre"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "_Enregistrer collection"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Ouvrir collection"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Fichier/Ouverts _récemment"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Recherche ..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "Imprimer ..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "_Nouveau dossier ..."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "quitter"
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "_Rotation sens horaire"
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "Rotation sens _anti-horaire"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Rotation de _180°"
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "Retourne_ment horizontal"
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "Retournement _vertical"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Tout sélectionner"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Désélectionner"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "_Propriétés ..."
+
+#: src/layout_util.c:788
+#, fuzzy
+msgid "_Thumbnail maintenance..."
+msgstr "/Éditer/Maintenance des _vignettes ..."
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Afficher/Taille de la fenê_tre"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "Plein _écran"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Masquer la _liste des fichiers"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "stopper le diaporama"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "Ra_fraîchir"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Aide/_Contenu"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Aide/_Raccourcis clavier"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Aide/_Notes pour cette version"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Aide/À _propos"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Vignettes"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Afficher/Arbr_e"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Afficher/Liste des fichiers _flottante"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Afficher/Masquer la _barre d'outils"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "Mots clés"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Afficher/Données E_xif"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Trier par nom"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Afficher/_Liste"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Icône : "
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Montrer les vignettes"
+
+#: src/layout_util.c:1085
+msgid "Change to home folder"
+msgstr "Aller dans le dossier personnel"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Rafraîchir la liste des fichiers"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Zoom avant"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Zoom arrière"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Mettre à la taille de la fenêtre"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Taille 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Configuration"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Outils flottants"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Aide - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Ligne de commande"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+msgid "next image"
+msgstr "image suivante"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr "image précédente"
+
+#: src/main.c:529
+msgid "first image"
+msgstr "première image"
+
+#: src/main.c:530
+msgid "last image"
+msgstr "dernière image"
+
+#: src/main.c:531
+msgid "toggle full screen"
+msgstr "Sortir du mode plein _écran"
+
+#: src/main.c:532
+msgid "start full screen"
+msgstr "Démarrer en mode plein _écran"
+
+#: src/main.c:533
+msgid "stop full screen"
+msgstr "Sortir du mode plein _écran"
+
+#: src/main.c:534
+msgid "toggle slide show"
+msgstr "stopper le diaporama"
+
+#: src/main.c:535
+msgid "start slide show"
+msgstr "lancer le diaporama"
+
+#: src/main.c:536
+msgid "stop slide show"
+msgstr "stopper le diaporama"
+
+#: src/main.c:537
+msgid "start recursive slide show"
+msgstr "lancer le diaporama récursif"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr "délais entre diapos en secondes"
+
+#: src/main.c:539
+msgid "show tools"
+msgstr "montrer les outils"
+
+#: src/main.c:540
+msgid "hide tools"
+msgstr "cacher les outils"
+
+#: src/main.c:541
+msgid "quit"
+msgstr "quitter"
+
+#: src/main.c:542
+msgid "open file"
+msgstr "ouvrir le fichier"
+
+#: src/main.c:543
+msgid "open file in new window"
+msgstr "ouvrir le fichier dans une nouvelle fenêtre"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr "Liste des commandes à distance :\n"
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr "Pas de GQview distant, lancement ..."
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr "Commande à distance non disponible\n"
+
+#: src/main.c:944
 msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
 msgstr ""
-"Project-Id-Version: gqview-0.8.0\n"
-"POT-Creation-Date: 2000-04-13 15:57-0400\n"
-"PO-Revision-Date: 2000-04-07 11:30+0100\n"
-"Last-Translator: Jean-pierre PEDRON <jppedron@club-internet.fr>\n"
-"Language-Team: french <jppedron@club-internet.fr>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso8859-1\n"
-"Content-Transfer-Encoding: 8bit\n"
+"Utilisation: gqview [options] [chemin]\n"
+"\n"
 
-#: src/config.c:307
-msgid "GQview configuration"
-msgstr "Configuration de GQview"
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "les options valides sont :\n"
 
-#: src/config.c:319
-msgid "Ok"
-msgstr "OK"
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           force l'affichage des outils\n"
 
-#: src/config.c:324
-msgid "Apply"
-msgstr "Appliquer"
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        masque les outils\n"
 
-#: src/config.c:329 src/utildlg.c:145 src/utilops.c:444 src/utilops.c:754
-#: src/utilops.c:885 src/utilops.c:983
-msgid "Cancel"
-msgstr "Annuler"
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           démarre en mode plein écran\n"
 
-#: src/config.c:343
-msgid "General"
-msgstr "Général"
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            démarre en mode diaporama\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+"  -l, --list                 ouvre une fenêtre de collection pour la ligne "
+"de commande\n"
+
+#: src/main.c:951
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+"  -r, --remote               lance la commande suivante pour ouvrir un "
+"fenêtre\n"
+"de commande\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+"  -rh,--remote-help          affiche la liste des commandes à distance\n"
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    valide les sorties de déboguage\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              affiche les infos de versions\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 affiche ce message\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"invalide ou ignoré : %s\n"
+"Utiliser --help pour connaître les options\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Création du dossier GQview : %s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Impossible de créer le dossier : %s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Rép. perso"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "Bureau"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - sortir"
+
+#: src/main.c:1156
+msgid "Quit GQview"
+msgstr "Quitter GQview"
+
+#: src/main.c:1156
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Des collections ont été modifiées.\n"
+"Quitter quand même ?"
+
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "Trier par taille"
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "Trier par date"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Non trié"
 
-#: src/config.c:351
-msgid "Initial directory"
-msgstr "Répertoire initial"
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "Trier par chemin"
 
-#: src/config.c:361
-msgid "On startup, change to this directory:"
-msgstr "Au démarrage, aller dans ce répertoire : "
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "Trier par valeur numérique"
 
-#: src/config.c:373
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "Trier par nom"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Trier"
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "Rotation de _180°"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Au plus près (moins bon, plus rapide)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Tuiles"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilénaire"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Hyper (meilleur, plus lent)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Aucune"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normale"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Meilleure"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr "Spécifique"
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "RAZ des filtres"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Ceci va remettre les filtres de fichiers à leur état par défaut.\n"
+"Continuer ?"
+
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "RAZ des éditeurs"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Ceci va remettre les commandes d'édition à leur état par défaut.\n"
+"Continuer ?"
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "Vider la corbeille"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "Ceci va supprimer le contenu de la corbeille"
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview plein écran"
+
+#: src/preferences.c:824
+msgid "Startup"
+msgstr "Début"
+
+#: src/preferences.c:826
+msgid "Change to folder:"
+msgstr "Aller dans le dossier :"
+
+#: src/preferences.c:837
 msgid "Use current"
-msgstr "Utiliser le répertoire actuel"
+msgstr "Utiliser le dossier courant"
 
-#: src/config.c:379
-msgid "Confirm file delete"
-msgstr "Confirmer la supression des fichiers"
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Taille :"
 
-#: src/config.c:381
-msgid "Remember tool state (float/hidden)"
-msgstr "Conserver l'état des outils (flottant/caché)"
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Qualité :"
 
-#: src/config.c:383
-msgid "Remember window positions"
-msgstr "Conserver les positions de la fenêtre"
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Mettre en cache les vignettes"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr "Utiliser un cache vignettes partagé"
 
-#: src/config.c:385
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Mettre en cache les vignettes dans .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Utiliser les vignettes xvpics si existantes (lecture seule)"
+
+#: src/preferences.c:864
 msgid "Slide show"
 msgstr "Diaporama"
 
-#: src/config.c:398
-msgid "Delay before image change (seconds):"
-msgstr "Délai avant changement d'image (secondes) : "
+#: src/preferences.c:867
+msgid "Delay between image change:"
+msgstr "Délai entre deux images :"
 
-#: src/config.c:411
+#: src/preferences.c:867
+msgid "seconds"
+msgstr "secondes"
+
+#: src/preferences.c:873
 msgid "Random"
 msgstr "Aléatoire"
 
-#: src/config.c:413
+#: src/preferences.c:874
 msgid "Repeat"
-msgstr "Répéter"
+msgstr "En boucle"
 
-#: src/config.c:420
-msgid "Image"
-msgstr "Image"
+#: src/preferences.c:884
+msgid "Zoom"
+msgstr "Zoom"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Méthode de dithering :"
 
-#: src/config.c:428
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Zoom en 2 passes"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Aggrandir les images pour que le zoom convienne."
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Incrément de zoom :"
+
+#: src/preferences.c:904
 msgid "When new image is selected:"
-msgstr "Quand une nouvelle image est sélectionnée : "
+msgstr "Sélection d'une nouvelle image :"
 
-#: src/config.c:438
+#: src/preferences.c:907
 msgid "Zoom to original size"
-msgstr "Conserver sa taille initiale"
-
-#: src/config.c:444 src/img-view.c:306 src/menu.c:473 src/menu.c:547
-#: src/menu.c:587 src/menu.c:678
-msgid "Fit image to window"
-msgstr "Mettre à la taille de la fenêtre"
+msgstr "Zoom à sa taille d'origine"
 
-#: src/config.c:450
+#: src/preferences.c:913
 msgid "Leave Zoom at previous setting"
-msgstr "Garder la valeur initiale du zoom"
+msgstr "Garder la valeur précédente du zoom"
 
-#: src/config.c:457
-msgid "Fit window to image when tools are hidden/floating"
-msgstr ""
-"Mettre la fenêtre à la taille de l'image quand les outils sont "
-"cachés/flottants"
+#: src/preferences.c:917
+msgid "Appearance"
+msgstr "Apparence"
 
-#: src/config.c:464
-msgid "Limit size when auto-sizing window"
-msgstr "Limiter la taille quand la fenêtre est auto-dimensionnable"
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Arrière-plan noir"
 
-#: src/config.c:474 src/menu.c:477
-msgid "Thumbnails"
-msgstr "Vignettes"
+#: src/preferences.c:922
+msgid "Convenience"
+msgstr "Commodités"
 
-#: src/config.c:490
-msgid "Size:"
-msgstr "Taille : "
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "Rafraîchir la liste des fichiers"
 
-#: src/config.c:519
-msgid "Cache thumbnails"
-msgstr "Cache vignettes"
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Précharger l'image suivante"
 
-#: src/config.c:521
-msgid "Use xvpics thumbnails when found (read only)"
-msgstr "Utiliser les vignettes xvpics si existantes (lecture seule)"
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Rotation automatique de l'image à l'aide des informations Exif"
 
-#: src/config.c:524
-msgid "Progressive keyboard scrolling"
-msgstr "Panoramique clavier progressif"
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Fenêtres"
 
-#: src/config.c:526
-msgid "Mouse wheel scrolls image"
+#: src/preferences.c:940
+msgid "State"
+msgstr "État"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Conserver les positions de la fenêtre"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Conserver l'état des outils (flottants/cachés)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
 msgstr ""
+"Mettre la fenêtre à la taille de l'image quand les outils sont cachés/"
+"flottants"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Limiter la taille quand la fenêtre est auto-dimensionnable (%) :"
 
-#: src/config.c:533
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Disposition"
+
+#: src/preferences.c:973
 msgid "Filtering"
 msgstr "Filtres"
 
-#: src/config.c:542
+#: src/preferences.c:978
 msgid "Show entries that begin with a dot"
 msgstr "Montrer les fichiers cachés"
 
-#: src/config.c:544
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "Tri sensible à la casse"
+
+#: src/preferences.c:983
 msgid "Disable File Filtering"
 msgstr "Désactiver les filtres de fichiers"
 
-#: src/config.c:546
-msgid "Include files of type:"
-msgstr "Inclure les fichiers de type : "
+#: src/preferences.c:986
+msgid "File types"
+msgstr "Type de fichier"
 
-#: src/config.c:596
-msgid "Custom file types:"
-msgstr "Types de fichiers personnels"
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "Filtre"
 
-#: src/config.c:609
-msgid "format: [.foo;.bar]"
-msgstr "Format : [.foo;.bar]"
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "Configuration par défaut"
 
-#: src/config.c:618
-msgid "External Editors"
-msgstr "Editeurs externes"
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Éditeurs"
 
-#: src/config.c:630
+#: src/preferences.c:1072
 msgid "#"
 msgstr "N°"
 
-#: src/config.c:633
+#: src/preferences.c:1075
 msgid "Menu name"
-msgstr "Nom"
+msgstr "Nom du menu"
 
-#: src/config.c:636
-msgid "Command Line"
-msgstr "Ligne de commande"
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "Avancé"
+
+#: src/preferences.c:1138
+msgid "Full screen"
+msgstr "Plein _écran"
+
+#: src/preferences.c:1146
+msgid "Smooth image flip"
+msgstr "Lisser le basculement d'image"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr "Inhiber l'économiseur d'écran"
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Effacer"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Confirmer la suppression des fichiers"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Utiliser la touche [Suppr]"
+
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "Confirmer la suppression des fichiers"
+
+#: src/preferences.c:1176
+msgid "Maximum size:"
+msgstr "Taille maximum :"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr "Mo"
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Voir"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr "Comportement"
+
+#: src/preferences.c:1191
+msgid "Rectangular selection in icon view"
+msgstr "Sélection rectangulaire dans la vue en icônes"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Parcourir les dossiers dans la vue arborescente"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Renommer en place"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr "Navigation"
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Panoramique clavier progressif"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Défilement des images avec la molette de la souris"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr "Divers"
 
-#: src/config.c:666 src/menu.c:500
-msgid "About"
-msgstr "A Propos..."
+#: src/preferences.c:1209
+#, fuzzy
+msgid "Store keywords and comments local to source images"
+msgstr "Sauver les vignettes avec les images sources"
 
-#: src/config.c:682
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "Similarité spécifique :"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Taille du cache mémoire (Mo par image) :"
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "A propos - GQview"
+
+#: src/preferences.c:1304
 #, c-format
 msgid ""
 "GQview %s\n"
 "\n"
-"Copyright (c) 2000 by John Ellis\n"
-"http://gqview.sorceforge.net\n"
-"or http://gqview.netpedia.net\n"
-"gqview@email.com\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
 "\n"
-"Released under the GNU Public License"
+"Released under the GNU General Public License"
 msgstr ""
 "GQview %s\n"
 "\n"
-"Copyright (c) 2000 par John Ellis\n"
-"http://gqview.sorceforge.net\n"
-"ou http://gqview.netpedia.net\n"
-"gqview@email.com\n"
+"Copyright © %s par John Ellis\n"
+"Site web : %s\n"
+"Contact : %s\n"
+"\n"
+"Traduction : Éric Lassauge <lassauge@users.sourceforge.net>, 2001-2004\n"
 "\n"
-"Distibué sous GNU Public License"
+"Jean-Pierre Pedron <jppedron@club-internet.fr>, 2000\n"
+"Pascal Bleser <pascal.bleser@atosorigin.com>, 2003\n"
+"Nicolas Boos <nicolas.boos@wanadoo.fr>, 2003\n"
+"Nicolas Bonifas <nicolas.bonifas@free.fr>, 2003-2004\n"
+"\n"
+"Distribué sous GNU General Public License"
 
-#: src/filelist.c:51
-msgid " Slideshow"
-msgstr " Diaporama"
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "Crédits ..."
+
+#: src/print.c:111
+msgid "Selection"
+msgstr "Sélection"
+
+#: src/print.c:112
+msgid "All"
+msgstr "Tout"
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr "Une image/page"
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr "Page de test"
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr "Imprimante par défaut"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr "Imprimante spécifique"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr "Fichier Postscript"
+
+#: src/print.c:140
+msgid "Image file"
+msgstr "Fichier image"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr "JPEG, basse qualité"
 
-#: src/filelist.c:55
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr "JPEG, qualité normale"
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr "JPEG, haute qualité"
+
+#: src/print.c:350 src/print.c:3201
+msgid "points"
+msgstr "points"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr "millimètres"
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr "centimètres"
+
+#: src/print.c:353
+msgid "inches"
+msgstr "pouces"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr "Portrait"
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr "Paysage"
+
+#: src/print.c:366
+msgid "Letter"
+msgstr "Lettre"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr "Legal"
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr "Executive"
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr "Enveloppe #10"
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr "Enveloppe #9"
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr "Enveloppe C4"
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr "Enveloppe C5"
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr "Enveloppe C6"
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr "Photo 6x4"
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr "Photo 8x10"
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr "Carte postale"
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr "Tabloïd"
+
+#: src/print.c:544
 #, c-format
-msgid "%d files (%d)%s"
-msgstr "%d fichiers (%d)%s"
+msgid "page %d of %d"
+msgstr "page %d de %d"
 
-#: src/filelist.c:57
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "Prévisualiser"
+
+#: src/print.c:1044
 #, c-format
-msgid "%d files%s"
-msgstr "%d fichiers%s"
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
 
-#: src/filelist.c:1025
-msgid "Loading thumbs..."
-msgstr "Chargement des vignettes..."
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "Un fichier portant le nom %s existe déjà."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
 
-#: src/image.c:66
+#: src/print.c:1964
 #, c-format
-msgid "( ? x ? ) %d bytes"
-msgstr "( ? x ? ) %d octets"
+msgid "Page %d"
+msgstr "Page %d"
 
-#: src/image.c:68
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Imprimante"
+
+#: src/print.c:1990
 #, c-format
-msgid "( %d x %d ) %d bytes"
-msgstr "( %d x %d ) %d octets"
+msgid "An error occured printing to %s."
+msgstr ""
 
-#: src/img-main.c:247
-msgid "GQview full screen"
-msgstr "GQview plein écran"
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Configuration par défaut"
 
-#: src/img-view.c:303 src/menu.c:470 src/menu.c:544 src/menu.c:584
-#: src/menu.c:674
-msgid "Zoom in"
-msgstr "Zoom avant"
+#: src/print.c:2587 src/print.c:3332
+msgid "Print - GQview"
+msgstr "Impression - GQview"
 
-#: src/img-view.c:304 src/menu.c:471 src/menu.c:545 src/menu.c:585
-#: src/menu.c:676
-msgid "Zoom out"
-msgstr "Zoom arrière"
+#: src/print.c:2591
+#, fuzzy, c-format
+msgid "Printing %d pages to %s."
+msgstr "Impression de %d pages vers %s ..."
+
+#: src/print.c:2691
+msgid "Format:"
+msgstr "Format :"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr "Unités :"
+
+#: src/print.c:2810
+msgid "Orientation:"
+msgstr "Orientation :"
+
+#: src/print.c:2942
+msgid "Destination:"
+msgstr "Destination :"
 
-#: src/img-view.c:305 src/menu.c:472 src/menu.c:546 src/menu.c:586
-msgid "Zoom 1:1"
-msgstr "Taille initiale"
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Nom du fichier"
 
-#. edit menu
-#: src/img-view.c:309 src/menu.c:457 src/menu.c:519 src/menu.c:550
-#: src/menu.c:590
-msgid "Edit"
-msgstr "Editer"
+#: src/print.c:3079
+msgid "Unlimited"
+msgstr "Sans limite"
 
-#: src/img-view.c:314 src/menu.c:446 src/menu.c:526 src/menu.c:557
-#: src/menu.c:595
-msgid "Copy..."
-msgstr "Copier..."
+#: src/print.c:3188
+msgid "Show"
+msgstr "Montrer"
 
-#: src/img-view.c:315 src/menu.c:447 src/menu.c:527 src/menu.c:558
-#: src/menu.c:596
-msgid "Move..."
-msgstr "Déplacer..."
+#: src/print.c:3199
+msgid "Font"
+msgstr "Police"
 
-#: src/img-view.c:316 src/menu.c:448 src/menu.c:528 src/menu.c:559
-#: src/menu.c:597
-msgid "Rename..."
-msgstr "Renommer..."
+#: src/print.c:3359
+msgid "Source"
+msgstr "Source"
 
-#: src/img-view.c:317 src/menu.c:449 src/menu.c:529 src/menu.c:560
-#: src/menu.c:598
-msgid "Delete..."
-msgstr "Effacer..."
+#: src/print.c:3375
+msgid "Proof size:"
+msgstr "Taille de l'aperçu :"
 
-#: src/img-view.c:320
-msgid "Close window"
-msgstr "Fermer"
+#: src/print.c:3391
+msgid "Text"
+msgstr "Texte"
 
-#: src/main.c:90 src/main.c:119
+#: src/print.c:3401
+msgid "Paper"
+msgstr "Papier"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr "Marges"
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr "Gauche :"
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr "Droite :"
+
+#: src/print.c:3432
+msgid "Top:"
+msgstr "Haute :"
+
+#: src/print.c:3435
+msgid "Bottom:"
+msgstr "Basse :"
+
+#: src/print.c:3444
+msgid "Printer"
+msgstr "Imprimante"
+
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr "Imprimante spécifique :"
+
+#: src/print.c:3459
+msgid "File:"
+msgstr "Fichier :"
+
+#: src/print.c:3468
+msgid "File format:"
+msgstr "Format du fichier :"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr "DPI :"
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Conserver les positions de la fenêtre"
+
+#: src/rcfile.c:185
 #, c-format
-msgid "GQview running: %s\n"
-msgstr "GQview tournant : %s\n"
+msgid "error saving config file: %s\n"
+msgstr "erreur à la sauvegarde du fichier de configuration : %s\n"
 
-#: src/main.c:330
-msgid ""
-"Usage: gqview [options] [path]\n"
-"\n"
-msgstr ""
-"Utilisation : gqview [options] [chemin]\n"
-"\n"
+#: src/search.c:200
+msgid "folder"
+msgstr "Dossier"
 
-#: src/main.c:331
-msgid "valid options are:\n"
-msgstr "les options valides sont :\n"
+#: src/search.c:201
+msgid "comments"
+msgstr "commentaires"
 
-#: src/main.c:332
-msgid "  +t, --with-tools           force show of tools\n"
-msgstr "  +t, --with-tools           force l'affichage des outils\n"
+#: src/search.c:202
+msgid "results"
+msgstr "résultats"
+
+#: src/search.c:206
+msgid "contains"
+msgstr "contient"
+
+#: src/search.c:207
+msgid "is"
+msgstr "est"
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr "égale(s) à"
+
+#: src/search.c:212
+msgid "less than"
+msgstr "moins que"
+
+#: src/search.c:213
+msgid "greater than"
+msgstr "plus qu"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr "entre"
+
+#: src/search.c:219
+msgid "before"
+msgstr "avant"
+
+#: src/search.c:220
+msgid "after"
+msgstr "après"
+
+#: src/search.c:225
+msgid "match all"
+msgstr "correspondent à tous"
+
+#: src/search.c:226
+msgid "match any"
+msgstr "correspondent à"
+
+#: src/search.c:227
+msgid "exclude"
+msgstr "exclusent"
+
+#: src/search.c:277
+#, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d fichiers (%s, %d)"
+
+#: src/search.c:284
+#, c-format
+msgid "%s, %d files"
+msgstr "%s, %d fichiers"
+
+#: src/search.c:301
+msgid "Searching..."
+msgstr "Recherche ..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr "Fichier inexistant"
+
+#: src/search.c:2094
+msgid "Please enter an existing file for image content."
+msgstr "Sélectionner un fichier existant pour un contenu image."
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr "Dossier inexistant"
+
+#: src/search.c:2141
+msgid "Please enter an existing folder to search."
+msgstr "Sélectionner un dossier existant pour la recherche."
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr "Recherche d'image - GQview"
+
+#: src/search.c:2599
+msgid "Search:"
+msgstr "Recherche :"
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr "Récursivement"
+
+#: src/search.c:2617
+msgid "File name"
+msgstr "Nom du fichier"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr "Sensible à la casse"
+
+#: src/search.c:2627
+msgid "File size is"
+msgstr "Taille du fichier est"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+msgid "and"
+msgstr "et"
 
-#: src/main.c:333
-msgid "  -t, --without-tools        force hide of tools\n"
-msgstr "  -t, --without-tools        masque les outils\n"
+#: src/search.c:2639
+msgid "File date is"
+msgstr "Date du fichier est"
 
-#: src/main.c:334
-msgid "  -f, --fullscreen           start in full screen mode\n"
-msgstr "  -f, --fullscreen           démarre en mode plein écran\n"
+#: src/search.c:2656
+msgid "Image dimensions are"
+msgstr "Dimensions de l'image sont"
 
-#: src/main.c:335
-msgid "  -s, --slideshow            start in slideshow mode\n"
-msgstr "  -s, --slideshow            démarre en mode diaporama\n"
+#: src/search.c:2676
+msgid "Image content is"
+msgstr "Contenu de l'image est"
 
-#: src/main.c:336
-msgid "  --debug                    turn on debug output\n"
-msgstr "  --debug                    valide les sorties de déboggage\n"
+#: src/search.c:2682
+#, no-c-format
+msgid "% similar to"
+msgstr "% similaire à"
 
-#: src/main.c:337
-msgid ""
-"  -h, --help                 show this message\n"
-"\n"
-msgstr ""
-"  -h, --help                 affiche ce message\n"
-"\n"
+#: src/search.c:2751
+msgid "Rank"
+msgstr "Rang"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "Impossible de charger la vignette depuis le cache, regénération.\n"
 
-#: src/main.c:342
+#: src/ui_bookmark.c:148
 #, c-format
-msgid ""
-"invalid or ignored: %s\n"
-"Use -help for options\n"
-msgstr ""
-"invalide ou ignoré: %s\n"
-"Utiliser -help pour connaître les options\n"
+msgid "Unable to write history lists to: %s\n"
+msgstr "Impossible d'écrire l'historique dans : %s\n"
 
-#: src/main.c:369
-msgid "The Gimp"
-msgstr "Gimp"
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "Nouveau signet"
 
-#: src/main.c:372
-msgid "Electric Eyes"
-msgstr "Electric Eyes"
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "Modifier les signets"
 
-#: src/main.c:375
-msgid "XV"
-msgstr "XV"
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "Chemin : "
 
-#: src/main.c:378
-msgid "Xpaint"
-msgstr "Xpaint"
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "Icône : "
 
-#: src/menu.c:373
-#, c-format
-msgid "in %s..."
-msgstr "Dans %s"
+#: src/ui_bookmark.c:627
+msgid "Select icon"
+msgstr "Sélectionner icône"
 
-#: src/menu.c:375
-msgid "in (unknown)..."
-msgstr "dans (inconnu)..."
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "_Propriétés ..."
 
-#: src/menu.c:394
-msgid "Options..."
-msgstr "Préférences..."
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "_Monter"
 
-#: src/menu.c:396
-msgid "Remove old thumbnails"
-msgstr "Détruire les anciennes vignettes"
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "_Descendre"
 
-#: src/menu.c:398 src/menu.c:410 src/menu.c:422
-msgid "Set as wallpaper"
-msgstr "Utiliser comme papier peint"
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "Efface_r"
 
-#. file menu
-#: src/menu.c:440
-msgid "File"
-msgstr "Fichier"
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Impossible de lancer la commande :\n"
+"%s"
 
-#: src/menu.c:444
-msgid "Create Dir..."
-msgstr "Créer un répertoire"
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Impossible de renommer le fichier %s en %s."
 
-#: src/menu.c:451
-msgid "Exit"
-msgstr "Quitter"
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Impossible de supprimer le fichier :\n"
+"%s"
 
-#. view menu
-#: src/menu.c:466
-msgid "View"
-msgstr "Afficher"
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "La suppression du fichier a échoué"
 
-#: src/menu.c:476 src/menu.c:563
-msgid "Full screen"
-msgstr "Plein écran"
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Supprimer fichier"
 
-#: src/menu.c:485
-msgid "Refresh Lists"
-msgstr "Rafraîchir les listes"
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Sur le point de supprimer le fichier :\n"
+" %s"
 
-#: src/menu.c:486
-msgid "(Un)Float file list"
-msgstr "Liste des fichiers flottante"
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "_Renommer"
 
-#: src/menu.c:487 src/menu.c:562
-msgid "(Un)Hide file list"
-msgstr "Cacher (montrer) la liste des fichiers"
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "Ajouter un _signet"
 
-#: src/menu.c:490
-msgid "Toggle slideshow"
-msgstr "Lancer (arrêter) le diaporama"
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "_Effacer"
 
-#. help menu
-#: src/menu.c:496
-msgid "Help"
-msgstr "Aide"
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+msgid "New folder"
+msgstr "Nouveau dossier"
 
-#: src/menu.c:523 src/menu.c:554
-msgid "View in new window"
-msgstr "Voir dans une nouvelle fenêtre"
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Impossible de créer le dossier :\n"
+"%s"
 
-#: src/menu.c:531
-msgid "Refresh"
-msgstr "Rafraîchir"
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+msgid "Error creating folder"
+msgstr "Erreur pendant le création du dossier"
 
-#: src/menu.c:601
-msgid "Exit full screen"
-msgstr "Sortir du mode plein écran"
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Montrer tous les fichiers"
 
-#: src/menu.c:661
-msgid "Create thumbnails"
-msgstr "Afficher les vignettes"
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Montrer les fichiers cachés"
 
-#: src/menu.c:670
-msgid "Change to home directory"
-msgstr "Aller dans le répertoire HOME"
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filtre :"
 
-#: src/menu.c:672
-msgid "Refresh file list"
-msgstr "Rafraîchir la liste des fichiers"
+#: src/ui_tabcomp.c:840
+msgid "Select path"
+msgstr "Sélectionner un chemin"
 
-#: src/menu.c:680
-msgid "Set zoom 1:1"
-msgstr "Retour taille initiale"
+#: src/ui_tabcomp.c:856
+msgid "All files"
+msgstr "Tous les fichiers"
 
-#: src/menu.c:682
-msgid "Configure options"
-msgstr "Configuration"
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Écraser fichier"
 
-#: src/menu.c:684
-msgid "Float Controls"
-msgstr "Outils flottants"
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+msgid "Overwrite file?"
+msgstr "Écraser fichier ?"
 
-#: src/rcfile.c:132
-#, c-format
-msgid "error saving config file: %s\n"
-msgstr "erreur dans la sauvegarde du fichier de configuration : %s\n"
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr "Remplacer le fichier existant par un nouveau fichier."
 
-#: src/thumb.c:127 src/thumb.c:151
-#, c-format
-msgid "create dir failed: %s\n"
-msgstr "échec lors de la création du répertoire : %s\n"
+#: src/utilops.c:480
+msgid "Overwrite _all"
+msgstr "Écraser _tout"
 
-#: src/thumb.c:233
-#, c-format
-msgid "Unable to delete dir: %s\n"
-msgstr "Impossible de détruire le répertoire : %s\n"
+#: src/utilops.c:482
+msgid "S_kip all"
+msgstr "S_auter tout"
 
-#: src/thumb.c:249
-#, c-format
-msgid "failed to delete:%s\n"
-msgstr "échec lors de la destruction : %s\n"
+#: src/utilops.c:483
+msgid "_Skip"
+msgstr "_Sauter"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+msgid "Existing file"
+msgstr "Fichier existant"
 
-#: src/utildlg.c:68
-msgid "     Ok     "
-msgstr "     Ok     "
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+msgid "New file"
+msgstr "Nouveau fichier"
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Renommage auto"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Renommer"
 
-#: src/utilops.c:166
+#: src/utilops.c:543
 msgid "Source to copy matches destination"
-msgstr "Source à copier à la destination coresspondante"
+msgstr "Le fichier source à copier est identique à la destination"
 
-#: src/utilops.c:167
+#: src/utilops.c:544
 #, c-format
 msgid ""
 "Unable to copy file:\n"
 "%s\n"
 "to itself."
 msgstr ""
-"Impossible de copier le fichier :\n"
+"Impossible de copier le fichier :\n"
 "%s\n"
 "sur lui-même."
 
-#: src/utilops.c:171
+#: src/utilops.c:548
 msgid "Source to move matches destination"
-msgstr "Source à déplacer à la destination coresspondante"
+msgstr "Le fichier source à déplacer est identique à la destination"
 
-#: src/utilops.c:172
+#: src/utilops.c:549
 #, c-format
 msgid ""
 "Unable to move file:\n"
 "%s\n"
 "to itself."
 msgstr ""
-"Impossible de déplacer le fichier :\n"
+"Impossible de déplacer le fichier :\n"
 "%s\n"
 "sur lui-même."
 
-#: src/utilops.c:175 src/utilops.c:231 src/utilops.c:516
-msgid "Continue"
-msgstr "Continuer"
-
-#: src/utilops.c:182
-#, c-format
-msgid ""
-"Overwrite file:\n"
-" %s\n"
-" with:\b %s"
-msgstr ""
-"Ecraser le fichier :\n"
-" %s\n"
-" avec :\b %s"
-
-#: src/utilops.c:183 src/utilops.c:289 src/utilops.c:651 src/utilops.c:835
-msgid "Overwrite file"
-msgstr "Ecraser fichier"
-
-#: src/utilops.c:186
-msgid "Skip"
-msgstr "Sauter"
-
-#: src/utilops.c:187
-msgid "Yes to all"
-msgstr "Oui pour tout"
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+msgid "Co_ntinue"
+msgstr "Co_ntinuer"
 
-#: src/utilops.c:188
-msgid "Yes"
-msgstr "Oui"
-
-#: src/utilops.c:222 src/utilops.c:317
+#: src/utilops.c:630 src/utilops.c:850
 msgid "Error copying file"
 msgstr "Erreur pour la copie de fichier"
 
-#: src/utilops.c:223
+#: src/utilops.c:631
 #, c-format
 msgid ""
 "Unable to copy file:\n"
-"%sto:\n"
 "%s\n"
-" during multiple file copy."
+"to:\n"
+"%s\n"
+"during multiple file copy."
 msgstr ""
-"Impossible de copier le fichier :\n"
-"%sà:\n"
+"Impossible de copier le fichier :\n"
+"%s\n"
+"vers :\n"
 "%s\n"
-" pendant la copie multiple."
+"pendant la copie multiple."
 
-#: src/utilops.c:227 src/utilops.c:322
+#: src/utilops.c:635 src/utilops.c:855
 msgid "Error moving file"
 msgstr "Erreur pour le déplacement de fichier"
 
-#: src/utilops.c:228
+#: src/utilops.c:636
 #, c-format
 msgid ""
 "Unable to move file:\n"
-"%sto:\n"
 "%s\n"
-" during multiple file move."
+"to:\n"
+"%s\n"
+"during multiple file move."
 msgstr ""
-"Impossible de déplacer le fichier :\n"
-"%sà:\n"
+"Impossible de déplacer le fichier :\n"
 "%s\n"
-" pendant un déplacement multiple."
+"vers :\n"
+"%s\n"
+"pendant un déplacement multiple."
 
-#: src/utilops.c:282
+#: src/utilops.c:774
 msgid "Source matches destination"
-msgstr "La source correspond à la destination"
+msgstr "Le fichier source est identique à la destination"
 
-#: src/utilops.c:283
+#: src/utilops.c:775
 msgid "Source and destination are the same, operation cancelled."
 msgstr "Source et destination sont les mêmes, opération annulée."
 
-#: src/utilops.c:288
-#, c-format
-msgid ""
-"Overwrite file:\n"
-"%s\n"
-" with:\n"
-"%s"
-msgstr ""
-"Ecraser le fichier :\n"
-"%s\n"
-" avec :\n"
-"%s"
-
-#: src/utilops.c:292 src/utilops.c:654 src/utilops.c:838
-msgid "Overwrite"
-msgstr "Ecraser"
-
-#: src/utilops.c:318
+#: src/utilops.c:851
 #, c-format
 msgid ""
 "Unable to copy file:\n"
@@ -592,12 +2732,12 @@ msgid ""
 "to:\n"
 "%s"
 msgstr ""
-"Impossible de copier le fichier :\n"
+"Impossible de copier le fichier :\n"
 "%s\n"
-"sur :\n"
+"sur :\n"
 "%s"
 
-#: src/utilops.c:323
+#: src/utilops.c:856
 #, c-format
 msgid ""
 "Unable to move file:\n"
@@ -605,195 +2745,218 @@ msgid ""
 "to:\n"
 "%s"
 msgstr ""
-"Impossible de déplacer le fichier :\n"
+"Impossible de déplacer le fichier :\n"
 "%s\n"
-"vers :\n"
+"vers :\n"
 "%s"
 
-#: src/utilops.c:367
+#: src/utilops.c:899
 msgid "Invalid destination"
 msgstr "Destination invalide"
 
-#: src/utilops.c:367
+#: src/utilops.c:900
 msgid ""
 "When operating with multiple files, please select\n"
-" a directory, not file."
+"a folder, not a file."
 msgstr ""
-"Lors d'une operation avec des fichiers multiples, sélectionner\n"
-" un répertoire, non un fichier."
+"Lors d'une opération avec des fichiers multiples, sélectionner\n"
+"un dossier, non un fichier."
 
-#: src/utilops.c:369
-msgid "Invalid directory"
-msgstr "Répertoire invalide"
+#: src/utilops.c:905
+msgid "Please select an existing folder."
+msgstr "Sélectionner un dossier existant."
 
-#: src/utilops.c:369
-msgid "Please select an existing directory"
-msgstr "Sélectionner un répertoire existant"
+#: src/utilops.c:956
+msgid "Copy - GQview"
+msgstr "Copie - GQview"
 
-#: src/utilops.c:427
-msgid "GQview - copy"
-msgstr "GQview - copier"
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "_Copier"
 
-#: src/utilops.c:428
-msgid "Copy"
-msgstr "Copier"
+#: src/utilops.c:960
+msgid "Copy file"
+msgstr "Copier le fichier"
 
-#: src/utilops.c:430
-#, c-format
-msgid ""
-"Copy file:\n"
-"%s\n"
-"to:"
-msgstr ""
-"Copier fichier :\n"
-"%s\n"
-"vers :"
+#: src/utilops.c:964
+msgid "Copy multiple files"
+msgstr "Copier des fichiers multiples"
 
-#: src/utilops.c:432
-#, c-format
-msgid ""
-"Copy multiple files from:\n"
-"%s\n"
-"to:"
-msgstr ""
-"Copier des fichiers multiples de :\n"
-"%s\n"
-"vers :"
+#: src/utilops.c:970
+msgid "Move - GQview"
+msgstr "Déplacement - GQview"
 
-#: src/utilops.c:436
-msgid "GQview - move"
-msgstr "GQview - déplacer"
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "_Déplacer"
 
-#: src/utilops.c:437
-msgid "Move"
-msgstr "Déplacer"
+#: src/utilops.c:974
+msgid "Move file"
+msgstr "Déplacer le fichier"
 
-#: src/utilops.c:439
+#: src/utilops.c:978
+msgid "Move multiple files"
+msgstr "Déplacer des fichiers multiples"
+
+#: src/utilops.c:992 src/utilops.c:1502
+msgid "File name:"
+msgstr "Nom du fichier :"
+
+#: src/utilops.c:996
+msgid "Choose the destination folder."
+msgstr "Choisir le dossier de destination."
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Echec de la suppression"
+
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "Impossible de supprimer le fichier de la corbeille"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+msgid "Could not create folder"
+msgstr "Impossible de créer le dossier"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "Permission refusée"
+
+#: src/utilops.c:1212
 #, c-format
 msgid ""
-"Move file:\n"
-"%s\n"
-"to:"
+"Unable to access or create the trash folder.\n"
+"\"%s\""
 msgstr ""
-"Déplacer fichier :\n"
-"%s\n"
-"vers:"
+"Impossible de créer ou d'accéder à la corbeille.\n"
+"«%s»"
 
-#: src/utilops.c:441
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "Ne pas confirmer la suppression des fichiers"
+
+#: src/utilops.c:1234
 #, c-format
-msgid ""
-"Move multiple files from:\n"
-"%s\n"
-"to:"
-msgstr ""
-"Déplacer des fichiers multiples de :\n"
-"%s\n"
-"vers :"
+msgid "Safe delete: %s"
+msgstr "Confirmer la suppression des fichiers : %s"
 
-#: src/utilops.c:514
+#: src/utilops.c:1276
 #, c-format
 msgid ""
 "Unable to delete file:\n"
 " %s\n"
 " Continue multiple delete operation?"
 msgstr ""
-"Impossible d'éffacer le fichier :\n"
+"Impossible de supprimer le fichier :\n"
 " %s\n"
-" Continuer l'opération d'effacement multiple ?"
-
-#: src/utilops.c:515 src/utilops.c:521
-msgid "Delete failed"
-msgstr "Destruction annulée"
+" Continuer l'opération de suppression multiple ?"
 
-#: src/utilops.c:520 src/utilops.c:565
+#: src/utilops.c:1347
 #, c-format
-msgid ""
-"Unable to delete file:\n"
-"%s"
-msgstr ""
-"Impossible de détruire ce fichier :\n"
-"%s"
+msgid "File %d of %d"
+msgstr "Fichier %d de %d"
 
-#: src/utilops.c:550
-msgid "Delete files"
-msgstr "Effacer les fichiers"
+#: src/utilops.c:1416
+msgid "Delete files - GQview"
+msgstr "Suppression de fichiers - GQview"
 
-#: src/utilops.c:550
-msgid "About to delete multiple files..."
-msgstr "A propos de la destruction de fichiers multiples"
+#: src/utilops.c:1420
+msgid "Delete multiple files"
+msgstr "Supprimer des fichiers multiples"
 
-#: src/utilops.c:551 src/utilops.c:596
-msgid "Delete"
-msgstr "Effacer"
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "Examiner %d fichiers"
 
-#: src/utilops.c:566
-msgid "File deletion failed"
-msgstr "Destruction du fichier annulée"
+#: src/utilops.c:1494
+msgid "Delete file - GQview"
+msgstr "Suppression de fichier - GQview"
 
-#: src/utilops.c:594
-#, c-format
-msgid ""
-"About to delete the file:\n"
-" %s"
-msgstr ""
-"Confirmer l'effacement du fichier :\n"
-" %s"
+#: src/utilops.c:1498
+msgid "Delete file?"
+msgstr "Supprimer fichier ?"
 
-#: src/utilops.c:595
-msgid "Delete file"
-msgstr "Effacer fichier"
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr "Remplacer un fichier existant en renommant un nouveau fichier."
 
-#: src/utilops.c:650 src/utilops.c:834
+#: src/utilops.c:1661
 #, c-format
 msgid ""
-"Overwrite file:\n"
+"Unable to rename file:\n"
 "%s\n"
-"by renaming:\n"
+" to:\n"
 "%s"
 msgstr ""
-"Ecraser le fichier :\n"
+"Impossible de renommer le fichier :\n"
 "%s\n"
-"par renommage de :\n"
+" en :\n"
 "%s"
 
-#: src/utilops.c:663
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Erreur pour renommer le fichier"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Impossible d'auto-renommer avec le jeu\n"
+"de nombres choisi, un ou plusieurs fichiers\n"
+"existent déjà par rapport à la liste de noms.\n"
+
+#: src/utilops.c:1809
 #, c-format
 msgid ""
-"Unable to rename file:\n"
+"Failed to rename\n"
 "%s\n"
-" to:\n"
-"%s"
+"The number was %d."
 msgstr ""
-"Impossible de renommer le fichier :\n"
+"Impossible de renommer\n"
 "%s\n"
-" vers :\n"
-"%s"
-
-#: src/utilops.c:664 src/utilops.c:847
-msgid "Error renaming file"
-msgstr "Erreur pour renommer le fichier"
+"Le nombre était %d."
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "GQview - rename"
-msgstr "GQview - renommer"
+#: src/utilops.c:2031 src/utilops.c:2249
+msgid "Rename - GQview"
+msgstr "Renommer - GQview"
 
-#: src/utilops.c:754
-msgid "Rename multiple files:"
+#: src/utilops.c:2034
+msgid "Rename multiple files"
 msgstr "Renommer des fichiers multiples"
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "Rename"
-msgstr "Renommer"
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "Nom d'origine"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+msgid "Original name:"
+msgstr "Nom d'origine :"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+msgid "New name:"
+msgstr "Renommer :"
 
-#: src/utilops.c:790
-msgid "Rename:"
-msgstr "Renommer : "
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Texte de début"
 
-#: src/utilops.c:799
-msgid "to:"
-msgstr "vers :"
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "N° début"
 
-#: src/utilops.c:846
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Texte de fin"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "Bourrage :"
+
+#: src/utilops.c:2207 src/view_file_list.c:459
 #, c-format
 msgid ""
 "Unable to rename file:\n"
@@ -801,85 +2964,312 @@ msgid ""
 "to:\n"
 "%s"
 msgstr ""
-"Impossible de renommer le fichier :\n"
+"Impossible de renommer le fichier :\n"
 "%s\n"
-"en :\n"
+"en :\n"
 "%s"
 
-#: src/utilops.c:884
+#: src/utilops.c:2252
+msgid "Rename file"
+msgstr "Renommer le fichier"
+
+#: src/utilops.c:2311
 #, c-format
 msgid ""
-"Rename file:\n"
+"The folder:\n"
 "%s\n"
-"to:"
+"already exists."
 msgstr ""
-"Renommer le fichier :\n"
+"Le dossier :\n"
 "%s\n"
-"en :"
+"existe déjà."
+
+#: src/utilops.c:2312
+msgid "Folder exists"
+msgstr "Dossiers existants"
 
-#: src/utilops.c:928
+#: src/utilops.c:2317
 #, c-format
 msgid ""
 "The path:\n"
 "%s\n"
 "already exists as a file."
 msgstr ""
-"Le chemin :\n"
+"Le chemin :\n"
 "%s\n"
 "existe déjà comme fichier."
 
-#: src/utilops.c:929
-msgid "Could not create directory"
-msgstr "Impossible de créer le répertoire"
+#: src/utilops.c:2369
+msgid "New folder - GQview"
+msgstr "Nouveau dossier - GQview"
 
-#: src/utilops.c:934
+#: src/utilops.c:2372
 #, c-format
 msgid ""
-"The directory:\n"
+"Create folder in:\n"
 "%s\n"
-"already exists."
+"named:"
 msgstr ""
-"Le répertoire :\n"
+"Créer un dossier dans :\n"
 "%s\n"
-"existe déjà."
+"\n"
+"nommé :"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "nouveau_repertoire"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "_Remonter"
 
-#: src/utilops.c:935
-msgid "Directory exists"
-msgstr "Répertoire existant"
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "_Diaporama"
 
-#: src/utilops.c:942
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Diaporama récursif"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "Rechercher les fichiers en _double ..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Rechercher récursivement les fichiers en double ..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "_Nouveau dossier ..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "_Voir sous forme d'arbre"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "Ra_fraîchir"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "_Trier"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "Voir sous forme d'_icônes"
+
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "Montre les vigne_ttes"
+
+#: src/view_file_list.c:447
 #, c-format
 msgid ""
-"Unable to create directory:\n"
+"Invalid file name:\n"
 "%s"
 msgstr ""
-"Impossible de créer le répertoire :\n"
+"Nom de fichier invalide :\n"
 "%s"
 
-#: src/utilops.c:943
-msgid "Error creating directory"
-msgstr "Erreur pendant le céation du répertoire"
+#~ msgid "Purge thumbnails"
+#~ msgstr "Purge des vignettes"
 
-#: src/utilops.c:982
-#, c-format
-msgid ""
-"Create directory in:\n"
-"%s\n"
-"named:"
-msgstr ""
-"Créer un répertoire dans :\n"
-"%s\n"
-"\n"
-"Nom :"
+#~ msgid "/File/tear1"
+#~ msgstr "/Fichier/tear1"
 
-#: src/utilops.c:983
-msgid "GQview - new directory"
-msgstr "GQview - nouveau répertoire"
+#~ msgid "/File/_New collection"
+#~ msgstr "/Fichier/_Nouvelle collection"
 
-#: src/utilops.c:983
-msgid "Create"
-msgstr "Créer"
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Fichier/_Ouvrir collection ..."
 
-#: src/window.c:151
-msgid "GQview Tools"
-msgstr "Outils GQview"
+#~ msgid "/File/sep1"
+#~ msgstr "/Fichier/sep1"
+
+#~ msgid "/File/_Search..."
+#~ msgstr "/Fichier/_Rechercher ..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Fichier/Rechercher les fichiers en _double ..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Fichier/sep2"
+
+#~ msgid "/File/_Print..."
+#~ msgstr "/Fichier/_Imprimer ..."
+
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Fichier/Nouveau dossi_er ..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Fichier/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Fichier/_Copier ..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Fichier/_Déplacer ..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Fichier/_Renommer ..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Fichier/_Effacer ..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Fichier/sep4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/Fichier/Fermer _la fenêtre"
+
+#~ msgid "/File/_Quit"
+#~ msgstr "/Fichier/_Quitter"
+
+#~ msgid "/_Edit"
+#~ msgstr "/Édit_er"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Éditer/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Éditer/éditeur1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Éditer/éditeur2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Éditer/éditeur3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Éditer/éditeur4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Éditer/éditeur5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Éditer/éditeur6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Éditer/éditeur7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Éditer/éditeur8"
+
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Éditer/éditeur9"
+
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Éditer/éditeur0"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Éditer/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Éditer/_Ajuster"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Éditer/_Propriétés"
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Éditer/Ajuster/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Éditer/Ajuster/_Rotation sens horaire"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Éditer/Ajuster/Rotation sens _anti-horaire"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Éditer/Ajuster/Rotation de 1_80°"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Éditer/Ajuster/Retournement _horizontal"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Éditer/Ajuster/Retournement _vertical"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Éditer/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Éditer/_Tout sélectionner"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Éditer/_Désélectionner"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Éditer/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Éditer/_Préférences ..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Éditer/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Éditer/Utiliser comme _papier peint"
+
+#~ msgid "/_View"
+#~ msgstr "/_Afficher"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Afficher/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Afficher/Zoom a_vant"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Afficher/Zoom a_rrière"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Afficher/Taille réelle (_1:1)"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Afficher/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Afficher/Vigne_ttes"
+
+#~ msgid "/View/I_cons"
+#~ msgstr "/Affichier/I_cônes"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Afficher/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Afficher/_Plein écran"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Afficher/sep3"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Afficher/Masquer la liste des fic_hiers"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/Afficher/sep4"
+
+#~ msgid "/View/_Keywords"
+#~ msgstr "/Afficher/Mots _clés"
+
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Afficher/Trier par no_m"
+
+#~ msgid "/View/sep5"
+#~ msgstr "/Afficher/sep5"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Afficher/(Dé_s)Activer le diaporama"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Afficher/_Rafraîchir les listes"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Aide/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Aide/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "Configuration de GQview"
diff --git a/po/hu.po b/po/hu.po
new file mode 100644 (file)
index 0000000..934c0ec
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,4163 @@
+# translation of gqview.po to Hungarian
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# Mátyás Tibor <templar@tempi.scene.hu>, 2001.
+# Koblinger Egmont <egmont@uhulinux.hu>, 2004.
+# Sári Gábor <saga@externet.hu>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2004-02-22 17:20+0100\n"
+"Last-Translator: Sári Gábor <saga@externet.hu>\n"
+"Language-Team: Hungarian <hu@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.0.2\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Eszközök"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "rekesz"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+# src/utilops.c:980
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Fájlnév:"
+
+# src/ui_pathsel.c:799
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Fájl dátuma:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+# src/dupe.c:1948
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Összehasonlítás ezzel:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Gyűjtemény mentése"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "Címke"
+
+# src/dupe.c:1652 src/dupe.c:1941
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Név"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "Érték"
+
+# src/preferences.c:401
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "Formátum"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "Elemek"
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "Leírás"
+
+# src/main.c:622
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "Exif"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "Haladó nézet"
+
+# src/utilops.c:664 src/utilops.c:676
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Hiba a törlésnél"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+# src/utilops.c:1144
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"A könyvtár:\n"
+"%s\n"
+"már létezik."
+
+# src/collect-dlg.c:206
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Üres a gyűjtemény"
+
+# src/collect-dlg.c:82 src/collect.c:1011
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"A gyűjtemény mentése sikertelen volt:\n"
+"%s"
+
+# src/collect-dlg.c:83 src/collect.c:1012
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Sikertelen mentés"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "Könyvjelző hozzáadása"
+
+# src/preferences.c:897
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Gyűjtemények"
+
+# src/dupe.c:1652 src/dupe.c:1941
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "Név:"
+
+# src/menu.c:526
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "Rendezés kezelő"
+
+# src/menu.c:709
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "Könyvtárak"
+
+# src/preferences.c:897
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Gyűjtemények"
+
+# src/utilops.c:592
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Másolás"
+
+# src/utilops.c:601
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Mozgatás"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+# src/collect-table.c:86
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d kép"
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Nincs kijelölés"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "Legutóbbi kép visszavonása"
+
+# src/preferences.c:400
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "kész"
+
+# src/dupe.c:841
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Hasonlósági adat olvasása..."
+
+# src/cache_maint.c:245
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Indexképek törlése..."
+
+# src/cache_maint.c:249
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Régi indexképek törlése..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+# src/collect-dlg.c:59
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Érvénytelen fájlnév"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+# src/preferences.c:603
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Indexképek tárolása"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Kezdet #"
+
+# src/menu.c:709
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "Könyvtár:"
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Nincs kijelölés"
+
+# src/collect-dlg.c:59
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Érvénytelen fájlnév"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "fut..."
+
+# src/cache_maint.c:245
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Indexképek törlése..."
+
+# src/preferences.c:163 src/preferences.c:604
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Gyorstár ürítése"
+
+# src/preferences.c:163
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Ez a funkció minden indexképet törölni fog,\n"
+"ami a lemezen van. Folytatod?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "Kép tulajdonságai - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+# src/fullscreen.c:117
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview teljes képernyő"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "akció"
+
+# src/dupe.c:1412 src/dupe.c:1570
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "Törlés"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+# src/preferences.c:603
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "Indexképek tárolása"
+
+# src/preferences.c:603
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "Indexképek megjelenítése"
+
+# src/ui_pathsel.c:437 src/ui_pathsel.c:460 src/utilops.c:944
+# src/utilops.c:1095
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "Átnevezés"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+# src/collect.c:329 src/image.c:1058
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Névtelen"
+
+# src/collect.c:333
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Névtelen (%d)"
+
+# src/collect.c:930
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - GQview gyűjtemény"
+
+# src/collect.c:1048
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Gyűjtemény bezárása"
+
+# src/collect.c:1048
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"A gyűjtemény megváltozott.\n"
+"Elmentsem előbb?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+# src/collect-dlg.c:58
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"A megjelölt elérési út:\n"
+"%s\n"
+"egy könyvtár, a gyűjtemények fájlok"
+
+# src/collect-dlg.c:59
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Érvénytelen fájlnév"
+
+# src/collect-dlg.c:69
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Fájl felülírása"
+
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Fájl felülírása"
+
+# src/collect-dlg.c:73 src/utilops.c:463 src/utilops.c:830 src/utilops.c:1036
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Felülír"
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Gyűjtemény mentése"
+
+# src/collect-dlg.c:172
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Gyűjtemény megnyitása"
+
+# src/collect-dlg.c:180
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Gyűjtemény hozzáfűzése"
+
+# src/collect-dlg.c:182
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Hozzáfűzés"
+
+# src/collect-dlg.c:194
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Gyűjteményfájlok"
+
+# src/collect-dlg.c:206
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Üres a gyűjtemény"
+
+# src/collect-dlg.c:206
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "A jelenlegi gyűjtemény üres, a mentés megszakítva."
+
+# src/collect-table.c:78 src/menu.c:684
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Üres"
+
+# src/collect-table.c:82
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d kép (%d)"
+
+# src/collect-table.c:86
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d kép"
+
+# src/collect-table.c:100 src/dupe.c:668 src/filelist.c:1813
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Indexképek betöltése..."
+
+# src/menu.c:753
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "_Nézet"
+
+# src/collect-table.c:620 src/dupe.c:1388 src/dupe.c:1560 src/img-view.c:801
+# src/menu.c:906 src/menu.c:964
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "Nézet új _ablakban"
+
+# src/collect-table.c:622 src/dupe.c:1410 src/dupe.c:1568
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "_Eltávolítás"
+
+# src/collect-table.c:624
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Csatolás fájllistából"
+
+# src/collect-table.c:625
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Csatolás gyűjteményből..."
+
+# src/collect-table.c:627 src/dupe.c:1391 src/dupe.c:1563
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Mindet kijelölni"
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Nincs kijelölés"
+
+# src/menu.c:748
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "Tu_lajdonságok"
+
+# src/collect-table.c:633 src/dupe.c:1401 src/img-view.c:804 src/menu.c:910
+# src/menu.c:969
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "_Másolás..."
+
+# src/collect-table.c:634 src/dupe.c:1403 src/img-view.c:805 src/menu.c:912
+# src/menu.c:971
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "M_ozgatás..."
+
+# src/collect-table.c:635 src/dupe.c:1405 src/img-view.c:806 src/menu.c:914
+# src/menu.c:973
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "Át_nevezés..."
+
+# src/collect-table.c:636 src/dupe.c:1407 src/img-view.c:807 src/menu.c:916
+# src/menu.c:975
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "_Törlés..."
+
+# src/ui_pathsel.c:764
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "Fájlnév mu_tatása"
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "Gyűjtemény menté_se"
+
+# src/collect-table.c:642
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "Gyűjtemény mentése min_t..."
+
+# src/collect-table.c:644 src/menu.c:885
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "_Duplikációk keresése..."
+
+# src/menu.c:721
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Fájl/Át_nevezés..."
+
+# src/collect-table.c:1818 src/dupe.c:2170
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "A ráhúzott lista könyvtárakat is tartalmaz."
+
+# src/collect-table.c:1820 src/dupe.c:2172
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "Hozzá_adás"
+
+# src/collect-table.c:1821 src/dupe.c:2173
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "_Rekurzív hozzáadás"
+
+# src/collect-table.c:1822 src/dupe.c:2174
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "Könyvtárak kihagyá_sa"
+
+# src/collect-table.c:1824 src/dupe.c:2176 src/preferences.c:536
+# src/ui_utildlg.c:105
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Mégsem"
+
+# src/dupe.c:61
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Húzd ide az összehasonlítandó fájlokat."
+
+# src/dupe.c:67 src/dupe.c:1449
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d fájl"
+
+# src/dupe.c:71
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d egyezés %d fájlban"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[1. halmaz]"
+
+# src/dupe.c:775
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Ellenőrző összegek olvasása..."
+
+# src/dupe.c:807
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Méretek beolvasása..."
+
+# src/dupe.c:841
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Hasonlósági adat olvasása..."
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Összehasonlítás..."
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "Rendezés..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr ""
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr ""
+
+# src/dupe.c:1398
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Hozzáadás egy új gyűjteményhez"
+
+# src/dupe.c:1412 src/dupe.c:1570
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "_Tisztítás"
+
+# src/dupe.c:1415 src/dupe.c:1573 src/img-view.c:841
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "Ablak _bezárása"
+
+# src/filelist.c:88
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "%d fájl (2. halmaz)"
+
+# src/dupe.c:1653 src/dupe.c:1942
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Méret"
+
+# src/dupe.c:1654 src/dupe.c:1943
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Dátum"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Méretek"
+
+# src/dupe.c:1656
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Ellenőrző összeg"
+
+# src/dupe.c:1657 src/dupe.c:1945
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Elérési út"
+
+# src/dupe.c:1658
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Hasonlóság (magas)"
+
+# src/dupe.c:1659
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Hasonlóság"
+
+# src/dupe.c:1660
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Hasonlóság (alacsony)"
+
+# src/dupe.c:1660
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Hasonlóság (egyéni)"
+
+# src/dupe.c:1968
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Duplikációk keresése - GQview"
+
+# src/dupe.c:1948
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Összehasonlítás ezzel:"
+
+# src/dupe.c:2045
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Összehasonlítás ez alapján:"
+
+# src/dupe.c:2054 src/preferences.c:586
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Indexképek"
+
+# src/dupe.c:2060
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Két fájlhalmaz összehasonlítása"
+
+# src/main.c:552
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "Gimp"
+
+# src/main.c:558
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+# src/main.c:561
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+# src/menu.c:572
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "Jpeg kép forgatása jobbra"
+
+# src/menu.c:575
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "Jpeg kép forgatása balra"
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "leállítás..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "Parancs eredmények szerkesztése"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "%s kimenete"
+
+# src/ui_help.c:191
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Sikertelen futtatás:\n"
+"%s\n"
+
+# src/menu.c:522
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "leállítva"
+
+# src/menu.c:432 src/menu.c:461
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "ismeretlen"
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/exif.c:113
+msgid "top left"
+msgstr "bal felső"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "jobb felső"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "jobb alsó"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "bal alsó"
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/exif.c:117
+msgid "left top"
+msgstr "bal felső"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "jobb felső"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "jobb alsó"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "bal alsó"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "inch"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "centiméter"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "átlag"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "súlypont"
+
+#: src/exif.c:142
+msgid "spot"
+msgstr ""
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr ""
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr ""
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "részleges"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "egyéb"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "nem meghatározott"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "kézi"
+
+# src/preferences.c:401
+#: src/exif.c:153
+msgid "normal"
+msgstr "normál"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "rekesz"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "zár"
+
+# src/utilops.c:1216
+#: src/exif.c:156
+msgid "creative"
+msgstr ""
+
+#: src/exif.c:157
+msgid "action"
+msgstr "akció"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "álló"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "fekvő"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "napfény"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr ""
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr ""
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "villanófény"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "nem"
+
+# src/utilops.c:343
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "igen"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr ""
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr ""
+
+# src/utilops.c:539
+#: src/exif.c:289
+msgid "Image description"
+msgstr "Kép leírása"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "Helyzet"
+
+# src/utilops.c:592
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "Copyright"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr ""
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "ISO érzékenység"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "Készítés időpontja"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "Digitalizálás időpontja"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "Zársebesség"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "Rekesz"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr ""
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "Tárgytávolság"
+
+# src/preferences.c:693
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "Mérési módszer"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "Fényforrás"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "Villanófény"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "Gyújtótávolság"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "Szélesség"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "Magasság"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "Felbontás"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "végtelen"
+
+# src/menu.c:709
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "mód:"
+
+# src/preferences.c:400
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "bekapcsolva"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "kikapcsolva"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "automatikus"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr ""
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr ""
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "a vörösszem effektus csökkentése"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "pont"
+
+# src/dupe.c:67 src/dupe.c:1449
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d byte"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f K"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+# src/fullscreen.c:117
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview teljes képernyő"
+
+# src/menu.c:709
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Fájlméret:"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+# src/img-view.c:792 src/menu.c:947 src/menu.c:1083 src/preferences.c:716
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Ablakmérethez igazítás"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+# src/img-view.c:789 src/menu.c:944 src/menu.c:1079
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "Nagyítás"
+
+# src/img-view.c:790 src/menu.c:945 src/menu.c:1081
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "Kicsinyítés"
+
+# src/img-view.c:791 src/menu.c:946
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "_1:1 nézet"
+
+# src/img-view.c:792 src/menu.c:947 src/menu.c:1083 src/preferences.c:716
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "Ablakmérethez _igazítás"
+
+# src/img-view.c:797 src/menu.c:960
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "_Háttérként alkalmaz"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "Diavetítés _leállítása"
+
+# src/img-view.c:816 src/menu.c:985
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "Diavetítés _folytatása"
+
+# src/img-view.c:820 src/img-view.c:827 src/menu.c:989 src/menu.c:995
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "Diavetítés s_zünet"
+
+# src/img-view.c:825 src/menu.c:994
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "_Diavetítés indítása"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "_Kilépés a teljes képernyős nézetből"
+
+# src/img-view.c:837 src/menu.c:1001
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "Teljes ké_pernyő"
+
+# src/dupe.c:1415 src/dupe.c:1573 src/img-view.c:841
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "Ablak _bezárása"
+
+# src/menu.c:709
+#: src/info.c:361
+msgid "File size:"
+msgstr "Fájlméret:"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Méret:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Átlátszó:"
+
+# src/preferences.c:676
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Kép mérete:"
+
+# src/dupe.c:1948
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Tömörítési arány:"
+
+# src/ui_pathsel.c:799
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Fájl dátuma:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Tulajdonos:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Csoport:"
+
+# src/preferences.c:551
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Általános"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "%d. kép összesen %d közül"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Kép tulajdonságai - GQview"
+
+# src/window.c:87
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Növekvő"
+
+# src/filelist.c:76
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Diavetítés"
+
+# src/filelist.c:80
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Szünet"
+
+# src/filelist.c:86
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d fájl (%s, %d)%s"
+
+# src/filelist.c:88
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d fájl%s"
+
+# src/filelist.c:88
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d fájl%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(nincs olvasási jog) %s byte"
+
+# src/window.c:379
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s byte"
+
+# src/window.c:383
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s byte"
+
+# src/window.c:234
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview Eszközök"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Eszközök"
+
+# src/menu.c:709
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "Fájlok"
+
+# src/preferences.c:676
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "A kép megjelenítése"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(az átrendezés fogd és vidd módszerrel működik)"
+
+# src/menu.c:1010
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "Fájllista _rejtése"
+
+# src/menu.c:430 src/menu.c:457
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "%s..."
+
+# src/menu.c:432 src/menu.c:461
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "(ismeretlen)..."
+
+# src/collect-table.c:78 src/menu.c:684
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Üres"
+
+# src/menu.c:709
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Fájl"
+
+# src/menu.c:726
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "_Szerkesztés"
+
+# src/menu.c:626
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "I_gazítás"
+
+# src/menu.c:771
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/Sú_gó"
+
+# src/menu.c:711
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Fájl/Új _ablak"
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "Gyűjtemény menté_se"
+
+# src/collect-dlg.c:172
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Gyűjtemény megnyitása"
+
+# src/menu.c:713
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Fájl/_Legutóbbi megnyitása"
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Rendezés..."
+
+# src/menu.c:721
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Fájl/Át_nevezés..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "Új mappa..."
+
+# src/preferences.c:684
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Minőség"
+
+# src/menu.c:572
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "Forgatás _jobbra"
+
+# src/menu.c:575
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "Forgatás _balra"
+
+# src/menu.c:578
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Forgatás 1_80 fokkal"
+
+# src/menu.c:581
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "Tükrözés _vízszintesen"
+
+# src/menu.c:584
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "Tükrözés _függőlegesen"
+
+# src/collect-table.c:627 src/dupe.c:1391 src/dupe.c:1563
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Mindet kijelölni"
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Nincs kijelölés"
+
+# src/menu.c:748
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "_Tulajdonságok..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+# src/menu.c:758
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Nézet/Ablakmérethez iga_zítás"
+
+# src/img-view.c:837 src/menu.c:1001
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "Teljes ké_pernyő"
+
+# src/menu.c:1010
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Fájllista _rejtése"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "Diavetítés _leállítása"
+
+# src/menu.c:891 src/menu.c:920
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "_Frissítés"
+
+# src/menu.c:776
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Súgó/_Névjegy"
+
+# src/menu.c:773
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Súgó/_Gyorsbillentyűk"
+
+# src/menu.c:774
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Súgó/_Megjelenési jegyzetek"
+
+# src/menu.c:776
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Súgó/_Névjegy"
+
+# src/dupe.c:2054 src/preferences.c:586
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Indexképek"
+
+# src/menu.c:768
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Nézet/_Fa nézet"
+
+# src/menu.c:766
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Nézet/Le_begő fájllista"
+
+# src/menu.c:754
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Nézet/Eszköztár elr_ejtése"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "/Nézet/I_konok"
+
+# src/menu.c:765
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Nézet/E_xif adatok"
+
+# src/menu.c:526
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Rendezés kezelő"
+
+# src/menu.c:765
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Nézet/_Lista"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Ikon:"
+
+# src/preferences.c:603
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Indexképek megjelenítése"
+
+# src/menu.c:1075
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Ugrás a saját könyvtárba"
+
+# src/menu.c:1077
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Fájllista frissítése"
+
+# src/img-view.c:789 src/menu.c:944 src/menu.c:1079
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Nagyítás"
+
+# src/img-view.c:790 src/menu.c:945 src/menu.c:1081
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Kicsinyítés"
+
+# src/img-view.c:792 src/menu.c:947 src/menu.c:1083 src/preferences.c:716
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Ablakmérethez igazítás"
+
+# src/menu.c:1085
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "1:1 méretarány"
+
+# src/menu.c:1087
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "A GQview beállítása"
+
+# src/menu.c:1089
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Külön eszköztár"
+
+# src/main.c:129
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Segítség - GQview"
+
+# src/main.c:743
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Parancssor"
+
+# src/preferences.c:660
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Következő kép előtöltése"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "Legutóbbi kép visszavonása"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Legutóbbi kép visszavonása"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "_Kilépés a teljes képernyős nézetből"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "_Kilépés a teljes képernyős nézetből"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "_Kilépés a teljes képernyős nézetből"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "Diavetítés _leállítása"
+
+# src/img-view.c:825 src/menu.c:994
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "_Diavetítés indítása"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "Diavetítés _leállítása"
+
+# src/img-view.c:825 src/menu.c:994
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "_Diavetítés indítása"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+# src/window.c:234
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview Eszközök"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+# src/utilops.c:1090
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr "Fájl átnevezése:"
+
+# src/collect-table.c:620 src/dupe.c:1388 src/dupe.c:1560 src/img-view.c:801
+# src/menu.c:906 src/menu.c:964
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Nézet új _ablakban"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+# src/main.c:457
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Használat: gqview [opciók] [útvonal]\n"
+"\n"
+
+# src/main.c:458
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "érvényes opciók:\n"
+
+# src/main.c:459
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           eszközök mutatása\n"
+
+# src/main.c:460
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        eszközök rejtése\n"
+
+# src/main.c:461
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           indítás teljes képernyős módban\n"
+
+# src/main.c:462
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            indítás diavetítés módban\n"
+
+# src/main.c:463
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+"  -l, --list                 gyűjtemény ablak megnyitása a parancssor "
+"számára\n"
+
+# src/main.c:463
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+"  -l, --list                 gyűjtemény ablak megnyitása a parancssor "
+"számára\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+# src/main.c:464
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    hibakereső kimenet bekapcsolása\n"
+
+# src/main.c:465
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              verziószám kiírása\n"
+
+# src/main.c:466
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 ennek az üzenetnek a kiírása\n"
+"\n"
+
+# src/main.c:471
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"érvénytelen opció: %s\n"
+"Használj \"--help\"-et az opciókért\n"
+
+# src/main.c:533
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "GQview könyvtár létrehozása: %s\n"
+
+# src/main.c:536
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Nem lehet a könyvtárat létrehozni:%s\n"
+
+# src/ui_pathsel.c:754
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Saját könyvtár"
+
+# src/utilops.c:989
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "Munkaasztal"
+
+# src/main.c:619
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - kilépés"
+
+# src/main.c:129
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "Névjegy - GQview"
+
+# src/main.c:619
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Megváltozott a gyűjtemény.\n"
+"Kilép ennek ellenére?"
+
+# src/menu.c:510
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "Rendezés méret szerint"
+
+# src/menu.c:513
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "Rendezés dátum szerint"
+
+# src/menu.c:516
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Rendezetlen"
+
+# src/menu.c:519
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "Rendezés útvonal szerint"
+
+# src/menu.c:522
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "Rendezés szám szerint"
+
+# src/menu.c:526
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "Rendezés név szerint"
+
+# src/menu.c:559
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Rendezés"
+
+# src/menu.c:578
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "Forgatás 1_80 fokkal"
+
+# src/preferences.c:367
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Hasonló (rossz minőség, de gyors)"
+
+# src/preferences.c:368
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Csempézve"
+
+# src/preferences.c:369
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilineáris"
+
+# src/preferences.c:370
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Szuper (jó minőség, de lassú)"
+
+# src/preferences.c:400
+#: src/preferences.c:418
+msgid "None"
+msgstr "Nincs"
+
+# src/preferences.c:401
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normál minőségű"
+
+# src/preferences.c:402
+#: src/preferences.c:420
+msgid "Best"
+msgstr "A legjobb minőségű"
+
+#: src/preferences.c:498 src/print.c:365
+#, fuzzy
+msgid "Custom"
+msgstr "automatikus"
+
+# src/utilops.c:707
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "Szűrők visszaállítása"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Ez visszaállítja a szűrőket az alapértelmezett értékekre.\n"
+"Folytatod?"
+
+# src/utilops.c:707
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "Szerkesztők törlése"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Ez visszaállítja a szerkesztő parancsokat az alapértelmezett értékekre.\n"
+"Folytatod?"
+
+# src/preferences.c:163 src/preferences.c:604
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "Kuka ürítése"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "Ez eltávolítja a kukában lévő elemeket."
+
+# src/utilops.c:942 src/utilops.c:1091
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - átnevezés"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "Kezdet #"
+
+# src/menu.c:1075
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Ugrás a saját könyvtárba"
+
+# src/preferences.c:581
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Jelenlegi könyvtár használata"
+
+# src/preferences.c:595
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Méret:"
+
+# src/preferences.c:597
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Minőség:"
+
+# src/preferences.c:603
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Indexképek tárolása"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+# src/preferences.c:610
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Indexképek tárolása a \".thumbnails\" könyvtár alatt"
+
+# src/preferences.c:613
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Használja az \"xvpics\" indexképeit (csak olvasás)"
+
+# src/preferences.c:615
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Diavetítés"
+
+# src/preferences.c:628
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Képváltási időköz (másodpercben):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+# src/preferences.c:645
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Véletlen"
+
+# src/preferences.c:647
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Ismétlés"
+
+# src/img-view.c:789 src/menu.c:944 src/menu.c:1079
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Nagyítás"
+
+# src/preferences.c:693
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Dithering módszer:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Kétlépéses átméretezés"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "A kép nagyításának engedélyezése ablakmérethez igazításkor."
+
+# src/preferences.c:751
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Nagyítási lépésköz:"
+
+# src/preferences.c:700
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Új kép kiválasztásánál:"
+
+# src/preferences.c:710
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Eredeti méret"
+
+# src/preferences.c:722
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Nagyítás az előző beállítás alapján"
+
+# src/collect-dlg.c:182
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Hozzáfűzés"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Fekete háttér"
+
+# src/utilops.c:328 src/utilops.c:394 src/utilops.c:668
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Folytatás"
+
+# src/menu.c:1077
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "Frissítés a fájl tartalmának változásakor"
+
+# src/preferences.c:660
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Következő kép előtöltése"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Képek automatikus forgatása az Exif infók alapján"
+
+# src/preferences.c:773
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Ablakok"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Kezdet #"
+
+# src/preferences.c:782
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Az ablak pozíciójának megjegyzése"
+
+# src/preferences.c:784
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Az eszköztár állapotának (külön/rejtett) megjegyzése"
+
+# src/preferences.c:787
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "A kép ablak méretűre nyújtása, ha az eszköztár külön/rejtett"
+
+# src/preferences.c:794
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Méret korlátozása auto-méretezés esetén (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Kinézet (Megjelenés)"
+
+# src/preferences.c:812
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Szűrés"
+
+# src/preferences.c:821
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Rejtett fájlok mutatása"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "Kis/nagybetű különbözik"
+
+# src/preferences.c:823
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Fájl szűrés letiltása"
+
+# src/ui_pathsel.c:799
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Fájl dátuma:"
+
+# src/ui_pathsel.c:799
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "Szűrő"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "Alapértelmezések"
+
+# src/preferences.c:915
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Szerkesztők"
+
+# src/preferences.c:927
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+# src/preferences.c:930
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Megjelenített név a menüben"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "Haladó"
+
+# src/img-view.c:837 src/menu.c:1001
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "Teljes ké_pernyő"
+
+# src/preferences.c:676
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Kép mérete:"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Törlés"
+
+# src/preferences.c:667
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Fájl törlés megerősítése"
+
+# src/preferences.c:669
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "A \"Delete\" gomb engedélyezése"
+
+# src/preferences.c:667
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "Biztonságos törlés (mozgatás az alábbi könyvtárba)"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Maximális méret (MB)"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+# src/collect-table.c:619 src/dupe.c:1386 src/dupe.c:1558
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Nézet"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+# src/preferences.c:906
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Derékszögű kijelölés"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Csökkenő mappák Fa nézetben"
+
+# src/preferences.c:658
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Átnevezés helyben"
+
+#: src/preferences.c:1200
+#, fuzzy
+msgid "Navigation"
+msgstr "akció"
+
+# src/preferences.c:764
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Progresszív billentyű görgetés"
+
+# src/preferences.c:766
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Az egér görgője görgeti a képet"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+# src/preferences.c:875
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "Egyéni hasonlósági küszöb:"
+
+# src/preferences.c:735
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Képernyőn kívüli cache mérete (MB képenként):"
+
+# src/main.c:129
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "Névjegy - GQview"
+
+# src/preferences.c:1041
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"honlap: %s\n"
+"e-mail: %s\n"
+"\n"
+"Megjelent a GNU Általános Terjesztési Feltételeinek (General Public License) "
+"megfelelően"
+
+# src/menu.c:748
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "Köszönet..."
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Nincs kijelölés"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+#, fuzzy
+msgid "Default printer"
+msgstr "Alapértelmezések"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr ""
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+# src/preferences.c:676
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Kép mérete:"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+# src/main.c:561
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+#, fuzzy
+msgid "centimeters"
+msgstr "centiméter"
+
+#: src/print.c:353
+#, fuzzy
+msgid "inches"
+msgstr "inch"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+#, fuzzy
+msgid "Portrait"
+msgstr "álló"
+
+#: src/print.c:360
+#, fuzzy
+msgid "Landscape"
+msgstr "fekvő"
+
+#: src/print.c:366
+#, fuzzy
+msgid "Letter"
+msgstr "centiméter"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, fuzzy, c-format
+msgid "page %d of %d"
+msgstr "%d. kép összesen %d közül"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "Előnézet"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+# src/ui_pathsel.c:307
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "A(z) %s fájl már létezik."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+# src/ui_pathsel.c:799
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Szűrő"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Alapértelmezések"
+
+# src/main.c:129
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "Névjegy - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+# src/preferences.c:401
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Formátum"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Helyzet"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Leírás"
+
+# src/utilops.c:980
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Fájlnév:"
+
+# src/collect.c:329 src/image.c:1058
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Névtelen"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+# src/preferences.c:400
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "bekapcsolva"
+
+# src/menu.c:559
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Rendezés"
+
+# src/preferences.c:676
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Kép mérete:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "rekesz"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+#, fuzzy
+msgid "Right:"
+msgstr "Magasság"
+
+#: src/print.c:3432
+#, fuzzy
+msgid "Top:"
+msgstr "Csoport:"
+
+# src/utilops.c:989
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "fájlnévről a következőre:"
+
+# src/ui_pathsel.c:799
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Szűrő"
+
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr ""
+
+# src/ui_pathsel.c:799
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Szűrő:"
+
+# src/ui_pathsel.c:799
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Fájl dátuma:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+# src/preferences.c:782
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Az ablak pozíciójának megjegyzése"
+
+# src/rcfile.c:132
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "Hiba a konfigurációs fájl mentése közben: %s\n"
+
+# src/menu.c:709
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Könyvtár:"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Elemek"
+
+#: src/search.c:202
+#, fuzzy
+msgid "results"
+msgstr "Alapértelmezések"
+
+# src/utilops.c:328 src/utilops.c:394 src/utilops.c:668
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Folytatás"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+msgid "greater than"
+msgstr ""
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+# src/dupe.c:1654 src/dupe.c:1943
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "Dátum"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+# src/filelist.c:86
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d fájl (%s, %d)%s"
+
+# src/filelist.c:88
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%s, %d fájl%s"
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Rendezés..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+# src/utilops.c:544
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Kérlek válassz egy létező könyvtárat"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+# src/utilops.c:544
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Kérlek válassz egy létező könyvtárat"
+
+#: src/search.c:2570
+#, fuzzy
+msgid "Image search - GQview"
+msgstr "Kép tulajdonságai - GQview"
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Rendezés..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+# src/utilops.c:980
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Fájlnév:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+# src/menu.c:709
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Fájlméret:"
+
+# src/preferences.c:645
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Véletlen"
+
+# src/ui_pathsel.c:799
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Fájl dátuma:"
+
+# src/utilops.c:539
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Kép leírása"
+
+# src/collect-table.c:1820 src/dupe.c:2172
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Hozzáadás"
+
+# src/dupe.c:1659
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Hasonlóság"
+
+# src/preferences.c:645
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Véletlen"
+
+# src/thumb.c:268
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr ""
+"A gyorstárban lévő indexkép betöltése sikertelen volt, megpróbálom újra "
+"létrehozni.\n"
+
+# src/ui_tabcomp.c:171
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Nem lehet előzmények listát létrehozni: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "Új könyvjelző"
+
+# src/preferences.c:915
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "Könyvjelzők szerkesztése"
+
+# src/dupe.c:1657 src/dupe.c:1945
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "Elérési út:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "Ikon:"
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Nincs kijelölés"
+
+# src/menu.c:748
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "_Tulajdonságok..."
+
+# src/utilops.c:601
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "Mozgatás _fel"
+
+# src/utilops.c:601
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "Mozgatás _le"
+
+# src/collect-table.c:622 src/dupe.c:1410 src/dupe.c:1568
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "_Eltávolítás"
+
+# src/ui_help.c:191
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Nem lehet megnyitni:\n"
+"%s"
+
+# src/ui_pathsel.c:313
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Hiba %s átnevezésekor %s névre."
+
+# src/ui_pathsel.c:343 src/utilops.c:675 src/utilops.c:727
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Nem lehet a fájlt törölni:\n"
+"%s"
+
+# src/ui_pathsel.c:344 src/utilops.c:728
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Sikertelen fájltörlés"
+
+# src/ui_pathsel.c:398 src/utilops.c:760
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Fájl törlése"
+
+# src/ui_pathsel.c:397 src/utilops.c:759
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Fájl törlésének jóváhagyása:\n"
+" %s"
+
+# src/ui_pathsel.c:437 src/ui_pathsel.c:460 src/utilops.c:944
+# src/utilops.c:1095
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "Átne_vezés"
+
+# src/preferences.c:915
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "Könyvjelző hozzá_adása"
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "_Törlés"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "Új mappa..."
+
+# src/ui_pathsel.c:517 src/utilops.c:1158
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Nem lehet a könyvtárat létrehozni:\n"
+"%s"
+
+# src/ui_pathsel.c:518 src/utilops.c:1159
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Hiba a könyvtár létrehozásakor"
+
+# src/ui_pathsel.c:697
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Minden fájl"
+
+# src/ui_pathsel.c:764
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Rejtett fájlok mutatása"
+
+# src/ui_pathsel.c:799
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Szűrő:"
+
+# src/collect-table.c:627 src/dupe.c:1391 src/dupe.c:1563
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Mindet kijelölni"
+
+# src/ui_pathsel.c:697
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "Minden fájl"
+
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Fájl felülírása"
+
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Fájl felülírása"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Fájl felülírása"
+
+# src/utilops.c:345
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Mindet kihagy"
+
+# src/utilops.c:345
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Kihagy"
+
+# src/utilops.c:387 src/utilops.c:495
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Hiba áthelyezés közben"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "Új mappa..."
+
+# src/preferences.c:930
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Automatikus átnevezés"
+
+# src/ui_pathsel.c:437 src/ui_pathsel.c:460 src/utilops.c:944
+# src/utilops.c:1095
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Átnevezés"
+
+# src/utilops.c:316
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "A másolandó forrás egyezik a céllal"
+
+# src/utilops.c:317
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Nem lehet a(z)\n"
+"%s\n"
+"fájlt önmagába másolni."
+
+# src/utilops.c:321
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Az áthelyezendő forrás egyezik a céllal"
+
+# src/utilops.c:322
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Nem lehet a(z)\n"
+"%s\n"
+"fájlt önmagára áthelyezni."
+
+# src/utilops.c:328 src/utilops.c:394 src/utilops.c:668
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Folytatás"
+
+# src/utilops.c:382 src/utilops.c:490
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Hiba másolás közben"
+
+# src/utilops.c:383
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Nem lehet ezt a fájlt:\n"
+"%s\n"
+"átmásolni ide:\n"
+"%s\n"
+"miközben több fájlt másol."
+
+# src/utilops.c:387 src/utilops.c:495
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Hiba áthelyezés közben"
+
+# src/utilops.c:388
+#: src/utilops.c:636
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Nem lehet ezt a fájlt:\n"
+"%s\n"
+"áthelyezni ide:\n"
+"%s\n"
+"miközben több fájlt mozgat."
+
+# src/utilops.c:450
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "A forrás egyezik a céllal"
+
+# src/utilops.c:451
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Forrás és cél ugyanaz, művelet megszakítva."
+
+# src/utilops.c:491
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Nem lehet a fájlt másolni:\n"
+"%s\n"
+"ide:\n"
+"%s"
+
+# src/utilops.c:496
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Nem lehet a fájlt áthelyezni:\n"
+"%s\n"
+"ide:\n"
+"%s"
+
+# src/utilops.c:539
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Érvénytelen célkönyvtár"
+
+# src/utilops.c:540
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"Ha több fájllal dolgozol, kérlek válassz\n"
+"egy könyvtárat, ne fájlt."
+
+# src/utilops.c:544
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Kérlek válassz egy létező könyvtárat"
+
+# src/main.c:129
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Segítség - GQview"
+
+# src/utilops.c:592
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "_Másolás"
+
+# src/utilops.c:1090
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr "Fájl átnevezése:"
+
+# src/utilops.c:596
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "Több fájl másolása ide:"
+
+# src/main.c:129
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Segítség - GQview"
+
+# src/utilops.c:601
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "M_ozgatás"
+
+# src/utilops.c:1090
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr "Fájl átnevezése:"
+
+# src/utilops.c:605
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Több fájl áthelyezése ide:"
+
+# src/utilops.c:980
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Fájlnév:"
+
+# src/utilops.c:450
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "A forrás egyezik a céllal"
+
+# src/utilops.c:664 src/utilops.c:676
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Hiba a törlésnél"
+
+# src/utilops.c:322
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "Nem lehet a régi fájlt törölni a kukából"
+
+# src/utilops.c:1151
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Nem lehet könyvtárat létrehozni"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "Hozzáférés megtagadva"
+
+# src/ui_pathsel.c:517 src/utilops.c:1158
+#: src/utilops.c:1212
+#, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Nem lehet a kukát elérni vagy létrehozni:\n"
+"\"%s\""
+
+# src/preferences.c:667
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "Biztonságos törlés kikapcsolása"
+
+# src/preferences.c:667
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "Biztonságos törlés: %s"
+
+# src/utilops.c:663
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Nem lehet a fájlt törölni:\n"
+" %s\n"
+" Folytatja a többi fájl törlését?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr "%d. fájl %d közül"
+
+# src/utilops.c:707
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Fájlok törlése"
+
+# src/utilops.c:942
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Több fájl átnevezése:"
+
+# src/dupe.c:67 src/dupe.c:1449
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "%d fájl újranézése"
+
+# src/ui_pathsel.c:398 src/utilops.c:760
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Fájl törlése"
+
+# src/ui_pathsel.c:398 src/utilops.c:760
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Fájl törlése"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+# src/utilops.c:842
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Nem lehet a fájlt átnevezni:\n"
+"%s\n"
+" erre:\n"
+"%s"
+
+# src/filelist.c:811 src/filelist.c:817 src/filelist.c:823 src/utilops.c:845
+# src/utilops.c:1048
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Nem lehet a fájlt átnevezni"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Az automatikus átnevezés nem hajtható végre a\n"
+"megadott adatokkal, mert egy vagy több fájl már létezik\n"
+"a szükséges nevekkel.\n"
+
+# src/ui_pathsel.c:313
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"Hiba %s átnevezése közben\n"
+"\n"
+"A %d. sorszámnál"
+
+# src/main.c:129
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Segítség - GQview"
+
+# src/utilops.c:942
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "Több fájl átnevezése:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "Eredeti név"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Eredeti név"
+
+# src/utilops.c:980
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "Átnevezés:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Kezdő szöveg"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "Kezdet #"
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Záró szöveg"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "Számláló szélessége:"
+
+# src/filelist.c:822 src/utilops.c:1047
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Nem lehet a(z)\n"
+"%s\n"
+"fájlt átnevezni erre:\n"
+"%s"
+
+# src/utilops.c:1090
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr "Fájl átnevezése:"
+
+# src/utilops.c:1144
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"A könyvtár:\n"
+"%s\n"
+"már létezik."
+
+# src/menu.c:709
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Könyvtárak"
+
+# src/utilops.c:1150
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"Az útvonal:\n"
+"%s\n"
+"már létezik mint fájl."
+
+# src/main.c:129
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Segítség - GQview"
+
+# src/utilops.c:1211
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Könyvtár létrehozása\n"
+"%s könyvtárban\n"
+"ilyen néven:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "új könyvtár"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "Feljebb egy szinttel"
+
+# src/menu.c:879
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "_Diavetítés"
+
+# src/menu.c:881
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Diavetítés rekurzívan"
+
+# src/collect-table.c:644 src/menu.c:885
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "_Duplikációk keresése..."
+
+# src/menu.c:887
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Duplikációk keresése rekurzívan..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "Új mappa..."
+
+# src/menu.c:761
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "Fa nézet"
+
+# src/menu.c:891 src/menu.c:920
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "_Frissítés"
+
+# src/menu.c:559
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "_Rendezés"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "_Ikonnézet"
+
+# src/preferences.c:603
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "Inde_xképek megjelenítése"
+
+# src/filelist.c:810
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Érvénytelen fájlnév:\n"
+"%s"
+
+# src/cache_maint.c:252
+#~ msgid "Purge thumbnails"
+#~ msgstr "Indexképek törlése"
+
+# src/menu.c:710
+#~ msgid "/File/tear1"
+#~ msgstr "/Fájl/tear1"
+
+# src/menu.c:711
+#~ msgid "/File/_New collection"
+#~ msgstr "/Fájl/Új _gyűjtemény"
+
+# src/menu.c:712
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Fájl/Gyűjtemén_y megnyitása..."
+
+# src/menu.c:714
+#~ msgid "/File/sep1"
+#~ msgstr "/Fájl/sep1"
+
+# src/menu.c:721
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/Fájl/Át_nevezés..."
+
+# src/menu.c:715
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Fájl/_Duplikációk keresése..."
+
+# src/menu.c:716
+#~ msgid "/File/sep2"
+#~ msgstr "/Fájl/sep2"
+
+# src/menu.c:721
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Fájl/Át_nevezés..."
+
+# src/menu.c:722
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Fájl/Új _könyvtár..."
+
+# src/menu.c:718
+#~ msgid "/File/sep3"
+#~ msgstr "/Fájl/sep3"
+
+# src/menu.c:719
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Fájl/_Másolás..."
+
+# src/menu.c:720
+#~ msgid "/File/_Move..."
+#~ msgstr "/Fájl/M_ozgatás..."
+
+# src/menu.c:721
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Fájl/Át_nevezés..."
+
+# src/menu.c:722
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Fájl/_Törlés..."
+
+# src/menu.c:723
+#~ msgid "/File/sep4"
+#~ msgstr "/Fájl/sep4"
+
+# src/dupe.c:1415 src/dupe.c:1573 src/img-view.c:841
+#~ msgid "/File/C_lose window"
+#~ msgstr "/Fájl/Ablak be_zárása"
+
+# src/menu.c:724
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Fájl/K_ilépés"
+
+# src/menu.c:726
+#~ msgid "/_Edit"
+#~ msgstr "/_Szerkesztés"
+
+# src/menu.c:727
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Szerkesztés/tear1"
+
+# src/menu.c:728
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Szerkesztés/editor1"
+
+# src/menu.c:729
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Szerkesztés/editor2"
+
+# src/menu.c:730
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Szerkesztés/editor3"
+
+# src/menu.c:731
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Szerkesztés/editor4"
+
+# src/menu.c:732
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Szerkesztés/editor5"
+
+# src/menu.c:733
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Szerkesztés/editor6"
+
+# src/menu.c:734
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Szerkesztés/editor7"
+
+# src/menu.c:735
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Szerkesztés/editor8"
+
+# src/menu.c:728
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Szerkesztés/editor9"
+
+# src/menu.c:728
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Szerkesztés/editor0"
+
+# src/menu.c:736
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Szerkesztés/sep1"
+
+# src/menu.c:737
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Szerkesztés/_Igazítás"
+
+# src/menu.c:748
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Szerkesztés/_Tulajdonságok..."
+
+# src/menu.c:738
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Szerkesztés/Igazítás/tear1"
+
+# src/menu.c:739
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Szerkesztés/Igazítás/Forgatás _jobbra"
+
+# src/menu.c:740
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Szerkesztés/Igazítás/Forgatás _balra"
+
+# src/menu.c:741
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Szerkesztés/Igazítás/Forgatás 1_80 fokkal"
+
+# src/menu.c:742
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Szerkesztés/Igazítás/Tükrözés _vízszintesen"
+
+# src/menu.c:743
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Szerkesztés/Igazítás/Tükrözés _függőlegesen"
+
+# src/menu.c:744
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Szerkesztés/sep2"
+
+# src/menu.c:745
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Szerkesztés/Mindent _kijelöl"
+
+# src/menu.c:746
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Szerkesztés/Ninc_s kijelölés"
+
+# src/menu.c:747
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Szerkesztés/sep3"
+
+# src/menu.c:748
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Szerkesztés/_Beállítások..."
+
+# src/menu.c:750
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Szerkesztés/sep4"
+
+# src/menu.c:751
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Szerkesztés/Legyen ez a _háttérkép"
+
+# src/menu.c:753
+#~ msgid "/_View"
+#~ msgstr "/_Nézet"
+
+# src/menu.c:754
+#~ msgid "/View/tear1"
+#~ msgstr "/Nézet/tear1"
+
+# src/menu.c:755
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Nézet/Na_gyítás"
+
+# src/menu.c:756
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Nézet/Ki_csinyítés"
+
+# src/menu.c:757
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Nézet/_1:1 arányú nézet"
+
+# src/menu.c:759
+#~ msgid "/View/sep1"
+#~ msgstr "/Nézet/sep1"
+
+# src/menu.c:762
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Nézet/_Indexképek"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#~ msgid "/View/I_cons"
+#~ msgstr "/Nézet/I_konok"
+
+# src/menu.c:764
+#~ msgid "/View/sep2"
+#~ msgstr "/Nézet/sep2"
+
+# src/menu.c:761
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Nézet/Teljes ké_pernyő"
+
+# src/menu.c:768
+#~ msgid "/View/sep3"
+#~ msgstr "/Nézet/sep3"
+
+# src/menu.c:767
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Nézet/Fájllista elre_jtése"
+
+# src/menu.c:759
+#~ msgid "/View/sep4"
+#~ msgstr "/Nézet/sep4"
+
+# src/menu.c:755
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Nézet/_Rendezés kezelő"
+
+# src/menu.c:759
+#~ msgid "/View/sep5"
+#~ msgstr "/Nézet/sep5"
+
+# src/menu.c:769
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Nézet/_Diavetítés ki-be"
+
+# src/menu.c:765
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Nézet/Lista fri_ssítése"
+
+# src/menu.c:772
+#~ msgid "/Help/tear1"
+#~ msgstr "/Súgó/tear1"
+
+# src/menu.c:775
+#~ msgid "/Help/sep1"
+#~ msgstr "/Súgó/sep1"
+
+# src/preferences.c:507
+#~ msgid "GQview configuration"
+#~ msgstr "A GQview beállításai"
+
+# src/menu.c:749
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Szerkesztés/_Régi indexképek törlése"
+
+# src/dupe.c:1657 src/dupe.c:1945
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Elérési út"
+
+# src/collect-dlg.c:167 src/collect.c:1052
+#~ msgid "Save"
+#~ msgstr "Mentés"
+
+# src/collect.c:1053 src/ui_help.c:302
+#~ msgid "Close"
+#~ msgstr "Bezárás"
+
+# src/collect-dlg.c:68
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Gyűjtemény fájl felülírása:\n"
+#~ "%s"
+
+# src/collect-dlg.c:166
+#~ msgid "Save collection as:"
+#~ msgstr "Gyűjtemény mentése mint:"
+
+# src/collect-dlg.c:173
+#~ msgid "Open collection from:"
+#~ msgstr "Gyűjtemény megnyitása innen:"
+
+# src/collect-dlg.c:174
+#~ msgid "Open"
+#~ msgstr "Megnyitás"
+
+# src/collect-dlg.c:181
+#~ msgid "Append collection from:"
+#~ msgstr "Gyűjtemény hozzáfűzése innen:"
+
+# src/main.c:622
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Kilépés"
+
+# src/main.c:622
+#~ msgid "Exit"
+#~ msgstr "Kilépés"
+
+# src/preferences.c:165 src/preferences.c:523 src/ui_utildlg.c:208
+# src/utilops.c:220
+#~ msgid "Ok"
+#~ msgstr "OK"
+
+# src/collect-dlg.c:59
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Érvénytelen fájlnév"
+
+# src/preferences.c:569
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Indításkor ugrás ebbe a könyvtárba:"
+
+# src/preferences.c:695 src/preferences.c:697
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Átméretezés (arányosan):"
+
+# src/preferences.c:805
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Dialógusablakok egér alá helyezése"
+
+# src/preferences.c:825
+#~ msgid "Include files of type:"
+#~ msgstr "Kezelt fájltípusok:"
+
+# src/collect-table.c:622 src/dupe.c:1410 src/dupe.c:1568
+#~ msgid "Remove"
+#~ msgstr "Eltávolítás"
+
+#~ msgid "Add"
+#~ msgstr "Hozzáadás"
+
+# src/preferences.c:933
+#~ msgid "Command Line"
+#~ msgstr "A végrehajtandó parancssor"
+
+# src/menu.c:771
+#~ msgid "Help"
+#~ msgstr "Súgó"
+
+# src/img-view.c:837 src/menu.c:1001
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "Teljes ké_pernyő"
+
+# src/menu.c:709
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Fájlméret:"
+
+#, fuzzy
+#~ msgid "Width:"
+#~ msgstr "Szélesség"
+
+#, fuzzy
+#~ msgid "Height:"
+#~ msgstr "Magasság"
+
+# src/utilops.c:338
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Fájl felülírása:\n"
+#~ " %s\n"
+#~ " ezzel:\n"
+#~ " %s"
+
+# src/utilops.c:343
+#~ msgid "Yes"
+#~ msgstr "Igen"
+
+# src/utilops.c:344
+#~ msgid "Yes to all"
+#~ msgstr "Igen, mindet"
+
+# src/utilops.c:458
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Fájl felülírása:\n"
+#~ "%s\n"
+#~ " ezzel:\n"
+#~ "%s"
+
+# src/utilops.c:594
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Fájl másolása:\n"
+#~ "%s\n"
+#~ "ide:"
+
+# src/utilops.c:603
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Áthelyezi a fájlt:\n"
+#~ "%s\n"
+#~ "ide:"
+
+# src/utilops.c:707
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Több fájl törlésének jóváhagyása..."
+
+# src/utilops.c:825 src/utilops.c:1031
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Fájl felülírása:\n"
+#~ "%s\n"
+#~ "átnevezéssel:\n"
+#~ "%s"
+
+# src/utilops.c:989
+#~ msgid "to:"
+#~ msgstr "fájlnévről a következőre:"
+
+# src/utilops.c:1216
+#~ msgid "Create"
+#~ msgstr "Létrehozás"
+
+# src/preferences.c:559
+#~ msgid "Initial directory"
+#~ msgstr "Induló könyvtár"
+
+# src/ui_pathsel.c:507 src/ui_pathsel.c:759
+#~ msgid "New Directory"
+#~ msgstr "Új könyvtár"
+
+# src/ui_pathsel.c:517 src/utilops.c:1158
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Nem lehet a könyvtárat létrehozni:\n"
+#~ "%s"
+
+# src/ui_pathsel.c:518 src/utilops.c:1159
+#~ msgid "Error creating directory"
+#~ msgstr "Hiba a könyvtár létrehozásakor"
+
+# src/utilops.c:539
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "Kép leírása"
+
+# src/menu.c:769
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/Nézet/_Diavetítés ki-be"
+
+# src/collect-table.c:1820 src/dupe.c:2172
+#~ msgid "Add contents"
+#~ msgstr "Hozzáadás"
+
+# src/collect-table.c:1821 src/dupe.c:2173
+#~ msgid "Add contents recursive"
+#~ msgstr "Hozzáadás rekurzívan"
+
+# src/collect-table.c:1822 src/dupe.c:2174
+#~ msgid "Skip directories"
+#~ msgstr "Könyvtárak kihagyása"
+
+# src/utilops.c:543
+#~ msgid "Invalid directory"
+#~ msgstr "Érvénytelen könyvtár"
+
+# src/utilops.c:591
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - másolás"
+
+# src/utilops.c:600
+#~ msgid "GQview - move"
+#~ msgstr "GQview - mozgatás"
+
+# src/utilops.c:1145
+#~ msgid "Directory exists"
+#~ msgstr "A könyvtár létezik"
+
+# src/utilops.c:1212
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - új könyvtár"
+
+#~ msgid "Misc."
+#~ msgstr "Egyéb"
diff --git a/po/id.po b/po/id.po
new file mode 100644 (file)
index 0000000..4296eaa
--- /dev/null
+++ b/po/id.po
@@ -0,0 +1,3714 @@
+# GQView (Indonesian)
+# Copyright (C) 2003 John Ellis
+# This file is distributed under the same license as the PACKAGE package.
+# Tedi Heriyanto <tedi_h@gmx.net>, 2003.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2003-04-14 11:03GMT+0700\n"
+"Last-Translator: Tedi Heriyanto <tedi_h@gmx.net>\n"
+"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 0.9.6\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Tool"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "Tanggal"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Namafile:"
+
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Tanggal file:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Bandingkan dengan:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Simpan koleksi"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr ""
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Nama"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr ""
+
+#: src/bar_exif.c:426
+#, fuzzy
+msgid "Format"
+msgstr "Normal"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr ""
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+#, fuzzy
+msgid "Description"
+msgstr "deskripsi"
+
+#: src/bar_exif.c:549 src/info.c:105
+#, fuzzy
+msgid "Exif"
+msgstr "Keluar"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr ""
+
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Gagal hapus"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Direktori:\n"
+"%s\n"
+"sudah ada."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Koleksi kosong"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Gagal menyimpan koleksi:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Gagal Menyimpan"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr ""
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Koleksi"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+#, fuzzy
+msgid "Name:"
+msgstr "Nama"
+
+#: src/bar_sort.c:569
+#, fuzzy
+msgid "Sort Manager"
+msgstr "Urutkan berdasarkan nama"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+#, fuzzy
+msgid "Folders"
+msgstr "File"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Koleksi"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Salin"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Pindah"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d image"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Tidak ada yang dipilih"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr ""
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+#, fuzzy
+msgid "done"
+msgstr "Tidak ada"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Membaca kemiripan data..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Menghapus thumbnail..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Menghapus thumbnail lama..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Namafile tidak valid"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Cache thumbnail"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Mulai #"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+#, fuzzy
+msgid "Folder:"
+msgstr "File"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Tidak ada yang dipilih"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Namafile tidak valid"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+#, fuzzy
+msgid "running..."
+msgstr "Membandingkan..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Menghapus thumbnail..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Hapus cache"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Akan menghapus semua thumbnail yang telah\n"
+"disimpan ke disk, lanjutkan?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "Properti image.-.GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview layar penuh"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "Koleksi"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "Bersihkan"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "Cache thumbnail"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "Tampilkan thumbnail"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "Ganti nama"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Tiada judul"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Tiada judul (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - Koleksi GQview"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Menutup koleksi"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Koleksi telah dimodifikasi \n"
+"Simpan dulu?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Path yang dispesifikasikan:\n"
+"%s\n"
+"adalah direktori, koleksi adalah file"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Namafile tidak valid"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Timpa File"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Timpa file"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Timpa"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Simpan koleksi"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Buka koleksi"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Tambahkan koleksi"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Tambah"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "File Koleksi"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Koleksi kosong"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Koleksi saat ini kosong, penyimpanan dibatalkan"
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Kosong"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d image (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d image"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Memuatkan thumb..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+#, fuzzy
+msgid "_View"
+msgstr "/_View"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+#, fuzzy
+msgid "View in _new window"
+msgstr "Lihat di jendela baru"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+#, fuzzy
+msgid "Rem_ove"
+msgstr "Pindahkan"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Tambahkan dari daftar file"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Tambahkan dari koleksi..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Pilih semua"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Tidak ada yang dipilih"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+#, fuzzy
+msgid "_Properties"
+msgstr "Properti"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+#, fuzzy
+msgid "_Copy..."
+msgstr "Salin..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+#, fuzzy
+msgid "_Move..."
+msgstr "Pindah..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+#, fuzzy
+msgid "_Rename..."
+msgstr "Ganti nama..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+#, fuzzy
+msgid "_Delete..."
+msgstr "Hapus..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+#, fuzzy
+msgid "Show filename _text"
+msgstr "Tampilkan sembunyi"
+
+#: src/collect-table.c:813
+#, fuzzy
+msgid "_Save collection"
+msgstr "Simpan koleksi"
+
+#: src/collect-table.c:815
+#, fuzzy
+msgid "Save collection _as..."
+msgstr "Simpan koleksi sebagai..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+#, fuzzy
+msgid "_Find duplicates..."
+msgstr "Cari duplikat..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/File/_Rename..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "Hapus daftar termasuk direktori."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+#, fuzzy
+msgid "_Add contents"
+msgstr "Tambah isi"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+#, fuzzy
+msgid "Add contents _recursive"
+msgstr "Tambah isi secara rekursif"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "Lewati direktori"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Batal"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Hapus file untuk membandingkannya"
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d files"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d kecocokan ditemukan dalam %d file"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr ""
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Membaca checksum..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Membaca dimensi..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Membaca kemiripan data..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Membandingkan..."
+
+#: src/dupe.c:1535
+#, fuzzy
+msgid "Sorting..."
+msgstr "Membandingkan..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr ""
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr ""
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Tambah ke koleksi baru"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+#, fuzzy
+msgid "C_lear"
+msgstr "Bersihkan"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+#, fuzzy
+msgid "Close _window"
+msgstr "Tutup jendela"
+
+#: src/dupe.c:2382
+#, fuzzy, c-format
+msgid "%d files (set 2)"
+msgstr "%d file%s"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Ukuran"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Tanggal"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Dimensi"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Checksum"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Path"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Kemiripan (tinggi)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Kemiripan"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Kemiripan (rendah)"
+
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Kemiripan (kustom)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Cari duplikat.-. GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Bandingkan dengan:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Dibandingkan secara:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Thumbnail"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Bandingkan dua set file"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+#, fuzzy
+msgid "Rotate jpeg clockwise"
+msgstr "Putar searah jarum jam"
+
+#: src/editors.c:59
+#, fuzzy
+msgid "Rotate jpeg counterclockwise"
+msgstr "Putar berlawanan dengan arah jam"
+
+#: src/editors.c:104
+#, fuzzy
+msgid "stopping..."
+msgstr "Membandingkan..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr ""
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr ""
+
+#: src/editors.c:303
+#, fuzzy, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Tidak dapat memuatkan:\n"
+"%s"
+
+#: src/editors.c:414
+#, fuzzy
+msgid "stopped by user"
+msgstr "Urutkan berdasarkan angka"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+#, fuzzy
+msgid "unknown"
+msgstr "dalam (tidak dikenal)..."
+
+#: src/exif.c:113
+#, fuzzy
+msgid "top left"
+msgstr "Hapus"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr ""
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr ""
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr ""
+
+#: src/exif.c:117
+#, fuzzy
+msgid "left top"
+msgstr "Hapus"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr ""
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr ""
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr ""
+
+#: src/exif.c:127
+msgid "inch"
+msgstr ""
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr ""
+
+#: src/exif.c:140
+msgid "average"
+msgstr ""
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr ""
+
+#: src/exif.c:142
+msgid "spot"
+msgstr ""
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr ""
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr ""
+
+#: src/exif.c:145
+msgid "partial"
+msgstr ""
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr ""
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr ""
+
+#: src/exif.c:152
+msgid "manual"
+msgstr ""
+
+#: src/exif.c:153
+#, fuzzy
+msgid "normal"
+msgstr "Normal"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr ""
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr ""
+
+#: src/exif.c:156
+#, fuzzy
+msgid "creative"
+msgstr "Buat"
+
+#: src/exif.c:157
+msgid "action"
+msgstr ""
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr ""
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr ""
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr ""
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr ""
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr ""
+
+#: src/exif.c:168
+msgid "flash"
+msgstr ""
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "tidak"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "ya"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr ""
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr ""
+
+#: src/exif.c:289
+#, fuzzy
+msgid "Image description"
+msgstr "deskripsi"
+
+#: src/exif.c:292
+#, fuzzy
+msgid "Orientation"
+msgstr "Dimensi:"
+
+#: src/exif.c:303
+#, fuzzy
+msgid "Copyright"
+msgstr "Salin"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr ""
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr ""
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr ""
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr ""
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr ""
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr ""
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr ""
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr ""
+
+#: src/exif.c:323
+#, fuzzy
+msgid "Metering mode"
+msgstr "Metode dithering:"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr ""
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr ""
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr ""
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr ""
+
+#: src/exif.c:337
+msgid "Height"
+msgstr ""
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr ""
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr ""
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr ""
+
+#: src/exif.c:1479
+#, fuzzy
+msgid "mode:"
+msgstr "File"
+
+#: src/exif.c:1483 src/utilops.c:1234
+#, fuzzy
+msgid "on"
+msgstr "Tidak ada"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr ""
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr ""
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr ""
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr ""
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr ""
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr ""
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d bytes"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f K"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: src/filelist.c:526
+#, fuzzy, c-format
+msgid "%.1f GB"
+msgstr "%.1f MB"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview layar penuh"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Ukuran file:"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Sesuaikan image ke jendela"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+#, fuzzy
+msgid "Zoom _in"
+msgstr "Perbesar"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+#, fuzzy
+msgid "Zoom _out"
+msgstr "Perkecil"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+#, fuzzy
+msgid "Zoom _1:1"
+msgstr "Zoom 1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+#, fuzzy
+msgid "Fit image to _window"
+msgstr "Sesuaikan image ke jendela"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+#, fuzzy
+msgid "Set as _wallpaper"
+msgstr "Set sebagai wallpaper"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+#, fuzzy
+msgid "_Stop slideshow"
+msgstr "Hentikan slideshow"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+#, fuzzy
+msgid "Continue slides_how"
+msgstr "Lanjutkan slideshow"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+#, fuzzy
+msgid "Pause slides_how"
+msgstr "Pause slideshow"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+#, fuzzy
+msgid "_Start slideshow"
+msgstr "Mulai slideshow"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+#, fuzzy
+msgid "Exit _full screen"
+msgstr "Keluar layar penuh"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+#, fuzzy
+msgid "_Full screen"
+msgstr "Layar penuh"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+#, fuzzy
+msgid "C_lose window"
+msgstr "Tutup jendela"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "Ukuran file:"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Dimensi:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Transparan:"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Ukuran image:"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Rasio kompresi:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Tanggal file:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Pemilik:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Grup:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Umum"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr ""
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Properti image.-.GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Menaik"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Slideshow"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Pause"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d file (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d file%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d file%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(tidak ada ijin membaca) %s byte"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s byte"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s byte"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "Tool GQview"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Tool"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "File"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Image"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(tarik untuk merubah urutan)"
+
+#: src/layout_image.c:770
+#, fuzzy
+msgid "Hide file _list"
+msgstr "Sembunyikan daftar file"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "dalam %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "dalam (tidak dikenal)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Kosong"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_File"
+
+#: src/layout_util.c:749 src/menu.c:91
+#, fuzzy
+msgid "_Edit"
+msgstr "/_Edit"
+
+#: src/layout_util.c:750 src/menu.c:248
+#, fuzzy
+msgid "_Adjust"
+msgstr "Sesuaikan"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/_Help"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/File/New _window"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "Simpan koleksi"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Buka koleksi"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/File/Open _recent"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Membandingkan..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/File/_Rename..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "Folder baru..."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Kualitas"
+
+#: src/layout_util.c:779 src/menu.c:194
+#, fuzzy
+msgid "_Rotate clockwise"
+msgstr "Putar searah jarum jam"
+
+#: src/layout_util.c:780 src/menu.c:197
+#, fuzzy
+msgid "Rotate _counterclockwise"
+msgstr "Putar berlawanan dengan arah jam"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Rotasi 180"
+
+#: src/layout_util.c:782 src/menu.c:203
+#, fuzzy
+msgid "_Mirror"
+msgstr "Cermin"
+
+#: src/layout_util.c:783 src/menu.c:206
+#, fuzzy
+msgid "_Flip"
+msgstr "Balik"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Pilih semua"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Tidak ada yang dipilih"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "Properti"
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/View/_Zoom to fit"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "Layar penuh"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Sembunyikan daftar file"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "Hentikan slideshow"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "Refresh"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Help/_About"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Help/_Keyboard shortcuts"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Help/_Release notes"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Help/_About"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Thumbnail"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/View/Tr_ee"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/View/_Float file list"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/View/Hide tool_bar"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "/View/I_cons"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/View/_List"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Urutkan berdasarkan nama"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/View/_List"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "/View/I_cons"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Tampilkan thumbnail"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Rubah ke home direktori"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Refresh daftar file"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Perbesar"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Perkecil"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Sesuaikan image ke jendela"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Set zoom 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Opsi konfigurasi"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Kendali Ambang"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Bantuan - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Perintah baris"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Preload gambar berikutnya"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "%d image"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Preload gambar berikutnya"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "Keluar layar penuh"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "Keluar layar penuh"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "Keluar layar penuh"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "Hentikan slideshow"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "Mulai slideshow"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "Hentikan slideshow"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "Mulai slideshow"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "Tool GQview"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr ""
+"Ganti nama file:\n"
+"%s\n"
+"ke:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Lihat di jendela baru"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Penggunaan: gqview [options] [path]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "opsi valid:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           paksa tampilkan tool\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        paksa sembunyikan tool\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           mulai dengan mode layar penuh\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            mulai dalam mode slideshow\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+"  -l, --list                 buka jendela koleksi untuk perintah baris\n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+"  -l, --list                 buka jendela koleksi untuk perintah baris\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    adakan output debug\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              cetak info versi\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 tampilkan pesan ini\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"tidak valid atau diabaikan: %s\n"
+"Gunakan --help untuk opsi\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Membuat direktori GQView: %s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Tidak dapat membuat dir: %s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Rumah"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr ""
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - keluar"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "Bantuan - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Koleksi telah dimodifikasi.\n"
+"Tetap keluar?"
+
+#: src/menu.c:115
+#, fuzzy
+msgid "Sort by size"
+msgstr "Urutkan berdasarkan ukuran"
+
+#: src/menu.c:118
+#, fuzzy
+msgid "Sort by date"
+msgstr "Urutkan berdasarkan tanggal"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Tidak diurutkan"
+
+#: src/menu.c:124
+#, fuzzy
+msgid "Sort by path"
+msgstr "Urutkan berdasarkan path"
+
+#: src/menu.c:127
+#, fuzzy
+msgid "Sort by number"
+msgstr "Urutkan berdasarkan angka"
+
+#: src/menu.c:131
+#, fuzzy
+msgid "Sort by name"
+msgstr "Urutkan berdasarkan nama"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Urutkan"
+
+#: src/menu.c:200
+#, fuzzy
+msgid "Rotate _180"
+msgstr "Rotasi 180"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Terdekat (terjelek, namun tercepat)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Ubin"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilinear"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Hiper (terbaik, namun terlambat)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Tidak ada"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normal"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Terbaik"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr ""
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "Reset filter"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Akan mereset file filter ke bakunya.\n"
+"Lanjutkan?"
+
+#: src/preferences.c:699 src/preferences.c:702
+#, fuzzy
+msgid "Reset editors"
+msgstr "Reset filter"
+
+#: src/preferences.c:703
+#, fuzzy
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Akan mereset file filter ke bakunya.\n"
+"Lanjutkan?"
+
+#: src/preferences.c:727 src/preferences.c:730
+#, fuzzy
+msgid "Clear trash"
+msgstr "Hapus cache"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr ""
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - ganti nama"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "Mulai #"
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Rubah ke home direktori"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Gunakan saat ini"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Ukuran:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Kualitas:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Cache thumbnail"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Cache thumbnail ke thumbnail"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Gunakan xvpics thumbnail bila ditemukan (hanya-baca)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Slide show"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Tunda sebelum gambar berubah (detik):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Acak"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Berulang"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Perbesar"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Metode dithering:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Zoom 2-pass"
+
+#: src/preferences.c:895
+#, fuzzy
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Ekspansi gambar untuk zoom agar sesuai."
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Inkrementasi zoom:"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Ketika gambar baru terpilih:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Zoom ke ukuran asli"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Biarkan zoom pada setting sebelumnya"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Tambah"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Latar belakang hitam"
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Lanjut"
+
+#: src/preferences.c:924
+#, fuzzy
+msgid "Refresh on file change"
+msgstr "Refresh daftar file"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Preload gambar berikutnya"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr ""
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Jendela"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Mulai #"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Ingat posisi jendela"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Ingat status tool (float/sembunyi)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "Sesuaikan jendela dengan gambar ketika tool sembunyi/mengambang"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Batasi ukuran ketika jendela auto-sizing (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Layout"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filter"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Tampilkan entri yang dimulai dengan titik"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr ""
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Tiadakan File Filtering"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Tanggal file:"
+
+#: src/preferences.c:1008
+#, fuzzy
+msgid "Filter"
+msgstr "Filter:"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "Baku"
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Editor"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Nama menu"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr ""
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "Layar penuh"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Ukuran image:"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Hapus"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Konfirmasi hapus file"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Adakan kunci hapus"
+
+#: src/preferences.c:1158
+#, fuzzy
+msgid "Safe delete"
+msgstr "Konfirmasi hapus file"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Ukuran file:"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Lihat"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Seleksi kotak"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Folder descend dalam view pohon"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Menggantikan"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr ""
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Scrolling keyboard progresif"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Scrool gambar roda mouse "
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "Ambang kesamaan kustom:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Ukuran cache offscreen (Mb per gambar):"
+
+#: src/preferences.c:1291
+#, fuzzy
+msgid "About - GQview"
+msgstr "Bantuan - GQview"
+
+#: src/preferences.c:1304
+#, fuzzy, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright (c) 2002 by John Ellis\n"
+"http://gqview.sourceforge.net\n"
+"gqview@users.sourceforge.net\n"
+"\n"
+"Released under the GNU General Public License"
+
+#: src/preferences.c:1322
+#, fuzzy
+msgid "Credits..."
+msgstr "Properti"
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Tidak ada yang dipilih"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+#, fuzzy
+msgid "Default printer"
+msgstr "Baku"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr ""
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Ukuran image:"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr ""
+
+#: src/print.c:353
+msgid "inches"
+msgstr ""
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr ""
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr ""
+
+#: src/print.c:366
+msgid "Letter"
+msgstr ""
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, c-format
+msgid "page %d of %d"
+msgstr ""
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr ""
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, fuzzy, c-format
+msgid "A file with name %s already exists."
+msgstr "Nama file %s sudah ada."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Filter:"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Baku"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "Bantuan - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Normal"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Dimensi:"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "deskripsi"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Namafile:"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Tiada judul"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "Tidak ada"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Urutkan"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Ukuran image:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "filter"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr ""
+
+#: src/print.c:3432
+#, fuzzy
+msgid "Top:"
+msgstr "Grup:"
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "ke:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Filter:"
+
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr ""
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Filter:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Tanggal file:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Ingat posisi jendela"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "kesalahan menyimpan file config: %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "File"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Tambah isi"
+
+#: src/search.c:202
+#, fuzzy
+msgid "results"
+msgstr "Baku"
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Lanjut"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+msgid "greater than"
+msgstr ""
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "filter"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d file (%s, %d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%s, %d file%s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Membandingkan..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Silakan pilih direktori yang ada"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Silakan pilih direktori yang ada"
+
+#: src/search.c:2570
+#, fuzzy
+msgid "Image search - GQview"
+msgstr "Properti image.-.GQview"
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Membandingkan..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Namafile:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Ukuran file:"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Acak"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Tanggal file:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "deskripsi"
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Tambah isi"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Kemiripan"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Acak"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "Gambar thumbnail di cache gagal dimuatkan, coba buat ulang.\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Tidak dapat menulis daftar sejarah ke: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr ""
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+#, fuzzy
+msgid "Edit Bookmark"
+msgstr "Editor"
+
+#: src/ui_bookmark.c:612
+#, fuzzy
+msgid "Path:"
+msgstr "Path"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr ""
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Tidak ada yang dipilih"
+
+#: src/ui_bookmark.c:718
+#, fuzzy
+msgid "_Properties..."
+msgstr "Properti"
+
+#: src/ui_bookmark.c:720
+#, fuzzy
+msgid "Move _up"
+msgstr "Pindah"
+
+#: src/ui_bookmark.c:722
+#, fuzzy
+msgid "Move _down"
+msgstr "Pindah"
+
+#: src/ui_bookmark.c:724
+#, fuzzy
+msgid "_Remove"
+msgstr "Pindahkan"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Tidak dapat memuatkan:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Gagal mengganti nama %s ke %s."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Tidak dapat menghapus file:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Gagal hapus file"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Hapus file"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Akan menghapus file:\n"
+"%s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+#, fuzzy
+msgid "_Rename"
+msgstr "Ganti nama"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+#, fuzzy
+msgid "Add _Bookmark"
+msgstr "Editor"
+
+#: src/ui_pathsel.c:636
+#, fuzzy
+msgid "_Delete"
+msgstr "Hapus"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "Folder baru..."
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Tidak dapat membuat direktori baru:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Gagal membuat direktori"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Semua file"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Tampilkan sembunyi"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filter:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Pilih semua"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "Semua file"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Timpa file"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Timpa file"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Timpa file"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Lewati semua"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Lewati"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Gagal memindahkan file"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "Folder baru..."
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Ganti nama otomatis"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Ganti nama"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Sumber untuk menyalin tujuan kecocokan"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Tidak dapat menyalin file:\n"
+"%s\n"
+"ke dirinya sendiri."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Sumber untuk memindahkan tujuan kecocokan"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Tidak dapat memindahkan file:\n"
+"%s\n"
+"ke dirinya sendiri."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Lanjut"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Gagal menyalin file"
+
+#: src/utilops.c:631
+#, fuzzy, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Tidak dapat menyalin file:\n"
+"%s ke:\n"
+"%s\n"
+" selama penyalinan file ganda."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Gagal memindahkan file"
+
+#: src/utilops.c:636
+#, fuzzy, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Gagal memindahkan file:\n"
+"%s ke:\n"
+"%s\n"
+" selama memindahkan banyak file"
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Tujuan sumber kecocokan"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Sumber dan tujuan sama, operasi dibatalkan."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Tidak dapat menyalin file:\n"
+"%s\n"
+"ke:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Tidak dapat menyalin file:\n"
+"%s\n"
+"ke:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Tujuan tidak valid"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"Ketika beroperasi pada banyak file, silakan pilih\n"
+"direktori, bukan file."
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Silakan pilih direktori yang ada"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Bantuan - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+#, fuzzy
+msgid "_Copy"
+msgstr "Salin"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr ""
+"Ganti nama file:\n"
+"%s\n"
+"ke:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "Salin banyak file ke:"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Bantuan - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+#, fuzzy
+msgid "_Move"
+msgstr "Pindah"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr ""
+"Ganti nama file:\n"
+"%s\n"
+"ke:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Pindah banyak file ke:"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Namafile:"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Tujuan sumber kecocokan"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Gagal hapus"
+
+#: src/utilops.c:1124
+#, fuzzy
+msgid "Unable to remove old file from trash folder"
+msgstr ""
+"Tidak dapat memindahkan file:\n"
+"%s\n"
+"ke dirinya sendiri."
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Tidak dapat membuat direktori"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr ""
+
+#: src/utilops.c:1212
+#, fuzzy, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Tidak dapat membuat direktori baru:\n"
+"%s"
+
+#: src/utilops.c:1216
+#, fuzzy
+msgid "Turn off safe delete"
+msgstr "Konfirmasi hapus file"
+
+#: src/utilops.c:1234
+#, fuzzy, c-format
+msgid "Safe delete: %s"
+msgstr "Konfirmasi hapus file"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Tidak dapat menghapus file:\n"
+" %s\n"
+" Lanjut operasi hapus banyak file?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr ""
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Hapus file"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Ganti nama banyak file:"
+
+#: src/utilops.c:1438
+#, fuzzy, c-format
+msgid "Review %d files"
+msgstr "%d files"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Hapus file"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Hapus file"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Tidak dapat mengganti nama file:\n"
+"%s\n"
+" ke:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Gagal mengganti nama file"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Tidak dapat mengganti nama otomatis ke himpunan angka\n"
+"yang dipilih, satu atau lebih file sudah ada\n"
+"yang cocok dengan daftar nama hasil.\n"
+
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"Gagal mengganti nama\n"
+"%s\n"
+"Angkanya adalah %d."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Bantuan - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "Ganti nama banyak file:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr ""
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Namafile:"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "Ganti nama:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Teks awal"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "Mulai #"
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Teks akhir"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "Padding:"
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Tidak dapat mengganti nama file:\n"
+"%s\n"
+"ke:\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr ""
+"Ganti nama file:\n"
+"%s\n"
+"ke:"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Direktori:\n"
+"%s\n"
+"sudah ada."
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "File"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"Path:\n"
+"%s\n"
+"sudah ada sebagai file."
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Bantuan - GQview"
+
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Buat direktori di:\n"
+"%s\n"
+"bernama:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "new_folder"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+#, fuzzy
+msgid "_Up to parent"
+msgstr "Ke orangtua"
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+#, fuzzy
+msgid "_Slideshow"
+msgstr "Slideshow"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Rekursif Slideshow"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+#, fuzzy
+msgid "Find _duplicates..."
+msgstr "Cari duplikat..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Cari rekursif ganda..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+#, fuzzy
+msgid "_New folder..."
+msgstr "Folder baru..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+#, fuzzy
+msgid "View as _tree"
+msgstr "Lihat sebagai pohon"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+#, fuzzy
+msgid "Re_fresh"
+msgstr "Refresh"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+#, fuzzy
+msgid "_Sort"
+msgstr "Urutkan"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+#, fuzzy
+msgid "View as _icons"
+msgstr "Lihat sebagai ikon"
+
+#: src/view_file_list.c:421
+#, fuzzy
+msgid "Show _thumbnails"
+msgstr "Tampilkan thumbnail"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Nama file tidak valid:\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "Menghapus thumbnail"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/File/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/File/_New collection"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/File/_Open collection..."
+
+#~ msgid "/File/sep1"
+#~ msgstr "/File/sep1"
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/File/_Rename..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/File/_Find duplicates..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/File/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/File/_Rename..."
+
+#, fuzzy
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "Folder baru..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/File/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/File/_Copy..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/File/_Move..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/File/_Rename..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/File/_Delete..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/File/sep4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/File/C_lose window"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/File/E_xit"
+
+#~ msgid "/_Edit"
+#~ msgstr "/_Edit"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Edit/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Edit/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Edit/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Edit/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Edit/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Edit/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Edit/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Edit/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Edit/editor8"
+
+#, fuzzy
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Edit/editor1"
+
+#, fuzzy
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Edit/editor1"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Edit/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Edit/_Adjust"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Edit/_Properties"
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Edit/Adjust/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Edit/Adjust/_Rotate clockwise"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Edit/Adjust/Rotate _counterclockwise"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Edit/Adjust/Rotate 1_80"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Edit/Adjust/_Mirror"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Edit/Adjust/_Flip"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Edit/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Edit/Select _all"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Edit/Select _none"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Edit/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Edit/_Options..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Edit/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Edit/Set as _wallpaper"
+
+#~ msgid "/_View"
+#~ msgstr "/_View"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/View/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/View/Zoom _in"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/View/Zoom _out"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/View/Zoom _1:1"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/View/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/View/_Thumbnails"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/View/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/View/F_ull screen"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/View/sep3"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/View/_Hide file list"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/View/sep4"
+
+#, fuzzy
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/View/Zoom _in"
+
+#, fuzzy
+#~ msgid "/View/sep5"
+#~ msgstr "/View/sep1"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/View/Toggle _slideshow"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/View/_Refresh Lists"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Help/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Help/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "Konfigurasi GQview"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Edit/_Remove old thumbnails"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Path"
+
+#~ msgid "Save"
+#~ msgstr "Simpan"
+
+#~ msgid "Close"
+#~ msgstr "Tutup"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Timpa file koleksi:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "Simpan koleksi sebagai:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "Buka koleksi dari:"
+
+#~ msgid "Open"
+#~ msgstr "Buka"
+
+#~ msgid "Append collection from:"
+#~ msgstr "Tambahkan koleksi dari:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Keluar"
+
+#~ msgid "Exit"
+#~ msgstr "Keluar"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Namafile tidak valid"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Saat mulai, ubah ke direktori ini:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Zoom (skala):"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Letakkan dialog di bawah mouse"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Sertakan file tipe:"
+
+#~ msgid "Remove"
+#~ msgstr "Pindahkan"
+
+#~ msgid "Add"
+#~ msgstr "Tambah"
+
+#~ msgid "Command Line"
+#~ msgstr "Perintah baris"
+
+#, fuzzy
+#~ msgid "Help"
+#~ msgstr "/_Help"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "Layar penuh"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Ukuran file:"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Timpa file:\n"
+#~ " %s\n"
+#~ " dengan:\n"
+#~ " %s"
+
+#~ msgid "Yes"
+#~ msgstr "Ya"
+
+#~ msgid "Yes to all"
+#~ msgstr "Ya ke semua"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Timpa file:\n"
+#~ "%s\n"
+#~ " dengan:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Salin file:\n"
+#~ "%s\n"
+#~ "ke:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Pindah file:\n"
+#~ "%s\n"
+#~ "ke:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Akan menghapus banyak file..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Timpa file:\n"
+#~ "%s\n"
+#~ "dengan mengganti nama:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "ke:"
+
+#~ msgid "Create"
+#~ msgstr "Buat"
+
+#~ msgid "Initial directory"
+#~ msgstr "Direktori awal"
+
+#~ msgid "New Directory"
+#~ msgstr "Direktori Baru"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Tidak dapat membuat direktori baru:\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "Gagal membuat direktori"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "deskripsi"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/View/Toggle _slideshow"
+
+#~ msgid "Add contents"
+#~ msgstr "Tambah isi"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "Tambah isi secara rekursif"
+
+#~ msgid "Skip directories"
+#~ msgstr "Lewati direktori"
+
+#~ msgid "Invalid directory"
+#~ msgstr "Direktori tidak valid"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - salin"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - pindah"
+
+#~ msgid "Directory exists"
+#~ msgstr "Direktori ada"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - direktori baru"
+
+#~ msgid "Misc."
+#~ msgstr "Lain"
+
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/File/Create _Dir..."
+
+#~ msgid "Edit"
+#~ msgstr "Edit"
+
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "Sisipkan file drop pada lokasi pointer"
+
+#~ msgid "File named %s already exists."
+#~ msgstr "File bernama %s sudah ada."
+
+#, fuzzy
+#~ msgid "Date:"
+#~ msgstr "Tanggal"
+
+#, fuzzy
+#~ msgid "top"
+#~ msgstr "ke:"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview berjalan: %s\n"
+
+#~ msgid "Electric Eyes"
+#~ msgstr "Electric Eyes"
+
+#~ msgid "Apply"
+#~ msgstr "Aplikasikan"
diff --git a/po/it.po b/po/it.po
new file mode 100644 (file)
index 0000000..cb64d4c
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,3016 @@
+# translation of it.po to Italiano
+# translation of gqview-1.5.8_it.po to Italiano
+# This file is distributed under the same license as the PACKAGE package.
+# Costantino <inverness1ATvirgilio.it>, 2005.
+# Costantino <inverness1ATvirgilio.it>, 2005.
+# Copyright (C) Christopher R. Gabriel <cgabriel@pluto.linux.it>, 2000 - 2001.
+# Costantino <inverness1ATvirgilio.it>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview-1.5.8_it\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2005-02-10 15:07+0100\n"
+"Last-Translator: Costantino <inverness1ATvirgilio.it>\n"
+"Language-Team: Italiano <it@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.3.1\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr "Favorito"
+
+#: src/bar_info.c:31
+msgid "Todo"
+msgstr "Da fare"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr "Gente"
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr "Luoghi"
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr "Arte"
+
+#: src/bar_info.c:35
+msgid "Nature"
+msgstr "Natura"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr "Possessi"
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr "Impostazioni delle parole chiavi"
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr "Elenco delle parole chiavi favorite"
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr "Parole chiavi"
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Nome del file:"
+
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Data del file:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr "Parole chiavi:"
+
+#: src/bar_info.c:1095
+msgid "Comment:"
+msgstr "Commento:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr "Modifica la lista delle parole chiavi favorite."
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr "Aggiungi delle parole chiavi ai file selezionati"
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+"Aggiungi delle parole chiavi ai file selezionati e sostituisci quelle già "
+"esistenti."
+
+#: src/bar_info.c:1130
+msgid "Save comment now"
+msgstr "Salva il commento adesso"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "Etichetta"
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Nome"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "Valore"
+
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "Formato"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "Elementi"
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "Descrizione"
+
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "Exif "
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "Vista avanzata"
+
+#: src/bar_sort.c:218
+msgid "Unlink failed"
+msgstr "La disconnessione non è riuscita"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr "Non riesco a collegarmi"
+
+#: src/bar_sort.c:435
+#, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"La collezione:\n"
+"%s\n"
+"esiste già."
+
+#: src/bar_sort.c:436
+msgid "Collection exists"
+msgstr "La collezione esiste già"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Non è stato possibile salvare la collezione:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Il salvataggio non è riuscito"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "Aggiungi segnalibro"
+
+#: src/bar_sort.c:489
+msgid "Add Collection"
+msgstr "Aggiungi collezione"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "Nome:"
+
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "Amministratore di ordinamento"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "Cartelle"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Collezioni"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Copia"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Sposta"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr "Collegamento"
+
+#: src/bar_sort.c:610
+msgid "Add image"
+msgstr "Aggiungi immagine"
+
+#: src/bar_sort.c:617
+msgid "Add selection"
+msgstr "Aggiungi selezione"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "Annulla l'ultima immagine"
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "fatto"
+
+#: src/cache_maint.c:304
+msgid "Removing old metadata..."
+msgstr "Sto rimuovendo i vecchi metadata..."
+
+#: src/cache_maint.c:308
+msgid "Clearing cached thumbnails..."
+msgstr "Sto cancellando le anteprime nella cache..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+msgid "Removing old thumbnails..."
+msgstr "Sto rimuovendo le vecchie anteprime..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr "Manutenzione"
+
+#: src/cache_maint.c:792 src/utilops.c:904
+msgid "Invalid folder"
+msgstr "La cartella non è valida"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr "Non riesco a trovare la cartella specificata."
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+msgid "Create thumbnails"
+msgstr "Crea anteprime"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+msgid "S_tart"
+msgstr "A_vvia "
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "Cartella:"
+
+#: src/cache_maint.c:845
+msgid "Select folder"
+msgstr "Seleziona cartella"
+
+#: src/cache_maint.c:849
+msgid "Include subfolders"
+msgstr "Includi sottocartelle"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr "Conserva le anteprime assieme alle immagini sorgenti"
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr "click per partire"
+
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "in esecuzione..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Sto cancellando le anteprime..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Svuota la cache"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Questo rimuoverà tutte le anteprime\n"
+"che sono state salvate su disco. Continuo?"
+
+#: src/cache_maint.c:1163
+msgid "Cache Maintenance - GQview"
+msgstr "Manutenzione della cache - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr "Manutenzione della cache e dei dati"
+
+#: src/cache_maint.c:1177
+msgid "GQview thumbnail cache"
+msgstr "Cache delle anteprime di GQview"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+msgid "Location:"
+msgstr "Posizione:"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+msgid "Clean up"
+msgstr "Pulisci"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr "Rimuovi le anteprime orfane o datate."
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+msgid "Delete all cached thumbnails."
+msgstr "Cancella tutte le anteprime in cache."
+
+#: src/cache_maint.c:1197
+msgid "Shared thumbnail cache"
+msgstr "Condividi la cache delle anteprime"
+
+#: src/cache_maint.c:1220
+msgid "Render"
+msgstr "Renderizza"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr "Renderizza le anteprime per una specifica cartella."
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr "Metadati"
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr "Rimuovi le parole d'ordine orfane e i commenti."
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Senza titolo"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Senza titolo (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - Collezione di GQview"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Chiudi collezione"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"La collezione è stata modificata.\n"
+"Non vuoi prima salvarla?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr "_Rigetta"
+
+#: src/collect-dlg.c:58
+#, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Il percorso specificato:\n"
+"%s\n"
+"è una cartella, le collezioni sono file"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Il nome del file non è valido"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Sovrascrivi file"
+
+#: src/collect-dlg.c:73
+msgid "Overwrite existing file?"
+msgstr "Sovrascrivo il file esistente?"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+msgid "_Overwrite"
+msgstr "S_ovrascrivi"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Salva collezione"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Apri collezione"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Accoda collezione"
+
+#: src/collect-dlg.c:185
+msgid "_Append"
+msgstr "_Accoda"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "File di collezione"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Collezione vuota"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "La collezione corrente è vuota: il salvataggio è stato annullato."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Vuota"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d immagini (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d immagini"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Sto caricando le anteprime..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "_Vista"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "Visualizza in una _nuova finestra"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "Rimu_ovi"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Accoda dalla lista dei file"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Accoda da collezione..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Seleziona tutto"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Non selezionare nulla"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "_Proprietà"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "_Copia..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "_Muovi..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "_Rinomina..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "_Cancella..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "Mostra i _testi dei file"
+
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "_Salva collezione"
+
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "Salva la collezione _come..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "Trova _duplicati..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+msgid "Print..."
+msgstr "Stampa..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+msgid "Dropped list includes folders."
+msgstr "La lista rimossa include delle cartelle."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "_Aggiungi dei contenuti"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "Aggiungi dei contenuti _ricorsivamente"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+msgid "_Skip folders"
+msgstr "_Salta le cartelle"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Cancella"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Sposta i file per confrontarli."
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d file"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d corrispondenze trovate in %d file"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[gruppo 1]"
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Sto leggendo i checksum..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Sto leggendo le dimensioni..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Sto leggendo i dati di somiglianza..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Sto confrontando..."
+
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "Sto ordinando..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "Seleziona i duplicati del gruppo _1"
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "Seleziona i duplicati del gruppo _2"
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Aggiungi alla nuova collezione"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "Cance_lla"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "Chiudi la _finestra"
+
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "%d file (gruppo 2)"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Dimensione"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Data"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Dimensioni"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Checksum "
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Percorso"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Somiglianza (alta)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Somiglianza"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Somiglianza (bassa)"
+
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Somiglianza (personalizzata)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Trova i duplicati - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Confronta con:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Confronta per:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Anteprime"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Confronta due gruppi di file"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp "
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "Xv "
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint "
+
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "Ruota l'immagine JPEG in senso orario"
+
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "Ruota l'immagine JPEG in senso antiorario"
+
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "Sto fermando..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "Modifica i risultati del comando"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "Uscita di %s"
+
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Non sono riuscito ad avviare il comando:\n"
+"%s\n"
+
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "è stato fermato dall'utente"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "sconosciuto"
+
+#: src/exif.c:113
+msgid "top left"
+msgstr "in alto a sinistra"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "in alto a destra"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "in basso a destra"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "in basso a sinistra"
+
+#: src/exif.c:117
+msgid "left top"
+msgstr "in alto a sinistra"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "in alto a destra"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "in basso a destra"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "in basso a sinistra"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "pollici"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "centimetri"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "media"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "centro pesato"
+
+#: src/exif.c:142
+msgid "spot"
+msgstr "macchia"
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr "multimacchia"
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr "multisegmento"
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "parziale"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "altro"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "non definito"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "manuale"
+
+#: src/exif.c:153
+msgid "normal"
+msgstr "normale"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "apertura"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "otturatore"
+
+#: src/exif.c:156
+msgid "creative"
+msgstr "creativo"
+
+#: src/exif.c:157
+msgid "action"
+msgstr "azione"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "ritratto"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "orizzontale"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "diurno"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "fluorescente"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "tungsteno (incandescente)"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "flash "
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "no "
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "sì"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr "sì, non rilevato dallo strobo"
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr "sì, rilevato dallo strobo"
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "Descrizione dell'immagine"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "Orientazione"
+
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "Diritti d'autore"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "Programma di esposizione"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "Sensibilità ISO"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "Data originale"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "Data digitalizzata"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "Velocità otturatore"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "Apertura"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "Orientamento dell'esposizione"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "Distanza del soggetto"
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "Modalità di conteggio"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "Sorgente di luce"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "Flash "
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "Lunghezza focale"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "Larghezza"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "Altezza"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "Camera "
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "Risoluzione"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "infinità"
+
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "modalità:"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "acceso"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "spento"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "automatico"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr "non rilevato dallo strobo"
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr "rilevato dallo strobo"
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "riduzione degli occhi rossi"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "punto"
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d byte"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f K "
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f MB "
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f GB "
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview a schermo intero"
+
+#: src/fullscreen.c:397
+msgid "Full size"
+msgstr "Dimensione piena"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr "Monitor "
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr "Schermo"
+
+#: src/fullscreen.c:644
+msgid "Stay above other windows"
+msgstr "Stai sopra le altre finestre"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr "Daterminato dal gestore finestre"
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr "Schermo attivo"
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr "Monitor attivo"
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "_Ingrandisci"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "_Riduci"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "Scala _1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "Adatta l'immagine alla _finestra"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "Imposta come _sfondo"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "F_erma la presentazione"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "Continua la presenta_zione"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "Pa_usa nella presentazione"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "A_vvia la presentazione"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "_Termina la visione a schermo intero"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "Sc_hermo intero"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "_Chiudi la finestra"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "Dimensioni del file:"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Dimensioni:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Trasparente:"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Dimensione dell'immagine:"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Rapporto di compressione:"
+
+#: src/info.c:368
+msgid "File type:"
+msgstr "Tipo di file:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Proprietario:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Gruppo:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Generale"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "Immagine %d di %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Proprietà dell'immagine - GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Ascendente"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr "Presentazione"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr "In pausa"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d file (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d file%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d file%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(nessun permesso di lettura) %s byte"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s byte"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s byte"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "Strumenti di GQview"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Strumenti"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "File"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Immagine"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(trascina per cambiare l'ordine)"
+
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "Nascondi la _lista dei file"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "in  %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "in (sconosciuto)..."
+
+#: src/layout_util.c:637
+msgid "empty"
+msgstr "vuota"
+
+#: src/layout_util.c:748
+msgid "_File"
+msgstr "_File "
+
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "_Modifica"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "_Aggiusta"
+
+#: src/layout_util.c:752
+msgid "_Help"
+msgstr "_Aiuto"
+
+#: src/layout_util.c:754
+msgid "New _window"
+msgstr "_Nuova finestra"
+
+#: src/layout_util.c:755
+msgid "_New collection"
+msgstr "Nuova _collezione"
+
+#: src/layout_util.c:756
+msgid "_Open collection..."
+msgstr "Apri c_ollezione..."
+
+#: src/layout_util.c:757
+msgid "Open _recent"
+msgstr "Apri _recenti"
+
+#: src/layout_util.c:758
+msgid "_Search..."
+msgstr "C_erca..."
+
+#: src/layout_util.c:760
+msgid "_Print..."
+msgstr "Stam_pa..."
+
+#: src/layout_util.c:761
+msgid "N_ew folder..."
+msgstr "N_uova cartella..."
+
+#: src/layout_util.c:767
+msgid "_Quit"
+msgstr "_Chiudi"
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "_Ruota in senso orario"
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "Ruota in senso _antiorario"
+
+#: src/layout_util.c:781
+msgid "Rotate 1_80"
+msgstr "Ruota di 1_80 gradi"
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "_Speculare"
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "Ri_balta"
+
+#: src/layout_util.c:785
+msgid "Select _all"
+msgstr "Seleziona _tutto"
+
+#: src/layout_util.c:786
+msgid "Select _none"
+msgstr "Non selezionare _nulla"
+
+#: src/layout_util.c:787
+msgid "P_references..."
+msgstr "P_referenze..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr "_Manutenzione anteprime..."
+
+#: src/layout_util.c:794
+msgid "_Zoom to fit"
+msgstr "_Adatta alla finestra"
+
+#: src/layout_util.c:795
+msgid "F_ull screen"
+msgstr "Schermo i_ntero"
+
+#: src/layout_util.c:796
+msgid "_Hide file list"
+msgstr "_Nascondi lista file"
+
+#: src/layout_util.c:797
+msgid "Toggle _slideshow"
+msgstr "Avvia/Ferma presentazione"
+
+#: src/layout_util.c:798
+msgid "_Refresh"
+msgstr "_Aggiorna"
+
+#: src/layout_util.c:800
+msgid "_Contents"
+msgstr "_Contenuti"
+
+#: src/layout_util.c:801
+msgid "_Keyboard shortcuts"
+msgstr "Scorciatoie da _tastiera"
+
+#: src/layout_util.c:802
+msgid "_Release notes"
+msgstr "Note sulla ve_rsione"
+
+#: src/layout_util.c:803
+msgid "_About"
+msgstr "_Riguardo"
+
+#: src/layout_util.c:807
+msgid "_Thumbnails"
+msgstr "_Anteprime"
+
+#: src/layout_util.c:808
+msgid "Tr_ee"
+msgstr "Al_bero"
+
+#: src/layout_util.c:809
+msgid "_Float file list"
+msgstr "Lista  _flottante dei file"
+
+#: src/layout_util.c:810
+msgid "Hide tool_bar"
+msgstr "Nascondi la _barra degli strumenti"
+
+#: src/layout_util.c:811
+msgid "_Keywords"
+msgstr "_Parole chiavi"
+
+#: src/layout_util.c:812
+msgid "E_xif data"
+msgstr "Dati E_xif"
+
+#: src/layout_util.c:813
+msgid "Sort _manager"
+msgstr "A_mministratore di ordinamento"
+
+#: src/layout_util.c:817
+msgid "_List"
+msgstr "_Lista"
+
+#: src/layout_util.c:818
+msgid "I_cons"
+msgstr "I_cone"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Mostra le anteprime"
+
+#: src/layout_util.c:1085
+msgid "Change to home folder"
+msgstr "Sposta nella cartella home"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Aggiorna la lista dei file"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Ingrandisci"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Riduci"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Adatta l'immagine alla finestra"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Imposta lo zoom ad 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Opzioni di configurazione"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Controlli flottanti"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Aiuto - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Linea di comando"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+msgid "next image"
+msgstr "immagine successiva"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr "immagine precedente"
+
+#: src/main.c:529
+msgid "first image"
+msgstr "prima immagine"
+
+#: src/main.c:530
+msgid "last image"
+msgstr "ultima immagine"
+
+#: src/main.c:531
+msgid "toggle full screen"
+msgstr "attiva/disattiva la visione a schermo intero"
+
+#: src/main.c:532
+msgid "start full screen"
+msgstr "avvia la visione a schermo intero"
+
+#: src/main.c:533
+msgid "stop full screen"
+msgstr "termina la visione a schermo intero"
+
+#: src/main.c:534
+msgid "toggle slide show"
+msgstr "avvia/ferma la presentazione"
+
+#: src/main.c:535
+msgid "start slide show"
+msgstr "avvia la presentazione"
+
+#: src/main.c:536
+msgid "stop slide show"
+msgstr "ferma la presentazione"
+
+#: src/main.c:537
+msgid "start recursive slide show"
+msgstr "avvia presentazione ricorsiva"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr "imposta il ritardo della presentazione in secondi"
+
+#: src/main.c:539
+msgid "show tools"
+msgstr "mostra gli strumenti"
+
+#: src/main.c:540
+msgid "hide tools"
+msgstr "nascondi gli strumenti"
+
+#: src/main.c:541
+msgid "quit"
+msgstr "chiudi"
+
+#: src/main.c:542
+msgid "open file"
+msgstr "apri un file"
+
+#: src/main.c:543
+msgid "open file in new window"
+msgstr "apri un file in una nuova finestra"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr "Lista dei comandi remoti:\n"
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr "L'istanza remota di GQview non è in esecuzione, l'avvio..."
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr "Non è disponibile in remoto\n"
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Uso: gqview [opzioni] [percorso]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "sono opzioni valide:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           visualizza gli strumenti\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        non visualizza gli strumenti\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen       avvia in modalità schermo intero\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slidehosw        avvia in modalità presentazione\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+"  -l, --list                  apre la finestra della collezione da linea di "
+"comando\n"
+
+#: src/main.c:951
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+"  -r, --remote               invia i comandi seguenti per aprire una "
+"finestra \n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr "  -rh,--remote-help          stampa la lista remota dei comandi\n"
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr " --debug                 abilita l'uscita di correzione\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version                stampa le informazioni sulla versione\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help             mostra questo messaggio\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"non valido o ignorato: %s\n"
+"Usa il comando gqview --help per ottenere le opzioni disponibili\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Sto creando la cartella di GQview: %s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Non è possibile creare la cartella: %s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Home "
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "Scrivania"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - uscita"
+
+#: src/main.c:1156
+msgid "Quit GQview"
+msgstr "Chiudi GQview"
+
+#: src/main.c:1156
+msgid "Collections have been modified. Quit anyway?"
+msgstr "Sono state modificate delle collezioni. Esco comunque?"
+
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "Ordina per dimensione"
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "Ordina per data"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Non ordinato"
+
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "Ordina per percorso"
+
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "Ordina per numero"
+
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "Ordina per nome"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Ordina"
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "Ruota di _180 gradi"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Più vicino (peggiore, ma veloce)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Tacche"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilineare"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Ultra (migliore, ma più lento)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Nessuno"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normale"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Migliore"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr "Personale"
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "Reimposta i filtri"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Questo reimposterà i filtri dei file a quelli prestabiliti.\n"
+"Continuo?"
+
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "Reimposta gli editori"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Questo reimposterà i comandi di modifica a quelli prestabiliti.\n"
+"Continuo?"
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "Svuota il cestino"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "Questo rimuoverà i contenuti del cestino."
+
+#: src/preferences.c:770
+msgid "GQview Preferences"
+msgstr "Preferenze di GQview"
+
+#: src/preferences.c:824
+msgid "Startup"
+msgstr "Avvia"
+
+#: src/preferences.c:826
+msgid "Change to folder:"
+msgstr "Sposta nella cartella:"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Usa la cartella corrente"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Dimensione:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Qualità:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Ricorda le anteprime"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr "Usa la cache condivisa delle anteprime"
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Metti le anteprime in .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Utilizza le anteprime Xvpic se esistono (sola lettura)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Presentazione"
+
+#: src/preferences.c:867
+msgid "Delay between image change:"
+msgstr "Attesa prima del cambio immagine:"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr "secondi"
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Casuale"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Ripeti"
+
+#: src/preferences.c:884
+msgid "Zoom"
+msgstr "Zoom"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Metodo di sfumatura:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Zoom in due passaggi"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Permetti l'espansione delle immagini per adattarle."
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Incremento dello zoom:"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Quando viene selezionata una nuova immagine:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Torna alla dimensione originale"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Usa l'impostazione precedente dello zoom"
+
+#: src/preferences.c:917
+msgid "Appearance"
+msgstr "Apparenza"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Sfondo nero"
+
+#: src/preferences.c:922
+msgid "Convenience"
+msgstr "Convenienza"
+
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "Aggiorna quando cambiano i file"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Precarica l'immagine successiva"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Ruota automaticamente l'immagine usando le informazioni Exif"
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Finestre"
+
+#: src/preferences.c:940
+msgid "State"
+msgstr "Status"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Ricorda la posizione delle finestre"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Ricorda lo stato degli strumenti (flottanti o nascosti)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr ""
+"Adatta l'immagine alla finestra quando gli strumenti sono nascosti o "
+"flottanti"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Dimensione limite della finestra quando si autoridimensiona (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Struttura"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filtraggio"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Mostra gli elementi che iniziano con un punto"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "Ordinamento maiuscolo/minuscolo"
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Disabilita i filtri sui file"
+
+#: src/preferences.c:986
+msgid "File types"
+msgstr "Tipi di file"
+
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "Filtro"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "Impostazioni prestabilite"
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Editori"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "# "
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Nome menù"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "Avanzato"
+
+#: src/preferences.c:1138
+msgid "Full screen"
+msgstr "Schermo intero"
+
+#: src/preferences.c:1146
+msgid "Smooth image flip"
+msgstr "Sfuma l'immagine ribaltata"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr "Disabilita salvaschermo"
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Cancella"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Conferma la cancellazione dei file"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Abilita tasto Canc"
+
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "Cancellazione sicura"
+
+#: src/preferences.c:1176
+msgid "Maximum size:"
+msgstr "Dimensione massima:"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr "MB"
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Vista"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr "Comportamento"
+
+#: src/preferences.c:1191
+msgid "Rectangular selection in icon view"
+msgstr "Selezione rettangolare in vista icona"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Approfondisci le cartelle nella vista ad albero"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Rinomina sul posto"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr "Navigazione"
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Scorrimento progressivo da tastiera"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "L'immagine è scorsa dalla rotella del mouse"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr "Varie"
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr "Conserva le parole chiavi e i commenti assieme alle immagini sorgenti"
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "Soglia personale di somiglianza:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Dimensione della cache offscreen (MB per immagine) :"
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "Riguardo - GQview"
+
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"Sito web: %s\n"
+"Posta elettronica: %s\n"
+"\n"
+"E' un programma rilasciato sotto la GNU General Public License"
+
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "Riconoscimenti..."
+
+#: src/print.c:111
+msgid "Selection"
+msgstr "Selezione"
+
+#: src/print.c:112
+msgid "All"
+msgstr "Tutto"
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr "Una sola immagine per pagina"
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr "Verifica la carta"
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr "Stampante predefinita"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr "Stampante personalizzata"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr "File Postscript"
+
+#: src/print.c:140
+msgid "Image file"
+msgstr "File immagine"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr "JPEG, bassa qualità"
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr "JPEG, qualità normale"
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr "JPEG, qualità alta"
+
+#: src/print.c:350 src/print.c:3201
+msgid "points"
+msgstr "punti"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr "millimetri"
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr "centimetri"
+
+#: src/print.c:353
+msgid "inches"
+msgstr "pollici"
+
+#: src/print.c:354
+msgid "picas"
+msgstr "pica"
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr "Ritratto"
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr "Orizzontale"
+
+#: src/print.c:366
+msgid "Letter"
+msgstr "Lettera"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr "Legale"
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr "Esecutivo"
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr "Inviluppo #10"
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr "Inviluppo #9"
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr "Inviluppo C4"
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr "Inviluppo C5"
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr "Inviluppo C6"
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr "Foto 6x4"
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr "Foto 8x10"
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr "Cartolina"
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr "Rotocalco"
+
+#: src/print.c:544
+#, c-format
+msgid "page %d of %d"
+msgstr "pagina %d di %d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "Anteprima"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+"Non riesco ad aprire il collegamento per scrivere.\n"
+"\"%s\""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "Esiste già un file chiamato %s."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr "Impossibile scrivere sul file %s"
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr "Si è verificato l'errore SIGPIPE inviando alla stampante."
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr "Pagina %d"
+
+#: src/print.c:1986 src/print.c:1991
+msgid "Printing error"
+msgstr "Errore di stampa"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr "Si è verificato un errore scrivendo sul file %s."
+
+#: src/print.c:1994
+msgid "Details"
+msgstr "Dettagli"
+
+#: src/print.c:2587 src/print.c:3332
+msgid "Print - GQview"
+msgstr "Stampa - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr "Sto stampando %d pagine su %s"
+
+#: src/print.c:2691
+msgid "Format:"
+msgstr "Formato:"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr "Unità:"
+
+#: src/print.c:2810
+msgid "Orientation:"
+msgstr "Orientazione:"
+
+#: src/print.c:2942
+msgid "Destination:"
+msgstr "Destinazione:"
+
+#: src/print.c:2990
+msgid "<printer name>"
+msgstr "<nome della stampante>"
+
+#: src/print.c:3079
+msgid "Unlimited"
+msgstr "Illimitato"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr "Mostra"
+
+#: src/print.c:3199
+msgid "Font"
+msgstr "Carattere"
+
+#: src/print.c:3359
+msgid "Source"
+msgstr "Sorgente"
+
+#: src/print.c:3375
+msgid "Proof size:"
+msgstr "Verifica dimensione:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr "Testo"
+
+#: src/print.c:3401
+msgid "Paper"
+msgstr "Carta"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr "Margini"
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr "Sinistro:"
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr "Destro:"
+
+#: src/print.c:3432
+msgid "Top:"
+msgstr "Superiore:"
+
+#: src/print.c:3435
+msgid "Bottom:"
+msgstr "Inferiore:"
+
+#: src/print.c:3444
+msgid "Printer"
+msgstr "Stampante"
+
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr "Stampante personale:"
+
+#: src/print.c:3459
+msgid "File:"
+msgstr "File:"
+
+#: src/print.c:3468
+msgid "File format:"
+msgstr "Formato del file:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr "DPI:"
+
+#: src/print.c:3481
+msgid "Remember print settings"
+msgstr "Ricorda le impostazioni di stampa"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "si è verificato un errore salvando il file di configurazione: %s\n"
+
+#: src/search.c:200
+msgid "folder"
+msgstr "cartella"
+
+#: src/search.c:201
+msgid "comments"
+msgstr "commenti"
+
+#: src/search.c:202
+msgid "results"
+msgstr "risultati"
+
+#: src/search.c:206
+msgid "contains"
+msgstr "il contenuto"
+
+#: src/search.c:207
+msgid "is"
+msgstr "è"
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr "uguale a "
+
+#: src/search.c:212
+msgid "less than"
+msgstr "meno della"
+
+#: src/search.c:213
+msgid "greater than"
+msgstr "maggiore di"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr "tra"
+
+#: src/search.c:219
+msgid "before"
+msgstr "prima"
+
+#: src/search.c:220
+msgid "after"
+msgstr "dopo"
+
+#: src/search.c:225
+msgid "match all"
+msgstr "coincide tutto"
+
+#: src/search.c:226
+msgid "match any"
+msgstr "non coincide nulla"
+
+#: src/search.c:227
+msgid "exclude"
+msgstr "escludi"
+
+#: src/search.c:277
+#, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d file (%s, %d)"
+
+#: src/search.c:284
+#, c-format
+msgid "%s, %d files"
+msgstr "%s, %d file"
+
+#: src/search.c:301
+msgid "Searching..."
+msgstr "Sto cercando..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr "Il file non è stato trovato"
+
+#: src/search.c:2094
+msgid "Please enter an existing file for image content."
+msgstr "Per favore, immetti un file esistente come contenuto dell'immagine."
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr "La cartella non è stata trovata"
+
+#: src/search.c:2141
+msgid "Please enter an existing folder to search."
+msgstr "Per favore, per la ricerca immetti il nome di una cartella esistente."
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr "Cerca immagine - GQview"
+
+#: src/search.c:2599
+msgid "Search:"
+msgstr "Cerca:"
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr "Ricorsivamente"
+
+#: src/search.c:2617
+msgid "File name"
+msgstr "Nome del file"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr "Coincide su maiuscolo/minuscolo"
+
+#: src/search.c:2627
+msgid "File size is"
+msgstr "La dimensione del file è"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+msgid "and"
+msgstr "e"
+
+#: src/search.c:2639
+msgid "File date is"
+msgstr "La data del file è"
+
+#: src/search.c:2656
+msgid "Image dimensions are"
+msgstr "Le dimensioni dell'immagine sono"
+
+#: src/search.c:2676
+msgid "Image content is"
+msgstr "Il contenuto dell'immagine è"
+
+#: src/search.c:2682
+#, no-c-format
+msgid "% similar to"
+msgstr "% uguale a"
+
+#: src/search.c:2751
+msgid "Rank"
+msgstr "Rango"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr ""
+"Non sono riuscito a caricare le anteprime nella cache: provo a ricrearle.\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Non è possibile scrivere la cronologia in: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "Nuovo segnalibro"
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "Modifica i segnalibri"
+
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "Percorso:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "Icona:"
+
+#: src/ui_bookmark.c:627
+msgid "Select icon"
+msgstr "Seleziona icona"
+
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "_Proprietà..."
+
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "Sposta in _alto"
+
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "Sposta in _basso"
+
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "_Rimuovi"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Non riesco a caricare:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Non è possibile rinominare il file %s in %s."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Non è possibile cancellare il file:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "La cancellazione del file è fallita"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Cancella i file"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Riguardo il cancellare il file:\n"
+"%s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "_Rinomina"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "Aggiungi _Segnalibro"
+
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "_Cancella"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+msgid "New folder"
+msgstr "Nuova cartella"
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Non riesco a creare la cartella:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+msgid "Error creating folder"
+msgstr "Si è verificato un errore creando la cartella"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Tutti i file"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Mostra i file nascosti"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filtro:"
+
+#: src/ui_tabcomp.c:840
+msgid "Select path"
+msgstr "Seleziona percorso"
+
+#: src/ui_tabcomp.c:856
+msgid "All files"
+msgstr "Tutti i fili"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Sovrascrivi i file"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+msgid "Overwrite file?"
+msgstr "Sovrascrivo il file?"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr "Sostituisci il file esistente con un nuovo file."
+
+#: src/utilops.c:480
+msgid "Overwrite _all"
+msgstr "Sovrascrivi _tutto"
+
+#: src/utilops.c:482
+msgid "S_kip all"
+msgstr "S_alta tutto"
+
+#: src/utilops.c:483
+msgid "_Skip"
+msgstr "_Salta"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+msgid "Existing file"
+msgstr "Il file esiste già"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+msgid "New file"
+msgstr "Nuovo file"
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Rinomina automaticamente"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Rinomina"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "La sorgente della copia coincide con la destinazione"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Non è possibile copiare il file:\n"
+"%s\n"
+"su se stesso."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "La sorgente dello spostamento coincide con la destinazione"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Non è possibile muovere il file:\n"
+"%s\n"
+"su se stesso."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+msgid "Co_ntinue"
+msgstr "Co_ntinua"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Si è verificato un errore durante copia del file"
+
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Non è possibile copiare il file:\n"
+"%s in:\n"
+"%s\n"
+"mentre si esegue la copia di più file."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Si è verificato un errore durante lo spostamento del file"
+
+#: src/utilops.c:636
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Non è possibile spostare il file:\n"
+"%s\n"
+"in:\n"
+"%s\n"
+"mentre si effettua lo spostamento di più file."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "La sorgente corrisponde alla destinazione"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr ""
+"La sorgente e la destinazione coincidono: l'operazione è stata quindi "
+"annullata."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Non è possibile copiare il file:\n"
+"%s\n"
+"in:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Non è possibile spostare il file:\n"
+"%s\n"
+"in:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "La destinazione non è valida"
+
+#: src/utilops.c:900
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"Per favore, seleziona una cartella e non un file\n"
+"quando intendi operare con più file per volta."
+
+#: src/utilops.c:905
+msgid "Please select an existing folder."
+msgstr "Per favore, seleziona una cartella esistente."
+
+#: src/utilops.c:956
+msgid "Copy - GQview"
+msgstr "Copia - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "_Copia"
+
+#: src/utilops.c:960
+msgid "Copy file"
+msgstr "Copia file"
+
+#: src/utilops.c:964
+msgid "Copy multiple files"
+msgstr "Copia più file"
+
+#: src/utilops.c:970
+msgid "Move - GQview"
+msgstr "Sposta - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "_Muovi"
+
+#: src/utilops.c:974
+msgid "Move file"
+msgstr "Sposta file"
+
+#: src/utilops.c:978
+msgid "Move multiple files"
+msgstr "Sposta più file"
+
+#: src/utilops.c:992 src/utilops.c:1502
+msgid "File name:"
+msgstr "Nome file:"
+
+#: src/utilops.c:996
+msgid "Choose the destination folder."
+msgstr "Scegli la cartella di destinazione."
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "La cancellazione non è riuscita"
+
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "Non è possibile rimuovere i vecchi file dal cestino"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+msgid "Could not create folder"
+msgstr "Non riesco a creare la cartella"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "Permesso negato"
+
+#: src/utilops.c:1212
+#, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Non è possibile accedere o creare il cestino.\n"
+"\"%s\""
+
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "Disabilita la cancellazione sicura"
+
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "Cancellazione sicura: %s"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Non riesco a cancellare il file:\n"
+"%s\n"
+"Continuo con la cancellazione multipla?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr "File %d di %d"
+
+#: src/utilops.c:1416
+msgid "Delete files - GQview"
+msgstr "Cancella - GQview"
+
+#: src/utilops.c:1420
+msgid "Delete multiple files"
+msgstr "Cancella file multipli"
+
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "Passa in rassegna %d file"
+
+#: src/utilops.c:1494
+msgid "Delete file - GQview"
+msgstr "Cancella il file - GQview"
+
+#: src/utilops.c:1498
+msgid "Delete file?"
+msgstr "Cancella il file?"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr "Sostituisci il file esistente rimominando il nuovo file."
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Non riesco a rinominare il file:\n"
+"%s\n"
+"in:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Si è verificato un errore mentre rinominavo il file"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Non è possibile rinominare automaticamente impostando il\n"
+"numero selezionato: esistono uno o più file che corrispondono\n"
+"al nome della lista risultante.\n"
+
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"Non sono riuscito a rinominare\n"
+"%s\n"
+"Il numero era %d."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+msgid "Rename - GQview"
+msgstr "Rinomina - GQview"
+
+#: src/utilops.c:2034
+msgid "Rename multiple files"
+msgstr "Rinomina file multipli"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "Nome originale"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+msgid "Original name:"
+msgstr "Nome originale:"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+msgid "New name:"
+msgstr "Nuovo nome:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Inizio testo"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "Avvia #"
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Fine testo"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "Riempimento:"
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Non riesco a rinominare il file:\n"
+"%s\n"
+"in:\n"
+"%s"
+
+#: src/utilops.c:2252
+msgid "Rename file"
+msgstr "Rinomina il file"
+
+#: src/utilops.c:2311
+#, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"La cartella:\n"
+"%s\n"
+"esiste già."
+
+#: src/utilops.c:2312
+msgid "Folder exists"
+msgstr "La cartella esiste"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"Il percorso:\n"
+"%s\n"
+"esiste già come file."
+
+#: src/utilops.c:2369
+msgid "New folder - GQview"
+msgstr "Nuova cartella - GQview"
+
+#: src/utilops.c:2372
+#, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Crea una cartella in:\n"
+"%s\n"
+"e chiamata:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "nuova _cartella"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "_Su alla cartella origine"
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "_Presentazione"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Presentazione ricorsiva"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "Trova i duplicati..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Trova i duplicati ricorsivamente..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "_Nuova cartella..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "Vedi come _albero"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "Ag_giorna"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "_Ordina"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "Vedi come _icone"
+
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "Mostra le _anteprime"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Il nome del file non è valido:\n"
+"%s"
index 906ceb0..744b8b3 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR Free Software Foundation, Inc.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
-#
-#, fuzzy
+# gqview ja.po.
+# Copyright (C) 2000-2004 Free Software Foundation, Inc.
+# SATO Satoru <ss@gnome.gr.jp>, 2001
+# Junichi Uekawa <dancer@debian.org>, 2002
+# Takeshi Aihana <aihana@gnome.gr.jp>, 2000-2004.
+# , no-wrap
+# 
 msgid ""
 msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2000-04-13 15:57-0400\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Project-Id-Version: gqview 1.5.3\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2004-09-26 19:28+0900\n"
+"Last-Translator: Takeshi AIHANA <aihana@gnome.gr.jp>\n"
+"Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=CHARSET\n"
-"Content-Transfer-Encoding: ENCODING\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
 
-#: src/config.c:307
-msgid "GQview configuration"
-msgstr "GQview¤ÎÀßÄê"
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr "お気に入り"
 
-#: src/config.c:319
-msgid "Ok"
-msgstr "Ok"
+#: src/bar_info.c:31
+msgid "Todo"
+msgstr "ToDo"
 
-#: src/config.c:324
-msgid "Apply"
-msgstr ""
+#: src/bar_info.c:32
+msgid "People"
+msgstr "人々"
 
-#: src/config.c:329 src/utildlg.c:145 src/utilops.c:444 src/utilops.c:754
-#: src/utilops.c:885 src/utilops.c:983
-msgid "Cancel"
-msgstr "¥­¥ã¥ó¥»¥ë"
+#: src/bar_info.c:33
+msgid "Places"
+msgstr "場所"
 
-#: src/config.c:343
-msgid "General"
-msgstr "°ìÈÌ"
+#: src/bar_info.c:34
+msgid "Art"
+msgstr "芸術"
 
-#: src/config.c:351
-msgid "Initial directory"
-msgstr "½é´ü¥Ç¥£¥ì¥¯¥È¥ê:"
+#: src/bar_info.c:35
+msgid "Nature"
+msgstr "自然"
 
-#: src/config.c:361
-msgid "On startup, change to this directory:"
-msgstr "µ¯Æ°»þ¤Ë¤³¤Î¥Ç¥£¥ì¥¯¥È¥ê¤Ø°ÜÆ°¤¹¤ë"
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr "所有物"
 
-#: src/config.c:373
-msgid "Use current"
-msgstr "¸½ºß¤Î¥Ç¥£¥ì¥¯¥È¥ê"
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr "デフォルトのキーワード一覧"
 
-#: src/config.c:379
-msgid "Confirm file delete"
-msgstr "ºï½ü»þ¤Ë³Îǧ"
+#: src/bar_info.c:508
+#, fuzzy
+msgid "Favorite keywords list"
+msgstr "お気に入りのキーワード一覧です:"
 
-#: src/config.c:381
-msgid "Remember tool state (float/hidden)"
-msgstr "¥Ä¡¼¥ë¥Ð¡¼¤Î¾õÂÖ¤òÊÝ»ý(float¤äÈóɽ¼¨)"
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr "キーワード"
 
-#: src/config.c:383
-msgid "Remember window positions"
-msgstr "¥¦¥£¥ó¥É¥¦°ÌÃÖ¤òÊÝ»ý"
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "ファイル名:"
 
-#: src/config.c:385
-msgid "Slide show"
-msgstr "¥¹¥é¥¤¥É¥·¥ç¥¦:"
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "タイムスタンプ:"
 
-#: src/config.c:398
-msgid "Delay before image change (seconds):"
-msgstr "¼¡¤Î¥¤¥á¡¼¥¸¤Þ¤Ç¤ÎÉÿô"
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr "キーワード:"
 
-#: src/config.c:411
-msgid "Random"
-msgstr "¥é¥ó¥À¥à"
+#: src/bar_info.c:1095
+msgid "Comment:"
+msgstr "コメント:"
 
-#: src/config.c:413
-msgid "Repeat"
-msgstr "·«¤êÊÖ¤¹"
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr "お気に入りのキーワードを編集します"
 
-#: src/config.c:420
-msgid "Image"
-msgstr "¥¤¥á¡¼¥¸"
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr "キーワードを選択したファイルに追加します"
 
-#: src/config.c:428
-msgid "When new image is selected:"
-msgstr "¤¢¤¿¤é¤·¤¤¥¤¥á¡¼¥¸¤¬ÁªÂò¤µ¤ì¤¿¤È¤­:"
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr "キーワードを選択したファイルに追加し、既存のファイルを置き換えます"
 
-#: src/config.c:438
-msgid "Zoom to original size"
-msgstr "¥ª¥ê¥¸¥Ê¥ë¤Î¥µ¥¤¥º¤Ø³ÈÂç"
+#: src/bar_info.c:1130
+msgid "Save comment now"
+msgstr "今すぐコメントを保存します"
 
-#: src/config.c:444 src/img-view.c:306 src/menu.c:473 src/menu.c:547
-#: src/menu.c:587 src/menu.c:678
-msgid "Fit image to window"
-msgstr "¥¦¥£¥ó¥É¥¦¤Ë¥Õ¥£¥Ã¥È¤µ¤»¤ë"
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "タグ"
 
-#: src/config.c:450
-msgid "Leave Zoom at previous setting"
-msgstr "ľÁ°¤Î¥º¡¼¥à¤ÎÀßÄê¤ò˺¤ì¤ë"
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "名前"
 
-#: src/config.c:457
-msgid "Fit window to image when tools are hidden/floating"
-msgstr "¥Ä¡¼¥ë¥Ð¡¼¤Î¾õÂÖÊѹ¹»þ¤Ë¥¤¥á¡¼¥¸¤ò¥¦¥£¥ó¥É¥¦¤Ë¥Õ¥£¥Ã¥È¤µ¤»¤ë"
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr ""
 
-#: src/config.c:464
-msgid "Limit size when auto-sizing window"
-msgstr "¥¦¥£¥ó¥É¥¦¤Î¼«Æ°Ä´Àá¤Î¸Â³¦"
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr ""
 
-#: src/config.c:474 src/menu.c:477
-msgid "Thumbnails"
-msgstr "¥µ¥à¥Í¥¤¥ë:"
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "要素"
 
-#: src/config.c:490
-msgid "Size:"
-msgstr "¥µ¥¤¥º"
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "説明"
 
-#: src/config.c:519
-msgid "Cache thumbnails"
-msgstr "¥µ¥à¥Í¥¤¥ë¤ò¥­¥ã¥Ã¥·¥å¤¹¤ë"
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "Exif"
 
-#: src/config.c:521
-msgid "Use xvpics thumbnails when found (read only)"
-msgstr "xvpics¤¬¤¢¤ë»þ¤Ë»ÈÍѤ¹¤ë(Æɤ߹þ¤ß¤Î¤ß)"
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "拡張表示にする"
 
-#: src/config.c:524
-msgid "Progressive keyboard scrolling"
-msgstr "¥­¡¼¥Ü¡¼¥É¤Ë¤è¤ë¥¹¥¯¥í¡¼¥ë"
+#: src/bar_sort.c:218
+msgid "Unlink failed"
+msgstr "削除に失敗しました"
 
-#: src/config.c:526
-msgid "Mouse wheel scrolls image"
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr "リンクに失敗しました"
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
 msgstr ""
+"フォルダ:\n"
+"%s\n"
+"は既に存在しています。"
 
-#: src/config.c:533
-msgid "Filtering"
-msgstr "¥Õ¥£¥ë¥¿¥ê¥ó¥°"
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "コレクションは空"
 
-#: src/config.c:542
-msgid "Show entries that begin with a dot"
-msgstr "¥É¥Ã¥È¥Õ¥¡¥¤¥ë¤âɽ¼¨¤¹¤ë"
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"コレクションの保存に失敗しました:\n"
+"%s"
 
-#: src/config.c:544
-msgid "Disable File Filtering"
-msgstr "¥Õ¥£¥ë¥¿¥ê¥ó¥°¤·¤Ê¤¤"
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "保存に失敗しました"
 
-#: src/config.c:546
-msgid "Include files of type:"
-msgstr "ɽ¼¨¤¹¤ë³ÈÄ¥»Ò:"
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "ブックマークへ追加します"
 
-#: src/config.c:596
-msgid "Custom file types:"
-msgstr "¥«¥¹¥¿¥à¥¿¥¤¥×"
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "コレクション"
 
-#: src/config.c:609
-msgid "format: [.foo;.bar]"
-msgstr "½ñ¼°: [.foo;.bar]"
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "名前:"
 
-#: src/config.c:618
-msgid "External Editors"
-msgstr "³°Éô¥¨¥Ç¥£¥¿"
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "ソート・マネージャ"
 
-#: src/config.c:630
-msgid "#"
-msgstr ""
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "フォルダ"
 
-#: src/config.c:633
-msgid "Menu name"
-msgstr "ɽ¼¨Ì¾"
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "コレクション"
 
-#: src/config.c:636
-msgid "Command Line"
-msgstr "¥³¥Þ¥ó¥É"
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "コピーする"
 
-#: src/config.c:666 src/menu.c:500
-msgid "About"
-msgstr ""
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "移動する"
 
-#: src/config.c:682
-#, c-format
-msgid ""
-"GQview %s\n"
-"\n"
-"Copyright (c) 2000 by John Ellis\n"
-"http://gqview.sorceforge.net\n"
-"or http://gqview.netpedia.net\n"
-"gqview@email.com\n"
-"\n"
-"Released under the GNU Public License"
-msgstr ""
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr "リンクを作成する"
 
-#: src/filelist.c:51
-msgid " Slideshow"
-msgstr "¥¹¥é¥¤¥É¥·¥ç¥¦"
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d 個の画像"
 
-#: src/filelist.c:55
-#, c-format
-msgid "%d files (%d)%s"
-msgstr ""
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "選択した画像"
 
-#: src/filelist.c:57
-#, c-format
-msgid "%d files%s"
-msgstr ""
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "最後の画像に戻します"
 
-#: src/filelist.c:1025
-msgid "Loading thumbs..."
-msgstr ""
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "完了"
 
-#: src/image.c:66
-#, c-format
-msgid "( ? x ? ) %d bytes"
-msgstr ""
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "類似データの読み込み中..."
 
-#: src/image.c:68
-#, c-format
-msgid "( %d x %d ) %d bytes"
-msgstr ""
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "サムネイルのクリア..."
 
-#: src/img-main.c:247
-msgid "GQview full screen"
-msgstr "GQview ¥Õ¥ë¥¹¥¯¥ê¡¼¥ó"
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "古いサムネイルの削除..."
 
-#: src/img-view.c:303 src/menu.c:470 src/menu.c:544 src/menu.c:584
-#: src/menu.c:674
-msgid "Zoom in"
-msgstr "³ÈÂç"
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
 
-#: src/img-view.c:304 src/menu.c:471 src/menu.c:545 src/menu.c:585
-#: src/menu.c:676
-msgid "Zoom out"
-msgstr "½Ì¾®"
+#: src/cache_maint.c:792 src/utilops.c:904
+msgid "Invalid folder"
+msgstr "不正なフォルダ"
 
-#: src/img-view.c:305 src/menu.c:472 src/menu.c:546 src/menu.c:586
-msgid "Zoom 1:1"
-msgstr "¸µ¤Î¥µ¥¤¥º"
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
 
-#. edit menu
-#: src/img-view.c:309 src/menu.c:457 src/menu.c:519 src/menu.c:550
-#: src/menu.c:590
-msgid "Edit"
-msgstr "ÊÔ½¸"
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "サムネイルをキャッシュする"
 
-#: src/img-view.c:314 src/menu.c:446 src/menu.c:526 src/menu.c:557
-#: src/menu.c:595
-msgid "Copy..."
-msgstr "¥³¥Ô¡¼..."
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "開始 #"
 
-#: src/img-view.c:315 src/menu.c:447 src/menu.c:527 src/menu.c:558
-#: src/menu.c:596
-msgid "Move..."
-msgstr "°ÜÆ°..."
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "フォルダ:"
 
-#: src/img-view.c:316 src/menu.c:448 src/menu.c:528 src/menu.c:559
-#: src/menu.c:597
-msgid "Rename..."
-msgstr "̾Á°¤ÎÊѹ¹..."
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "選択取り消し"
 
-#: src/img-view.c:317 src/menu.c:449 src/menu.c:529 src/menu.c:560
-#: src/menu.c:598
-msgid "Delete..."
-msgstr "ºï½ü..."
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "不正なフォルダ"
 
-#: src/img-view.c:320
-msgid "Close window"
-msgstr "¥¦¥£¥ó¥É¥¦¤òÊĤ¸¤ë"
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
 
-#: src/main.c:90 src/main.c:119
-#, c-format
-msgid "GQview running: %s\n"
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
 msgstr ""
 
-#: src/main.c:330
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "実行中..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "サムネイルのクリア..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "キャッシュのクリア"
+
+#: src/cache_maint.c:1113
 msgid ""
-"Usage: gqview [options] [path]\n"
-"\n"
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
 msgstr ""
-"»È¤¤Êý: gqview [¥ª¥×¥·¥ç¥ó] [¥Ñ¥¹]\n"
-"\n"
+"ディスクに保存されたサムネイルは\n"
+"全て削除されます。よろしいですか?"
 
-#: src/main.c:331
-msgid "valid options are:\n"
-msgstr "¥ª¥×¥·¥ç¥ó:\n"
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "画像の検索 - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
 
-#: src/main.c:332
+#: src/cache_maint.c:1177
 #, fuzzy
-msgid "  +t, --with-tools           force show of tools\n"
-msgstr "  +t, +tools                 ¥Ä¡¼¥ë¥Ð¡¼¤òɽ¼¨\n"
+msgid "GQview thumbnail cache"
+msgstr "GQview フル・スクリーン"
 
-#: src/main.c:333
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
 #, fuzzy
-msgid "  -t, --without-tools        force hide of tools\n"
-msgstr "  -t, -tools                 ¥Ä¡¼¥ë¥Ð¡¼¤òÈóɽ¼¨\n"
+msgid "Location:"
+msgstr "アクション"
 
-#: src/main.c:334
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
 #, fuzzy
-msgid "  -f, --fullscreen           start in full screen mode\n"
-msgstr "  -t, -tools                 ¥Ä¡¼¥ë¥Ð¡¼¤òÈóɽ¼¨\n"
+msgid "Clean up"
+msgstr "クリア"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
 
-#: src/main.c:335
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
 #, fuzzy
-msgid "  -s, --slideshow            start in slideshow mode\n"
-msgstr "  -t, -tools                 ¥Ä¡¼¥ë¥Ð¡¼¤òÈóɽ¼¨\n"
+msgid "Delete all cached thumbnails."
+msgstr "サムネイルをキャッシュする"
 
-#: src/main.c:336
+#: src/cache_maint.c:1197
 #, fuzzy
-msgid "  --debug                    turn on debug output\n"
-msgstr "  -debug                     ¥Ç¥Ð¥Ã¥°ÍѤνÐÎϤòÍ­¸ú¤Ë¤¹¤ë\n"
+msgid "Shared thumbnail cache"
+msgstr "サムネイルの表示"
 
-#: src/main.c:337
+#: src/cache_maint.c:1220
 #, fuzzy
-msgid ""
-"  -h, --help                 show this message\n"
-"\n"
-msgstr ""
-"  -help                      ¤³¤Î¥á¥Ã¥»¡¼¥¸¤òɽ¼¨\n"
-"\n"
+msgid "Render"
+msgstr "名前を変更する"
 
-#: src/main.c:342
-#, c-format
-msgid ""
-"invalid or ignored: %s\n"
-"Use -help for options\n"
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
 msgstr ""
-"%s¤ÏÉÔÌÀ¤Ç¤¹¡£\n"
-"¾Ü¤·¤¯¤Ï `gqview -help` ¤ò¼Â¹Ô¤·¤Æ¤¯¤À¤µ¤¤¡£\n"
 
-#: src/main.c:369
-msgid "The Gimp"
+#: src/cache_maint.c:1225
+msgid "Metadata"
 msgstr ""
 
-#: src/main.c:372
-msgid "Electric Eyes"
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
 msgstr ""
 
-#: src/main.c:375
-msgid "XV"
-msgstr ""
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "タイトルなし"
 
-#: src/main.c:378
-msgid "Xpaint"
-msgstr ""
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "タイトルなし (%d)"
 
-#: src/menu.c:373
+#: src/collect.c:980
 #, c-format
-msgid "in %s..."
-msgstr ""
+msgid "%s - GQview Collection"
+msgstr "%s - GQview コレクション"
 
-#: src/menu.c:375
-msgid "in (unknown)..."
-msgstr ""
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "コレクションを閉じる"
 
-#: src/menu.c:394
-msgid "Options..."
-msgstr "¥ª¥×¥·¥ç¥ó..."
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"コレクションが変更されました。\n"
+"まず保存しますか?"
 
-#: src/menu.c:396
-msgid "Remove old thumbnails"
-msgstr "¸Å¤¤¥µ¥à¥Í¥¤¥ë¤òÇË´þ"
+#: src/collect.c:1106
+#, fuzzy
+msgid "_Discard"
+msgstr "絵はがき"
 
-#: src/menu.c:398 src/menu.c:410 src/menu.c:422
-msgid "Set as wallpaper"
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
 msgstr ""
+"指定したパス:\n"
+"%s\n"
+"はフォルダです。コレクションはファイルの集まりです。"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "不正なファイル名"
 
-#. file menu
-#: src/menu.c:440
-msgid "File"
-msgstr "¥Õ¥¡¥¤¥ë"
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "ファイルの上書き"
 
-#: src/menu.c:444
-msgid "Create Dir..."
-msgstr "¥Ç¥£¥ì¥¯¥È¥êºîÀ®..."
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "ファイルの上書き"
 
-#: src/menu.c:451
-msgid "Exit"
-msgstr "½ªÎ»"
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "上書き"
 
-#. view menu
-#: src/menu.c:466
-msgid "View"
-msgstr "¥Ó¥å¡¼"
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "コレクションを保存"
 
-#: src/menu.c:476 src/menu.c:563
-msgid "Full screen"
-msgstr "¥Õ¥ë¥¹¥¯¥ê¡¼¥ó"
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "コレクションを開く"
 
-#: src/menu.c:485
-msgid "Refresh Lists"
-msgstr "¥ê¥¹¥È¤Î¹¹¿·"
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "コレクションの追加"
 
-#: src/menu.c:486
-msgid "(Un)Float file list"
-msgstr "¥Õ¥¡¥¤¥ë¥ê¥¹¥È¤ò(Èó)¥Õ¥í¡¼¥È¤Ë¤¹¤ë"
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "追加"
 
-#: src/menu.c:487 src/menu.c:562
-msgid "(Un)Hide file list"
-msgstr "¥Õ¥¡¥¤¥ë¥ê¥¹¥È¤ò(Èó)ɽ¼¨¤Ë¤¹¤ë"
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "コレクション・ファイル"
 
-#: src/menu.c:490
-msgid "Toggle slideshow"
-msgstr "¥¹¥é¥¤¥É¥·¥ç¥¦"
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "コレクションは空"
 
-#. help menu
-#: src/menu.c:496
-msgid "Help"
-msgstr "¥Ø¥ë¥×"
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "現在のコレクションは空です。保存を中止します。"
 
-#: src/menu.c:523 src/menu.c:554
-msgid "View in new window"
-msgstr "¿·¤·¤¤¥¦¥£¥ó¥É¥¦¤Ç¤ß¤ë"
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "空です"
 
-#: src/menu.c:531
-msgid "Refresh"
-msgstr "¹¹¿·"
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d 個の画像 (%d)"
 
-#: src/menu.c:601
-msgid "Exit full screen"
-msgstr "¥Õ¥ë¥¹¥¯¥ê¡¼¥ó¤ò¤ä¤á¤ë"
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d 個の画像"
 
-#: src/menu.c:661
-msgid "Create thumbnails"
-msgstr "¥µ¥à¥Í¥¤¥ëºîÀ®"
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "サムネイルを開く..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "表示(_V)"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "新しいウィンドウで表示(_N)"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "削除(_O)"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "ファイル一覧から追加"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "コレクションから追加..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "全て選択"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "選択取り消し"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "プロパティ(_P)"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "コピー(_C)..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "移動(_M)..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "名前の変更(_R)..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "削除(_D)..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "ファイル名表示(_T)"
+
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "コレクションの保存(_S)"
+
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "別名でコレクションの保存(_A)..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "複製の検索(_F)..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/ファイル(_F)/印刷(_P)..."
 
-#: src/menu.c:670
-msgid "Change to home directory"
-msgstr "¥Û¡¼¥à¥Ç¥£¥ì¥¯¥È¥ê¤Ø°ÜÆ°"
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "フォルダを含む一覧にドロップします。"
 
-#: src/menu.c:672
-msgid "Refresh file list"
-msgstr "¥Õ¥¡¥¤¥ë¥ê¥¹¥È¤Î¹¹¿·"
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "内容の追加(_A)"
 
-#: src/menu.c:680
-msgid "Set zoom 1:1"
-msgstr "¸µ¤Î¥µ¥¤¥º¤Ë¤¹¤ë"
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "内容を再帰的に追加(_R)"
 
-#: src/menu.c:682
-msgid "Configure options"
-msgstr "¥ª¥×¥·¥ç¥óÀßÄê"
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "フォルダをスキップする(_S)"
 
-#: src/menu.c:684
-msgid "Float Controls"
-msgstr "¥³¥ó¥È¥í¡¼¥ë¤ò¥Õ¥í¡¼¥È¾õÂ֤ˤ¹¤ë"
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "キャンセル"
 
-#: src/rcfile.c:132
-#, c-format
-msgid "error saving config file: %s\n"
-msgstr ""
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "比較するためにファイルをドロップして下さい。"
 
-#: src/thumb.c:127 src/thumb.c:151
+#: src/dupe.c:100
 #, c-format
-msgid "create dir failed: %s\n"
-msgstr "%s¥Ç¥£¥ì¥¯¥È¥ê¤Ç¼ºÇÔ¤·¤Þ¤·¤¿¡£\n"
+msgid "%d files"
+msgstr "%d 個のファイル"
 
-#: src/thumb.c:233
+#: src/dupe.c:104
 #, c-format
-msgid "Unable to delete dir: %s\n"
-msgstr "%s¥Ç¥£¥ì¥¯¥È¥ê¤Çºï½ü¤Ë¼ºÇÔ¡£\n"
+msgid "%d matches found in %d files"
+msgstr "%d 個が一致 (%d 個のファイル中)"
 
-#: src/thumb.c:249
-#, c-format
-msgid "failed to delete:%s\n"
-msgstr "%s¤Îºï½ü¤Ë¼ºÇÔ\n"
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[セット 1]"
 
-#: src/utildlg.c:68
-msgid "     Ok     "
-msgstr ""
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "チェックサムの読み込み中..."
 
-#: src/utilops.c:166
-msgid "Source to copy matches destination"
-msgstr ""
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "寸法を検出中..."
 
-#: src/utilops.c:167
-#, fuzzy, c-format
-msgid ""
-"Unable to copy file:\n"
-"%s\n"
-"to itself."
-msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤¬¤Ç¤­¤Þ¤»¤ó¡£\n"
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "類似データの読み込み中..."
 
-#: src/utilops.c:171
-msgid "Source to move matches destination"
-msgstr ""
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "比較中..."
 
-#: src/utilops.c:172
-#, fuzzy, c-format
-msgid ""
-"Unable to move file:\n"
-"%s\n"
-"to itself."
-msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤¬¤Ç¤­¤Þ¤»¤ó¡£\n"
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "ソート中..."
 
-#: src/utilops.c:175 src/utilops.c:231 src/utilops.c:516
-msgid "Continue"
-msgstr ""
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "複製グループ1の選択(_1)"
 
-#: src/utilops.c:182
-#, fuzzy, c-format
-msgid ""
-"Overwrite file:\n"
-" %s\n"
-" with:\b %s"
-msgstr "¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤­:\n"
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "複製グループ2の選択(_2)"
 
-#: src/utilops.c:183 src/utilops.c:289 src/utilops.c:651 src/utilops.c:835
-msgid "Overwrite file"
-msgstr "¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤­"
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "新しいコレクションの追加"
 
-#: src/utilops.c:186
-msgid "Skip"
-msgstr "¥¹¥­¥Ã¥×"
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "クリア(_L)"
 
-#: src/utilops.c:187
-msgid "Yes to all"
-msgstr "¤¹¤Ù¤Æ¤Ï¤¤"
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "ウィンドウを閉じる(_W)"
 
-#: src/utilops.c:188
-msgid "Yes"
-msgstr "¤Ï¤¤"
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "%d 個のファイル (セット2)"
 
-#: src/utilops.c:222 src/utilops.c:317
-msgid "Error copying file"
-msgstr ""
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "サイズ"
 
-#: src/utilops.c:223
-#, c-format
-msgid ""
-"Unable to copy file:\n"
-"%sto:\n"
-"%s\n"
-" during multiple file copy."
-msgstr ""
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "日付"
 
-#: src/utilops.c:227 src/utilops.c:322
-msgid "Error moving file"
-msgstr ""
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "寸法"
 
-#: src/utilops.c:228
-#, c-format
-msgid ""
-"Unable to move file:\n"
-"%sto:\n"
-"%s\n"
-" during multiple file move."
-msgstr ""
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "チェックサム"
 
-#: src/utilops.c:282
-msgid "Source matches destination"
-msgstr ""
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "パス"
 
-#: src/utilops.c:283
-msgid "Source and destination are the same, operation cancelled."
-msgstr ""
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "類似性 (高い)"
 
-#: src/utilops.c:288
-#, fuzzy, c-format
-msgid ""
-"Overwrite file:\n"
-"%s\n"
-" with:\n"
-"%s"
-msgstr "¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤­:\n"
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "類似性"
 
-#: src/utilops.c:292 src/utilops.c:654 src/utilops.c:838
-msgid "Overwrite"
-msgstr ""
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "類似性 (低い)"
 
-#: src/utilops.c:318
-#, fuzzy, c-format
-msgid ""
-"Unable to copy file:\n"
-"%s\n"
-"to:\n"
-"%s"
-msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤¬¤Ç¤­¤Þ¤»¤ó¡£\n"
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "類似性 (カスタム)"
 
-#: src/utilops.c:323
-#, fuzzy, c-format
-msgid ""
-"Unable to move file:\n"
-"%s\n"
-"to:\n"
-"%s"
-msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤¬¤Ç¤­¤Þ¤»¤ó¡£\n"
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "複製の検索 - GQview"
 
-#: src/utilops.c:367
-msgid "Invalid destination"
-msgstr ""
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "比較する対象:"
 
-#: src/utilops.c:367
-msgid ""
-"When operating with multiple files, please select\n"
-" a directory, not file."
-msgstr ""
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "比較する要素:"
 
-#: src/utilops.c:369
-msgid "Invalid directory"
-msgstr ""
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "サムネイル"
 
-#: src/utilops.c:369
-msgid "Please select an existing directory"
-msgstr ""
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "二つのファイルを比較する"
 
-#: src/utilops.c:427
-msgid "GQview - copy"
-msgstr ""
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "\"GIMP\""
 
-#: src/utilops.c:428
-msgid "Copy"
-msgstr ""
+#: src/editors.c:51
+msgid "XV"
+msgstr "\"XV\""
 
-#: src/utilops.c:430
-#, c-format
-msgid ""
-"Copy file:\n"
-"%s\n"
-"to:"
-msgstr ""
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "\"X Paint\""
 
-#: src/utilops.c:432
-#, c-format
-msgid ""
-"Copy multiple files from:\n"
-"%s\n"
-"to:"
-msgstr ""
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "\"時計回りにローテーションして (JPEG)\""
 
-#: src/utilops.c:436
-msgid "GQview - move"
-msgstr ""
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "\"反時計回りにローテーションして (JPEG)\""
 
-#: src/utilops.c:437
-msgid "Move"
-msgstr ""
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "停止中..."
 
-#: src/utilops.c:439
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "編集コマンドの結果"
+
+#: src/editors.c:134
 #, c-format
-msgid ""
-"Move file:\n"
-"%s\n"
-"to:"
-msgstr ""
+msgid "Output of %s"
+msgstr "%s の出力"
 
-#: src/utilops.c:441
+#: src/editors.c:303
 #, c-format
 msgid ""
-"Move multiple files from:\n"
+"Failed to run command:\n"
 "%s\n"
-"to:"
 msgstr ""
+"コマンドの実行に失敗しました:\n"
+"%s\n"
 
-#: src/utilops.c:514
-#, c-format
-msgid ""
-"Unable to delete file:\n"
-" %s\n"
-" Continue multiple delete operation?"
-msgstr ""
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "ユーザ割り込みで停止しました"
 
-#: src/utilops.c:515 src/utilops.c:521
-msgid "Delete failed"
-msgstr ""
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "不明"
 
-#: src/utilops.c:520 src/utilops.c:565
-#, fuzzy, c-format
-msgid ""
-"Unable to delete file:\n"
-"%s"
-msgstr "%s¥Ç¥£¥ì¥¯¥È¥ê¤Çºï½ü¤Ë¼ºÇÔ¡£\n"
+#: src/exif.c:113
+msgid "top left"
+msgstr "上左"
 
-#: src/utilops.c:550
-msgid "Delete files"
-msgstr ""
+#: src/exif.c:114
+msgid "top right"
+msgstr "上右"
 
-#: src/utilops.c:550
-msgid "About to delete multiple files..."
-msgstr ""
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "右下"
 
-#: src/utilops.c:551 src/utilops.c:596
-msgid "Delete"
-msgstr ""
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "左下"
 
-#: src/utilops.c:566
-msgid "File deletion failed"
-msgstr ""
+#: src/exif.c:117
+msgid "left top"
+msgstr "左上"
 
-#: src/utilops.c:594
-#, fuzzy, c-format
-msgid ""
-"About to delete the file:\n"
-" %s"
-msgstr "%s¥Ç¥£¥ì¥¯¥È¥ê¤Çºï½ü¤Ë¼ºÇÔ¡£\n"
+#: src/exif.c:118
+msgid "right top"
+msgstr "右上"
 
-#: src/utilops.c:595
-msgid "Delete file"
-msgstr ""
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "右下"
 
-#: src/utilops.c:650 src/utilops.c:834
-#, fuzzy, c-format
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "左下"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "インチ"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "センチ"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "平均"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "中央重心"
+
+#: src/exif.c:142
+msgid "spot"
+msgstr "スポット"
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr "複数のスポット"
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr "複数のセグメント"
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "部分光"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "その他"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "定義なし"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "手動"
+
+#: src/exif.c:153
+msgid "normal"
+msgstr "標準"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "レンズ径"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "シャッター"
+
+#: src/exif.c:156
+msgid "creative"
+msgstr "クリエイティブ"
+
+#: src/exif.c:157
+msgid "action"
+msgstr "アクション"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "縦置き"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "横置き"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "日光"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "fluorescent"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "タングステン (白熱灯)"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "フラッシュ"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "いいえ"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "はい"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr "はい (ストロボ未検出)"
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr "はい (ストロボ検出)"
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "画像の説明"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "向き"
+
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "ライセンス"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "露出プログラム"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "ISO 感度"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "オリジナルの日付"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "データ化した日付"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "シャッター・スピード"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "レンズ径"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "露出偏光"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "被写体の距離"
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "計測モード"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "光源"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "フラッシュ"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "焦点調節範囲"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "幅"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "高さ"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "カメラ"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "解像度"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "∞"
+
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "モード:"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "ON"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "OFF"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "自動"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr "ストロボ未検出"
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr "ストロボ検出"
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "赤目反射"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "ドット"
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d バイト"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f Kバイト"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f Mバイト"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f Gバイト"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview フル・スクリーン"
+
+#: src/fullscreen.c:397
+msgid "Full size"
+msgstr "フルサイズ"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr "モニタ"
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr "スクリーン"
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "ウィンドウにフィットさせます"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr "現在使用中のスクリーン"
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr "現在使用中のモニタ"
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "拡大(_I)"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "縮小(_O)"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "元のサイズ(_1)"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "ウィンドウにフィットさせる(_W)"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "壁紙として貼り付け(_W)"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "スライドショーの停止(_S)"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "スライドショーの続行(_H)"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "スライドショーの一時停止(_H)"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "スライドショーの開始(_S)"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "フル・スクリーン表示の終了(_F)"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "フル・スクリーン表示(_F)"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "ウィンドウを閉じる(_L)"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "サイズ:"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "寸法:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "透明:"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "画像サイズ:"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "圧縮率:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "タイムスタンプ:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "所有者:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "グループ:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "全般"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "画像 %d / %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "画像のプロパティ - GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "昇順にする"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " スライドショー"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " 一時停止"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d 個のファイル (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d 個のファイル%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d 個のファイル%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(読み込み権限なし) %s バイト"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s バイト"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s バイト"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview ツール"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "ツール"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "ファイル"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "画像"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(順番を変更する場合はここにドロップして下さい)"
+
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "ファイル一覧を隠す(_L)"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "%s で開く..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "(不明なツール)で開く..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "空です"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/ファイル(_F)"
+
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "編集(_E)"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "調整(_A)"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/ヘルプ(_H)"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/ファイル(_F)/新しいウィンドウ(_N)"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "コレクションの保存(_S)"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "コレクションを開く"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/ファイル(_F)/最近の開いたファイル(_R)"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "検索中..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/ファイル(_F)/印刷(_P)..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "新しいフォルダ(_N)..."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "品質"
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "時計回りにローテーション(_R)"
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "反時計回りにローテーション(_C)"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "180度ローテーション(_1)"
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "ミラーリング(_M)"
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "折り返す(_F)"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "全て選択"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "選択取り消し"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "プロパティ(_P)..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/表示(_V)/ウィンドウにフィット(_Z)"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "フル・スクリーン表示(_F)"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "ファイル一覧を隠す(_L)"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "スライドショーの切り替え"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "更新(_F)"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/ヘルプ(_H)/目次(_C)"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/ヘルプ(_H)/キー割り当て(_K)"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/ヘルプ(_H)/リリースノート(_R)"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/ヘルプ(_H)/情報(_A)"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "サムネイル"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/表示(_V)/ツリー表示(_E)"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/表示(_V)/一覧のフロート化(_F)"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/表示(_V)/ツールバーを隠す(_B)"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "キーワード"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/表示(_V)/Exif データ(_X)"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "ソート・マネージャ"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/表示(_V)/一覧表示(_L)"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "アイコン:"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "サムネイルの表示"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "ホームへ移動します"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "ファイル一覧を更新します"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "拡大します"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "縮小します"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "ウィンドウにフィットさせます"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "オリジナルのサイズにします"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "オプションを設定します"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "コントロールのフロート状態を切り替えます"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "ヘルプ - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "コマンドライン"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+msgid "next image"
+msgstr "次の画像へジャンプする"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr "前の画像へジャンプする"
+
+#: src/main.c:529
+msgid "first image"
+msgstr "先頭の画像へジャンプする"
+
+#: src/main.c:530
+msgid "last image"
+msgstr "最後の画像へジャンプする"
+
+#: src/main.c:531
+msgid "toggle full screen"
+msgstr "フル・スクリーン表示の切り替え"
+
+#: src/main.c:532
+msgid "start full screen"
+msgstr "フル・スクリーン表示を開始する"
+
+#: src/main.c:533
+msgid "stop full screen"
+msgstr "フル・スクリーン表示を停止する"
+
+#: src/main.c:534
+msgid "toggle slide show"
+msgstr "スライドショーの切り替え"
+
+#: src/main.c:535
+msgid "start slide show"
+msgstr "スライドショーを開始する"
+
+#: src/main.c:536
+msgid "stop slide show"
+msgstr "スライドショーを停止する"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "スライドショーを開始する"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr "スライドショーで画像を表示する間隔(秒)をセットする"
+
+#: src/main.c:539
+msgid "show tools"
+msgstr "ツールを表示する"
+
+#: src/main.c:540
+msgid "hide tools"
+msgstr "ツールを隠す"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+msgid "open file"
+msgstr "ファイルを開く"
+
+#: src/main.c:543
+msgid "open file in new window"
+msgstr "新しいウィンドウでファイルを開く"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr "リモート・コマンドの一覧:\n"
+
+#: src/main.c:667
+#, fuzzy
+msgid "Remote GQview not running, starting..."
+msgstr "リモート GQview が起動していません。起動します...\n"
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr "リモート機能は利用できません\n"
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"用法: gqview [オプション] [パス]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "有効なオプション群:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           ツールバーを強制的に表示する\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        ツールバーを強制的に消す\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           フル・スクリーン・モードで起動する\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            スライドショー・モードで起動する\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+"  -l, --list                 コマンドラインからコレクション・ウィンドウを開"
+"く\n"
+
+#: src/main.c:951
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr "  -r, --remote               ウィンドウを開くコマンドを送信する\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr "  -rh,--remote-help          リモート・コマンドの一覧を表示する\n"
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  -debug                     デバッグ出力を有効にする\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              バージョン情報を表示する\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr "  -h, --help                 このメッセージを表示する\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"次のオプションを無視しました: %s\n"
+"利用可能なオプションについては '-help' を使って下さい\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "GQview フォルダの生成中: %s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "フォルダを作成できませんでした: %s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "ホーム"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "デスクトップ"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - 終了"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "印刷 - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"コレクションが変更されました。\n"
+"とにかく終了しますか?"
+
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "サイズ順でソート"
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "日付順でソート"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "並び替えない"
+
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "パス名順でソート"
+
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "番号順でソート"
+
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "名前順でソート"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "ソート"
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "180度ローテーション(_1)"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "簡易 (最低だが早い)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "タイル状"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "線形"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "ハイパー (最適だが遅い)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "なし"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "通常"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "最適"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr "カスタマイズ"
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "フィルタのリセット"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"ファイル・フィルタを初期値に戻します。\n"
+"続行しますか?"
+
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "エディタのリセット"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"エディタ・コマンドをデフォルトに初期化します。\n"
+"続行しますか?"
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "ゴミ箱のクリア"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "ゴミ箱にあるものを削除します"
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview フル・スクリーン"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "開始 #"
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "ホームへ移動します"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "現在のフォルダ"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "サイズ:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "品質:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "サムネイルをキャッシュする"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "サムネイルを .thumbnails にキャッシュする"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "xvpics がある場合それを使用する(読み込みのみ)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "スライドショー"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "画像を表示する間隔(秒):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "ランダム"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "繰り返し"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "拡大します"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "ディザ手法:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "2-パス方式でズームする"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "ズーム時にフィットするように画像を引き伸ばす"
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "拡大率:"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "新しい画像が選択された時:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "オリジナルのサイズへ拡大する"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "直前のズーム設定のままにする"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "追加"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "背景を黒にする"
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "続行"
+
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "ファイルを変更したら画面をリフレッシュする"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "次に表示する画像をプリロードする"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Exif 情報で画像を自動的に回転させる"
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "ウィンドウ"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "開始 #"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "ウィンドウ位置を保持する"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "ツールバーの状態 (フロートや非表示) を保持する"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "ツールバーの変更時に画像をウィンドウにフィットさせる"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "自動的に調整するウィンドウ・サイズの上限 (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "配置"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "フィルタリング"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "ドット・ファイル (.*) を表示する"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "大・小文字で並べ替える"
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "フィルタリングしない"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "タイムスタンプ:"
+
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "フィルター"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "初期値"
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "編集ツール"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "番号"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "メニューの名前"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "拡張"
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "フル・スクリーン表示(_F)"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "フル・スクリーン表示では画像をスムーズにめくる"
+
+#: src/preferences.c:1148
+#, fuzzy
+msgid "Disable screen saver"
+msgstr "フル・スクリーン表示ではスクリーン・セーバーを無効にする"
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "削除"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "削除時に確認する"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "[DEL] キーを有効にする"
+
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "安全に削除する"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "最大サイズ (MB)"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "表示"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "矩形の選択範囲を指定する"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "フォルダを降順でツリー表示する"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "名前を変更して配置する"
+
+#: src/preferences.c:1200
+#, fuzzy
+msgid "Navigation"
+msgstr "アクション"
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "キーボードによるスクロールを有効にする"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "ホイール・マウスで画像をスクロールする"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "類似性のしきい値:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "オフスクリーンのキャッシュ・サイズ (Mバイト/画像):"
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "情報 - GQview"
+
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright (C) %s John Ellis\n"
+"ウェブサイト: %s\n"
+"E-メール: %s\n"
+"\n"
+"GNU一般公有使用許諾契約書の下で公開されています。"
+
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "クレジット..."
+
+#: src/print.c:111
+msgid "Selection"
+msgstr "選択した画像"
+
+#: src/print.c:112
+msgid "All"
+msgstr "全て"
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr "1ページにつき1画像"
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr "ためし刷り"
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr "デフォルトのプリンタ"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr "プリンタのカスタマイズ"
+
+#: src/print.c:139
+#, fuzzy
+msgid "PostScript file"
+msgstr "Postscript ファイル"
+
+#: src/print.c:140
+msgid "Image file"
+msgstr "画像ファイル"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr "JPEG (低品質)"
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr "JPEG (標準の品質)"
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr "JPEG (高品質)"
+
+#: src/print.c:350 src/print.c:3201
+msgid "points"
+msgstr "ポイント"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr "ミリ"
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr "センチ"
+
+#: src/print.c:353
+msgid "inches"
+msgstr "インチ"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr "縦置き"
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr "横置き"
+
+#: src/print.c:366
+msgid "Letter"
+msgstr "レター"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr "リーガル"
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr "エグゼクティブ"
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr "封筒 #10"
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr "封筒 #9"
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr "封筒 C4"
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr "封筒 C5"
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr "封筒 C6"
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr "写真 6x4"
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr "写真 8x10"
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr "絵はがき"
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr "タブロイド"
+
+#: src/print.c:544
+#, c-format
+msgid "page %d of %d"
+msgstr "%d / %d ページ"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "プレビュー"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "ファイル名 %s は既に存在しています。"
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr "%d ページ"
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "プリンタ"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "初期値"
+
+#: src/print.c:2587 src/print.c:3332
+msgid "Print - GQview"
+msgstr "印刷 - GQview"
+
+#: src/print.c:2591
+#, fuzzy, c-format
+msgid "Printing %d pages to %s."
+msgstr "%d ページを %s へ出力中..."
+
+#: src/print.c:2691
+msgid "Format:"
+msgstr "書式:"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr "単位:"
+
+#: src/print.c:2810
+msgid "Orientation:"
+msgstr "向き:"
+
+#: src/print.c:2942
+msgid "Destination:"
+msgstr "印刷先:"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "ファイル名が"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "タイトルなし"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "ON"
+
+#: src/print.c:3359
+msgid "Source"
+msgstr "印刷するもの"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "ためし刷りのサイズ"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr "テキスト"
+
+#: src/print.c:3401
+msgid "Paper"
+msgstr "用紙"
+
+#: src/print.c:3424
+#, fuzzy
+msgid "Margins"
+msgstr "マージン"
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr "左:"
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr "右:"
+
+#: src/print.c:3432
+msgid "Top:"
+msgstr "上:"
+
+#: src/print.c:3435
+msgid "Bottom:"
+msgstr "下:"
+
+#: src/print.c:3444
+msgid "Printer"
+msgstr "プリンタ"
+
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr "カスタムのプリンタ:"
+
+#: src/print.c:3459
+msgid "File:"
+msgstr "ファイル:"
+
+#: src/print.c:3468
+msgid "File format:"
+msgstr "ファイルの書式:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "ウィンドウ位置を保持する"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "設定ファイルの保存中にエラー: %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "フォルダ:"
+
+#: src/search.c:201
+msgid "comments"
+msgstr "コメント"
+
+#: src/search.c:202
+msgid "results"
+msgstr "結果"
+
+#: src/search.c:206
+msgid "contains"
+msgstr "次を含む"
+
+#: src/search.c:207
+msgid "is"
+msgstr "次の文字列である"
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr "次と等しい"
+
+#: src/search.c:212
+msgid "less than"
+msgstr "次より小さい"
+
+#: src/search.c:213
+msgid "greater than"
+msgstr "次より大きい"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr "次の間にある"
+
+#: src/search.c:219
+msgid "before"
+msgstr "次の前にある"
+
+#: src/search.c:220
+msgid "after"
+msgstr "次の後ろにある"
+
+#: src/search.c:225
+msgid "match all"
+msgstr "次と完全に一致する "
+
+#: src/search.c:226
+msgid "match any"
+msgstr "次のいづれかと一致する"
+
+#: src/search.c:227
+msgid "exclude"
+msgstr "次を除く"
+
+#: src/search.c:277
+#, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d 個のファイル (%s, %d)"
+
+#: src/search.c:284
+#, c-format
+msgid "%s, %d files"
+msgstr "%s, %d 個のファイル"
+
+#: src/search.c:301
+msgid "Searching..."
+msgstr "検索中..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr "ファイルはありません"
+
+#: src/search.c:2094
+msgid "Please enter an existing file for image content."
+msgstr "存在している画像ファイルを入力して下さい"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr "フォルダはありません"
+
+#: src/search.c:2141
+msgid "Please enter an existing folder to search."
+msgstr "存在しているフォルダを入力して下さい"
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr "画像の検索 - GQview"
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "検索する"
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr "再帰的に検索する"
+
+#: src/search.c:2617
+msgid "File name"
+msgstr "ファイル名が"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr "大/小文字を区別する"
+
+#: src/search.c:2627
+msgid "File size is"
+msgstr "ファイル・サイズが"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+msgid "and"
+msgstr "と"
+
+#: src/search.c:2639
+msgid "File date is"
+msgstr "タイムスタンプが"
+
+#: src/search.c:2656
+msgid "Image dimensions are"
+msgstr "画像の寸法が"
+
+#: src/search.c:2676
+msgid "Image content is"
+msgstr "画像の中身が"
+
+#: src/search.c:2682
+#, no-c-format
+msgid "% similar to"
+msgstr "% 次と類似する"
+
+#: src/search.c:2751
+msgid "Rank"
+msgstr "ランク"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr ""
+"キャッシュにあるサムネイル画像のロードに失敗しました。再度作成して下さい。\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "履歴リストへ書き込めません: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "新しいブックマーク"
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "ブックマークの編集"
+
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "パス:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "アイコン:"
+
+#: src/ui_bookmark.c:627
+msgid "Select icon"
+msgstr "アイコンの選択"
+
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "プロパティ(_P)..."
+
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "上へ移動(_U)"
+
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "下へ移動(_D)"
+
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "削除(_R)"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"読み込めません:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "%s から %s への名前変更に失敗しました。"
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"ファイルの削除に失敗:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "削除に失敗したファイル"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "ファイルの削除"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"ファイルの削除について:\n"
+" %s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "名前の変更(_R)"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "ブックマークへ追加(_B)"
+
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "削除(_D)"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "新しいフォルダ(_N)..."
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"フォルダを作成できません:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+msgid "Error creating folder"
+msgstr "フォルダの作成中にエラー"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "全ファイル"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "隠す"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "フィルター:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "全て選択"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "全ファイル"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "ファイルの上書き"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "ファイルの上書き"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "ファイルの上書き"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "全てスキップ"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "スキップ"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "ファイルの移動中にエラー:"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "新しいフォルダ(_N)..."
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "自動的に名前を変更する"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "名前を変更する"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "コピー元から一致するコピー先へ"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"ファイルのコピーに失敗:\n"
+"%s\n"
+"から自分自身へ"
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "移動元から一致する移動先へ"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"ファイルの移動に失敗:\n"
+"%s\n"
+"から自分自身へ。"
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "続行"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "ファイルをコピーする際にエラー"
+
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"複数ファイルのコピーで\n"
+"ファイルをコピーできません:\n"
+"%s から:\n"
+"%s へ"
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "ファイルの移動中にエラー:"
+
+#: src/utilops.c:636
+#, c-format
 msgid ""
-"Overwrite file:\n"
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"複数ファイルの移動で\n"
+"ファイルを移動できません:\n"
+"%s から\n"
+"%s へ"
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "移動元が移動先に一致します"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "移動元と移動先が同じです。この操作を取り消しました。"
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
 "%s\n"
-"by renaming:\n"
+"to:\n"
 "%s"
-msgstr "¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤­:\n"
+msgstr ""
+"%s\n"
+"から\n"
+"%s へコピーしますか?"
 
-#: src/utilops.c:663
-#, fuzzy, c-format
+#: src/utilops.c:856
+#, c-format
 msgid ""
-"Unable to rename file:\n"
+"Unable to move file:\n"
 "%s\n"
-" to:\n"
+"to:\n"
 "%s"
-msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤¬¤Ç¤­¤Þ¤»¤ó¡£\n"
+msgstr ""
+"%s\n"
+"から\n"
+"%s へ移動できませんでした"
 
-#: src/utilops.c:664 src/utilops.c:847
-msgid "Error renaming file"
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "不正な対象先"
+
+#: src/utilops.c:900
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
 msgstr ""
+"複数のファイルに対する操作では、\n"
+"ファイルではなくフォルダを指定して下さい。"
+
+#: src/utilops.c:905
+msgid "Please select an existing folder."
+msgstr "存在しているフォルダを選択して下さい。"
+
+#: src/utilops.c:956
+msgid "Copy - GQview"
+msgstr "コピー - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "コピー(_C)"
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "GQview - rename"
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr "ファイルを開く"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "複数のファイルのコピー先:"
+
+#: src/utilops.c:970
+msgid "Move - GQview"
+msgstr "移動 - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "移動(_M)"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr "ファイルを開く"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "複数のファイルの移動先:"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "ファイル名が"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "移動元が移動先に一致します"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "削除に失敗しました"
+
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "ゴミ箱から古いファイルを削除できません"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+msgid "Could not create folder"
+msgstr "フォルダを作成できませんでした"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "パーミッションが不正です"
+
+#: src/utilops.c:1212
+#, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
 msgstr ""
+"ゴミ箱にアクセスまたは作成できません。\n"
+"\"%s\""
+
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "安全な削除を無効にする"
+
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "安全に削除: %s"
 
-#: src/utilops.c:754
-msgid "Rename multiple files:"
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
 msgstr ""
+"ファイルの削除に失敗:\n"
+" %s\n"
+"複数のファイルの削除を続行しますか?"
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "Rename"
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr "ファイル %d / %d"
+
+#: src/utilops.c:1416
+msgid "Delete files - GQview"
+msgstr "ファイルの削除 - GQview"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "複数のファイル名の変更:"
+
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "%d 個のファイルのレビュー"
+
+#: src/utilops.c:1494
+msgid "Delete file - GQview"
+msgstr "ファイルの削除 - GQview"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "ファイルの削除"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
 msgstr ""
+"ファイル名の変更に失敗:\n"
+"%s\n"
+"から\n"
+"%s へ"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "ファイル名の変更でエラー"
 
-#: src/utilops.c:790
-msgid "Rename:"
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
 msgstr ""
+"指定した番号の並びで自動ファイル名変更は\n"
+"行えませんん。名前一覧に一致する\n"
+"ファイルが一つ以上あります。\n"
 
-#: src/utilops.c:799
-msgid "to:"
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
 msgstr ""
+"%s の名前変更に\n"
+"失敗しました。\n"
+"番号は %d です。"
 
-#: src/utilops.c:846
-#, fuzzy, c-format
+#: src/utilops.c:2031 src/utilops.c:2249
+msgid "Rename - GQview"
+msgstr "名前の変更 - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "複数のファイル名の変更:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "オリジナルの名前"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "オリジナルの名前"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "名前変更:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "テキストの先頭"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "開始 #"
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "テキストの末尾"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "埋め込み:"
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
 msgid ""
 "Unable to rename file:\n"
 "%s\n"
 "to:\n"
 "%s"
-msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤¬¤Ç¤­¤Þ¤»¤ó¡£\n"
+msgstr ""
+"ファイル名の変更不可:\n"
+"%s\n"
+"から\n"
+"%s へ"
 
-#: src/utilops.c:884
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr "ファイル名の変更:"
+
+#: src/utilops.c:2311
 #, c-format
 msgid ""
-"Rename file:\n"
+"The folder:\n"
 "%s\n"
-"to:"
+"already exists."
 msgstr ""
+"フォルダ:\n"
+"%s\n"
+"は既に存在しています。"
 
-#: src/utilops.c:928
+#: src/utilops.c:2312
+msgid "Folder exists"
+msgstr "フォルダが存在しています"
+
+#: src/utilops.c:2317
 #, c-format
 msgid ""
 "The path:\n"
 "%s\n"
 "already exists as a file."
 msgstr ""
+"パス:\n"
+"%s\n"
+"はファイルとして既に存在しています。"
 
-#: src/utilops.c:929
-#, fuzzy
-msgid "Could not create directory"
-msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤¬¤Ç¤­¤Þ¤»¤ó¡£\n"
+#: src/utilops.c:2369
+msgid "New folder - GQview"
+msgstr "新しいフォルダ - GQview"
 
-#: src/utilops.c:934
+#: src/utilops.c:2372
 #, c-format
 msgid ""
-"The directory:\n"
+"Create folder in:\n"
 "%s\n"
-"already exists."
+"named:"
 msgstr ""
+"次の名前を付けて\n"
+"フォルダの保存:\n"
+"%s"
 
-#: src/utilops.c:935
-msgid "Directory exists"
-msgstr ""
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "new_folder"
 
-#: src/utilops.c:942
-#, fuzzy, c-format
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "上のフォルダへ(_U)"
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr " スライドショー(_S)"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "逆順にスライドショー"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "複製の検索(_D)..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "逆順に複製の検索..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "新しいフォルダ(_N)..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "ツリー表示(_T)"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "更新(_F)"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "ソート(_S)"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "アイコン表示(_I)"
+
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "サムネイルの表示(_T)"
+
+#: src/view_file_list.c:447
+#, c-format
 msgid ""
-"Unable to create directory:\n"
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"不正なファイル名:\n"
 "%s"
-msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤¬¤Ç¤­¤Þ¤»¤ó¡£\n"
 
-#: src/utilops.c:943
-#, fuzzy
-msgid "Error creating directory"
-msgstr "¥Ç¥£¥ì¥¯¥È¥ê¤ÎºîÀ®¤¬¤Ç¤­¤Þ¤»¤ó¡£\n"
+#~ msgid "Purge thumbnails"
+#~ msgstr "サムネイルの削除"
 
-#: src/utilops.c:982
-#, fuzzy, c-format
-msgid ""
-"Create directory in:\n"
-"%s\n"
-"named:"
-msgstr "¥Ç¥£¥ì¥¯¥È¥êºîÀ®\n"
+#~ msgid "/File/tear1"
+#~ msgstr "/ファイル(_F)/tear1"
 
-#: src/utilops.c:983
-msgid "GQview - new directory"
-msgstr "GQview - ¿·µ¬¥Ç¥£¥ì¥¯¥È¥ê"
+#~ msgid "/File/_New collection"
+#~ msgstr "/ファイル(_F)/新しいコレクション(_N)"
 
-#: src/utilops.c:983
-msgid "Create"
-msgstr "ºîÀ®"
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/ファイル(_F)/コレクションを開く(_O)..."
 
-#: src/window.c:151
-#, fuzzy
-msgid "GQview Tools"
-msgstr "GQview ¥Õ¥ë¥¹¥¯¥ê¡¼¥ó"
+#~ msgid "/File/sep1"
+#~ msgstr "/ファイル(_F)/sep1"
+
+#~ msgid "/File/_Search..."
+#~ msgstr "/ファイル(_F)/検索(_S)..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/ファイル(_F)/複製の検索(_F)..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/ファイル(_F)/sep2"
+
+#~ msgid "/File/_Print..."
+#~ msgstr "/ファイル(_F)/印刷(_P)..."
+
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/ファイル(_F)/新しいフォルダ(_E)..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/ファイル(_F)/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/ファイル(_F)/コピー(_C)..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/ファイル(_F)/移動(_M)..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/ファイル(_F)/名前の変更(_R)..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/ファイル(_F)/削除(_D)..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/ファイル(_F)/sep4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/ファイル(_F)/ウィンドウを閉じる(_L)"
 
 #, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/ファイル(_F)/終了(_X)"
+
+#~ msgid "/_Edit"
+#~ msgstr "/編集(_E)"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/編集(_E)/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/編集(_E)/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/編集(_E)/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/編集(_E)/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/編集(_E)/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/編集(_E)/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/編集(_E)/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/編集(_E)/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/編集(_E)/editor8"
+
+#~ msgid "/Edit/editor9"
+#~ msgstr "/編集(_E)/editor9"
+
+#~ msgid "/Edit/editor0"
+#~ msgstr "/編集(_E)/editor0"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/編集(_E)/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/編集(_E)/調整(_A)"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/編集(_E)/プロパティ(_P)..."
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/編集(_E)/調整(_A)/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/編集(_E)/調整(_A)/時計回りに回転(_R)"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/編集(_E)/調整(_A)/反時計回りに回転(_C)"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/編集(_E)/調整(_A)/180度回転(_8)"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/編集(_E)/調整(_A)/ミラーリング(_M)"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/編集(_E)/調整(_A)/折り返し(_F)"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/編集(_E)/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/編集(_E)/全て選択(_A)"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/編集(_E)/選択解除(_N)"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/編集(_E)/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/編集(_E)/オプション(_O)..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/編集(_E)/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/編集(_E)/壁紙として貼り付け(_W)"
+
+#~ msgid "/_View"
+#~ msgstr "/表示(_V)"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/表示(_V)/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/表示(_V)/拡大(_I)"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/表示(_V)/縮小(_O)"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/表示(_V)/1:1 サイズ(_1)"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/表示(_V)/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/表示(_V)/サムネイル表示(_T)"
+
+#~ msgid "/View/I_cons"
+#~ msgstr "/表示(_V)/アイコン表示(_C)"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/表示(_V)/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/表示(_V)/フル・スクリーン表示(_U)"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/表示(_V)/sep3"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/表示(_V)/一覧を隠す(_H)"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/表示(_V)/sep4"
+
+#~ msgid "/View/_Keywords"
+#~ msgstr "/表示(_V)/キーワード(_K)"
+
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/表示(_V)/ソート・マネージャ(_M)"
+
+#~ msgid "/View/sep5"
+#~ msgstr "/表示(_V)/sep5"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/表示(_V)/スライドショーの切替え(_S)"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/表示(_V)/一覧の更新(_R)"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/ヘルプ(_H)/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/ヘルプ(_H)/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "GQview の設定"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/編集(_E)/古いサムネイルの削除(_R)"
+
+#~ msgid "path"
+#~ msgstr "パス"
+
+#~ msgid "Save"
+#~ msgstr "保存"
+
+#~ msgid "Close"
+#~ msgstr "閉じる"
+
 #~ msgid ""
-#~ "Overwrite file:\n"
-#~ "%s\n"
-#~ "with:\n"
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "コレクションファイルの上書き:\n"
 #~ "%s"
-#~ msgstr "¥Õ¥¡¥¤¥ë¤Î¾å½ñ¤­:\n"
 
-#~ msgid "Save"
-#~ msgstr "¥»¡¼¥Ö"
+#~ msgid "Save collection as:"
+#~ msgstr "コレクションを名前を付けて保存:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "開くコレクションの場所:"
+
+#~ msgid "Open"
+#~ msgstr "開く"
+
+#~ msgid "Append collection from:"
+#~ msgstr "コレクションへの追加先:"
+
+#~ msgid "exit"
+#~ msgstr "終了する"
+
+#~ msgid "Exit"
+#~ msgstr "終了"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "不正なフォルダ"
+
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "起動時に次のフォルダに移動する:"
 
-#~ msgid "Save settings on exit"
-#~ msgstr "½ªÎ»»þ¤ËÀßÄê¤òÊݸ¤¹¤ë"
+#~ msgid "Zoom (scaling):"
+#~ msgstr "ズーム (スケーリング):"
 
-#~ msgid "Save options"
-#~ msgstr "ÀßÄê¤òÊݸ"
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "マウスの下にダイアログを配置する"
 
-#~ msgid "Gen thumbnail:%s\n"
-#~ msgstr "¥µ¥à¥Í¥¤¥ëºîÀ®:%s\n"
+#~ msgid "Include files of type:"
+#~ msgstr "表示する拡張子:"
 
-#~ msgid "XV thumbnail found, loaded\n"
-#~ msgstr "XV¤Î¥µ¥à¥Í¥¤¥ë¤ò¸«¤Ä¤±¤¿¤Î¤Ç¡¢Æɤ߹þ¤ß¤Þ¤·¤¿\n"
+#~ msgid "Remove"
+#~ msgstr "削除"
 
-#~ msgid "Found in cache:%s\n"
-#~ msgstr "¥­¥ã¥Ã¥·¥å¤ò¸«¤Ä¤±¤Þ¤·¤¿:%s\n"
+#~ msgid "Add"
+#~ msgstr "追加"
 
-#~ msgid "creating thumbnail dir:%s\n"
-#~ msgstr "%s¥Ç¥£¥ì¥¯¥È¥ê¤Î¥µ¥à¥Í¥¤¥ë¤òºîÀ®¤·¤Æ¤¤¤Þ¤¹¡£\n"
+#~ msgid "Command Line"
+#~ msgstr "コマンド"
 
-#~ msgid "creating sub dir:%s\n"
-#~ msgstr "¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê%s¤Î¥µ¥à¥Í¥¤¥ë¤òºîÀ®¤·¤Æ¤¤¤Þ¤¹¡£\n"
+#~ msgid "Help"
+#~ msgstr "ヘルプ"
 
-#~ msgid "Saving thumb: %s\n"
-#~ msgstr "¥µ¥à¥Í¥¤¥ë%s¤òÊݸ¤·¤Þ¤·¤¿¡£\n"
+#~ msgid "Full screen size:"
+#~ msgstr "フル・スクリーン表示のサイズ:"
 
-#~ msgid "maintainance check: %s\n"
-#~ msgstr "%s¤ò¥á¥ó¥Æ¥Ê¥ó¥¹¤Î¤¿¤á¥Á¥§¥Ã¥¯¤·¤Æ¤¤¤Þ¤¹¡£\n"
+#~ msgid "Point size:"
+#~ msgstr "ポイントのサイズ:"
 
-#~ msgid "Deleting thumb dir: %s\n"
-#~ msgstr "%s¥Ç¥£¥ì¥¯¥È¥ê¤Î¥µ¥à¥Í¥¤¥ë¤òºï½ü¤·¤Æ¤¤¤Þ¤¹¡£\n"
+#~ msgid "Width:"
+#~ msgstr "幅:"
 
-#~ msgid "Deleting thumb: %s\n"
-#~ msgstr "¥µ¥à¥Í¥¤¥ë%s¤òºï½ü¤·¤Æ¤¤¤Þ¤¹¡£\n"
+#~ msgid "Height:"
+#~ msgstr "高さ:"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "ファイルの上書き:\n"
+#~ "%s\n"
+#~ "を\n"
+#~ "%s で"
 
-#~ msgid "copy"
-#~ msgstr "¥³¥Ô¡¼"
+#~ msgid "Yes"
+#~ msgstr "はい"
 
-#~ msgid "move"
-#~ msgstr "°ÜÆ°"
+#~ msgid "Yes to all"
+#~ msgstr "全てはい"
 
 #~ msgid ""
-#~ "\n"
+#~ "Overwrite file:\n"
+#~ "%s\n"
 #~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "%s\n"
+#~ "を\n"
+#~ "%s で上書きしますか?"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "ファイルのコピー:\n"
+#~ "%s\n"
+#~ "から:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "ファイルの移動:\n"
+#~ "%s\n"
+#~ "から"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "複数のファイルの削除について..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "ファイルの上書き:\n"
+#~ "%s\n"
+#~ "を名前を変えて:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "変更先:"
+
+#~ msgid "Create"
+#~ msgstr "作成"
+
+#~ msgid "Initial directory"
+#~ msgstr "初期フォルダ"
+
+#~ msgid "New Directory"
+#~ msgstr "新しいフォルダ"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
 #~ msgstr ""
-#~ "\n"
-#~ "¤ò...\n"
+#~ "フォルダの作成に失敗:\n"
+#~ "%s"
 
-#~ msgid "Error "
-#~ msgstr "¥¨¥é¡¼"
+#~ msgid "Error creating directory"
+#~ msgstr "ã\83\95ã\82©ã\83«ã\83\80ä½\9cæ\88\90中ã\81«ã\82¨ã\83©ã\83¼"
diff --git a/po/nl.po b/po/nl.po
new file mode 100644 (file)
index 0000000..0b4fb6e
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,3662 @@
+# Nederlandse vertaling van GQview
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# Hette J Visser <H.J.Visser@harrie.mine.nu>, 2001.
+# Tino Meinen <a.t.meinen@chello.nl>, 2003-2004
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: GQview 1.3.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2004-02-07 01:21+0100\n"
+"Last-Translator: Tino Meinen <a.t.meinen@chello.nl>\n"
+"Language-Team: Dutch <vertaling@nl.linux.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Gereedschap"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "diafragma"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Bestandsnaam:"
+
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Bestandsdatum:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Vergelijken met:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Collectie opslaan"
+
+# goede vertaling voor tag?
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "Tag"
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Naam"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "Waarde"
+
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "Formaat"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "Elementen"
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "Beschrijving"
+
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "Exif"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "Geavanceerd"
+
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Verwijderen mislukt"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"De map:\n"
+"%s\n"
+"bestaat al."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Collectie leeg"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Opslaan van collectie mislukt:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Opslaan mislukt"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "Favoriet toevoegen"
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Collecties"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "Naam:"
+
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "Archiefbeheer"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "Mappen"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Collecties"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Kopiëren"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Verplaatsen"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d afbeeldingen"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Niets selecteren"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "Laatste afbeelding herstellen"
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "klaar"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Lezen van overeenkomsten..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "De miniaturen worden opgeschoond..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Oude miniaturen worden verwijderd..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Ongeldige bestandsnaam"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Miniaturen 'cachen'"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Start #"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "Map:"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Niets selecteren"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Ongeldige bestandsnaam"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "vergelijken..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "De miniaturen worden opgeschoond..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Cache legen"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Alle opgeslagen miniaturen worden hiermee\n"
+"gewist, wilt u verder gaan?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "Eigenschappen van afbeelding - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview volledig scherm"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "actie"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "Wissen"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "Miniaturen 'cachen'"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "Miniaturen tonen"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "Hernoemen"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Naamloos"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Naamloos (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - GQview collectie"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Collectie sluiten"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Collectie is gewijzigd.\n"
+"Eerst opslaan?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Gegeven pad:\n"
+"%s\n"
+"is een map, collecties zijn bestanden"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Ongeldige bestandsnaam"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Bestand overschrijven"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Overschrijf bestanden"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Overschrijven"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Collectie opslaan"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Collectie openen"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Collectie aanvullen"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Invoegen"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Collectie bestanden"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Collectie leeg"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "De huidige collectie is leeg, opslaan afgebroken."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Legen"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d afbeeldingen (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d afbeeldingen"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Miniaturen worden geladen..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "Beel_d"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "Weergeven in _nieuw venster"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "_Verwijderen"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Aanvullen vanaf bestandslijst"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Aanvullen vanuit collectie..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Alles selecteren"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Niets selecteren"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "_Eigenschappen"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "_Kopiëren..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "Ver_plaatsen..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "_Hernoemen..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "_Verwijderen..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "Bestandsnaam _tekst tonen"
+
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "Collectie op_slaan"
+
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "Collectie opslaan _als..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "_Dubbele zoeken..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Bestand/_Hernoemen..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "De lijst bevat mappen."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "Inhoud _toevoegen"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "Inhoud _recursief toevoegen"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "Mappen _overslaan"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Plaats bestanden om ze te vergelijken"
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d bestanden"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d overeenkomsten gevonden in %d bestanden"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[set 1]"
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Lezen van checksums..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Lezen van afmetingen..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Lezen van overeenkomsten..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Vergelijken..."
+
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "Sorteren..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "Groep _1 dubbele selecteren"
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "Groep _2 dubbele selecteren"
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Toevoegen aan nieuwe collectie"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "_Wissen"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "Venster sl_uiten"
+
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "%d bestanden (set 2)"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Grootte"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Datum"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Afmetingen"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Controlesom"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Pad"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Overeenkomst (groot)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Overeenkomst"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Overeenkomst (klein)"
+
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Overeenkomst (aangepast)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Dubbele bestanden zoeken - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Vergelijken met:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Vergelijken via:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Miniaturen"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Twee verzamelingen vergelijken"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "Klokgewijs draaien"
+
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "Antiklokgewijs draaien"
+
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "stoppen..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "Resultaat van bewerkingsopdracht"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "Uitvoer van %s"
+
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Kan opdracht niet uitvoeren:\n"
+"%s\n"
+
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "afgebroken door gebruiker"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "onbekend"
+
+#: src/exif.c:113
+msgid "top left"
+msgstr "boven links"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "boven rechts"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "onder rechts"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "onder links"
+
+#: src/exif.c:117
+msgid "left top"
+msgstr "links boven"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "rechts boven"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "rechts onder"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "links onder"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "inch"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "centimeter"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "gemiddeld"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "centrum gewogen"
+
+# onzeker
+#: src/exif.c:142
+msgid "spot"
+msgstr "focus"
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr "multi-focus"
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr "multi-segment"
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "gedeeltelijk"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "overige"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "niet gedefinieerd"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "handmatig"
+
+#: src/exif.c:153
+msgid "normal"
+msgstr "normaal"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "diafragma"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "sluiter"
+
+#: src/exif.c:156
+msgid "creative"
+msgstr "creatief"
+
+#: src/exif.c:157
+msgid "action"
+msgstr "actie"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "staand"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "liggend"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "daglicht"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "fluorescent"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "tungsten (incandescent)"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "flits"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "nee"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "ja"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr "ja, niet ontdenkt met de strobe"
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr "ja, ontdekt met de strobe"
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "Beschrijving"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "Oriëntatie"
+
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "Copyright"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "Belichtingstijd"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "ISO gevoeligheid"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "Oorspronkelijke datum"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "Gedigitaliseerde datum"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "Sluitertijd"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "Diafragma"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "Belichtingsafwijking"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "Afstand voorwerp"
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "Afstandsmethode"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "Lichtbron"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "Flits"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "Brandpuntafstand"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "Breedte"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "Hoogte"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "Camera"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "Resolutie"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "oneindig"
+
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "modus:"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "aan"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "uit"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "auto"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr "noet ontdekt met de strobe"
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr "ontdekt met de strobe"
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "rode ogen reductie"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "dot"
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d byte"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f K"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f Mb"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f Gb"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview volledig scherm"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Bestandsgrootte:"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Afbeelding passend maken"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "_Inzoomen"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "_Uitzoomen"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "_1:1 zoomen"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "Afbeelding _passend maken"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "Als achter_grond gebruiken"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "Diavoorstelling _stoppen"
+
+# de o zit naast de p
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "Diavoorstelling verv_olgen"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "Diavoorstelling _pauzeren"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "Diavoorstelling _starten"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "_Volledig scherm verlaten"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "_Volledig scherm"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "Venster sl_uiten"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "Bestandsgrootte:"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Afmetingen:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Doorzichtig:"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Grootte afbeelding:"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Compressieverhouding:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Bestandsdatum:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Eigenaar:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Groep:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Algemeen"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "Afbeelding %d van %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Eigenschappen van afbeelding - GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Oplopend"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Diavoorstelling"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Gepauzeerd"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d bestanden (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d bestanden%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d bestanden%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(geen schrijfpermissie) %s byte"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s byte"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s byte"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview gereedschap"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Gereedschap"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "Bestanden"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Afbeelding"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(slepen om de volgorde te veranderen)"
+
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "Bestands_lijst verbergen"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "in %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "in (onbekend)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Legen"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Bestand"
+
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "Be_werken"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "_Aanpassen"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/_Hulp"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Bestand/_Nieuw venster"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "Collectie op_slaan"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Collectie openen"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Bestand/_Recente openen"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Sorteren..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Bestand/_Hernoemen..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "_Nieuw map..."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Kwaliteit"
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "_Klokgewijs draaien"
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "_Antiklokgewijs draaien"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "_180 draaien"
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "_Spiegelen"
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "_Omdraaien"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Alles selecteren"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Niets selecteren"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "_Eigenschappen..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Beeld/_Passend zoomen"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "_Volledig scherm"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Bestands_lijst verbergen"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "Diavoorstelling _stoppen"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "_Herladen"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Hulp/_Info"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Hulp/_Sneltoetsen"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Hulp/_Versie-informatie"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Hulp/_Info"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Miniaturen"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Beeld/_Boom"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Beeld/Bestandslijst _zwevend"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Beeld/_Werkbalk verbergen"
+
+# P wordt al gebruikt voor _Passend zoomn
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "/Beeld/Pi_ctogrammen"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Beeld/E_xif gegevens"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Archiefbeheer"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Beeld/_Lijst"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Pictogram:"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Miniaturen tonen"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Persoonlijke map"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Bestandslijst herladen"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Inzoomen"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Uitzoomen"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Afbeelding passend maken"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "1:1 zoomen"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Configuratie-opties"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Bedieningsvenster loskoppelen"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Hulp - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Opdrachtregel"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Alvast de volgende afbeelding laden"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "Laatste afbeelding herstellen"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Laatste afbeelding herstellen"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "_Volledig scherm verlaten"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "_Volledig scherm verlaten"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "_Volledig scherm verlaten"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "Diavoorstelling _stoppen"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "Diavoorstelling _starten"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "Diavoorstelling _stoppen"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "Diavoorstelling _starten"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview gereedschap"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr "Bestand hernoemen:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Weergeven in _nieuw venster"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr "Gebruik: gqview [opties] [pad]\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "geldige opties zijn:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr " +t, --with-tools           forceer weergave van gereedschap\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools       forceer verbergen van gereedschap\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen          start in volledig scherm\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow           start met diavoorstelling\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr "  -l, --list                open collectie venster voor command line\n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr "  -l, --list                open collectie venster voor command line\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                   zet debug uitvoer aan\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version             print versie info\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr "  -h, --help          deze boodschap weergeven\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"onjuist of verworpen: %s\n"
+"Gebruik --help voor opties\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Bezig met maken van GQview map:%s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Kan map niet aanmaken:%s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Persoonlijke map"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "Desktop"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "Gqview - Afsluiten"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "Info - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Collecties zijn gewijzigd.\n"
+"Evengoed afsluiten?"
+
+# bestandsgrootte
+# Omdat de tekst in de balk zichbaar blijft (zodat je kunt zien
+# hoe de lijst is gesorteerd hanteren we de vorm: op ... gesorteerd
+# ipv de vorm: Op ... sorteren
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "Op grootte gesorteerd"
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "Op datum gesorteerd"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Ongesorteerd"
+
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "Op pad gesorteerd"
+
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "Op nummer gesorteerd"
+
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "Op naam gesorteerd"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Sorteren"
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "_180 draaien"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Meest gelijkend (meest beroerd, maar snelst)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Tegels"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilinear"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Hyper (beste, maar langzaamste)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Geen"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normaal"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Beste"
+
+#: src/preferences.c:498 src/print.c:365
+#, fuzzy
+msgid "Custom"
+msgstr "auto"
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "Filters resetten"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Dit zal de oude waarden voor bestandsfilters terughalen.\n"
+"Doorgaan?"
+
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "Editors resetten"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Dit zal de oude waarden voor de edit-opdrachten herstellen.\n"
+"Doorgaan?"
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "Prullenbak legen"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "Hiermee zal de inhoud van de prullenbak verwijderd worden"
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - hernoem"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "Start #"
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Persoonlijke map"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Huidige gebruiken"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Grootte:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Kwaliteit:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Miniaturen 'cachen'"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Miniaturen 'cachen' in .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "xvpics-miniaturen gebruiken, indien gevonden (alleen lezen)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Diavoorstelling"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Afbeelding wisselen na een aantal seconden:"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Willekeurig"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Herhalen"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Inzoomen"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Dithering methode:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Zoomen in twee stappen"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Afbeeldingen zoomen zodat ze in het venster passen"
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Stapgrootte voor zoomen:"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Bij het tonen van de volgende afbeelding"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Op oorspronkelijke grootte tonen"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Zoom-waarde niet veranderen"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Invoegen"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Zwarte achtergrond"
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Verder"
+
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "Verversen bij aanpassing van bestand"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Alvast de volgende afbeelding laden"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Afbeelding automatisch draaien afgaand op Exif info"
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Vensters"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Start #"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Positie van vensters onthouden"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "De werkbalk-toestand (zwevend/verborgen) onthouden"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "Venster aanpassen aan afbeelding als werkbalk zweeft/verborgen is"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Grootte beperken bij automatisch aanpassen van venster (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Indeling"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filteren"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Mappen tonen die met een punt beginnen"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "Hoofdlettergevoelig"
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Bestandsfiltering uitschakelen"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Bestandsdatum:"
+
+# kolomkop voor de filters
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "Filter"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "Standaarden"
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Editors"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+# duidelijker zo
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Naam van programma"
+
+# dit is de titel van het tabblad
+# 'Extra' is niet de letterlijke vertaling maar wel een goede hier.
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "Extra"
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "_Volledig scherm"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Grootte afbeelding:"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Verwijderen"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Verwijderen bestand bevestigen"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Delete-toets activeren"
+
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "Veilig verwijderen"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Maximale grootte (Mb)"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+# normale vertaling zou Beeld zijn, maar dit is in de preferences.
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Weergeven"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Rechthoekige selectie"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Mappen binnengaan in boom-weergave"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Snel hernoemen van bestanden"
+
+#: src/preferences.c:1200
+#, fuzzy
+msgid "Navigation"
+msgstr "actie"
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Versnelling bij het schuiven van afbeelding via toetsenbord"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Muiswiel schuift afbeelding"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "Aangepaste drempelwaarde voor overeenkomst:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Offscreen cache grootte (Mb per afbeelding):"
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "Info - GQview"
+
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright ©  %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Uitgegeven onder de GNU General Public License"
+
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "Met dank aan..."
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Niets selecteren"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+#, fuzzy
+msgid "Default printer"
+msgstr "Standaarden"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr ""
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Grootte afbeelding:"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+#, fuzzy
+msgid "centimeters"
+msgstr "centimeter"
+
+#: src/print.c:353
+#, fuzzy
+msgid "inches"
+msgstr "inch"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+#, fuzzy
+msgid "Portrait"
+msgstr "staand"
+
+#: src/print.c:360
+#, fuzzy
+msgid "Landscape"
+msgstr "liggend"
+
+#: src/print.c:366
+#, fuzzy
+msgid "Letter"
+msgstr "centimeter"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, fuzzy, c-format
+msgid "page %d of %d"
+msgstr "Afbeelding %d van %d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "Voorbeeld"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "Een bestand met de naam %s bestaat reeds."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+# kolomkop voor de filters
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Filter"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Standaarden"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "Info - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Formaat"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Oriëntatie"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Beschrijving"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Bestandsnaam:"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Naamloos"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "aan"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Sorteren"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Grootte afbeelding:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "diafragma"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+#, fuzzy
+msgid "Right:"
+msgstr "Hoogte"
+
+#: src/print.c:3432
+#, fuzzy
+msgid "Top:"
+msgstr "Groep:"
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "naar:"
+
+# kolomkop voor de filters
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Filter"
+
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr ""
+
+# werkwoord?
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Filter:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Bestandsdatum:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Positie van vensters onthouden"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "Fout bij opslaan van bestand: %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Map:"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Elementen"
+
+#: src/search.c:202
+#, fuzzy
+msgid "results"
+msgstr "Standaarden"
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Verder"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+msgid "greater than"
+msgstr ""
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "Datum"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d bestanden (%s, %d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%s, %d bestanden%s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Sorteren..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Selecteer aub een bestaande map"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Selecteer aub een bestaande map"
+
+#: src/search.c:2570
+#, fuzzy
+msgid "Image search - GQview"
+msgstr "Eigenschappen van afbeelding - GQview"
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Sorteren..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Bestandsnaam:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Bestandsgrootte:"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Willekeurig"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Bestandsdatum:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Beschrijving"
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Inhoud toevoegen"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Overeenkomst"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Willekeurig"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "Laden van miniatuur in cache mislukt, probeer een nieuwe te maken.\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Kon geschiedenis niet schrijven naar: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "Nieuwe favoriet"
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "Favorieten bewerken"
+
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "Pad:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "Pictogram:"
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Niets selecteren"
+
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "_Eigenschappen..."
+
+# kort houden
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "Naar _boven"
+
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "Naar _beneden"
+
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "_Verwijderen"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Kan bestand: \n"
+"%s niet laden"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Kon %s niet hernoemen tot %s."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Kan het bestand: \n"
+"%s niet verwijderen"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Verwijderen van bestand mislukt"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Bestand verwijderen"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Het bestand: %s\n"
+"zal worden verwijderd"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "_Hernoemen"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "_Favoriet toevoegen"
+
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "_Verwijderen"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "_Nieuw map..."
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Kan map:\n"
+"%s niet aanmaken"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Fout bij het aanmaken van map"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Alle bestanden"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Verborgen weergeven"
+
+# werkwoord?
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filter:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Alles selecteren"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "Alle bestanden"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Overschrijf bestanden"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Overschrijf bestanden"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Overschrijf bestanden"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Alles overslaan"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Sla over"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Fout bij het verplaatsen"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "_Nieuw map..."
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Automatisch hernoemen"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Hernoemen"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Bron voor kopiëren is gelijk aan doel"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Kan bestand:\n"
+"%s\n"
+"niet naar zichzelf kopieren."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Te verplaatsen bron is gelijk aan doel"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Kan bestand:\n"
+"%s\n"
+"niet naar zichzelf verplaatsen."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Verder"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Fout bij kopieren bestand"
+
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Kan niet kopiëren, bestand:\n"
+"%s \n"
+"naar:\n"
+"%s\n"
+"tijdens het kopiëren van meerdere bestanden."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Fout bij het verplaatsen"
+
+#: src/utilops.c:636
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Kan niet verplaatsen, bestand:\n"
+"%s\n"
+"naar:\n"
+"%s\n"
+"tijdens het verplaatsen van meerdere bestanden."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Bron is gelijk aan doellocatie"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Bron is gelijk aan doellocatie, actie onderbroken"
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Fout bij het kopieren van bestand:\n"
+"%s\n"
+"naar:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Fout bij het verplaatsen van bestand:\n"
+"%s\n"
+"naar:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Ongeldige doellocatie"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"Bij het werken met meerdere bestanden moet u een map\n"
+"selecteren, geen bestand."
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Selecteer aub een bestaande map"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Hulp - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "_Kopiëren"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr "Bestand hernoemen:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "Meerdere bestanden kopiëren naar:"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Hulp - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "_Verplaatsen"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr "Bestand hernoemen:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Meerdere bestanden verplaatsen naar:"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Bestandsnaam:"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Bron is gelijk aan doellocatie"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Verwijderen mislukt"
+
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "Kan oud bestand niet uit de prullenbak verwijderen"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Kon map niet aanmaken"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "Toestemming geweigerd"
+
+#: src/utilops.c:1212
+#, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Kan de prullenbak-map niet benaderen of aanmaken.\n"
+"\"%s\""
+
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "Veilig bestanden verwijdern uitzetten"
+
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "Veilig verwijderen: %s"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Kan bestand: \n"
+"%s niet verwijderen\n"
+"Wilt u verder gaan met het verwijderen van bestanden?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr "Bestand %d van %d"
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Verwijder bestanden"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Hernoem meerdere bestanden:"
+
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "%d bestanden herzien"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Bestand verwijderen"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Bestand verwijderen"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Kan bestand:\n"
+"%s\n"
+"niet hernoemen tot:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Fout bij het hernoemen van bestand"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Kan niet automatisch hernoemen met de opgegeven\n"
+"nummers. Een of meer bestanden komen overeen\n"
+"met de resulterende bestandsnamen.\n"
+
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"Kon %s niet hernoemen\n"
+"\n"
+"Het getal was %d."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Hulp - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "Hernoem meerdere bestanden:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "Oorspronkelijke naam"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Oorspronkelijke naam"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "Hernoemen:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Begintekst"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "Start #"
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Eindtekst"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "Opvulling:"
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Kan bestand:\n"
+"%s\n"
+"niet hernoemen tot:\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr "Bestand hernoemen:"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"De map:\n"
+"%s\n"
+"bestaat al."
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Mappen"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"Het pad:\n"
+"%s\n"
+"bestaat al als bestand."
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Hulp - GQview"
+
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Map aanmaken in:\n"
+"%s\n"
+"met de naam:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "Nieuwe map"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "Naar _bovenliggende"
+
+# was eerst diashow
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "_Diavoorstelling"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Recursieve diavoorstelling"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "_Dubbele zoeken..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Recursief dubbele zoeken..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "_Nieuw map..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "Als _boom weergeven"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "_Herladen"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "_Sorteren"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "Als _pictogrammen weergeven"
+
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "_Miniaturen tonen"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Ongeldige bestandsnaam:\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "Miniaturen verwijderen"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/Bestand/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/Bestand/Nieuwe _collectie"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Bestand/Collectie _openen..."
+
+#~ msgid "/File/sep1"
+#~ msgstr "/Bestand/sep1"
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/Bestand/_Hernoemen..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Bestand/_Dubbele zoeken..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Bestand/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Bestand/_Hernoemen..."
+
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Bestand/Nieuw _map..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Bestand/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Bestand/_Kopiëren..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Bestand/Ver_plaatsen..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Bestand/_Hernoemen..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Bestand/_Verwijderen..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Bestand/sep4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/Bestand/Venster s_luiten"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Bestand/_Afsluiten"
+
+#~ msgid "/_Edit"
+#~ msgstr "/Be_werken"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Bewerken/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Bewerken/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Bewerken/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Bewerken/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Bewerken/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Bewerken/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Bewerken/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Bewerken/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Bewerken/editor8"
+
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Bewerken/editor9"
+
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Bewerken/editor0"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Bewerken/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Bewerken/Aan_passen"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Bewerken/_Eigenschappen"
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Bewerken/Aanpassen/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Bewerken/Aanpassen/Met klok mee_draaien"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Bewerken/Aanpassen/_Tegen klok indraaien"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Bewerken/Aanpassen/1_80 draaien"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Bewerken/Aanpassen/_Spiegelen"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Bewerken/Aanpassen/Om_keren"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Bewerken/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Bewerken/_Alles selecteren"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Bewerken/_Niets selecteren"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Bewerken/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Bewerken/_Opties..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Bewerken/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Bewerken/Als achter_grond gebruiken"
+
+#~ msgid "/_View"
+#~ msgstr "/Beel_d"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Beeld/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Beeld/_Inzoomen"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Beeld/_Uitzoomen"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Beeld/_1:1 zoomen"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Beeld/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Beeld/_Miniaturen"
+
+# P wordt al gebruikt voor _Passend zoomn
+#~ msgid "/View/I_cons"
+#~ msgstr "/Beeld/Pi_ctogrammen"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Beeld/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Beeld/_Volledig scherm"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Beeld/sep3"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Beeld/_Bestandslijst verbergen"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/Beeld/sep4"
+
+# archiefbeheer het mooiste
+# opbergen, indelingsbeheer(der) sorteerbeheer
+# indelen, sorteren
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Beeld/_Archiefbeheer"
+
+#~ msgid "/View/sep5"
+#~ msgstr "/Beeld/sep5"
+
+# aan/uit geeft vreemde effecten,
+# aan\uit valt weg 
+# aan\\uit werkt wel
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Beeld/_Diashow aan\\\\uit"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Beeld/Lijsten _verversen"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Hulp/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Hulp/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "GQview configuratie"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Bewerken/Oude miniaturen _verwijderen"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Pad"
+
+#~ msgid "Save"
+#~ msgstr "Opslaan"
+
+#~ msgid "Close"
+#~ msgstr "Sluiten"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Overschrijven van collectie bestand:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "Collectie opslaan als:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "Collectie openen vanuit:"
+
+#~ msgid "Open"
+#~ msgstr "Openen"
+
+#~ msgid "Append collection from:"
+#~ msgstr "Collectie aanvullen vanuit:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Afsluiten"
+
+#~ msgid "Exit"
+#~ msgstr "Afsluiten"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Ongeldige bestandsnaam"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Bij het opstarten deze map tonen:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Zoomen (schaling):"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Plaats dialoogvensters onder muis"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Bestanden weergeven van type:"
+
+#~ msgid "Remove"
+#~ msgstr "Verwijderen"
+
+#~ msgid "Add"
+#~ msgstr "Toevoegen"
+
+# Kan beter
+#~ msgid "Command Line"
+#~ msgstr "Opdrachtregel"
+
+#~ msgid "Help"
+#~ msgstr "Hulp"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "_Volledig scherm"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Bestandsgrootte:"
+
+#, fuzzy
+#~ msgid "Width:"
+#~ msgstr "Breedte"
+
+#, fuzzy
+#~ msgid "Height:"
+#~ msgstr "Hoogte"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Overschrijf bestanden:\n"
+#~ " %s\n"
+#~ " met:\n"
+#~ " %s"
+
+#~ msgid "Yes"
+#~ msgstr "Ja"
+
+#~ msgid "Yes to all"
+#~ msgstr "Ja voor alles"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Overschrijf bestand:\n"
+#~ "%s\n"
+#~ "met:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Het bestand:\n"
+#~ "%s\n"
+#~ "kopiëren naar:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Het bestand:\n"
+#~ "%s\n"
+#~ "verplaatsen naar:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Beginnen met verwijderen van bestanden..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Overschrijf bestand:\n"
+#~ "%s\n"
+#~ "Door het hernoemen van:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "naar:"
+
+#~ msgid "Create"
+#~ msgstr "Aanmaken"
+
+#~ msgid "Initial directory"
+#~ msgstr "Startmap"
+
+#~ msgid "New Directory"
+#~ msgstr "Nieuwe map"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Kan map:\n"
+#~ "%s niet aanmaken"
+
+#~ msgid "Error creating directory"
+#~ msgstr "Fout bij het aanmaken van map"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "Beschrijving"
+
+# aan/uit geeft vreemde effecten,
+# aan\uit valt weg 
+# aan\\uit werkt wel
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/Beeld/_Diashow aan\\\\uit"
+
+#~ msgid "Add contents"
+#~ msgstr "Inhoud toevoegen"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "Inhoud recursief toevoegen"
+
+#~ msgid "Skip directories"
+#~ msgstr "Mappen overslaan"
+
+#~ msgid "Invalid directory"
+#~ msgstr "Ongeldige map"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - kopiëren"
+
+#~ msgid "GQview - move"
+#~ msgstr "Gqview - verplaatsen"
+
+#~ msgid "Directory exists"
+#~ msgstr "Map bestaat al"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - Nieuwe map"
+
+#~ msgid "Misc."
+#~ msgstr "Overig"
+
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/Bestand/_Map aanmaken..."
+
+#~ msgid "Edit"
+#~ msgstr "Bewerken"
+
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "Bestanden invoegen bij de positie van de muisaanwijzer"
+
+#~ msgid "File named %s already exists."
+#~ msgstr "Bestandsnaam %s bestaat al."
+
+#~ msgid "Date:"
+#~ msgstr "Datum:"
+
+#~ msgid "cm"
+#~ msgstr "cm"
+
+#~ msgid "aperture priority"
+#~ msgstr "diafragma voorkeuren"
+
+#~ msgid "tungsten"
+#~ msgstr "tungsten"
+
+#~ msgid "standard A"
+#~ msgstr "standaard A"
+
+#~ msgid "standard B"
+#~ msgstr "standaard B"
+
+#~ msgid "standard C"
+#~ msgstr "standaard C"
+
+#~ msgid "OTHER"
+#~ msgstr "OVERIGE"
+
+#~ msgid "yes (strobe return light not detected)"
+#~ msgstr "ja (flits weerspiegeling niet gedetecteerd)"
+
+#~ msgid "yes (strobe return light detected)"
+#~ msgstr "ja (flits weerspiegeling gedetecteerd)"
+
+#~ msgid "top"
+#~ msgstr "boven"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview draait: %s\n"
+
+#~ msgid "Electric Eyes"
+#~ msgstr "Electric Eyes"
diff --git a/po/no.po b/po/no.po
new file mode 100644 (file)
index 0000000..c5b8b0b
--- /dev/null
+++ b/po/no.po
@@ -0,0 +1,3710 @@
+# GQview in Norwegian.
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# Torgeir Ness Sundli <torgeir@mp3bil.no>, 2001.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview-0.99.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2001-12-06 16:27+0100\n"
+"Last-Translator: Torgeir Ness Sundli <torgeir@mp3bil.no>\n"
+"Language-Team: Norwegian <?>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Fliser"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "Dato"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+#, fuzzy
+msgid "Filename:"
+msgstr "Omdøp:"
+
+#: src/bar_info.c:1007 src/info.c:360
+#, fuzzy
+msgid "File date:"
+msgstr "Filter:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Sammenlign med:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Lagre samling"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr ""
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Navn"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr ""
+
+#: src/bar_exif.c:426
+#, fuzzy
+msgid "Format"
+msgstr "Normal"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr ""
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr ""
+
+#: src/bar_exif.c:549 src/info.c:105
+#, fuzzy
+msgid "Exif"
+msgstr "Avslutt"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr ""
+
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Sletting mislykktes"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Mappen:\n"
+"%s\n"
+"eksisterer allerede."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Tom samling"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Kunne ikke lagre samlingen:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Lagring mislyktes"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr ""
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Samlinger"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+#, fuzzy
+msgid "Name:"
+msgstr "Navn"
+
+#: src/bar_sort.c:569
+#, fuzzy
+msgid "Sort Manager"
+msgstr "Sorter etter navn"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+#, fuzzy
+msgid "Folders"
+msgstr "Fliser"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Samlinger"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Kopier"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Flytt"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d bilder"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Velg ingen"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr ""
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+#, fuzzy
+msgid "done"
+msgstr "Ingen"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Leser likhetsdata..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Fjerner thumbnails..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Utrensker gamle thumbnails..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Ugyldig filnavn"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Lagre thumbnails"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Dato"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+#, fuzzy
+msgid "Folder:"
+msgstr "Fliser"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Velg ingen"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Ugyldig filnavn"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+#, fuzzy
+msgid "running..."
+msgstr "Sammenligner..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Fjerner thumbnails..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Slett cache"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Dette vil slette alle thumbnails, som\n"
+"har blitt lagret på disken, fortsett?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "Hjelp - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview fullskjerm"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "Samlinger"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "Visk ut"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "Lagre thumbnails"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "Lagre thumbnails"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "Omdøp"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Intet navn"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Intet navn (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - GQview samling"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Lukk samling"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Samlingen er blitt endret.\n"
+"Lagre først?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Spesifisert mål:\n"
+"%s\n"
+"er en mappe, samlinger er filer"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Ugyldig filnavn"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Overskriv fil"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Overskriv fil"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Overskriv"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Lagre samling"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Åpne samling"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Tilføy samling"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Tilføy"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Samlingsfiler"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Tom samling"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Denne samlingen er tom, lagringen ble avbrutt."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Tom"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d bilder (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d bilder"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Åpner thumbnails..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+#, fuzzy
+msgid "_View"
+msgstr "/_Vis"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+#, fuzzy
+msgid "View in _new window"
+msgstr "Vis i nytt vindu"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+#, fuzzy
+msgid "Rem_ove"
+msgstr "Fjern"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Tilføy fra filliste"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Tilføy fra samling..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Velg alle"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Velg ingen"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+#, fuzzy
+msgid "_Properties"
+msgstr "/Rediger/_Innstillinger"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+#, fuzzy
+msgid "_Copy..."
+msgstr "Kopier..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+#, fuzzy
+msgid "_Move..."
+msgstr "Flytt..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+#, fuzzy
+msgid "_Rename..."
+msgstr "Omdøp..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+#, fuzzy
+msgid "_Delete..."
+msgstr "Slett..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+#, fuzzy
+msgid "Show filename _text"
+msgstr "Vis skjulte"
+
+#: src/collect-table.c:813
+#, fuzzy
+msgid "_Save collection"
+msgstr "Lagre samling"
+
+#: src/collect-table.c:815
+#, fuzzy
+msgid "Save collection _as..."
+msgstr "Lagre samling som..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+#, fuzzy
+msgid "_Find duplicates..."
+msgstr "Finn dubletter..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Fil/_Omdøp..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "Denne listen inneholder mapper."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+#, fuzzy
+msgid "_Add contents"
+msgstr "Legg til innhold"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+#, fuzzy
+msgid "Add contents _recursive"
+msgstr "Legg til indhold med mapper"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "Unngå mapper"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Dra og slipp mapper her for å sammenligne dem."
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d filer"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d likheter funnet i %d filer"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr ""
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Leser checksums..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Leser dimensjoner..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Leser likhetsdata..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Sammenligner..."
+
+#: src/dupe.c:1535
+#, fuzzy
+msgid "Sorting..."
+msgstr "Sammenligner..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr ""
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr ""
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Legg til til ny samling"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+#, fuzzy
+msgid "C_lear"
+msgstr "Visk ut"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+#, fuzzy
+msgid "Close _window"
+msgstr "Lukk vindu"
+
+#: src/dupe.c:2382
+#, fuzzy, c-format
+msgid "%d files (set 2)"
+msgstr "%d filer%s"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Størrelse"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Dato"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Dimensjoner"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Checksum"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Mål"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Likhet (stor)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Likhet"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Likhet (lav)"
+
+#: src/dupe.c:2598
+#, fuzzy
+msgid "Similarity (custom)"
+msgstr "Likhet (lav)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Finn dubletter - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Sammenlign med:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Sammenlign ved:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Thumbnails"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Sammenlign to sett filer"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+#, fuzzy
+msgid "Rotate jpeg clockwise"
+msgstr "Roter med uret"
+
+#: src/editors.c:59
+#, fuzzy
+msgid "Rotate jpeg counterclockwise"
+msgstr "Roter mot uret"
+
+#: src/editors.c:104
+#, fuzzy
+msgid "stopping..."
+msgstr "Sammenligner..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr ""
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr ""
+
+#: src/editors.c:303
+#, fuzzy, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Kunne ikke åpne:\n"
+"%s"
+
+#: src/editors.c:414
+#, fuzzy
+msgid "stopped by user"
+msgstr "Sorter etter nummer"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+#, fuzzy
+msgid "unknown"
+msgstr "i (ukjent)..."
+
+#: src/exif.c:113
+#, fuzzy
+msgid "top left"
+msgstr "Slett"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr ""
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr ""
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr ""
+
+#: src/exif.c:117
+#, fuzzy
+msgid "left top"
+msgstr "Slett"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr ""
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr ""
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr ""
+
+#: src/exif.c:127
+msgid "inch"
+msgstr ""
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr ""
+
+#: src/exif.c:140
+msgid "average"
+msgstr ""
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr ""
+
+#: src/exif.c:142
+msgid "spot"
+msgstr ""
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr ""
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr ""
+
+#: src/exif.c:145
+msgid "partial"
+msgstr ""
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr ""
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr ""
+
+#: src/exif.c:152
+msgid "manual"
+msgstr ""
+
+#: src/exif.c:153
+#, fuzzy
+msgid "normal"
+msgstr "Normal"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr ""
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr ""
+
+#: src/exif.c:156
+#, fuzzy
+msgid "creative"
+msgstr "Oppret"
+
+#: src/exif.c:157
+msgid "action"
+msgstr ""
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr ""
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr ""
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr ""
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr ""
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr ""
+
+#: src/exif.c:168
+msgid "flash"
+msgstr ""
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr ""
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+#, fuzzy
+msgid "yes"
+msgstr "Ja"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr ""
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr ""
+
+#: src/exif.c:289
+#, fuzzy
+msgid "Image description"
+msgstr "Ugylding destinasjon"
+
+#: src/exif.c:292
+#, fuzzy
+msgid "Orientation"
+msgstr "Dimensjoner"
+
+#: src/exif.c:303
+#, fuzzy
+msgid "Copyright"
+msgstr "Kopier"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr ""
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr ""
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr ""
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr ""
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr ""
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr ""
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr ""
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr ""
+
+#: src/exif.c:323
+#, fuzzy
+msgid "Metering mode"
+msgstr "Ditheringsmetode:"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr ""
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr ""
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr ""
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr ""
+
+#: src/exif.c:337
+msgid "Height"
+msgstr ""
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr ""
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr ""
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr ""
+
+#: src/exif.c:1479
+#, fuzzy
+msgid "mode:"
+msgstr "Fliser"
+
+#: src/exif.c:1483 src/utilops.c:1234
+#, fuzzy
+msgid "on"
+msgstr "Ingen"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr ""
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr ""
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr ""
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr ""
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr ""
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr ""
+
+#: src/filelist.c:513
+#, fuzzy, c-format
+msgid "%d bytes"
+msgstr "%d filer"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr ""
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr ""
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr ""
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview fullskjerm"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Fliser"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Bilde passer til vindu"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+#, fuzzy
+msgid "Zoom _in"
+msgstr "Zoom inn"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+#, fuzzy
+msgid "Zoom _out"
+msgstr "Zoom ut"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+#, fuzzy
+msgid "Zoom _1:1"
+msgstr "Zoom 1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+#, fuzzy
+msgid "Fit image to _window"
+msgstr "Bilde passer til vindu"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+#, fuzzy
+msgid "Set as _wallpaper"
+msgstr "Bruk som bakgrunn"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+#, fuzzy
+msgid "_Stop slideshow"
+msgstr "Stopp bildeserie"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+#, fuzzy
+msgid "Continue slides_how"
+msgstr "Fortsett bildeserie"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+#, fuzzy
+msgid "Pause slides_how"
+msgstr "Avbryt bildeserie"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+#, fuzzy
+msgid "_Start slideshow"
+msgstr "Start bildeserie"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+#, fuzzy
+msgid "Exit _full screen"
+msgstr "Gå ut av fullskjerm"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+#, fuzzy
+msgid "_Full screen"
+msgstr "Fullskjerm"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+#, fuzzy
+msgid "C_lose window"
+msgstr "Lukk vindu"
+
+#: src/info.c:361
+#, fuzzy
+msgid "File size:"
+msgstr "Fliser"
+
+#: src/info.c:363
+#, fuzzy
+msgid "Dimensions:"
+msgstr "Dimensjoner"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr ""
+
+#: src/info.c:365 src/print.c:3371
+#, fuzzy
+msgid "Image size:"
+msgstr "Bilde"
+
+#: src/info.c:367
+#, fuzzy
+msgid "Compress ratio:"
+msgstr "Sammenlign med:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Filter:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr ""
+
+#: src/info.c:371
+msgid "Group:"
+msgstr ""
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Generelt"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr ""
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr ""
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Stigende"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Bildeserie"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Avbrutt"
+
+#: src/layout.c:358
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%d filer (%d)%s"
+
+#: src/layout.c:365
+#, fuzzy, c-format
+msgid "%s, %d files%s"
+msgstr "%d filer%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d filer%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr ""
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s byte"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s byte"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview værktøy"
+
+#: src/layout_config.c:57
+#, fuzzy
+msgid "Tools"
+msgstr "Fliser"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+#, fuzzy
+msgid "Files"
+msgstr "Fliser"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Bilde"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr ""
+
+#: src/layout_image.c:770
+#, fuzzy
+msgid "Hide file _list"
+msgstr "Vis/skjul filliste"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "i %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "i (ukjent)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Tom"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Fil"
+
+#: src/layout_util.c:749 src/menu.c:91
+#, fuzzy
+msgid "_Edit"
+msgstr "/_Rediger"
+
+#: src/layout_util.c:750 src/menu.c:248
+#, fuzzy
+msgid "_Adjust"
+msgstr "Tilpass"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/_Hjelp"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Fil/_Ny samling"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "Lagre samling"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Åpne samling"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Filer/Åpne n_ylige"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Sammenligner..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Fil/_Omdøp..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "Hjelp - GQview"
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Kvalitet"
+
+#: src/layout_util.c:779 src/menu.c:194
+#, fuzzy
+msgid "_Rotate clockwise"
+msgstr "Roter med uret"
+
+#: src/layout_util.c:780 src/menu.c:197
+#, fuzzy
+msgid "Rotate _counterclockwise"
+msgstr "Roter mot uret"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Roter 180"
+
+#: src/layout_util.c:782 src/menu.c:203
+#, fuzzy
+msgid "_Mirror"
+msgstr "Speilvend"
+
+#: src/layout_util.c:783 src/menu.c:206
+#, fuzzy
+msgid "_Flip"
+msgstr "Vend"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Velg alle"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Velg ingen"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "/Rediger/_Innstillinger"
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Vis/_Zoom for å passe"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "Fullskjerm"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Vis/skjul filliste"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "Stopp bildeserie"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "Oppdater"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Hjelp/Om"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Hjelp/_Tastatur snarveier"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Hjelp/_Versjonsinfo"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Hjelp/Om"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Thumbnails"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Vis/sep3"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Vis/_Løsriv filliste"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Vis/tear1"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "Dimensjoner"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Vis/_Oppdater lister"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Sorter etter navn"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Vis/_Oppdater lister"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Dimensjoner"
+
+#: src/layout_util.c:1083
+#, fuzzy
+msgid "Show thumbnails"
+msgstr "Lagre thumbnails"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Gå til hjemmemappe"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Oppdater filliste"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Zoom inn"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Zoom ut"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Bilde passer til vindu"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Sett zoom 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Endre innstillinger"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Flytende kontrollpanel"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Hjelp - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Kommandolinje"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Innles neste bilde"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "%d bilder"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Innles neste bilde"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "Gå ut av fullskjerm"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "Gå ut av fullskjerm"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "Gå ut av fullskjerm"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "Stopp bildeserie"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "Start bildeserie"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "Stopp bildeserie"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "Start bildeserie"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview værktøy"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr ""
+"Omdøp filen:\n"
+"%s\n"
+"til:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Vis i nytt vindu"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Bruk: gqview [tilvalg] [mål]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "gyldige tilvalg er:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           tvinger vis av verktøy\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        tvinger gjem av verktøy\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           start i fullskjerm modus\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            start i bildeserie modus\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr "  -l, --list                 åpne samlingsvindu for kommandolinje\n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr "  -l, --list                 åpne samlingsvindu for kommandolinje\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    slå på debug output\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              vis versjonsinformasjon\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 vis denne hjelpeteksten\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"Ugyldig eller ignorert: %s\n"
+"Bruk --help for å vise tilvalg\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Opretter GQview mappe:%s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Kunne ikke oprette mappe:%s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Hjem"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+#, fuzzy
+msgid "Desktop"
+msgstr "til:"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - avslutt"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr " - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Samlinger er blitt endret.\n"
+"Avslutt alikevel?"
+
+#: src/menu.c:115
+#, fuzzy
+msgid "Sort by size"
+msgstr "Sorter etter størrelse"
+
+#: src/menu.c:118
+#, fuzzy
+msgid "Sort by date"
+msgstr "Sorter etter dato"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Usortert"
+
+#: src/menu.c:124
+#, fuzzy
+msgid "Sort by path"
+msgstr "Sorter etter mål"
+
+#: src/menu.c:127
+#, fuzzy
+msgid "Sort by number"
+msgstr "Sorter etter nummer"
+
+#: src/menu.c:131
+#, fuzzy
+msgid "Sort by name"
+msgstr "Sorter etter navn"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Sorter"
+
+#: src/menu.c:200
+#, fuzzy
+msgid "Rotate _180"
+msgstr "Roter 180"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Nærmest (dårligst, men hurtigst)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Fliser"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilineær"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Super (best, men tregest)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Ingen"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normal"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Best"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr ""
+
+#: src/preferences.c:662 src/preferences.c:665
+#, fuzzy
+msgid "Reset filters"
+msgstr "Slett filer"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:699 src/preferences.c:702
+#, fuzzy
+msgid "Reset editors"
+msgstr "Slett filer"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:727 src/preferences.c:730
+#, fuzzy
+msgid "Clear trash"
+msgstr "Slett cache"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr ""
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - omdøp"
+
+#: src/preferences.c:824
+msgid "Startup"
+msgstr ""
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Gå til hjemmemappe"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Bruk nåværende"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Størrelse:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Kvalitet:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Lagre thumbnails"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Lagre thumbnails i .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Bruk xvpics thumbnails, hvis de finnes"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Bildeserie"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Sekunder før neste bilde vises:"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Tilfeldig"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Gjenta"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Zoom inn"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Ditheringsmetode:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr ""
+
+#: src/preferences.c:895
+#, fuzzy
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Utvid bildene så de passer i vinduet"
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Zoom økning:"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Når et nytt bilde er valgt:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Zoom til oprinnelig størrelse"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Bruk forrige zoominnstilling"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Tilføy"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr ""
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Fortsett"
+
+#: src/preferences.c:924
+#, fuzzy
+msgid "Refresh on file change"
+msgstr "Oppdater filliste"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Innles neste bilde"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr ""
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Vinduer"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Dato"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Husk vinduplasseringer"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Husk verktøy tilstand (flytende/gjemt)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "Juster vinduet til bilde når verktøy er flytende/gjemt"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Limit size when auto-sizing window (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr ""
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filtrering"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Vis filer som begynner med punktum"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr ""
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Deaktiver fil filtrering"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Filter:"
+
+#: src/preferences.c:1008
+#, fuzzy
+msgid "Filter"
+msgstr "Filter:"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr ""
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Redigerere"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "Nr."
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Menynavn"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr ""
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "Fullskjerm"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Bilde"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Slett"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Bekreft sletting av fil"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Tillat delete-knapp"
+
+#: src/preferences.c:1158
+#, fuzzy
+msgid "Safe delete"
+msgstr "Bekreft sletting av fil"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Fliser"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Vis"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Firkantet markering"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr ""
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "In place renaming"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr ""
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Progressive keyboard scrolling"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Bruk hjulet på musen til å skifte bilde"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+#, fuzzy
+msgid "Custom similarity threshold:"
+msgstr "Egne filtyper:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Offscreen cache size (Mb per image):"
+
+#: src/preferences.c:1291
+#, fuzzy
+msgid "About - GQview"
+msgstr " - GQview"
+
+#: src/preferences.c:1304
+#, fuzzy, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Opphavsrett (c) 2003 by John Ellis\n"
+"http://gqview.sourceforge.net\n"
+"gqview@users.sourceforge.net\n"
+"\n"
+"Utgitt under GNU General Public License"
+
+#: src/preferences.c:1322
+#, fuzzy
+msgid "Credits..."
+msgstr "/Rediger/_Innstillinger"
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Velg ingen"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr ""
+
+#: src/print.c:138
+#, fuzzy
+msgid "Custom printer"
+msgstr "Egne filtyper:"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Bilde"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr ""
+
+#: src/print.c:353
+msgid "inches"
+msgstr ""
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr ""
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr ""
+
+#: src/print.c:366
+msgid "Letter"
+msgstr ""
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, c-format
+msgid "page %d of %d"
+msgstr ""
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr ""
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, fuzzy, c-format
+msgid "A file with name %s already exists."
+msgstr "Filnavnet %s eksisterer allerede."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Filter:"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Slett filer"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr " - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Normal"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Dimensjoner"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Ugylding destinasjon"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Omdøp:"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Intet navn"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "Ingen"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Sorter"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Bilde"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "Filter:"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr ""
+
+#: src/print.c:3432
+msgid "Top:"
+msgstr ""
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "til:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Filter:"
+
+#: src/print.c:3450
+#, fuzzy
+msgid "Custom printer:"
+msgstr "Egne filtyper:"
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Filter:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Filter:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Husk vinduplasseringer"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "feil ved lagring av konfigurasjonsfil: %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Fliser"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Legg til innhold"
+
+#: src/search.c:202
+msgid "results"
+msgstr ""
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Fortsett"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+#, fuzzy
+msgid "greater than"
+msgstr "Lag thumbnails"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "Filter:"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%d filer (%d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%d filer%s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Sammenligner..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Vennligst velg en eksisterende mappe"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Vennligst velg en eksisterende mappe"
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr ""
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Sammenligner..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Omdøp:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Fliser"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Tilfeldig"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Filter:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Ugylding destinasjon"
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Legg til innhold"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Likhet"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Tilfeldig"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "Thumbnail image in cache failed to load, trying to recreate.\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Kunne ikke skrive historieliste til: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr ""
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+#, fuzzy
+msgid "Edit Bookmark"
+msgstr "Redigerere"
+
+#: src/ui_bookmark.c:612
+#, fuzzy
+msgid "Path:"
+msgstr "Mål"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr ""
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Velg ingen"
+
+#: src/ui_bookmark.c:718
+#, fuzzy
+msgid "_Properties..."
+msgstr "/Rediger/_Innstillinger"
+
+#: src/ui_bookmark.c:720
+#, fuzzy
+msgid "Move _up"
+msgstr "Flytt"
+
+#: src/ui_bookmark.c:722
+#, fuzzy
+msgid "Move _down"
+msgstr "Flytt"
+
+#: src/ui_bookmark.c:724
+#, fuzzy
+msgid "_Remove"
+msgstr "Fjern"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Kunne ikke åpne:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Kunne ikke omdøpe %s til %s."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Kunne ikke slette fil:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Sletting av fil mislykktes"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Slett fil"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Vil nå slette filen:\n"
+"%s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+#, fuzzy
+msgid "_Rename"
+msgstr "Omdøp"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+#, fuzzy
+msgid "Add _Bookmark"
+msgstr "Redigerere"
+
+#: src/ui_pathsel.c:636
+#, fuzzy
+msgid "_Delete"
+msgstr "Slett"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "Hjelp - GQview"
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Kunne ikke opprette mappen:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Feil ved opprettelse av mappe"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Alle filer"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Vis skjulte"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filter:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Velg alle"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "Alle filer"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Overskriv fil"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Overskriv fil"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Overskriv fil"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Hopp over"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Hopp over"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Feil ved flyttning av fil"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "Hjelp - GQview"
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+#, fuzzy
+msgid "Auto rename"
+msgstr "Menynavn"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Omdøp"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Bane til kopiering er samme som destinasjon"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Kan ikke kopiere filen:\n"
+"%s\n"
+"til seg selv."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Bane til flytting er samme som destinasjon"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Kan ikke flytte filen:\n"
+"%s\n"
+"til seg selv."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Fortsett"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Feil ved kopiering av fil"
+
+#: src/utilops.c:631
+#, fuzzy, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Kunne ikke kopiere filen:\n"
+"%sto:\n"
+"%s\n"
+" ved kopiering av mangfoldige filer."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Feil ved flyttning av fil"
+
+#: src/utilops.c:636
+#, fuzzy, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Kunne ikke flytte filen:\n"
+"%sto:\n"
+"%s\n"
+" ved flytting av mangfoldige filer."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Bane er samme som destinasjon"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Bane og destinasjon er den samme, operasjonen ble avbrutt."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Kunne ikke kopiere filen:\n"
+"%s\n"
+"til:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Kunne ikke flytte filen:\n"
+"%s\n"
+"til:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Ugylding destinasjon"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"Når du opererer med flere filer, vennligst velg\n"
+" en mappe, ikke ei fil."
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Vennligst velg en eksisterende mappe"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Hjelp - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+#, fuzzy
+msgid "_Copy"
+msgstr "Kopier"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr ""
+"Omdøp filen:\n"
+"%s\n"
+"til:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "Kopier mangfoldige filer til:"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Hjelp - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+#, fuzzy
+msgid "_Move"
+msgstr "Flytt"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr ""
+"Omdøp filen:\n"
+"%s\n"
+"til:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Flytt mangfoldige filer til:"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Omdøp:"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Bane er samme som destinasjon"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Sletting mislykktes"
+
+#: src/utilops.c:1124
+#, fuzzy
+msgid "Unable to remove old file from trash folder"
+msgstr ""
+"Kan ikke flytte filen:\n"
+"%s\n"
+"til seg selv."
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Kunne ikke opprette mappe"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr ""
+
+#: src/utilops.c:1212
+#, fuzzy, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Kunne ikke opprette mappen:\n"
+"%s"
+
+#: src/utilops.c:1216
+#, fuzzy
+msgid "Turn off safe delete"
+msgstr "Bekreft sletting av fil"
+
+#: src/utilops.c:1234
+#, fuzzy, c-format
+msgid "Safe delete: %s"
+msgstr "Bekreft sletting av fil"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Kunne ikke slette filen:\n"
+" %s\n"
+" Fortsett med sletting av mangfoldige filer?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr ""
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Slett filer"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Omdøper mangfoldige filer:"
+
+#: src/utilops.c:1438
+#, fuzzy, c-format
+msgid "Review %d files"
+msgstr "%d filer"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Slett fil"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Slett fil"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Kunne ikke omdøpe filen:\n"
+"%s\n"
+" til:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Feil ved omdøping av fil"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+
+#: src/utilops.c:1809
+#, fuzzy, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr "Kunne ikke omdøpe %s til %s."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Hjelp - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "Omdøper mangfoldige filer:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr ""
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Omdøp:"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "Omdøp:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr ""
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr ""
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr ""
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr ""
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Kunne ikke omdøpe filen:\n"
+"%s\n"
+"til:\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr ""
+"Omdøp filen:\n"
+"%s\n"
+"til:"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Mappen:\n"
+"%s\n"
+"eksisterer allerede."
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Fliser"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"Banen:\n"
+"%s\n"
+"eksisterer allerde som ei fil."
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Hjelp - GQview"
+
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Lag mappe i:\n"
+"%s\n"
+"ved navn:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr ""
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr ""
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+#, fuzzy
+msgid "_Slideshow"
+msgstr "Bildeserie"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Inkluder mapper i bildeserie"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+#, fuzzy
+msgid "Find _duplicates..."
+msgstr "Finn dubletter..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Finn dubletter også i mapper..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr ""
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+#, fuzzy
+msgid "View as _tree"
+msgstr "/Vis/F_ullskjerm"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+#, fuzzy
+msgid "Re_fresh"
+msgstr "Oppdater"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+#, fuzzy
+msgid "_Sort"
+msgstr "Sorter"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+#, fuzzy
+msgid "View as _icons"
+msgstr "Dimensjoner"
+
+#: src/view_file_list.c:421
+#, fuzzy
+msgid "Show _thumbnails"
+msgstr "Lagre thumbnails"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Ugyldig filnavn:\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "Utrensk thumbnails"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/Fil/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/Fil/_Ny samling"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Fil/Å_pne samling..."
+
+#~ msgid "/File/sep1"
+#~ msgstr "/Fil/sep1"
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/Fil/_Omdøp..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Fil/_Finn dubletter..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Fil/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Fil/_Omdøp..."
+
+#, fuzzy
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Fil/_Slett..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Fil/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Fil/_Kopier..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Fil/F_lytt..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Fil/_Omdøp..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Fil/_Slett..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Fil/sep4"
+
+#, fuzzy
+#~ msgid "/File/C_lose window"
+#~ msgstr "Lukk vindu"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Fil/_Avslutt"
+
+#~ msgid "/_Edit"
+#~ msgstr "/_Rediger"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Rediger/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Rediger/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Rediger/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Rediger/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Rediger/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Rediger/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Rediger/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Rediger/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Rediger/editor8"
+
+#, fuzzy
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Rediger/editor1"
+
+#, fuzzy
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Rediger/editor1"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Rediger/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Rediger/J_uster"
+
+#, fuzzy
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Rediger/_Innstillinger"
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Rediger/J_uster/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Rediger/Juster/_Roter med uret"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Rediger/Juster/Roter _mot uret"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Rediger/Juster/Roter 1_80"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Rediger/Juster/_Speilvend"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Rediger/Juster/_Vend"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Rediger/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Rediger/Velg _alle"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Rediger/Velg i_ngen"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Rediger/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Rediger/_Innstillinger"
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Rediger/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Rediger/Velg som _bakgrunn"
+
+#~ msgid "/_View"
+#~ msgstr "/_Vis"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Vis/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Vis/Zoom _inn"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Vis/Zoom _ut"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Vis/Zoom _1:1"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Vis/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Vis/_Thumbnails"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Vis/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Vis/F_ullskjerm"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Vis/sep3"
+
+#, fuzzy
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Vis/_Skjul filiste"
+
+#, fuzzy
+#~ msgid "/View/sep4"
+#~ msgstr "/Vis/sep1"
+
+#, fuzzy
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Vis/Zoom _inn"
+
+#, fuzzy
+#~ msgid "/View/sep5"
+#~ msgstr "/Vis/sep1"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Vis/(De)aktiver _bildeserie"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Vis/_Oppdater lister"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Hjelp/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Hjelp/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "GQview konfigurasjon"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Rediger/_Fjern gamle thumbnails"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Mål"
+
+#~ msgid "Save"
+#~ msgstr "Lagre"
+
+#~ msgid "Close"
+#~ msgstr "Lukk"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Overskriv samlingsfil:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "Lagre samling som:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "Åpne samling fra:"
+
+#~ msgid "Open"
+#~ msgstr "Åpne"
+
+#~ msgid "Append collection from:"
+#~ msgstr "Tilføy samling fra:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Avslutt"
+
+#~ msgid "Exit"
+#~ msgstr "Avslutt"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Ugyldig filnavn"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Ved oppstart, begynn i denne mappen:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Zoom (skalering):"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Plasser bokser under muspekeren"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Inkluder filer av denne typen:"
+
+#~ msgid "Remove"
+#~ msgstr "Fjern"
+
+#~ msgid "Command Line"
+#~ msgstr "Kommandolinje"
+
+#, fuzzy
+#~ msgid "Help"
+#~ msgstr "/_Hjelp"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "Fullskjerm"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Fliser"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Overskriv filen:\n"
+#~ " %s\n"
+#~ " med:\n"
+#~ " %s"
+
+#~ msgid "Yes"
+#~ msgstr "Ja"
+
+#~ msgid "Yes to all"
+#~ msgstr "Ja til alt"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Overskriv filen:\n"
+#~ "%s\n"
+#~ " med:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Kopier fil:\n"
+#~ "%s\n"
+#~ "til:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Flytt filen:\n"
+#~ "%s\n"
+#~ "til:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "I ferd med å slette mangfoldige filer..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Overskriver filen:\n"
+#~ "%s\n"
+#~ "ved å omdøpe:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "til:"
+
+#~ msgid "Create"
+#~ msgstr "Oppret"
+
+#~ msgid "Initial directory"
+#~ msgstr "Startmappe"
+
+#~ msgid "New Directory"
+#~ msgstr "Ny mappe"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Kunne ikke opprette mappen:\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "Feil ved opprettelse av mappe"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "Ugylding destinasjon"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/Vis/(De)aktiver _bildeserie"
+
+#~ msgid "Add contents"
+#~ msgstr "Legg til innhold"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "Legg til indhold med mapper"
+
+#~ msgid "Skip directories"
+#~ msgstr "Unngå mapper"
+
+#~ msgid "Invalid directory"
+#~ msgstr "Ugyldig mappe"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - kopier"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - flytt"
+
+#~ msgid "Directory exists"
+#~ msgstr "Mappen eksisterer"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - ny mappe"
+
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/Fil/Oprett _mappe..."
+
+#~ msgid "Edit"
+#~ msgstr "Rediger"
+
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "Sett inn dra og slipp-filer ved muspekeren"
+
+#~ msgid "File named %s already exists."
+#~ msgstr "Fil ved navn %s finnes allerede."
+
+#, fuzzy
+#~ msgid "Date:"
+#~ msgstr "Dato"
+
+#, fuzzy
+#~ msgid "top"
+#~ msgstr "til:"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview kjører: %s\n"
+
+#~ msgid "Electric Eyes"
+#~ msgstr "Electric Eyes"
+
+#~ msgid "Apply"
+#~ msgstr "Bruk"
+
+#~ msgid "format: [.foo;.bar]"
+#~ msgstr "format: [.foo;.bar]"
diff --git a/po/pl.po b/po/pl.po
new file mode 100644 (file)
index 0000000..ef889eb
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,3638 @@
+# translation of gqview.po to Polski
+# Copyright (C) 2001-2002,2003, 2004 Free Software Foundation, Inc.
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+# Aktualn± wersjê tego pliku mo¿esz odnale¼æ w repozytorium cvs.gnome.pl
+# (:pserver:anonymous@cvs.gnome.pl:/gnomepl, puste has³o)
+# Je¶li masz jakiekolwiek uwagi odnosz±ce siê do t³umaczenia lub chcesz
+# pomóc w jego rozwijaniu i pielêgnowaniu, napisz do nas na adres:
+# translators@gnome.pl
+# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+# GNOME PL Team <translators@gnome.pl>, 2001
+# Grzegorz Kowal <g_kowal@poczta.onet.pl>, 2000.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2004-01-23 21:53+0100\n"
+"Last-Translator: GNOME PL Team <translators@gnome.pl>\n"
+"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.0.2\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Narzêdzia"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "Data"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Nazwa pliku:"
+
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Czas utworzenia pliku:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Porównanie z:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Zapisz kolekcjê"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "Znacznik"
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Nazwa"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "Warto¶æ"
+
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "Format"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "Elementy"
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "Opis"
+
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr ""
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "Zaawansowany podgl±d"
+
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Usuniêcie nie powiod³o siê"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Katalog:\n"
+"%s\n"
+"ju¿ istnieje."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Pusta kolekcja"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Zapisanie kolekcji nie powiod³o siê:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Zapis nie powiód³ siê"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "Dodanie zak³adki"
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Kolekcje"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "Nazwa:"
+
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "Mened¿er Sortowania"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "Katalogi"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Kolekcje"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Skopiuj"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Przenie¶"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d obrazów"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Wyczy¶æ zaznaczenie"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "Cofnij ostatni obraz"
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "ukoñczono"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Wczytywanie danych opisuj±cych podobieñstwo..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Czyszczenie miniatur..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Usuwanie starych miniatur..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Niepoprawna nazwa pliku"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Zapisywanie miniaturek w cache"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Start #"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "Katalog:"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Wyczy¶æ zaznaczenie"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Niepoprawna nazwa pliku"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr ""
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Czyszczenie miniatur..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Wyczy¶æ cache"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Zostan± usuniête wszystkie miniaturki\n"
+"zapisane na dysku, kontynuowaæ?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "W³a¶ciwo¶ci obrazu - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "pe³ny ekran GQview"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "akcja"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "Wyczy¶æ"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "Zapisywanie miniaturek w cache"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "Poka¿ miniaturki"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "Zmieñ nazwê"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "BezNazwy"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "BezNazwy (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - Kolekcja GQview"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Zamkniêcie kolekcji"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Kolekcja zosta³a zmodyfikowana.\n"
+"Czy najpierw zapisaæ?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Podana ¶cie¿ka:\n"
+"%s\n"
+"reprezentuje katalog, kolekcje s± plikami"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Niepoprawna nazwa pliku"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Nadpisanie Pliku"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Nadpisz plik"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Nadpisz"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Zapisz kolekcjê"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Otwarcie kolekcji"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Do³±cz kolekcji"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Do³±cz"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Pliki kolekcji"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Pusta kolekcja"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Bie¿±ca kolekcja jest pusta, zrezygnowano z zapisu."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Pusta"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d obrazów (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d obrazów"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Wczytywanie miniatur..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "_Podgl±d"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "Podgl±d w _nowym oknie"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "_Usuñ"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Do³±cz z listy plików"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Do³±cz z kolekcji..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Zaznacz wszystko"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Wyczy¶æ zaznaczenie"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "W³_a¶ciwo¶ci"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "_Kopiuj..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "P_rzenie¶..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "Zm_ieñ nazwê..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "_Usuñ..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "Poka¿ nazwê pliku"
+
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "_Zapisz kolekcjê"
+
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "Zapisz kolekcjê jako..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "Wyszukaj duplikaty..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Plik/_Zmieñ nazwê..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "Upuszczona lista zawiera katalogi."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "_Dodaj zawarto¶æ"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "Dodaj zawarto¶æ _rekurencyjnie"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "Pomiñ katalogi"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Anuluj"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Upu¶æ pliki, aby je porównaæ."
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d plików"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d wyst±pieñ w %d plikach"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[zbiór 1]"
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Odczytywanie sum kontrolnych..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Odczytywanie wymiarów"
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Wczytywanie danych opisuj±cych podobieñstwo..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Porównywanie..."
+
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "Sortowanie..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "Wybierz _pierwsz± grupê duplikatów"
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "Wybierz _drug± grupê duplikatów"
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Dodaj do nowej kolekcji"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "Wyczy¶æ"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "Zamknij okno"
+
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "%d plików (zbiór 2)"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Rozmiar"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Data"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Wymiary"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Suma kontrolna"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "¦cie¿ka"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Podobieñstwo (wysokie)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Podobieñstwo"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Podobieñstwo (niskie)"
+
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Podobieñstwo (dowolne)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Wyszukiwanie duplikatów - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Porównanie z:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Kryterium porównywania:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Miniaturki"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Porównanie dwóch zbiorów plików"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "GIMP"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "Obróæ jpeg zgodnie z zegarem"
+
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "Obróæ jpeg przeciwnie do zegara"
+
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "zatrzymywanie..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "Edycja wyniku dzia³ania polecenia"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "Wyj¶cie %s"
+
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Nie mo¿na uruchomiæ:\n"
+"%s\n"
+
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "zatrzymane przez u¿ytkownika"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "nieznany"
+
+#: src/exif.c:113
+msgid "top left"
+msgstr "górny lewy"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "górny prawy"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "dolny lewy"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "dolny lewy"
+
+#: src/exif.c:117
+msgid "left top"
+msgstr "lewy górny"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "prawy górny"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "prawy dolny"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "lewy dolny"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "cal"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "centymetr"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "¶rednie"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr ""
+
+#: src/exif.c:142
+msgid "spot"
+msgstr ""
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr ""
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr ""
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "czê¶ciowe"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "inne"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "niezdefiniowany"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "rêczny"
+
+#: src/exif.c:153
+msgid "normal"
+msgstr "zwyk³y"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr ""
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "migawka"
+
+#: src/exif.c:156
+msgid "creative"
+msgstr ""
+
+#: src/exif.c:157
+msgid "action"
+msgstr "akcja"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "pionowe"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "poziome"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "¶wiat³o dzienne"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "fluorescencyjne"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr ""
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "flesz"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "nie"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "tak"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr ""
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr ""
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "Opis obrazu"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "U³o¿enie"
+
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "Prawa autorskie"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr ""
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "czu³o¶æ ISO"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "Data orygina³u"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "Data digitalizacji"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "Szybko¶æ migawki"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "Przys³ona"
+
+#: src/exif.c:320 src/exif.c:422
+#, fuzzy
+msgid "Exposure bias"
+msgstr "Czas na¶wietlania"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "Odleg³o¶æ przedmiotu"
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "Metoda pomiaru odleg³o¶ci"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "¬ród³o ¶wiat³a"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "Flesz"
+
+#: src/exif.c:326 src/exif.c:424
+#, fuzzy
+msgid "Focal length"
+msgstr "Ogniskowa"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "Szeroko¶æ"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "Wysoko¶æ"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "Aparat fotograficzny"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "Rozdzielczo¶æ"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "nieskoñczono¶æ"
+
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "tryb:"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "w³±czony"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "wy³±czony"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "automatyczne"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr ""
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr ""
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "redukcja efektu czerwonych oczu"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "punktów"
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d bajtów"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f K"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "pe³ny ekran GQview"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Rozmiar pliku:"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Dopasowanie obrazu do okna"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "Po_wiêksz"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "Po_mniejsz"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "Powiêkszenie _1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "Dopasowanie obrazu do _okna"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "Ustaw jako _tapetê"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "_Zatrzymaj przegl±danie slajdowe"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "_Kontynuuj przegl±danie slajdowe"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "W_strzymaj przegl±danie slajdowe"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "Rozpo_cznij przegl±danie slajdowe"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "Opu¶æ tryb pe³noekranowy"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "Pe³ny ekran"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "Zamknij okno"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "Rozmiar pliku:"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Wymiary:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Przezroczysto¶æ:"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Rozmiar obrazu:"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Wspó³czynnik kompresji:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Czas utworzenia pliku:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "W³a¶ciciel:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Grupa:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Ogólne"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "Obraz %d z %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "W³a¶ciwo¶ci obrazu - GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Rosn±co"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Slajdy"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Zatrzymane"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d plików (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d plików%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d plików%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(brak uprawnieñ do odczytu) %s bajtów"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s bajtów"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s bajtów"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "Narzêdzia GQview"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Narzêdzia"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "Pliki"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Obraz"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(przeci±gnij aby zmieniæ kolejno¶æ)"
+
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "Ukrycie _listy plików"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "za pomoc± %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "za pomoc± (nieznany)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Pusta"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Plik"
+
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "_Edycja"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "Modyfikacja"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/Pomo_c"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Plik/_Nowe okno"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "_Zapisz kolekcjê"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Otwarcie kolekcji"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Plik/O_twórz poprzednie"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Sortowanie..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Plik/_Zmieñ nazwê..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "Nowy _folder..."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Jako¶æ"
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "Obróæ _zgodnie z zegarem"
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "Obróæ _przeciwnie do zegara"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Obróæ o _180"
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "_Lustro"
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "O_dbij"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Zaznacz wszystko"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Wyczy¶æ zaznaczenie"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "_W³a¶ciwo¶ci..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Widok/_Powiêkszenie do dopasowania"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "Pe³ny ekran"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Ukrycie _listy plików"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "_Zatrzymaj przegl±danie slajdowe"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "_Od¶wie¿"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Pomoc/_Informacje o"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Pomoc/Skróty _klawiszowe"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Pomoc/Uwagi na temat _wydania"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Pomoc/_Informacje o"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Miniaturki"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Widok/_Drzewo"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Widok/_Oderwanie lista plików"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Widok/Ukry_cie paska narzêdziowego"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "/Widok/_Ikony"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Widok/Dane E_xif"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Mened¿er Sortowania"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Widok/_Lista"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Ikona:"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Poka¿ miniaturki"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Powraca do katalogu domowego"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Od¶wie¿a listê plików"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Powiêksz"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Pomniejsz"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Dopasowanie obrazu do okna"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Ustawia powiêkszenie 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Opcje konfiguracji"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Od³±cza panel steruj±cy"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Pomoc - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Wiersz poleceñ"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Wstêpny odczyt nastêpnego obrazu"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "Cofnij ostatni obraz"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Cofnij ostatni obraz"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "Opu¶æ tryb pe³noekranowy"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "Opu¶æ tryb pe³noekranowy"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "Opu¶æ tryb pe³noekranowy"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "_Zatrzymaj przegl±danie slajdowe"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "Rozpo_cznij przegl±danie slajdowe"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "_Zatrzymaj przegl±danie slajdowe"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "Rozpo_cznij przegl±danie slajdowe"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "Narzêdzia GQview"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr "Zmiana nazwy pliku:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Podgl±d w _nowym oknie"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"U¿ycie: gqview [opcje] [¶cie¿ka]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "poprawnymi opcjami s±:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           wymusza wy¶wietlenie narzêdzi\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        wymusza ukrycie narzêdzi\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           uruchamia w trybie pe³noekranowym\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            uruchamia w trybie slajdowym\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+"  -l, --list                 otwiera okno kolekcji z plikami z wiersza "
+"poleceñ\n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+"  -l, --list                 otwiera okno kolekcji z plikami z wiersza "
+"poleceñ\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr ""
+"  --debug                    uaktywnia wy¶wietlanie komunikatów\n"
+"                                    diagnostycznych\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              wypisuje informacjê na temat wersji\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 wypisuje ten komunikat\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"niepoprawna lub zignorowana: %s\n"
+"U¿yj --help aby uzyskaæ informacje o opcjach\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Tworzenie katalogu GQview:%s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Nie mo¿na utworzyæ katalogu: %s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Po³o¿enie pocz±tkowe"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "Pulpit"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - zakoñczenie"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "O programie - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Kolekcje zosta³y zmodyfikowane.\n"
+"Czy pomimo tego zakoñczyæ?"
+
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "Uporz±dkuj wed³ug rozmiaru"
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "Uporz±dkuj wed³ug daty"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Nieuporz±dkowane"
+
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "Uporz±dkuj wed³ug ¶cie¿ki"
+
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "Uporz±dkuj wed³ug numeru"
+
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "Uporz±dkuj wed³ug nazwy"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Uporz±dkuj"
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "Obróæ o _180"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Najbli¿szy s±siad (najgorsze, lecz najszybsze)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Kafle"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Dwuliniowe"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Hiper (najlepsze, lecz najwolniejsze)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Brak"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Zwyk³a"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Najlepsza"
+
+#: src/preferences.c:498 src/print.c:365
+#, fuzzy
+msgid "Custom"
+msgstr "automatyczne"
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "Wyzeruj filtry"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Ustawienia filtrów powróc± do warto¶ci domy¶lnych.\n"
+"Kontynuowaæ?"
+
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr ""
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Komendy ecyji powróc± do warto¶ci domy¶lnych.\n"
+"Kontynuowaæ?"
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "Wyczy¶æ kosz"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "Ta operacja spowoduje usuniêcie zawarto¶ci kosza"
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - zmiana nazwy"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "Start #"
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Powraca do katalogu domowego"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Wykorzystaj bie¿±cy"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Rozmiar:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Jako¶æ:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Zapisywanie miniaturek w cache"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "U¿ywanie katalogu .thumbinals do przechowywania miniaturek"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Wykorzystywanie odnalezionych miniaturek xvpics (tylko odczyt)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Przegl±danie slajdowe"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Opó¼nienie przed zmian± obrazu (sekundy):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Losowo"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Powtarzanie"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Powiêksz"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Metoda rozpraszania:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Dwuetapowe powiêkszanie"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Rozci±ganie obrazów przy powiêkszaniu, aby je dopasowaæ."
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Przyrost powiêkszenia"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Po wybraniu nowego obrazu:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Powiêkszenie do rozmiaru oryginalnego"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Pozostawienie poprzedniego powiêkszenia"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Do³±cz"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Czarne t³o"
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Kontynuuj"
+
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "Od¶wie¿anie podczas zmiant pliku"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Wstêpny odczyt nastêpnego obrazu"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Automatyczne obracanie obrazów przy u¿yciu informacji Exif"
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Okna"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Start #"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Zapamiêtanie pozycji okien"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Zapamiêtanie stanu narzêdzi (oderwane/ukryte)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "Dopasowanie okna do obrazu, je¶li narzêdzia s± ukryte/oderwane"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Ograniczenie rozmiaru przy automatycznym dopasowaniu okna (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "U³o¿enie"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filtrowanie"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Wy¶wietlanie wpisów rozpoczynaj±cych siê kropk±"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "Rozró¿nianie wielko¶æ liter podczas sortowania"
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Bez filtrowania plików"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Czas utworzenia pliku:"
+
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "Filtr"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "Domy¶lne"
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Edytory"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Nazwa menu"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "Zaawansowane"
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "Pe³ny ekran"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Rozmiar obrazu:"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Usuñ"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Potwierdzanie usuniêcia pliku"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Aktywny klawisz Delete"
+
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "bezpieczne usuwanie"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Maksymalny rozmiar (MB)"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Widok"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Zaznaczanie prostok±tne"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Odwrotna kolejno¶æ katalogów w widoku drzewiastym"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Zmiana nazwy na miejscu"
+
+#: src/preferences.c:1200
+#, fuzzy
+msgid "Navigation"
+msgstr "akcja"
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Przyrostowe przewijanie klawiatur±"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Przewijanie obrazu kó³kiem myszy"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "Dowolny próg podobieñstwa:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Rozmiar cache w piksmapach (MB na obraz):"
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "O programie - GQview"
+
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s by John Ellis\n"
+"strona www: %s\n"
+"email: %s\n"
+"\n"
+"Wydany na warunkach licencji GNU GPL"
+
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "Zas³ugi..."
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Wyczy¶æ zaznaczenie"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+#, fuzzy
+msgid "Default printer"
+msgstr "Domy¶lne"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr ""
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Rozmiar obrazu:"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+#, fuzzy
+msgid "centimeters"
+msgstr "centymetr"
+
+#: src/print.c:353
+#, fuzzy
+msgid "inches"
+msgstr "cal"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+#, fuzzy
+msgid "Portrait"
+msgstr "pionowe"
+
+#: src/print.c:360
+#, fuzzy
+msgid "Landscape"
+msgstr "poziome"
+
+#: src/print.c:366
+#, fuzzy
+msgid "Letter"
+msgstr "centymetr"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, fuzzy, c-format
+msgid "page %d of %d"
+msgstr "Obraz %d z %d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "Podgl±d"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "Plik o nazwie %s ju¿ istnieje."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Filtr"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Domy¶lne"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "O programie - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Format"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "U³o¿enie"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Opis"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Nazwa pliku:"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "BezNazwy"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "w³±czony"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Uporz±dkuj"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Rozmiar obrazu:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "Data"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+#, fuzzy
+msgid "Right:"
+msgstr "Wysoko¶æ"
+
+#: src/print.c:3432
+#, fuzzy
+msgid "Top:"
+msgstr "Grupa:"
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "na:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Filtr"
+
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr ""
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Filtr:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Czas utworzenia pliku:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Zapamiêtanie pozycji okien"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "b³±d przy zapisie pliku konfiguracyjnego: %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Katalog:"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Elementy"
+
+#: src/search.c:202
+#, fuzzy
+msgid "results"
+msgstr "Domy¶lne"
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Kontynuuj"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+msgid "greater than"
+msgstr ""
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "Data"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d plików (%s, %d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%s, %d plików%s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Sortowanie..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Zaznacz istniej±cy katalog"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Zaznacz istniej±cy katalog"
+
+#: src/search.c:2570
+#, fuzzy
+msgid "Image search - GQview"
+msgstr "W³a¶ciwo¶ci obrazu - GQview"
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Sortowanie..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Nazwa pliku:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Rozmiar pliku:"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Losowo"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Czas utworzenia pliku:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Opis obrazu"
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Dodaj zawarto¶æ"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Podobieñstwo"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Losowo"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "Odczyt miniaturki z cache nie powiód³ siê, próba odtworzenia.\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Nie mo¿na zapisaæ list historii w: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "Nowa zak³adka"
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "Edycja zak³adki"
+
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "¦cie¿ka:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "Ikona:"
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Wyczy¶æ zaznaczenie"
+
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "_W³a¶ciwo¶ci..."
+
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "Przesuñ w _górê"
+
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "Przesuñ w _dó³"
+
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "Usuñ"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Nie mo¿na wczytaæ:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Zmiana nazwy %s na %s nie powiod³a siê."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Nie mo¿na usun±æ pliku:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Usuniêcie pliku nie powiod³o siê"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Usuñ plik"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Usuniêcie pliku:\n"
+" %s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "Zmieñ nazwê"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "Dodanie zak³adki"
+
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "Usuñ"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "Nowy _folder..."
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Nie mo¿na utworzyæ katalogu:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "B³±d podczas tworzenia katalogu"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Wszystkie pliki"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Wy¶wietlanie ukrytych"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filtr:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Zaznacz wszystko"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "Wszystkie pliki"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Nadpisz plik"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Nadpisz plik"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Nadpisz plik"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Pomiñ wszystko"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Pomiñ"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "B³±d przy przenoszeniu pliku"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "Nowy _folder..."
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Automatyczna zmiana nazwy"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Zmieñ nazwê"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Kopiowany plik ¼ród³owy odpowiada docelowemu"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Nie mo¿na skopiowaæ pliku:\n"
+"%s\n"
+"na niego samego."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Przenoszony plik ¼ród³owy odpowiada docelowemu"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Nie mo¿na przenie¶æ pliku:\n"
+"%s\n"
+"na niego samego."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Kontynuuj"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "B³±d przy kopiowaniu pliku"
+
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Nie mo¿na skopiowaæ pliku:\n"
+"%s\n"
+"do:\n"
+"%s\n"
+" podczas kopiowania wielu plików."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "B³±d przy przenoszeniu pliku"
+
+#: src/utilops.c:636
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Nie mo¿na przenie¶æ pliku:\n"
+"%s\n"
+"do:\n"
+"%s\n"
+" podczas przenoszenia wielu plików."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "¬ród³o odpowiada celowi"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "¬ród³o i cel s± takie same, operacja anulowana."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Nie mo¿na skopiowaæ pliku:\n"
+"%s\n"
+"do:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Nie mo¿na przenie¶æ pliku:\n"
+"%s\n"
+"do:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Niepoprawny cel"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"Podczas operacji na wielu plikach, zaznacz katalog,\n"
+"nie plik."
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Zaznacz istniej±cy katalog"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Pomoc - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "S_kopiuj"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr "Zmiana nazwy pliku:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "Kopiowanie wielu plików do:"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Pomoc - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "_Przenie¶"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr "Zmiana nazwy pliku:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Przeniesienie wielu plików do:"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Nazwa pliku:"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "¬ród³o odpowiada celowi"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Usuniêcie nie powiod³o siê"
+
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "Nie mo¿na usun±æ starego pliku z kosza"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Nie mo¿na utworzyæ katalogu."
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "Brak dostêpu"
+
+#: src/utilops.c:1212
+#, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"B³±d podczas dostêpu lub podczas tworzenia katalogu:\n"
+"\"%s\""
+
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "Wy³±cz bezpieczne usuwanie"
+
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "Bezpieczne usuwanie: %s"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Nie mo¿na usun±æ pliku:\n"
+" %s\n"
+" Kontynuowaæ operacjê usuwania plików?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr "Plik %d z %d"
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Usuñ pliki"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Zmiana nazwy wielu plików:"
+
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "Przegl±d %d plików"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Usuñ plik"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Usuñ plik"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Nie mo¿na zmieniæ nazwy pliku:\n"
+"%s\n"
+" na:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "B³±d podczas zmiany nazwy pliku"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Nie mo¿na przeprowadziæ automatycznej\n"
+"zmiany nazw plików, jeden lub wiêcej\n"
+"plików posiada nazwê podobn± do\n"
+"tych z wynikowej listy nazw.\n"
+
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"Nie powiod³a siê zmiana nazwy\n"
+"%s\n"
+"Liczba %d."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Pomoc - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "Zmiana nazwy wielu plików:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "Nazwa orygina³u"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Nazwa orygina³u"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "Zmiana nazwy:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Pocz±tek tekstu"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "Start #"
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Koniec tekstu"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr ""
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Nie mo¿na zmieniæ nazwy pliku:\n"
+"%s\n"
+"na:\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr "Zmiana nazwy pliku:"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Katalog:\n"
+"%s\n"
+"ju¿ istnieje."
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Katalogi"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"¦cie¿ka:\n"
+"%s\n"
+"ju¿ istnieje i reprezentuje plik."
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Pomoc - GQview"
+
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Utworzenie katalogu w:\n"
+"%s\n"
+"o nazwie:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "nowy_folder"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "W _górê do nadrzêdnego"
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "Przegl±danie _slajdowe"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Rekurencyjne przegl±danie slajdowe"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "Wyszukaj _duplikaty..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Rekurencyjnie wyszukaj duplikaty..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "Nowy _folder..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "Widok _drzewiasty"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "_Od¶wie¿"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "_Uporz±dkuj"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "Wy¶wietlanie jako _ikony"
+
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "Poka¿ _miniaturki"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Niepoprawna nazwa pliku:\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "Usuwanie miniatur"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/Plik/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/Plik/_Nowa kolekcja"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Plik/_Otwórz kolekcjê..."
+
+#~ msgid "/File/sep1"
+#~ msgstr "/Plik/sep1"
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/Plik/_Zmieñ nazwê..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Plik/Znajd¼ _duplikaty..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Plik/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Plik/_Zmieñ nazwê..."
+
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Plik/_Nowy katalog..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Plik/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Plik/S_kopiuj..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Plik/_Przenie¶..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Plik/_Zmieñ nazwê..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Plik/_Usuñ..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Plik/sep4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/Plik/Zam_knij okno"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Plik/Z_akoñcz"
+
+#~ msgid "/_Edit"
+#~ msgstr "/_Edycja"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Edycja/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Edycja/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Edycja/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Edycja/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Edycja/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Edycja/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Edycja/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Edycja/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Edycja/editor8"
+
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Edycja/editor9"
+
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Edycja/editor0"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Edycja/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Edycja/_Dopasuj"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Edycja/_W³a¶ciwo¶ci"
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Edycja/Modyfikacja/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Edycja/Modyfikacja/Obróæ _zgodnie z zegarem"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Edycja/Modyfikacja/Obróæ p_rzeciwnie do zegara"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Edycja/Modyfikacja/Obróæ o 1_80"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Edycja/Modyfikacja/_Lustro"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Edycja/Modyfikacja/_Odbij"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Edycja/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Edycja/_Zaznacz wszystko"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Edycja/_Wyczy¶æ zaznaczenie"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Edycja/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Edycja/_Opcje..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Edycja/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Edycja/Ustaw jako _tapetê"
+
+#~ msgid "/_View"
+#~ msgstr "/_Widok"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Widok/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Widok/Po_wiêksz"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Widok/Po_mniejsz"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Widok/Powiêkszenie _1:1"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Widok/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Widok/_Miniaturki"
+
+#~ msgid "/View/I_cons"
+#~ msgstr "/Widok/_Ikony"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Widok/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Widok/P_e³ny ekran"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Widok/sep3"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Widok/_Ukrycie listy plików"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/Widok/sep4"
+
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Widok/Mened¿er s_ortowania"
+
+#~ msgid "/View/sep5"
+#~ msgstr "/Widok/sep5"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Widok/Prze³±cz _slajdy"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Widok/_Od¶wie¿ listê"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Pomoc/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Pomoc/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "Konfiguracja GQview"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Edycja/_Usuñ stare miniaturki"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "¦cie¿ka"
+
+#~ msgid "Save"
+#~ msgstr "Zapisz"
+
+#~ msgid "Close"
+#~ msgstr "Zamknij"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Nadpisanie pliku kolekcji:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "Zapis kolekcji jako:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "Otwarcie kolekcji z:"
+
+#~ msgid "Open"
+#~ msgstr "Otwórz"
+
+#~ msgid "Append collection from:"
+#~ msgstr "Do³±czenie kolekcji z:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Zakoñcz"
+
+#~ msgid "Exit"
+#~ msgstr "Zakoñcz"
+
+#~ msgid "Ok"
+#~ msgstr "OK"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Niepoprawna nazwa pliku"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Po uruchomieniu zmiana katalogu na:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Powiêkszenie (skalowanie):"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Umieszczanie okien dialogowych przy wska¼niku myszy"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Uwzglêdnianie plików typu:"
+
+#~ msgid "Remove"
+#~ msgstr "Usuñ"
+
+#~ msgid "Add"
+#~ msgstr "Dodaj"
+
+#~ msgid "Command Line"
+#~ msgstr "Wiersz poleceñ"
+
+#~ msgid "Help"
+#~ msgstr "Pomoc"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "Pe³ny ekran"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Rozmiar pliku:"
+
+#, fuzzy
+#~ msgid "Width:"
+#~ msgstr "Szeroko¶æ"
+
+#, fuzzy
+#~ msgid "Height:"
+#~ msgstr "Wysoko¶æ"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Nadpisanie pliku:\n"
+#~ " %s\n"
+#~ " plikiem:\n"
+#~ " %s"
+
+#~ msgid "Yes"
+#~ msgstr "Tak"
+
+#~ msgid "Yes to all"
+#~ msgstr "Tak, Wszystkie"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Nadpisanie pliku:\n"
+#~ "%s\n"
+#~ " plikiem:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Kopiowanie pliku:\n"
+#~ "%s\n"
+#~ "do:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Przenoszenie pliku:\n"
+#~ "%s\n"
+#~ "do:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Usuniêcie wielu plików..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Nadpisanie pliku:\n"
+#~ "%s\n"
+#~ "poprzez zmianê nazwy na:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "na:"
+
+#~ msgid "Create"
+#~ msgstr "Utwórz"
+
+#~ msgid "Initial directory"
+#~ msgstr "Katalog pocz±tkowy"
+
+#~ msgid "New Directory"
+#~ msgstr "Nowy katalog"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Nie mo¿na utworzyæ katalogu:\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "B³±d podczas tworzenia katalogu"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "Opis obrazu"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/Widok/Prze³±cz _slajdy"
+
+#~ msgid "Add contents"
+#~ msgstr "Dodaj zawarto¶æ"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "Dodaj zawarto¶æ rekurencyjnie"
+
+#~ msgid "Skip directories"
+#~ msgstr "Pomiñ katalogi"
+
+#~ msgid "Invalid directory"
+#~ msgstr "Niepoprawny katalog"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - kopiowanie"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - przenoszenie"
+
+#~ msgid "Directory exists"
+#~ msgstr "Katalog istnieje"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - nowy katalog"
+
+#~ msgid "Misc."
+#~ msgstr "Ro¿ne"
+
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/Plik/Ut_wórz katalog..."
+
+#~ msgid "Edit"
+#~ msgstr "Edycja"
+
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "Wstawiane pliki na bie¿±cym po³o¿eniu"
+
+#~ msgid "File named %s already exists."
+#~ msgstr "Plik %s ju¿ istnieje."
+
+#~ msgid "cm"
+#~ msgstr "cm"
+
+#~ msgid "standard A"
+#~ msgstr "zwyk³e A"
+
+#~ msgid "standard B"
+#~ msgstr "zwyk³e B"
+
+#~ msgid "standard C"
+#~ msgstr "zwyk³e C"
+
+#~ msgid "OTHER"
+#~ msgstr "INNY"
+
+#~ msgid "Date:"
+#~ msgstr "Data:"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview jest uruchomiony: %s\n"
+
+#~ msgid "Electric Eyes"
+#~ msgstr "Electric Eyes"
index d49be1f..471c0f7 100644 (file)
 # gqview pt_BR.po file.
-# Copyright (C) 1999 Vitor Fernandes.
-# Vitor Fernandes <vitor_fernandes@SoftHome.net>, 1999.
+# Copyright (C) Guilherme M. Schroeder.
+# Guilherme M. Schroeder <slump@linuxall.org>, 2001.
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: gqview-0.7.0c\n"
-"POT-Creation-Date: 2000-04-13 15:57-0400\n"
-"PO-Revision-Date: 1999-09-15 16:47-0300\n"
-"Last-Translator: Vitor Fernandes <vitor_fernandes@SoftHome.net>\n"
-"Language-Team: Vitor Fernandes <vitor_fernandes@SoftHome.net>\n"
+"Project-Id-Version: gqview-1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2001-12-1 02:57-0300\n"
+"Last-Translator: Guilherme M. Schroeder <slump@linuxall.org>\n"
+"Language-Team: Guilherme M. Schroeder <slump@linuxall.org>\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=3Diso-8859-1\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/config.c:307
-msgid "GQview configuration"
-msgstr "Configura=E7=E3o do GQview"
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
 
-#: src/config.c:319
-msgid "Ok"
-msgstr "Ok"
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Tiles"
 
-#: src/config.c:324
-msgid "Apply"
-msgstr "Aplicar"
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
 
-#: src/config.c:329 src/utildlg.c:145 src/utilops.c:444 src/utilops.c:754
-#: src/utilops.c:885 src/utilops.c:983
-msgid "Cancel"
-msgstr "Cancelar"
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
 
-#: src/config.c:343
-msgid "General"
-msgstr "Geral"
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
 
-#: src/config.c:351
-msgid "Initial directory"
-msgstr "Diret=F3rio inicial"
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "Data"
 
-#: src/config.c:361
-msgid "On startup, change to this directory:"
-msgstr "Na abertura, mude para esse diret=F3rio:"
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
 
-#: src/config.c:373
-msgid "Use current"
-msgstr "Use o atual"
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
 
-#: src/config.c:379
-msgid "Confirm file delete"
-msgstr "Confirmar exclus=E3o de arquivo"
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
 
-#: src/config.c:381
-msgid "Remember tool state (float/hidden)"
-msgstr "Lembrar estado da ferramenta (flutuante/escondida)"
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
 
-#: src/config.c:383
-msgid "Remember window positions"
-msgstr "Lembrar posi=E7=F5es da janela"
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+#, fuzzy
+msgid "Filename:"
+msgstr "Renomear:"
 
-#: src/config.c:385
-msgid "Slide show"
-msgstr "Show de slides"
+#: src/bar_info.c:1007 src/info.c:360
+#, fuzzy
+msgid "File date:"
+msgstr "Filtro:"
 
-#: src/config.c:398
-msgid "Delay before image change (seconds):"
-msgstr "Demora antes de mudar imagem (segundos):"
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
 
-#: src/config.c:411
-msgid "Random"
-msgstr "Aleat=F3rio"
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Comparar com:"
 
-#: src/config.c:413
-msgid "Repeat"
-msgstr "Repetir"
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
 
-#: src/config.c:420
-msgid "Image"
-msgstr "Imagem"
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
 
-#: src/config.c:428
-msgid "When new image is selected:"
-msgstr "Quando nova imagem =E9 selecionada:"
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
 
-#: src/config.c:438
-msgid "Zoom to original size"
-msgstr "Zoom para o tamanho original"
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Salvar seleção"
 
-#: src/config.c:444 src/img-view.c:306 src/menu.c:473 src/menu.c:547
-#: src/menu.c:587 src/menu.c:678
-msgid "Fit image to window"
-msgstr "Ajustar imagem =E0 janela"
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr ""
 
-#: src/config.c:450
-msgid "Leave Zoom at previous setting"
-msgstr "Deixar o Zoom na configura=E7=E3o anterior"
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Renomear"
 
-#: src/config.c:457
-msgid "Fit window to image when tools are hidden/floating"
+#: src/bar_exif.c:425
+msgid "Value"
 msgstr ""
-"Ajustar janela =E0 imagem quando as ferramentas estiverem "
-"escondidas/flutuando"
 
-#: src/config.c:464
-msgid "Limit size when auto-sizing window"
-msgstr "Limitar tamanho quando auto-dimensionando janela"
+#: src/bar_exif.c:426
+#, fuzzy
+msgid "Format"
+msgstr "Normal"
 
-#: src/config.c:474 src/menu.c:477
-msgid "Thumbnails"
-msgstr "Miniaturas"
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr ""
 
-#: src/config.c:490
-msgid "Size:"
-msgstr "Tamanho:"
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr ""
 
-#: src/config.c:519
-msgid "Cache thumbnails"
-msgstr "Manter miniaturas"
+#: src/bar_exif.c:549 src/info.c:105
+#, fuzzy
+msgid "Exif"
+msgstr "Sair"
 
-#: src/config.c:521
-msgid "Use xvpics thumbnails when found (read only)"
-msgstr "Usar miniaturas xvpics quando encontradas (somente leitura)"
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr ""
 
-#: src/config.c:524
-msgid "Progressive keyboard scrolling"
-msgstr "Rolagem de teclado progressiva"
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Falha ao excluir"
 
-#: src/config.c:526
-msgid "Mouse wheel scrolls image"
+#: src/bar_sort.c:298
+msgid "Link failed"
 msgstr ""
 
-#: src/config.c:533
-msgid "Filtering"
-msgstr "Filtragem"
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"O diretório:\n"
+"%s\n"
+"já existe."
 
-#: src/config.c:542
-msgid "Show entries that begin with a dot"
-msgstr "Exibir entradas que iniciam com um ponto"
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Coleção vazia"
 
-#: src/config.c:544
-msgid "Disable File Filtering"
-msgstr "Desativar Filtragem de Arquivos"
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Falha ao salvar coleção:\n"
+"%s"
 
-#: src/config.c:546
-msgid "Include files of type:"
-msgstr "Incluir arquivos do tipo:"
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Falha ao salvar"
 
-#: src/config.c:596
-msgid "Custom file types:"
-msgstr "Tipos de arquivos personalizados:"
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr ""
 
-#: src/config.c:609
-msgid "format: [.foo;.bar]"
-msgstr "formato: [.foo;.bar]"
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Coleções"
 
-#: src/config.c:618
-msgid "External Editors"
-msgstr "Editores Externos"
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+#, fuzzy
+msgid "Name:"
+msgstr "Renomear"
 
-#: src/config.c:630
-msgid "#"
-msgstr "#"
+#: src/bar_sort.c:569
+#, fuzzy
+msgid "Sort Manager"
+msgstr "Sortear pelo nome"
 
-#: src/config.c:633
-msgid "Menu name"
-msgstr "Nome no menu"
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+#, fuzzy
+msgid "Folders"
+msgstr "Tiles"
 
-#: src/config.c:636
-msgid "Command Line"
-msgstr "Linha do comando"
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Coleções"
 
-#: src/config.c:666 src/menu.c:500
-msgid "About"
-msgstr "Sobre"
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Copiar"
 
-#: src/config.c:682
-#, fuzzy, c-format
-msgid ""
-"GQview %s\n"
-"\n"
-"Copyright (c) 2000 by John Ellis\n"
-"http://gqview.sorceforge.net\n"
-"or http://gqview.netpedia.net\n"
-"gqview@email.com\n"
-"\n"
-"Released under the GNU Public License"
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Mover"
+
+#: src/bar_sort.c:600
+msgid "Link"
 msgstr ""
-"GQview %s\n"
-"\n"
-"Copyright (c) 1999 por John Ellis\n"
-"http://gqview.netpedia.net\n"
-"gqview@email.com\n"
-"\n"
-"Lan=E7ado sob a Licensa P=FAblica Geral GNU"
 
-#: src/filelist.c:51
-msgid " Slideshow"
-msgstr "Show de Slides"
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d imagens"
 
-#: src/filelist.c:55
-#, c-format
-msgid "%d files (%d)%s"
-msgstr "%d arquivos (%d)%s"
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Nenhum selecionado"
 
-#: src/filelist.c:57
-#, c-format
-msgid "%d files%s"
-msgstr "%d arquivos%s"
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr ""
 
-#: src/filelist.c:1025
-msgid "Loading thumbs..."
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+#, fuzzy
+msgid "done"
+msgstr "Nenhum"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Lendo similaridade da data..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
 msgstr "Carregando mini..."
 
-#: src/image.c:66
-#, c-format
-msgid "( ? x ? ) %d bytes"
-msgstr ""
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Carregando miniaturas"
 
-#: src/image.c:68
-#, c-format
-msgid "( %d x %d ) %d bytes"
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
 msgstr ""
 
-#: src/img-main.c:247
-msgid "GQview full screen"
-msgstr "GQview tela cheia"
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Arquivo inválido"
 
-#: src/img-view.c:303 src/menu.c:470 src/menu.c:544 src/menu.c:584
-#: src/menu.c:674
-msgid "Zoom in"
-msgstr "Mais Zoom"
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
 
-#: src/img-view.c:304 src/menu.c:471 src/menu.c:545 src/menu.c:585
-#: src/menu.c:676
-msgid "Zoom out"
-msgstr "Menos Zoom"
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Manter miniaturas"
 
-#: src/img-view.c:305 src/menu.c:472 src/menu.c:546 src/menu.c:586
-msgid "Zoom 1:1"
-msgstr ""
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Data"
 
-#. edit menu
-#: src/img-view.c:309 src/menu.c:457 src/menu.c:519 src/menu.c:550
-#: src/menu.c:590
-msgid "Edit"
-msgstr "Editar"
+#: src/cache_maint.c:842 src/preferences.c:1165
+#, fuzzy
+msgid "Folder:"
+msgstr "Tiles"
 
-#: src/img-view.c:314 src/menu.c:446 src/menu.c:526 src/menu.c:557
-#: src/menu.c:595
-msgid "Copy..."
-msgstr "Copiar..."
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Nenhum selecionado"
 
-#: src/img-view.c:315 src/menu.c:447 src/menu.c:527 src/menu.c:558
-#: src/menu.c:596
-msgid "Move..."
-msgstr "Mover..."
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Arquivo inválido"
 
-#: src/img-view.c:316 src/menu.c:448 src/menu.c:528 src/menu.c:559
-#: src/menu.c:597
-msgid "Rename..."
-msgstr "Renomear..."
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
 
-#: src/img-view.c:317 src/menu.c:449 src/menu.c:529 src/menu.c:560
-#: src/menu.c:598
-msgid "Delete..."
-msgstr "Excluir..."
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
 
-#: src/img-view.c:320
-msgid "Close window"
-msgstr "Fechar janela"
+#: src/cache_maint.c:997 src/editors.c:549
+#, fuzzy
+msgid "running..."
+msgstr "Comparando..."
 
-#: src/main.c:90 src/main.c:119
-#, c-format
-msgid "GQview running: %s\n"
-msgstr "GQview rodando: %s\n"
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Carregando mini..."
 
-#: src/main.c:330
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Limpar cache"
+
+#: src/cache_maint.c:1113
 msgid ""
-"Usage: gqview [options] [path]\n"
-"\n"
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
 msgstr ""
-"Uso: gqview [op=E7=F5es] [caminho]\n"
-"\n"
+"Isso irá remover todos as miniaturas que você tem\n"
+"salvas no disco, continuar?"
 
-#: src/main.c:331
-msgid "valid options are:\n"
-msgstr "op=E7=F5es v=E1lidas s=E3o:\n"
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "Ajuda - GQview"
 
-#: src/main.c:332
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
 #, fuzzy
-msgid "  +t, --with-tools           force show of tools\n"
-msgstr "  +t, +tools\t\t\tfor=E7a a exibir as ferramentas\n"
+msgid "GQview thumbnail cache"
+msgstr "GQview tela cheia"
 
-#: src/main.c:333
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
 #, fuzzy
-msgid "  -t, --without-tools        force hide of tools\n"
-msgstr "  -t, -tools\t\t\tfor=E7a a olcultar as ferramentas\n"
+msgid "Location:"
+msgstr "Coleções"
 
-#: src/main.c:334
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
 #, fuzzy
-msgid "  -f, --fullscreen           start in full screen mode\n"
-msgstr "  -t, -tools\t\t\tfor=E7a a olcultar as ferramentas\n"
+msgid "Clean up"
+msgstr "Limpar"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
 
-#: src/main.c:335
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
 #, fuzzy
-msgid "  -s, --slideshow            start in slideshow mode\n"
-msgstr "  -t, -tools\t\t\tfor=E7a a olcultar as ferramentas\n"
+msgid "Delete all cached thumbnails."
+msgstr "Manter miniaturas"
 
-#: src/main.c:336
+#: src/cache_maint.c:1197
 #, fuzzy
-msgid "  --debug                    turn on debug output\n"
-msgstr "  -debug\t\t\tativa sa=EDda de debug\n"
+msgid "Shared thumbnail cache"
+msgstr "Manter miniaturas"
 
-#: src/main.c:337
+#: src/cache_maint.c:1220
 #, fuzzy
-msgid ""
-"  -h, --help                 show this message\n"
-"\n"
+msgid "Render"
+msgstr "Renomear"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
 msgstr ""
-"  -help                      \t\tessa mensagem\n"
-"\n"
 
-#: src/main.c:342
-#, c-format
-msgid ""
-"invalid or ignored: %s\n"
-"Use -help for options\n"
+#: src/cache_maint.c:1225
+msgid "Metadata"
 msgstr ""
-"inv=E1lido ou ignorado: %s\n"
-"Use -help para op=E7=F5es\n"
 
-#: src/main.c:369
-msgid "The Gimp"
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
 msgstr ""
 
-#: src/main.c:372
-msgid "Electric Eyes"
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Sem nome"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Sem nome (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - Coleção do GQview"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Fechar coleções"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
 msgstr ""
+"A coleção foi modificada.\n"
+"Salvar primeiro?"
 
-#: src/main.c:375
-msgid "XV"
+#: src/collect.c:1106
+msgid "_Discard"
 msgstr ""
 
-#: src/main.c:378
-msgid "Xpaint"
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
 msgstr ""
+"Diretório específicado:\n"
+"%s\n"
+"é um diretório, coleções são arquivos"
 
-#: src/menu.c:373
-#, c-format
-msgid "in %s..."
-msgstr "em %s..."
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Arquivo inválido"
 
-#: src/menu.c:375
-msgid "in (unknown)..."
-msgstr "em (desconhecido)..."
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Sobrescrever arquivo"
 
-#: src/menu.c:394
-msgid "Options..."
-msgstr "Op=E7=F5es..."
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Sobescrever arquivo"
 
-#: src/menu.c:396
-msgid "Remove old thumbnails"
-msgstr "Remover miniaturas velhas"
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Sobrescrever"
 
-#: src/menu.c:398 src/menu.c:410 src/menu.c:422
-msgid "Set as wallpaper"
-msgstr ""
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Salvar seleção"
 
-#. file menu
-#: src/menu.c:440
-msgid "File"
-msgstr "Arquivo"
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Abrir seleção"
 
-#: src/menu.c:444
-msgid "Create Dir..."
-msgstr "Criar diret=F3rio..."
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Adicionar coleção"
 
-#: src/menu.c:451
-msgid "Exit"
-msgstr "Sair"
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Adicionar"
 
-#. view menu
-#: src/menu.c:466
-msgid "View"
-msgstr "Ver"
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Coleção de arquivos"
 
-#: src/menu.c:476 src/menu.c:563
-msgid "Full screen"
-msgstr "Tela cheia"
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Coleção vazia"
 
-#: src/menu.c:485
-msgid "Refresh Lists"
-msgstr "Atualizar Listas"
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Erro ao salvar, a coleção está vazia."
 
-#: src/menu.c:486
-msgid "(Un)Float file list"
-msgstr "(Des)Flutuar lista de arquivos"
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Vazio"
 
-#: src/menu.c:487 src/menu.c:562
-msgid "(Un)Hide file list"
-msgstr "(Des)Esconder lista de arquivos"
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d imagens (%d)"
 
-#: src/menu.c:490
-msgid "Toggle slideshow"
-msgstr "Alternar show de slides"
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d imagens"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Carregando miniaturas..."
 
-#. help menu
-#: src/menu.c:496
-msgid "Help"
-msgstr "Ajuda"
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+#, fuzzy
+msgid "_View"
+msgstr "/_Ver"
 
-#: src/menu.c:523 src/menu.c:554
-msgid "View in new window"
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+#, fuzzy
+msgid "View in _new window"
 msgstr "Ver em nova janela"
 
-#: src/menu.c:531
-msgid "Refresh"
-msgstr "Atualizar"
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+#, fuzzy
+msgid "Rem_ove"
+msgstr "Remover"
 
-#: src/menu.c:601
-msgid "Exit full screen"
-msgstr "Sair da tela cheia"
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Adicionar de lista de arquivo"
 
-#: src/menu.c:661
-msgid "Create thumbnails"
-msgstr "Criar miniaturas"
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Adicionar de coleção..."
 
-#: src/menu.c:670
-msgid "Change to home directory"
-msgstr "Mudar para diret=F3rio pessoal"
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Selecionar tudo"
 
-#: src/menu.c:672
-msgid "Refresh file list"
-msgstr "Atualizar lista de arquivos"
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Nenhum selecionado"
 
-#: src/menu.c:680
-msgid "Set zoom 1:1"
-msgstr "Deixar zoom em 1:1"
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+#, fuzzy
+msgid "_Properties"
+msgstr "/Editar/_Opções..."
 
-#: src/menu.c:682
-msgid "Configure options"
-msgstr "Configurar op=E7=F5es"
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+#, fuzzy
+msgid "_Copy..."
+msgstr "Copiar..."
 
-#: src/menu.c:684
-msgid "Float Controls"
-msgstr "Controles Flutuantes"
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+#, fuzzy
+msgid "_Move..."
+msgstr "Mover..."
 
-#: src/rcfile.c:132
-#, c-format
-msgid "error saving config file: %s\n"
-msgstr "erro salvando arquivo de configura=E7=E3o: %s\n"
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+#, fuzzy
+msgid "_Rename..."
+msgstr "Renomear..."
 
-#: src/thumb.c:127 src/thumb.c:151
-#, c-format
-msgid "create dir failed: %s\n"
-msgstr "falha ao criar diret=F3rio: %s\n"
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+#, fuzzy
+msgid "_Delete..."
+msgstr "Excluir..."
 
-#: src/thumb.c:233
-#, c-format
-msgid "Unable to delete dir: %s\n"
-msgstr "Incapaz de excluir diret=F3rio: %s\n"
+#: src/collect-table.c:810 src/view_file_icon.c:309
+#, fuzzy
+msgid "Show filename _text"
+msgstr "Mostrar arquivos escondidos"
 
-#: src/thumb.c:249
-#, c-format
-msgid "failed to delete:%s\n"
-msgstr "falha ao excluir: %s\n"
+#: src/collect-table.c:813
+#, fuzzy
+msgid "_Save collection"
+msgstr "Salvar seleção"
 
-#: src/utildlg.c:68
-msgid "     Ok     "
-msgstr "     OK     "
+#: src/collect-table.c:815
+#, fuzzy
+msgid "Save collection _as..."
+msgstr "Salvar coleção como..."
 
-#: src/utilops.c:166
-msgid "Source to copy matches destination"
-msgstr ""
+#: src/collect-table.c:818 src/layout_util.c:759
+#, fuzzy
+msgid "_Find duplicates..."
+msgstr "Procurar duplicados..."
 
-#: src/utilops.c:167
-#, fuzzy, c-format
-msgid ""
-"Unable to copy file:\n"
-"%s\n"
-"to itself."
-msgstr ""
-"Incapaz de copiar arquivo:\n"
-"%s\n"
-"para:\n"
-"%s"
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Arquivo/_Renomear..."
 
-#: src/utilops.c:171
-msgid "Source to move matches destination"
-msgstr ""
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "Apagar lista incluindo diretórios."
 
-#: src/utilops.c:172
-#, fuzzy, c-format
-msgid ""
-"Unable to move file:\n"
-"%s\n"
-"to itself."
-msgstr ""
-"Incapaz de mover arquivo:\n"
-"%s\n"
-"para:\n"
-"%s"
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+#, fuzzy
+msgid "_Add contents"
+msgstr "Adicionar conteúdo"
 
-#: src/utilops.c:175 src/utilops.c:231 src/utilops.c:516
-msgid "Continue"
-msgstr "Continuar"
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+#, fuzzy
+msgid "Add contents _recursive"
+msgstr "Adicionar conteúdo recursivo"
 
-#: src/utilops.c:182
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "Pular diretórios"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Apagar arquivos para poder compará-los."
+
+#: src/dupe.c:100
 #, c-format
-msgid ""
-"Overwrite file:\n"
-" %s\n"
-" with:\b %s"
-msgstr ""
-"Sobescrever arquivo:\n"
-" %s\n"
-" com:\b %s"
+msgid "%d files"
+msgstr "%d arquivos"
 
-#: src/utilops.c:183 src/utilops.c:289 src/utilops.c:651 src/utilops.c:835
-msgid "Overwrite file"
-msgstr "Sobescrever arquivo"
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d ocorrências encontradas em %d arquivos"
 
-#: src/utilops.c:186
-msgid "Skip"
-msgstr "Saltar"
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr ""
 
-#: src/utilops.c:187
-msgid "Yes to all"
-msgstr "Sim para todos"
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Lendo checksums..."
 
-#: src/utilops.c:188
-msgid "Yes"
-msgstr "Sim"
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Lendo dimensões..."
 
-#: src/utilops.c:222 src/utilops.c:317
-msgid "Error copying file"
-msgstr "Erro copiando arquivo"
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Lendo similaridade da data..."
 
-#: src/utilops.c:223
-#, c-format
-msgid ""
-"Unable to copy file:\n"
-"%sto:\n"
-"%s\n"
-" during multiple file copy."
-msgstr ""
-"Incapaz de copiar arquivo:\n"
-"%sto:\n"
-"%s\n"
-" durante c=F3pia m=FAltipla de arquivos."
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Comparando..."
 
-#: src/utilops.c:227 src/utilops.c:322
-msgid "Error moving file"
-msgstr "Erro movendo arquivo"
+#: src/dupe.c:1535
+#, fuzzy
+msgid "Sorting..."
+msgstr "Comparando..."
 
-#: src/utilops.c:228
-#, c-format
-msgid ""
-"Unable to move file:\n"
-"%sto:\n"
-"%s\n"
-" during multiple file move."
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
 msgstr ""
-"Incapaz de mover arquivo:\n"
-"%sto:\n"
-"%s\n"
-" durante movimento m=FAltiplo de arquivos."
 
-#: src/utilops.c:282
-msgid "Source matches destination"
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
 msgstr ""
 
-#: src/utilops.c:283
-msgid "Source and destination are the same, operation cancelled."
-msgstr ""
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Adicionar a nova coleção"
 
-#: src/utilops.c:288
-#, c-format
-msgid ""
-"Overwrite file:\n"
-"%s\n"
-" with:\n"
-"%s"
-msgstr ""
-"Sobescrever arquivo:\n"
-"%s\n"
-" com:\n"
-"%s"
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+#, fuzzy
+msgid "C_lear"
+msgstr "Limpar"
 
-#: src/utilops.c:292 src/utilops.c:654 src/utilops.c:838
-msgid "Overwrite"
-msgstr "Sobescrever"
+#: src/dupe.c:2224 src/dupe.c:2512
+#, fuzzy
+msgid "Close _window"
+msgstr "Fechar janela"
 
-#: src/utilops.c:318
-#, c-format
-msgid ""
-"Unable to copy file:\n"
-"%s\n"
-"to:\n"
-"%s"
-msgstr ""
-"Incapaz de copiar arquivo:\n"
-"%s\n"
-"para:\n"
-"%s"
+#: src/dupe.c:2382
+#, fuzzy, c-format
+msgid "%d files (set 2)"
+msgstr "%d arquivos%s"
 
-#: src/utilops.c:323
-#, c-format
-msgid ""
-"Unable to move file:\n"
-"%s\n"
-"to:\n"
-"%s"
-msgstr ""
-"Incapaz de mover arquivo:\n"
-"%s\n"
-"para:\n"
-"%s"
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Tamanho:"
 
-#: src/utilops.c:367
-msgid "Invalid destination"
-msgstr "Destino inv=E1lido"
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Data"
 
-#: src/utilops.c:367
-msgid ""
-"When operating with multiple files, please select\n"
-" a directory, not file."
-msgstr ""
-"Quando operando com v=E1rios arquivos, por favor selecione\n"
-" um diret=F3rio, n=E3o arquivo."
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Dimensões"
 
-#: src/utilops.c:369
-msgid "Invalid directory"
-msgstr "Diret=F3rio inv=E1lido"
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Checksum"
 
-#: src/utilops.c:369
-msgid "Please select an existing directory"
-msgstr "Por favor selecione um diret=F3rio existente"
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Caminho"
 
-#: src/utilops.c:427
-msgid "GQview - copy"
-msgstr "GQview - copiar"
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Similaridade (alta)"
 
-#: src/utilops.c:428
-msgid "Copy"
-msgstr "Copiar"
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Similaridade"
 
-#: src/utilops.c:430
-#, c-format
-msgid ""
-"Copy file:\n"
-"%s\n"
-"to:"
-msgstr ""
-"Copiar arquivo:\n"
-"%s\n"
-"para:"
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Similaridade (baixa)"
 
-#: src/utilops.c:432
-#, c-format
-msgid ""
-"Copy multiple files from:\n"
-"%s\n"
-"to:"
-msgstr ""
-"Copiar m=FAltiplos arquivos de:\n"
-"%s\n"
-"para:"
+#: src/dupe.c:2598
+#, fuzzy
+msgid "Similarity (custom)"
+msgstr "Similaridade (baixa)"
 
-#: src/utilops.c:436
-msgid "GQview - move"
-msgstr "GQview - mover"
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Procurar duplicados - GQview"
 
-#: src/utilops.c:437
-msgid "Move"
-msgstr "Mover"
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Comparar com:"
 
-#: src/utilops.c:439
-#, c-format
-msgid ""
-"Move file:\n"
-"%s\n"
-"to:"
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Comparar pelo:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Miniaturas"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Comparar dois tipos de arquivos"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+#, fuzzy
+msgid "Rotate jpeg clockwise"
+msgstr "Girar no sentido horário"
+
+#: src/editors.c:59
+#, fuzzy
+msgid "Rotate jpeg counterclockwise"
+msgstr "Girar no sentido anti-horário"
+
+#: src/editors.c:104
+#, fuzzy
+msgid "stopping..."
+msgstr "Comparando..."
+
+#: src/editors.c:131
+msgid "Edit command results"
 msgstr ""
-"Mover arquivo:\n"
-"%s\n"
-"para:"
 
-#: src/utilops.c:441
+#: src/editors.c:134
 #, c-format
-msgid ""
-"Move multiple files from:\n"
-"%s\n"
-"to:"
+msgid "Output of %s"
 msgstr ""
-"Mover m=FAltiplos arquivos de:\n"
-"%s\n"
-"para:"
 
-#: src/utilops.c:514
-#, c-format
+#: src/editors.c:303
+#, fuzzy, c-format
 msgid ""
-"Unable to delete file:\n"
-" %s\n"
-" Continue multiple delete operation?"
+"Failed to run command:\n"
+"%s\n"
 msgstr ""
-"Incapaz de excluir arquivo:\n"
-" %s\n"
-" Continuar opera=E7=E3o de exclus=E3o multipla ?"
+"Incapaz de ler:\n"
+"%s"
 
-#: src/utilops.c:515 src/utilops.c:521
-msgid "Delete failed"
-msgstr "Falha ao excluir"
+#: src/editors.c:414
+#, fuzzy
+msgid "stopped by user"
+msgstr "Sortear pelo número"
 
-#: src/utilops.c:520 src/utilops.c:565
-#, c-format
-msgid ""
-"Unable to delete file:\n"
-"%s"
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+#, fuzzy
+msgid "unknown"
+msgstr "em (desconhecido)..."
+
+#: src/exif.c:113
+#, fuzzy
+msgid "top left"
+msgstr "Excluir"
+
+#: src/exif.c:114
+msgid "top right"
 msgstr ""
-"Incapaz de excluir arquivo:\n"
-"%s"
 
-#: src/utilops.c:550
-msgid "Delete files"
-msgstr "Excluir arquivos"
+#: src/exif.c:115
+msgid "bottom right"
+msgstr ""
 
-#: src/utilops.c:550
-msgid "About to delete multiple files..."
-msgstr "Prestes a excluir m=FAltiplos arquivos..."
+#: src/exif.c:116
+msgid "bottom left"
+msgstr ""
 
-#: src/utilops.c:551 src/utilops.c:596
-msgid "Delete"
+#: src/exif.c:117
+#, fuzzy
+msgid "left top"
 msgstr "Excluir"
 
-#: src/utilops.c:566
-msgid "File deletion failed"
-msgstr "Exclus=E3o de arquivos falhou"
+#: src/exif.c:118
+msgid "right top"
+msgstr ""
 
-#: src/utilops.c:594
-#, c-format
-msgid ""
-"About to delete the file:\n"
-" %s"
+#: src/exif.c:119
+msgid "right bottom"
 msgstr ""
-"Prestes a excluir o arquivo:\n"
-" %s"
 
-#: src/utilops.c:595
-msgid "Delete file"
-msgstr "Excluir arquivo"
+#: src/exif.c:120
+msgid "left bottom"
+msgstr ""
 
-#: src/utilops.c:650 src/utilops.c:834
-#, c-format
-msgid ""
-"Overwrite file:\n"
-"%s\n"
-"by renaming:\n"
-"%s"
+#: src/exif.c:127
+msgid "inch"
 msgstr ""
-"Sobescrever arquivo:\n"
-"%s\n"
-"renomeando:\n"
-"%s"
 
-#: src/utilops.c:663
-#, c-format
-msgid ""
-"Unable to rename file:\n"
-"%s\n"
-" to:\n"
-"%s"
+#: src/exif.c:128
+msgid "centimeter"
 msgstr ""
-"Incapaz de renomear arquivo:\n"
-"%s\n"
-" para:\n"
-"%s"
 
-#: src/utilops.c:664 src/utilops.c:847
-msgid "Error renaming file"
-msgstr "Erro renomeando arquivo"
+#: src/exif.c:140
+msgid "average"
+msgstr ""
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "GQview - rename"
-msgstr "GQview - renomear"
+#: src/exif.c:141
+msgid "center weighted"
+msgstr ""
 
-#: src/utilops.c:754
-msgid "Rename multiple files:"
-msgstr "Renomear m=FAltiplos arquivos:"
+#: src/exif.c:142
+msgid "spot"
+msgstr ""
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "Rename"
-msgstr "Renomear"
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr ""
 
-#: src/utilops.c:790
-msgid "Rename:"
-msgstr "Renomear:"
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr ""
 
-#: src/utilops.c:799
-msgid "to:"
-msgstr "para:"
+#: src/exif.c:145
+msgid "partial"
+msgstr ""
 
-#: src/utilops.c:846
-#, c-format
-msgid ""
-"Unable to rename file:\n"
-"%s\n"
-"to:\n"
-"%s"
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
 msgstr ""
-"Incapaz de renomear arquivo:\n"
-"%s\n"
-"para:\n"
-"%s"
 
-#: src/utilops.c:884
-#, c-format
-msgid ""
-"Rename file:\n"
-"%s\n"
-"to:"
+#: src/exif.c:151
+msgid "not defined"
 msgstr ""
-"Renomear arquivo:\n"
-"%s\n"
-"para:"
 
-#: src/utilops.c:928
-#, c-format
-msgid ""
-"The path:\n"
-"%s\n"
-"already exists as a file."
+#: src/exif.c:152
+msgid "manual"
 msgstr ""
-"O caminho:\n"
-"%s\n"
-"j=E1 existe como um arquivo."
 
-#: src/utilops.c:929
-msgid "Could not create directory"
-msgstr "N=E3o pude criar diret=F3rio"
+#: src/exif.c:153
+#, fuzzy
+msgid "normal"
+msgstr "Normal"
 
-#: src/utilops.c:934
-#, c-format
-msgid ""
-"The directory:\n"
-"%s\n"
-"already exists."
+#: src/exif.c:154
+msgid "aperture"
 msgstr ""
-"O diret=F3rio:\n"
-"%s\n"
-"j=E1 existe."
 
-#: src/utilops.c:935
-msgid "Directory exists"
-msgstr "Diret=F3rio existe"
+#: src/exif.c:155
+msgid "shutter"
+msgstr ""
 
-#: src/utilops.c:942
-#, c-format
-msgid ""
-"Unable to create directory:\n"
-"%s"
+#: src/exif.c:156
+#, fuzzy
+msgid "creative"
+msgstr "Criar"
+
+#: src/exif.c:157
+msgid "action"
 msgstr ""
-"Incapaz de criar diret=F3rio:\n"
-"%s"
 
-#: src/utilops.c:943
-msgid "Error creating directory"
-msgstr "Erro criando diret=F3rio"
+#: src/exif.c:158
+msgid "portrait"
+msgstr ""
 
-#: src/utilops.c:982
-#, c-format
-msgid ""
-"Create directory in:\n"
-"%s\n"
-"named:"
+#: src/exif.c:159
+msgid "landscape"
 msgstr ""
-"Criar diret=F3rio em:\n"
-"%s\n"
-"chamado:"
 
-#: src/utilops.c:983
-msgid "GQview - new directory"
-msgstr "GQview - novo diret=F3rio"
+#: src/exif.c:165
+msgid "daylight"
+msgstr ""
 
-#: src/utilops.c:983
-msgid "Create"
-msgstr "Criar"
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr ""
 
-#: src/window.c:151
-msgid "GQview Tools"
-msgstr "GQview Ferramentas"
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr ""
+
+#: src/exif.c:168
+msgid "flash"
+msgstr ""
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr ""
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+#, fuzzy
+msgid "yes"
+msgstr "Sim"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr ""
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr ""
+
+#: src/exif.c:289
+#, fuzzy
+msgid "Image description"
+msgstr "Destino inválido"
+
+#: src/exif.c:292
+#, fuzzy
+msgid "Orientation"
+msgstr "Dimensões"
+
+#: src/exif.c:303
+#, fuzzy
+msgid "Copyright"
+msgstr "Copiar"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr ""
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr ""
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr ""
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr ""
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr ""
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr ""
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr ""
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr ""
+
+#: src/exif.c:323
+#, fuzzy
+msgid "Metering mode"
+msgstr "Método de dithering"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr ""
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr ""
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr ""
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr ""
+
+#: src/exif.c:337
+msgid "Height"
+msgstr ""
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr ""
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr ""
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr ""
+
+#: src/exif.c:1479
+#, fuzzy
+msgid "mode:"
+msgstr "Tiles"
+
+#: src/exif.c:1483 src/utilops.c:1234
+#, fuzzy
+msgid "on"
+msgstr "Nenhum"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr ""
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr ""
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr ""
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr ""
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr ""
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr ""
+
+#: src/filelist.c:513
+#, fuzzy, c-format
+msgid "%d bytes"
+msgstr "%d arquivos"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr ""
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr ""
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr ""
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview tela cheia"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Tiles"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Ajustar imagem a janela"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+#, fuzzy
+msgid "Zoom _in"
+msgstr "Mais Zoom"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+#, fuzzy
+msgid "Zoom _out"
+msgstr "Menos Zoom"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+#, fuzzy
+msgid "Zoom _1:1"
+msgstr "Zoom 1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+#, fuzzy
+msgid "Fit image to _window"
+msgstr "Ajustar imagem a janela"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+#, fuzzy
+msgid "Set as _wallpaper"
+msgstr "Definir como papel de parede"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+#, fuzzy
+msgid "_Stop slideshow"
+msgstr "Para show de slides"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+#, fuzzy
+msgid "Continue slides_how"
+msgstr "Continuar com show de slides"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+#, fuzzy
+msgid "Pause slides_how"
+msgstr "Pausar show de slides"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+#, fuzzy
+msgid "_Start slideshow"
+msgstr "Iniciar show de slides"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+#, fuzzy
+msgid "Exit _full screen"
+msgstr "Sair da tela cheia"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+#, fuzzy
+msgid "_Full screen"
+msgstr "Tela cheia"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+#, fuzzy
+msgid "C_lose window"
+msgstr "Fechar janela"
+
+#: src/info.c:361
+#, fuzzy
+msgid "File size:"
+msgstr "Tiles"
+
+#: src/info.c:363
+#, fuzzy
+msgid "Dimensions:"
+msgstr "Dimensões"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr ""
+
+#: src/info.c:365 src/print.c:3371
+#, fuzzy
+msgid "Image size:"
+msgstr "Imagem"
+
+#: src/info.c:367
+#, fuzzy
+msgid "Compress ratio:"
+msgstr "Comparar com:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Filtro:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr ""
+
+#: src/info.c:371
+msgid "Group:"
+msgstr ""
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Geral"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr ""
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr ""
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Subir"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Show de slides"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Parado"
+
+#: src/layout.c:358
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%d arquivos (%d)%s"
+
+#: src/layout.c:365
+#, fuzzy, c-format
+msgid "%s, %d files%s"
+msgstr "%d arquivos%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d arquivos%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr ""
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ?) %s bytes"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d) %s bytes"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview Ferramentas"
+
+#: src/layout_config.c:57
+#, fuzzy
+msgid "Tools"
+msgstr "Tiles"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+#, fuzzy
+msgid "Files"
+msgstr "Tiles"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Imagem"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr ""
+
+#: src/layout_image.c:770
+#, fuzzy
+msgid "Hide file _list"
+msgstr "(Des)Esconder lista de arquivos"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "em %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "em (desconhecido)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Vazio"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Arquivo"
+
+#: src/layout_util.c:749 src/menu.c:91
+#, fuzzy
+msgid "_Edit"
+msgstr "/_Editar"
+
+#: src/layout_util.c:750 src/menu.c:248
+#, fuzzy
+msgid "_Adjust"
+msgstr "Ajustar"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/_Ajuda"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Arquivo/_Nova coleção"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "Salvar seleção"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Abrir seleção"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Arquivo/Abrir _recente"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Comparando..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Arquivo/_Renomear..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "Ajuda - GQview"
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Qualidade"
+
+#: src/layout_util.c:779 src/menu.c:194
+#, fuzzy
+msgid "_Rotate clockwise"
+msgstr "Girar no sentido horário"
+
+#: src/layout_util.c:780 src/menu.c:197
+#, fuzzy
+msgid "Rotate _counterclockwise"
+msgstr "Girar no sentido anti-horário"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Girar 180"
+
+#: src/layout_util.c:782 src/menu.c:203
+#, fuzzy
+msgid "_Mirror"
+msgstr "Espelho"
+
+#: src/layout_util.c:783 src/menu.c:206
+#, fuzzy
+msgid "_Flip"
+msgstr "Virar"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Selecionar tudo"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Nenhum selecionado"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "/Editar/_Opções..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Ver/_Zoom para toda janela"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "Tela cheia"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "(Des)Esconder lista de arquivos"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "Para show de slides"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "Atualizar"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Ajuda/_Sobre"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Ajuda/_Atalhos do teclado"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Ajuda/_Novidades da versão"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Ajuda/_Sobre"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Miniaturas"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Ver/sep3"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Ver/(Des)_Flutuar lista de arquivos"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Ver/tear1"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "Dimensões"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Ver/_Atualizar Listas"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Sortear pelo nome"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Ver/_Atualizar Listas"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Dimensões"
+
+#: src/layout_util.c:1083
+#, fuzzy
+msgid "Show thumbnails"
+msgstr "Manter miniaturas"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Mudar para diretório pessoal"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Atualizar lista de arquivos"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Mais Zoom"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Menos Zoom"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Ajustar imagem a janela"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Deixar zoom em 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Configurar opções"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Controles Flutuantes"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Ajuda - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Linha de comando"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Pré carregar próxima imagem"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "%d imagens"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Pré carregar próxima imagem"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "Sair da tela cheia"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "Sair da tela cheia"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "Sair da tela cheia"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "Para show de slides"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "Iniciar show de slides"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "Para show de slides"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "Iniciar show de slides"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview Ferramentas"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr ""
+"Renomear arquivo:\n"
+"%s\n"
+"para:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Ver em nova janela"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Uso: gqview [opções] [caminho]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "opções válidas são:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools          exibir as ferramentas\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools       ocultar as ferramentas\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen          iniciar no modo tela-cheia\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow           iniciar no modo slideshow\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+" -l, --list                 abrir janela de coleção para linha de comando\n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+" -l, --list                 abrir janela de coleção para linha de comando\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr " --debug                    ligar a saída do debug\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr " -v, --version              mostrar versão\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 mostrar essa mensagem\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"inválido ou ignorado: %s\n"
+"Use --help para opções\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Criando diretório do GQview:%s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Não pude criar diretório:%s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Diretório inicial"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+#, fuzzy
+msgid "Desktop"
+msgstr "para:"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - sair"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr " - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Coleções foram modificadas.\n"
+"Sair assim mesmo?"
+
+#: src/menu.c:115
+#, fuzzy
+msgid "Sort by size"
+msgstr "Sortear pelo tamanho"
+
+#: src/menu.c:118
+#, fuzzy
+msgid "Sort by date"
+msgstr "Sortear pela data"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Sem sortear"
+
+#: src/menu.c:124
+#, fuzzy
+msgid "Sort by path"
+msgstr "Sortear pelo caminho"
+
+#: src/menu.c:127
+#, fuzzy
+msgid "Sort by number"
+msgstr "Sortear pelo número"
+
+#: src/menu.c:131
+#, fuzzy
+msgid "Sort by name"
+msgstr "Sortear pelo nome"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Modo"
+
+#: src/menu.c:200
+#, fuzzy
+msgid "Rotate _180"
+msgstr "Girar 180"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Limpo (ruim, mas rápido)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Tiles"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Biliner"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Hyper (melhor, mas lento)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Nenhum"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normal"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Melhor"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr ""
+
+#: src/preferences.c:662 src/preferences.c:665
+#, fuzzy
+msgid "Reset filters"
+msgstr "Excluir arquivos"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:699 src/preferences.c:702
+#, fuzzy
+msgid "Reset editors"
+msgstr "Excluir arquivos"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:727 src/preferences.c:730
+#, fuzzy
+msgid "Clear trash"
+msgstr "Limpar cache"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr ""
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - renomear"
+
+#: src/preferences.c:824
+msgid "Startup"
+msgstr ""
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Mudar para diretório pessoal"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Use o atual"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Tamanho:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Qualidade"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Manter miniaturas"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Manter miniaturas dentro do .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Usar miniaturas do xvpics quando encontrado (somente leitura)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Show de slides"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Demora antes de mudar imagem (segundos):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Aleatório"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Repetir"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Mais Zoom"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Método de dithering"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr ""
+
+#: src/preferences.c:895
+#, fuzzy
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Expandir imagens para o zoom ajustar."
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Mais Zoom"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Quando nova imagem é selecionada:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Zoom para o tamanho original"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Deixar o Zoom na configuração anterior"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Adicionar"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr ""
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Continuar"
+
+#: src/preferences.c:924
+#, fuzzy
+msgid "Refresh on file change"
+msgstr "Atualizar lista de arquivos"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Pré carregar próxima imagem"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr ""
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Janelas"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Data"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Lembrar posições da janela"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Lembrar estado da ferramenta (flutuante/escondida)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr ""
+"Ajustar janela à imagem quando as ferramentas estiverem escondidas/flutuando"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Limitar tamanho quando auto-dimensionar janela"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr ""
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filtragem"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Exibir entradas que iniciam com um ponto"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr ""
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Desativar Filtragem de Arquivos"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Filtro:"
+
+#: src/preferences.c:1008
+#, fuzzy
+msgid "Filter"
+msgstr "Filtro:"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr ""
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Editar"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Nome do menu"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr ""
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "Tela cheia"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Imagem"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Excluir"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Confirmar exclusão de arquivo"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Habilitar a tecla delete"
+
+#: src/preferences.c:1158
+#, fuzzy
+msgid "Safe delete"
+msgstr "Confirmar exclusão de arquivo"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Tiles"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Ver"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Seleção retangular"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr ""
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Renomeando no lugar"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr ""
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Rolagem de teclado progressiva"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Movimento do mouse move imagem"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+#, fuzzy
+msgid "Custom similarity threshold:"
+msgstr "Tipos de arquivos personalizados:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Tamanho do cache do offscreen (Mb por imagem)"
+
+#: src/preferences.c:1291
+#, fuzzy
+msgid "About - GQview"
+msgstr " - GQview"
+
+#: src/preferences.c:1304
+#, fuzzy, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright (c) 2003 por John Ellis\n"
+"http://gqview.sourceforge.net\n"
+"gqview@users.sourceforge.net\n"
+"\n"
+"Lançado sob a Licensa Pública Geral GNU"
+
+#: src/preferences.c:1322
+#, fuzzy
+msgid "Credits..."
+msgstr "/Editar/_Opções..."
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Nenhum selecionado"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr ""
+
+#: src/print.c:138
+#, fuzzy
+msgid "Custom printer"
+msgstr "Tipos de arquivos personalizados:"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Imagem"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr ""
+
+#: src/print.c:353
+msgid "inches"
+msgstr ""
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr ""
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr ""
+
+#: src/print.c:366
+msgid "Letter"
+msgstr ""
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, c-format
+msgid "page %d of %d"
+msgstr ""
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr ""
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, fuzzy, c-format
+msgid "A file with name %s already exists."
+msgstr "Nome de arquivo %s já existe."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Filtro:"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Excluir arquivos"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr " - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Normal"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Dimensões"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Destino inválido"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Renomear:"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Sem nome"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "Nenhum"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Modo"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Imagem"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "Filtro:"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr ""
+
+#: src/print.c:3432
+msgid "Top:"
+msgstr ""
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "para:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Filtro:"
+
+#: src/print.c:3450
+#, fuzzy
+msgid "Custom printer:"
+msgstr "Tipos de arquivos personalizados:"
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Filtro:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Filtro:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Lembrar posições da janela"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "erro salvando arquivo de configuração: %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Tiles"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Adicionar conteúdo"
+
+#: src/search.c:202
+msgid "results"
+msgstr ""
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Continuar"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+#, fuzzy
+msgid "greater than"
+msgstr "Criar miniaturas"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "Filtro:"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%d arquivos (%d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%d arquivos%s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Comparando..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Por favor selecione um diretório existente"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Por favor selecione um diretório existente"
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr ""
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Comparando..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Renomear:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Tiles"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Aleatório"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Filtro:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Destino inválido"
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Adicionar conteúdo"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Similaridade"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Aleatório"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr ""
+"Miniatura da imagem no cache deu erro quando foi lida, tentando recriar\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Impossível de gravar lista do histórico em: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr ""
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+#, fuzzy
+msgid "Edit Bookmark"
+msgstr "Editar"
+
+#: src/ui_bookmark.c:612
+#, fuzzy
+msgid "Path:"
+msgstr "Caminho"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr ""
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Nenhum selecionado"
+
+#: src/ui_bookmark.c:718
+#, fuzzy
+msgid "_Properties..."
+msgstr "/Editar/_Opções..."
+
+#: src/ui_bookmark.c:720
+#, fuzzy
+msgid "Move _up"
+msgstr "Mover"
+
+#: src/ui_bookmark.c:722
+#, fuzzy
+msgid "Move _down"
+msgstr "Mover"
+
+#: src/ui_bookmark.c:724
+#, fuzzy
+msgid "_Remove"
+msgstr "Remover"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Incapaz de ler:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Erro ao renomear %s para %s."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Incapaz de excluir arquivo:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Exclusão de arquivo falhou"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Excluir arquivo"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Sobre deletar o arquivo:\n"
+" %s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+#, fuzzy
+msgid "_Rename"
+msgstr "Renomear"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+#, fuzzy
+msgid "Add _Bookmark"
+msgstr "Editar"
+
+#: src/ui_pathsel.c:636
+#, fuzzy
+msgid "_Delete"
+msgstr "Excluir"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "Ajuda - GQview"
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Incapaz de criar diretório:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Erro ao criar diretório"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Todos os arquivos"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Mostrar arquivos escondidos"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filtro:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Selecionar tudo"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "Todos os arquivos"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Sobescrever arquivo"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Sobescrever arquivo"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Sobescrever arquivo"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Saltar"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Saltar"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Erro movendo arquivo"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "Ajuda - GQview"
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+#, fuzzy
+msgid "Auto rename"
+msgstr "Nome do menu"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Renomear"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Fonte para copiar as combinações no destino"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Incapaz de copiar arquivo:\n"
+"%s\n"
+"para ele mesmo."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Fonte para mover arquivos de destino"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Incapaz de mover arquivo:\n"
+"%s\n"
+"para ele mesmo."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Continuar"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Erro copiando arquivo"
+
+#: src/utilops.c:631
+#, fuzzy, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Incapaz de copiar arquivo:\n"
+"%sto:\n"
+"%s\n"
+" durante cópia múltipla de arquivos."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Erro movendo arquivo"
+
+#: src/utilops.c:636
+#, fuzzy, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Incapaz de mover arquivo:\n"
+"%sto:\n"
+"%s\n"
+" durante movimento múltiplo de arquivos."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Fonte confere com o destino "
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Comeco e destino são o mesmo, operação cancelada."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Incapaz de copiar arquivo:\n"
+"%s\n"
+"para:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Incapaz de mover arquivo:\n"
+"%s\n"
+"para:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Destino inválido"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"Quando estiver operando com vários arquivos, por favor selecione\n"
+" um diretório, não um arquivo."
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Por favor selecione um diretório existente"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Ajuda - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+#, fuzzy
+msgid "_Copy"
+msgstr "Copiar"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr ""
+"Renomear arquivo:\n"
+"%s\n"
+"para:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "Copiar múltiplos arquios para:"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Ajuda - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+#, fuzzy
+msgid "_Move"
+msgstr "Mover"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr ""
+"Renomear arquivo:\n"
+"%s\n"
+"para:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Mover múltiplos arquivos para:"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Renomear:"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Fonte confere com o destino "
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Falha ao excluir"
+
+#: src/utilops.c:1124
+#, fuzzy
+msgid "Unable to remove old file from trash folder"
+msgstr ""
+"Incapaz de mover arquivo:\n"
+"%s\n"
+"para ele mesmo."
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Não pude criar diretório"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr ""
+
+#: src/utilops.c:1212
+#, fuzzy, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Incapaz de criar diretório:\n"
+"%s"
+
+#: src/utilops.c:1216
+#, fuzzy
+msgid "Turn off safe delete"
+msgstr "Confirmar exclusão de arquivo"
+
+#: src/utilops.c:1234
+#, fuzzy, c-format
+msgid "Safe delete: %s"
+msgstr "Confirmar exclusão de arquivo"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Incapaz de excluir arquivo:\n"
+" %s\n"
+" Continuar operação de exclusão múltipla ?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr ""
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Excluir arquivos"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Renomear múltiplos arquivos:"
+
+#: src/utilops.c:1438
+#, fuzzy, c-format
+msgid "Review %d files"
+msgstr "%d arquivos"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Excluir arquivo"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Excluir arquivo"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Incapaz de renomear arquivo:\n"
+"%s\n"
+" para:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Erro ao renomear arquivo"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+
+#: src/utilops.c:1809
+#, fuzzy, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr "Erro ao renomear %s para %s."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Ajuda - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "Renomear múltiplos arquivos:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr ""
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Renomear:"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "Renomear:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr ""
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr ""
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr ""
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr ""
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Incapaz de renomear arquivo:\n"
+"%s\n"
+"para:\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr ""
+"Renomear arquivo:\n"
+"%s\n"
+"para:"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"O diretório:\n"
+"%s\n"
+"já existe."
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Tiles"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"O caminho:\n"
+"%s\n"
+"já existe como um arquivo."
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Ajuda - GQview"
+
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Criar diretório em:\n"
+"%s\n"
+"chamado:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr ""
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr ""
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+#, fuzzy
+msgid "_Slideshow"
+msgstr "Show de slides"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Show de slides recursivos"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+#, fuzzy
+msgid "Find _duplicates..."
+msgstr "Procurar duplicados..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Procurar recursivos duplicados..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr ""
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+#, fuzzy
+msgid "View as _tree"
+msgstr "/Ver/T_ela cheia"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+#, fuzzy
+msgid "Re_fresh"
+msgstr "Atualizar"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+#, fuzzy
+msgid "_Sort"
+msgstr "Modo"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+#, fuzzy
+msgid "View as _icons"
+msgstr "Dimensões"
+
+#: src/view_file_list.c:421
+#, fuzzy
+msgid "Show _thumbnails"
+msgstr "Manter miniaturas"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Nome de arquivo inválido:\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "Criar miniaturas"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/Arquivo/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/Arquivo/_Nova coleção"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/File/_Abrir coleção..."
+
+#~ msgid "/File/sep1"
+#~ msgstr "/Arquivo/sep1"
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/Arquivo/_Renomear..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Arquivo/_Procurar duplicados..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Arquivo/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Arquivo/_Renomear..."
+
+#, fuzzy
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Arquivo/_Excluir..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Arquivo/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Arquivo/Copiar..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Arquivo/_Mover..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Arquivo/_Renomear..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Arquivo/_Excluir..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Arquivo/sep4"
+
+#, fuzzy
+#~ msgid "/File/C_lose window"
+#~ msgstr "Fechar janela"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Arquivo/S_air"
+
+#~ msgid "/_Edit"
+#~ msgstr "/_Editar"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Editar/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Editar/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Editar/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Editar/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Editar/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Editar/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Editar/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Editar/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Editar/editor8"
+
+#, fuzzy
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Editar/editor1"
+
+#, fuzzy
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Editar/editor1"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Editar/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Editar/_Ajustar"
+
+#, fuzzy
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Editar/_Opções..."
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Editar/Ajustar/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Editar/Ajustar/_Girar no sentido horário"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Editar/Ajustar/Girar no sentido _Anti-horário"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Editar/Ajustar/Girar 1_80"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Editar/Ajustar/_Espelho"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Editar/Ajustar/_Virar"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Editar/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Editar/Selecionr _tudo"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Editar/Deselecionar"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Editar/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Editar/_Opções..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Editar/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Editar/Definir como _papel de parede"
+
+#~ msgid "/_View"
+#~ msgstr "/_Ver"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Ver/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Ver/Mais _Zoom"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Ver/Menos _Zoom"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Ver/Zoom _1:1"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Ver/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Ver/_Miniaturas"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Ver/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Ver/T_ela cheia"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Ver/sep3"
+
+#, fuzzy
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Ver/(Des)_Esconder lista de arquivos"
+
+#, fuzzy
+#~ msgid "/View/sep4"
+#~ msgstr "/Ver/sep1"
+
+#, fuzzy
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Ver/Mais _Zoom"
+
+#, fuzzy
+#~ msgid "/View/sep5"
+#~ msgstr "/Ver/sep1"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Ver/Alternar _show de slides"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Ver/_Atualizar Listas"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Help/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Ajuda/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "Configuração do GQview"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Editar/_Remover miniaturas velhas"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Caminho"
+
+#~ msgid "Save"
+#~ msgstr "Salvar"
+
+#~ msgid "Close"
+#~ msgstr "Fechar"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Sobrescrever arquivo:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "Salvar seleção como:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "Abrir seleção de:"
+
+#~ msgid "Open"
+#~ msgstr "Abrir"
+
+#~ msgid "Append collection from:"
+#~ msgstr "Adicionar coleção de:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Sair"
+
+#~ msgid "Exit"
+#~ msgstr "Sair"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Arquivo inválido"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Na abertura, mude para esse diretório:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Mais Zoom (aproximar)"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Colocar diálogos abaixo do mouse"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Incluir arquivos do tipo:"
+
+#~ msgid "Remove"
+#~ msgstr "Remover"
+
+#~ msgid "Command Line"
+#~ msgstr "Linha de comando"
+
+#, fuzzy
+#~ msgid "Help"
+#~ msgstr "/_Ajuda"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "Tela cheia"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Tiles"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Sobescrever arquivo:\n"
+#~ " %s\n"
+#~ " com:\n"
+#~ " %s"
+
+#~ msgid "Yes"
+#~ msgstr "Sim"
+
+#~ msgid "Yes to all"
+#~ msgstr "Sim para todos"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Sobescrever arquivo:\n"
+#~ "%s\n"
+#~ " com:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Copiar arquivo:\n"
+#~ "%s\n"
+#~ "para:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Mover arquivo:\n"
+#~ "%s\n"
+#~ "para:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Sobre excluir múltiplos arquivos..."
 
 #~ msgid ""
 #~ "Overwrite file:\n"
 #~ "%s\n"
-#~ "with:\n"
+#~ "by renaming:\n"
 #~ "%s"
 #~ msgstr ""
 #~ "Sobescrever arquivo:\n"
 #~ "%s\n"
-#~ "com:\n"
+#~ "renomeando:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "para:"
+
+#~ msgid "Create"
+#~ msgstr "Criar"
+
+#~ msgid "Initial directory"
+#~ msgstr "Diretório inicial"
+
+#~ msgid "New Directory"
+#~ msgstr "Novo diretório"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Incapaz de criar diretório:\n"
 #~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "Erro ao criar diretório"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "Destino inválido"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/Ver/Alternar _show de slides"
+
+#~ msgid "Add contents"
+#~ msgstr "Adicionar conteúdo"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "Adicionar conteúdo recursivo"
+
+#~ msgid "Skip directories"
+#~ msgstr "Pular diretórios"
+
+#~ msgid "Invalid directory"
+#~ msgstr "Diretório inválido"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - copiar"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - mover"
+
+#~ msgid "Directory exists"
+#~ msgstr "Diretório existe"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - novo diretório"
+
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/Arquivo/Criar _diretório..."
+
+#~ msgid "Edit"
+#~ msgstr "Editar"
+
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "Inserir arquivos deletados na posição do ponteiro"
+
+#~ msgid "File named %s already exists."
+#~ msgstr "Arquivo nomeado %s já existe."
+
+#, fuzzy
+#~ msgid "Date:"
+#~ msgstr "Data"
+
+#, fuzzy
+#~ msgid "top"
+#~ msgstr "para:"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview rodando: %s\n"
+
+#~ msgid "Electric Eyes"
+#~ msgstr "Electric Eyes"
+
+#~ msgid "Apply"
+#~ msgstr "Aplicar"
+
+#~ msgid "format: [.foo;.bar]"
+#~ msgstr "formato: [.foo;.bar]"
diff --git a/po/ro.po b/po/ro.po
new file mode 100644 (file)
index 0000000..6e93139
--- /dev/null
+++ b/po/ro.po
@@ -0,0 +1,3618 @@
+# translation of ro.po to Romanian
+# Copyright (C) 2004 Free Software Foundation, Inc.
+# Harald Ersch <hersch@romatsa.ro>,2002.
+# Harald Ersch <harald@ersch.ro>, 2004.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: ro\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2004-04-28 16:07-0400\n"
+"Last-Translator: Harald Ersch <harald@ersch.ro>\n"
+"Language-Team: Romanian <rtfs-project@sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.3\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Unelte"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "deschidere diafragmã"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Nume fiºier:"
+
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Datã fiºier:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Comparã cu:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Salveazã colecþia"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "Etichetã"
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Nume"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "Valoare"
+
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "Format"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "Elemente"
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "Descriere"
+
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "EXIF"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "Vizualizare avansatã"
+
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Nu am putut ºterge"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Directorul: \n"
+"%s\n"
+"existã deja."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Colecþie goalã"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Nu am putut salva colecþia:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Nu am putut salva datele!"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "Adaugã semn de carte"
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Colecþii"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "Nume:"
+
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "Gestionar de sortare"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "Dosare"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Colecþii"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Copiazã"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Mutã"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d imagini"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Nu selecta nimic"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "Des-face ultima imagine"
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "terminat"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Citesc datele de similaritate..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "ªterg miniaturile..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "ªterg miniaturile vechi..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Nume fiºier incorect"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Pune miniaturile în memoria tampon"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Start #"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "Dosar:"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Nu selecta nimic"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Nume fiºier incorect"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "ruleazã..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "ªterg miniaturile..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "ªterge memoria tampon"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Doriþi sã ºtergeþi toate miniaturile\n"
+"salvate pe disc?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "Proprietãþi imagine - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview tot ecranul"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "acþiune"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "ªterge"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "Pune miniaturile în memoria tampon"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "Afiºeazã miniaturile"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "Redenumeºte"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Fãrã_titlu"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Fãra titlu (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - Colecþie GQview"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Închide colecþia"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Colecþia a fost modificatã!\n"
+"Doriþi sã o salvaþi?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Calea specificatã:\n"
+"%s\n"
+"este un director, colecþiile sunt fiºiere"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Nume fiºier incorect"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Suprascrie Fiºier"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Suprascriere fiºier"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Suprascrie"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Salveazã colecþia"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Deschide colecþia"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Adaugã colecþia"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Adaugã"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Fiºiere colecþie"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Colecþie goalã"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Colecþia curentã este goalã, nu am ce salva"
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Gol"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d imagini (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d imagini"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Încarc miniaturile..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "_Vizualizare"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "Vizualizeazã în fereastrã _nouã"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "_ªterge"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Adaugã din lista de fiºiere"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Adaugã din colecþie"
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Selecteazã tot"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Nu selecta nimic"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "_Proprietãþi"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "_Copiere..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "_Mutare..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "_Redenumire..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "_ªtergere..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "Afiºeazã numele fiºierelor"
+
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "_Salveazã colecþia"
+
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "Salveazã colecþia c_a..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "_Cautã duplicatele..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Fiºier/_Redenumeºte"
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "Lista conþinea directoare."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "_Adaugã conþinut"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "Adaugã conþinut în mod _recursiv"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "_Sãri directoarele"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Renunþã"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Renunþã la fiºiere pentru a le compara."
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d fiºiere"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d potriviri gãsite în%d fiºiere"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[set 1]"
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Citesc sumele de control..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Citesc dimensiunile..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Citesc datele de similaritate..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Compar..."
+
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "Sortez..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "Selecþie duplicate-grup _1"
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "Selecþie duplicate-grup _1"
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Adaugã la colecþia nouã"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "_ªterge"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "Închide _fereastra"
+
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "%d fiºiere (set 2)"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Mãrime"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Data"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Dimensiuni"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Sumã de control"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Cale"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Similaritate (mare)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Similaritate"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Similaritate (micã)"
+
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Similaritate (personalizatã)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Cautã duplicatele - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Comparã cu:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Comparare dupã:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Miniaturi"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Comparã 2 seturi de fiºiere"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "Rotire jpeg în sens orar"
+
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "Rotire jpeg în sens antiorar"
+
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "opresc..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "Editare rezultate comandã"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "Ieºirea %s"
+
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Nu pot executa comanda:\n"
+"%s\n"
+
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "oprit de cãtre utilizator"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "necunoscut"
+
+#: src/exif.c:113
+msgid "top left"
+msgstr "stânga sus"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "dreapta sus"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "dreapta jos"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "stânga jos"
+
+#: src/exif.c:117
+msgid "left top"
+msgstr "stânga sus"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "dreapta sus"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "dreapta jos"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "stânga jos"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "inci"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "centimetri"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "medie"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "media din centru"
+
+#: src/exif.c:142
+msgid "spot"
+msgstr "spot"
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr "multi-spot"
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr "multi-segment"
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "parþial(e)"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "alta"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "nedefinit(e)"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "manual(e)"
+
+#: src/exif.c:153
+msgid "normal"
+msgstr "normal(ã)"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "deschidere diafragmã"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "timp de expunere"
+
+#: src/exif.c:156
+msgid "creative"
+msgstr "creativ(e)"
+
+#: src/exif.c:157
+msgid "action"
+msgstr "acþiune"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "portret"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "peisaj"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "lumina zilei"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "fluorescent"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "tungsten (incandescent)"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "flash(blitz)"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "nu"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "da"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr "da, NEdetectate de strobe"
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr "da, detectate de strobe"
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "Descriere imagine"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "Orientare"
+
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "Drept de autor"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "Program de expunere"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "Sensibilitate ISO"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "Data originalã"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "Data digitizãrii"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "Vitezã obturator"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "Deschidere diafragmã"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "Decalaj expunere"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "Distanþa de la subiect"
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "Mod de mãsurare"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "Sursa de luminã"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "Flash"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "Distanþa focalã"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "Lãþime"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "Înãlþime"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "Aparat"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "Rezoluþie"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "infinit(ã)"
+
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "mod:"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "pornit"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "oprit"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "auto"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr "nedetectate de strobe"
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr "detectate de strobe"
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "reducere efect ochi roºii"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "punct"
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d bytes"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f K"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview tot ecranul"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Mãrime fiºier:"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Umple fereastra cu imaginea"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "Mãr_ire"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "Micº_orare"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "Scara _1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "Umple _fereastra cu imaginea"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "Pune drept fundal (_wallpaper)"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "_Opreºte prezentarea de imagini"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "_Continuã prezentarea de imagini"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "_Întrerupe prezentarea de imagini"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "_Porneºte prezentarea de imagini"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "_Ieºire din mod tot ecranul"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "_Tot ecranul"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "Î_nchide fereastra"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "Mãrime fiºier:"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Dimensiuni:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Transparent:"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Mãrime imagine:"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Ratã de compresie:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Datã fiºier:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Proprietar:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Grup:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "General"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "Imaginea %d din %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Proprietãþi imagine - GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Ascendentã"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Prezentare de imagini"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr "Întrerupt"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d fiºiere (%s,%d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s,%d fiºiere%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d fiºiere%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(fãrã permisiune de citire) %s bytes"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s bytes"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s bytes"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview - Unelte"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Unelte"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "Fiºiere"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Imagine"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(trageþi pentru schimbare ordine)"
+
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "Ascunde _listã fiºiere"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "în %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "în (necunoscut)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Gol"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Fiºier"
+
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "_Editare"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "_Ajustare"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/_Ajutor"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Fiºier/Fereastrã _nouã"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "_Salveazã colecþia"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Deschide colecþia"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Fiºier/Deschide _recente"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Sortez..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Fiºier/_Redenumeºte"
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "Dosar _nou..."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Calitate"
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "Rotire în sens _orar"
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "Rotire în sens _antiorar"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Rotire _180"
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "_Oglindire"
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "_Rãsturnare"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Selecteazã tot"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Nu selecta nimic"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "_Proprietãþi..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Vizualizare/_Sã încapã"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "_Tot ecranul"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Ascunde _listã fiºiere"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "_Opreºte prezentarea de imagini"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "Actualizeazã"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Ajutor/_Despre..."
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Ajutor/Scurtãturi tastaturã"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Ajutor/Note de distribui_re"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Ajutor/_Despre..."
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Miniaturi"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Vizualizare/A_rborescent"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Vizualizare/Activare listã _flotantã"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Vizualizare/Ascunde barã unelte"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "/Vizualizare/_Iconuri"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Vizualizare/Info _EXIF"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Gestionar de sortare"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Vizualizare/_Listã"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Icon:"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Afiºeazã miniaturile"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Du-te în directorul Acasã"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Actualizare listã fiºiere"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Mãrire"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Micºorare"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Umple fereastra cu imaginea"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Pune mãrirea la 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Configurare opþiuni"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Controale flotante"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Ajutor - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Linia de comandã"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Preîncarcã urmãtoarea imagine"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "Des-face ultima imagine"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Des-face ultima imagine"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "_Ieºire din mod tot ecranul"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "_Ieºire din mod tot ecranul"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "_Ieºire din mod tot ecranul"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "_Opreºte prezentarea de imagini"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "_Porneºte prezentarea de imagini"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "_Opreºte prezentarea de imagini"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "_Porneºte prezentarea de imagini"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview - Unelte"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr "Redenumire  fiºier:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Vizualizeazã în fereastrã _nouã"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Folosire: gqview [opþiuni] [cale]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "opþiunile corecte sunt:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           forþeazã afiºarea barei de unelte\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  +t, --with-tools           forþeazã ascunderea barei de unelte\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           pornire în modul tot ecranul\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            pornire în modul prezentare de imagini\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+"  -l, --list                 deschide fereastra colecþii pentru linia de "
+"comandã\n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+"  -l, --list                 deschide fereastra colecþii pentru linia de "
+"comandã\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    activeazã mesajele de depanare\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              afiºeazã informaþii despre versiune\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 afiºeazã acest mesaj\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"incorect sau ignorat: %s\n"
+"Folosiþi --help pentru opþiuni\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Creez directorul GQView: %s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Nu pot creea directorul: %s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Acasã"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "Ecran"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - ieºire"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "Despre - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Colecþiile au fost modificate.\n"
+"Totuºi doriþi sã ieºiþi?"
+
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "Sortare dupã mãrime"
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "Sortare dupã datã"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Nesortate"
+
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "Sortare dupã cale"
+
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "Sortare dupã numãr"
+
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "Sortare dupã nume"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Sortare"
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "Rotire _180"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Cea mai apropiatã(cea mai rea, dar cea mai rapidã)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Pavaj"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilinearã"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Super (Cea mai bunã, dar cea mai lentã)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Nimic"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normalã"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Cea mai bunã"
+
+#: src/preferences.c:498 src/print.c:365
+#, fuzzy
+msgid "Custom"
+msgstr "auto"
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "Reiniþializare filtre"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Se vor reinitializa filtrele de fiºiere cu valorile implicite.\n"
+"Doriþi sã continuaþi?"
+
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "Reiniþializare editoare"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Se vor reinitializa comenzile de editare cu valorile implicite.\n"
+"Doriþi sã continuaþi?"
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "ªterge gunoi"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "Se va goli conþinutul gunoiului"
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - redenumire"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "Start #"
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Du-te în directorul Acasã"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Foloseºte directorul curent"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Mãrime:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Calitate:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Pune miniaturile în memoria tampon"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Pãstreazã miniaturile în .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Foloseºte miniaturile xvpics disponibile (numai pt. citire)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Prezentare de imagini"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Timp de afiºare a imaginii (secunde):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Aleator"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Repetare"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Mãrire"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Metoda de dithering:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Mãrire în doi paºi"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Mãreºte imaginea pânã la umplere"
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Incrementul mãririi"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "La selectarea unei imagini noi:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Mãreºte la dimensiunea iniþialã"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Pãstreazã valoarea anterioarã a mãririi"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Adaugã"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Fundal negru"
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Continuã"
+
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "Actualizare la modificare fiºiere"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Preîncarcã urmãtoarea imagine"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Autorotire imagine folosind informaþiile EXIF"
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Ferestre"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Start #"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Memoreazã poziþia ferestrelor"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Memoreazã starea uneltelor (flotante, ascunse)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "Ajusteazã fereastra la imagine când uneltele sunt flotante/ascunse"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Limitare mãrime la redimensionarea automatã a ferestrei"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Aranjare"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filtrare"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Aratã intrãrile ce încep cu un punct"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "Sortare case-sensitive"
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Dezactiveazã filtrarea fiºierelor"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Datã fiºier:"
+
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "Filtru"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "Implicite"
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Editoare"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Nume meniu"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "Avansate"
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "_Tot ecranul"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Mãrime imagine:"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "ªterge"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Confirmare pentru ºtergerea fiºierelor"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Activare tasta Delete"
+
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "ªtergere sigurã"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Mãrime maximã (MB)"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Vizualizare"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Selectare dreptunghiularã"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Coboarã dosarele în arborescenþã"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Cu redenumire"
+
+#: src/preferences.c:1200
+#, fuzzy
+msgid "Navigation"
+msgstr "acþiune"
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Deplasare progresivã cu tastatura"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Rotiþa mouse-ului defileazã imaginea"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "Prag similaritate utilizator:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Memorie tampon în afara ecranului (Mb/imagine):"
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "Despre - GQview"
+
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s \n"
+"\n"
+"Distribuit sub GNU GPL"
+
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "Mulþumiri..."
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Nu selecta nimic"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+#, fuzzy
+msgid "Default printer"
+msgstr "Implicite"
+
+#: src/print.c:138
+#, fuzzy
+msgid "Custom printer"
+msgstr "Tipuri fiºiere utilizator:"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Mãrime imagine:"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+#, fuzzy
+msgid "centimeters"
+msgstr "centimetri"
+
+#: src/print.c:353
+#, fuzzy
+msgid "inches"
+msgstr "inci"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+#, fuzzy
+msgid "Portrait"
+msgstr "portret"
+
+#: src/print.c:360
+#, fuzzy
+msgid "Landscape"
+msgstr "peisaj"
+
+#: src/print.c:366
+#, fuzzy
+msgid "Letter"
+msgstr "centimetri"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, fuzzy, c-format
+msgid "page %d of %d"
+msgstr "Imaginea %d din %d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "Previzualizare"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "Fiºierul cu numele %s existã deja."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Filtru"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Implicite"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "Despre - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Format"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Orientare"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Descriere"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Nume fiºier:"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Fãrã_titlu"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "pornit"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Sortare"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Mãrime imagine:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "deschidere diafragmã"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+#, fuzzy
+msgid "Right:"
+msgstr "Înãlþime"
+
+#: src/print.c:3432
+#, fuzzy
+msgid "Top:"
+msgstr "Grup:"
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "în:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Filtru"
+
+#: src/print.c:3450
+#, fuzzy
+msgid "Custom printer:"
+msgstr "Tipuri fiºiere utilizator:"
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Filtru:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Datã fiºier:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Memoreazã poziþia ferestrelor"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "Nu pot salva fiºierul de configurare: %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Dosar:"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Elemente"
+
+#: src/search.c:202
+#, fuzzy
+msgid "results"
+msgstr "Implicite"
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Continuã"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+msgid "greater than"
+msgstr ""
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "Filtru:"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d fiºiere (%s,%d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%s,%d fiºiere%s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Sortez..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Selectaþi un director existent"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Selectaþi un director existent"
+
+#: src/search.c:2570
+#, fuzzy
+msgid "Image search - GQview"
+msgstr "Proprietãþi imagine - GQview"
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Sortez..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Nume fiºier:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Mãrime fiºier:"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Aleator"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Datã fiºier:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Descriere imagine"
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Adaugã conþinut"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Similaritate"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Aleator"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "Nu pot încãrca miniaturile din cache, încerc actualizarea lor.\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Nu pot scrie istoricul în: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "Semn de carte nou"
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "Editare semn de carte"
+
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "Cale:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "Icon:"
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Nu selecta nimic"
+
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "_Proprietãþi..."
+
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "Mutã s_us"
+
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "Mutã _jos"
+
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "_ªterge"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Nu pot încãrca:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Nu pot redenumi %s în %s."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Nu pot ºterge fiºierul:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Nu am putut ºterge!"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "ªtergere fiºiere"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Voi ºterge fiºierul:\n"
+"%s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "_Redenumeºte"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "Adaugã _semn de carte"
+
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "_ªterge"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "Dosar _nou..."
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Nu pot creea directorul:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Eroare la crearea directorului"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Toate fiºierele"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Afiºeazã fiºierele ascunse"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filtru:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Selecteazã tot"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "Toate fiºierele"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Suprascriere fiºier"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Suprascriere fiºier"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Suprascriere fiºier"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Sar toate"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Sare"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Eroare la mutare fiºier"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "Dosar _nou..."
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Autoredenumire"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Redenumeºte"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Sursa copierii se suprapune cu destinaþia"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Nu pot copia fiºierul:\n"
+"%s\n"
+"peste el însuºi."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Sursa mutãrii se suprapune cu destinaþia"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Nu pot muta fiºierul:\n"
+"%s\n"
+"peste el însuºi."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Continuã"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Eroare la copiere fiºier"
+
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Nu pot copia fiºierul:\n"
+"%sîn\n"
+"%s\n"
+"în timpul copierii multiple."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Eroare la mutare fiºier"
+
+#: src/utilops.c:636
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Nu pot muta fiºierul:\n"
+"%sîn\n"
+"%s\n"
+"în timpul mutãrii multiple."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Sursa se suprapune cu destinaþia"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Operaþiune anulatã, sursa se suprapune cu destinaþia"
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Nu pot copia fiºierul:\n"
+"%s\n"
+"în:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Nu pot muta fiºierul:\n"
+"%s\n"
+"în:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Destinaþie incorectã"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"La manipularea fiºierelor multiple\n"
+"selectaþi un director, nu un fiºier!"
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Selectaþi un director existent"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Ajutor - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "_Copiazã"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr "Redenumire  fiºier:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "Copiazã mai multe fiºiere în:"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Ajutor - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "_Mutã"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr "Redenumire  fiºier:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Mutã mai multe fiºiere în:"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Nume fiºier:"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Sursa se suprapune cu destinaþia"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Nu am putut ºterge"
+
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "Nu pot ºterge vechiul fiºier din dosarul de gunoi"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Nu pot creea directorul"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "Acces interzis"
+
+#: src/utilops.c:1212
+#, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Nu pot accesa sau creea directoru de gunoi:\n"
+"\"%s\""
+
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "Dezactiveazã ºtergerea sigurã"
+
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "ªtergere sigurã: %s"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Nu pot ºterge fiºierul:\n"
+"%s\n"
+"Doriþi continuarea operaþiilor de ºtergere?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr "Fiºierul %d din %d"
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "ªterge fiºiere"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Redenumire multiplã de fiºiere:"
+
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "Revedere %d fiºiere"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "ªtergere fiºiere"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "ªtergere fiºiere"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Nu pot redenumi fiºierul:\n"
+"%s\n"
+"în:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Nu pot redenumi fiºierul"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Nu pot redenumi cu numele rezultat \n"
+"din numãrul selectat, existã unul sau mai multe fiºiere cu numele identic.\n"
+
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"Nu pot redenumi\n"
+" %s \n"
+"Numãrul a fost %d."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Ajutor - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "Redenumire multiplã de fiºiere:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "Nume original"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Nume original"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "Redenumeºte:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Text de început"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "Start #"
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Text de sfârºit"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "Umplere:"
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Nu pot redenumi fiºierul:\n"
+"%s\n"
+"în:\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr "Redenumire  fiºier:"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Directorul: \n"
+"%s\n"
+"existã deja."
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Dosare"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"Calea:\n"
+"%s\n"
+"existã deja ca fiºier."
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Ajutor - GQview"
+
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Creeazã directorul în:\n"
+"%s\n"
+"cu numele:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "Dosar_nou"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "S_us pânã la pãrinte"
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "_Prezentare de imagini"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Prezentare de imagini recursivã"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "Cautã _duplicatele..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Cãutare recursivã a duplicatelor"
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "Dosar _nou..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "Arborescen_tã"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "Actualizeazã"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "_Sortare"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "Vizualizare ca _iconuri"
+
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "Afiºare miniaturi"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Nume fiºier incorect:\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "ªterge miniaturile"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/Fiºier/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/Fiºier/Colecþie _nouã"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Fiºier/Deschide c_olecþie"
+
+#~ msgid "/File/sep1"
+#~ msgstr "/Fiºier/sep1"
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/Fiºier/_Redenumeºte"
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Fiºier/Cautã duplicatele"
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Fiºier/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Fiºier/_Redenumeºte"
+
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Fiºier/Dosar _nou..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Fiºier/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Fiºier/_Copiazã"
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Fiºier/_Mutã"
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Fiºier/_Redenumeºte"
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Fiºier/_ªterge..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Fiºier/sep4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/Fiºier/Închide fereastra"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Fiºier/I_eºire"
+
+#~ msgid "/_Edit"
+#~ msgstr "/_Editare"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Editare/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Editare/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Editare/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Editare/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Editare/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Editare/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Editare/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Editare/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Editare/editor8"
+
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Editare/editor9"
+
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Editare/editor0"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Editare/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Editare/_Ajustare"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Editare/_Proprietãþi"
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Editare/Ajustare/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Editare/Ajustare/Roteºte orar"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Editare/Ajustare/Roteºte antiorar"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Editare/Ajustare/Roteºte 180"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Editare/Ajustare/_Oglindire"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Editare/Ajustare/_Rãsturnare"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Editare/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Editare/Selecteazã tot"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Edit/Deselecteazã tot"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Editare/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Editare/_Opþiuni..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Editare/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Edit/Pune imaginea drept fundal"
+
+#~ msgid "/_View"
+#~ msgstr "/_Vizualizare"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Vizualizare/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Vizualizare/Mãrire"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Vizualizare/Micºorare"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Vizualizare/Scara 1:1"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Vizualizare/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Vizualizare/Minia_turi"
+
+#~ msgid "/View/I_cons"
+#~ msgstr "/Vizualizare/_Iconuri"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Vizualizare/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Vizualizare/Umple tot ecran_ul"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Vizualizare/sep3"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Vizualizare/Ascunde lista fiºierelor"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/Vizualizare/sep4"
+
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Vizualizare/Gestionar _sortare"
+
+#~ msgid "/View/sep5"
+#~ msgstr "/Vizualizare/sep5"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Vizualizare/Prezentare de imagini"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/View/Actualiza_re listã"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Ajutor/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Ajutor/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "Configurare GQview"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Editare/_ªterge miniaturile vechi"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Cale"
+
+#~ msgid "Save"
+#~ msgstr "Salveazã"
+
+#~ msgid "Close"
+#~ msgstr "Închide"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Suprascrie fiºierul colecþie:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "Salveazã colecþia ca:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "Deschide colecþia din:"
+
+#~ msgid "Open"
+#~ msgstr "Deschide"
+
+#~ msgid "Append collection from:"
+#~ msgstr "Adugã colecþia din:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Ieºire"
+
+#~ msgid "Exit"
+#~ msgstr "Ieºire"
+
+#~ msgid "Ok"
+#~ msgstr "OK"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Nume fiºier incorect"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "La pornire, schimbã în acest director:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Mãrire (scarã):"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Pune dialogurile sub mouse"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Include fiºierele de tip:"
+
+#~ msgid "Remove"
+#~ msgstr "ªterge"
+
+#~ msgid "Add"
+#~ msgstr "Adaugã"
+
+#~ msgid "Command Line"
+#~ msgstr "Linia de comandã"
+
+#~ msgid "Help"
+#~ msgstr "Ajutor"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "_Tot ecranul"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Mãrime fiºier:"
+
+#, fuzzy
+#~ msgid "Width:"
+#~ msgstr "Lãþime"
+
+#, fuzzy
+#~ msgid "Height:"
+#~ msgstr "Înãlþime"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Suprascrie fiºierul:\n"
+#~ "%s\n"
+#~ "cu:\n"
+#~ "%s"
+
+#~ msgid "Yes"
+#~ msgstr "Da"
+
+#~ msgid "Yes to all"
+#~ msgstr "Da, pentru toate"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Suprascrie fiºierul:\n"
+#~ "%s\n"
+#~ "cu:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Copiazã fiºierul:\n"
+#~ "%s\n"
+#~ "în:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Mutã fiºierul:\n"
+#~ "%s\n"
+#~ "în:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Voi ºterge mai multe fiºiere..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Suprascriere fiºier:\n"
+#~ "%s\n"
+#~ "prin redenumire:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "în:"
+
+#~ msgid "Create"
+#~ msgstr "Creeazã"
+
+#~ msgid "Initial directory"
+#~ msgstr "Director iniþial"
+
+#~ msgid "New Directory"
+#~ msgstr "Director nou"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Nu pot creea directorul:\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "Eroare la crearea directorului"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "Descriere imagine"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/Vizualizare/Prezentare de imagini"
+
+#~ msgid "Misc."
+#~ msgstr "Diverse"
+
+#~ msgid "Invalid directory"
+#~ msgstr "Director incorect"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - copiere"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - mutare"
+
+#~ msgid "Directory exists"
+#~ msgstr "Directorul existã"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - director nou"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "Adaugã conþinut în mod recursiv"
+
+#~ msgid "Skip directories"
+#~ msgstr "Sãri directoarele"
+
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/Fiºier/Creare _Director"
+
+#~ msgid "Edit"
+#~ msgstr "Editare"
+
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "Inserare fiºier la poziþia cursorului"
+
+#~ msgid "File named %s already exists."
+#~ msgstr "Fiºierul cu numele %s existã deja."
+
+#, fuzzy
+#~ msgid "Date:"
+#~ msgstr "Data"
+
+#, fuzzy
+#~ msgid "top"
+#~ msgstr "în:"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview ruleazã: %s\n"
+
+#~ msgid "Electric Eyes"
+#~ msgstr "Electric Eyes"
+
+#~ msgid "Apply"
+#~ msgstr "Aplicã"
+
+#~ msgid "format: [.foo;.bar]"
+#~ msgstr "format: [.foo;.bar]"
index 50768c4..d4d97b2 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
 # gqview ru.po file. Russian locale definition for gqview.
 # Copyright (C) 1999 Free Software Foundation, Inc.
-# Oleg Andrjushenko <oandr@itec.cn.ua>, 1999.
+# Oleg Andryuschenko <oandr@itek.com.ua>, 1999.
+# Edited by Michael Bravo <mbravo@acm.org>, 2000.
+# Edited by drF_ckoff <dfo@antex.ru>, 2001.
+# Edited by Oleg Andryuschenko <oandr@itek.com.ua>, 2002.
+# Edited by drF_ckoff <dfo@antex.ru>, 2003-2004.
+#
+# $Id$
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: gqview-0.7.0d\n"
-"POT-Creation-Date: 2000-04-13 15:57-0400\n"
-"PO-Revision-Date: 1999-09-09 09:09+0300\n"
-"Last-Translator: Oleg Andrjushenko <oandr@itec.cn.ua>\n"
-"Language-Team: It`s me <oandr@itec.cn.ua>\n"
+"Project-Id-Version: gqview-1.5.7\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2005-02-01 13:40+0400\n"
+"Last-Translator: Sergey Pinaev <dfo@antex.ru>\n"
+"Language-Team: Russian <ru@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=koi8-r\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/config.c:307
-msgid "GQview configuration"
-msgstr "ëÏÎÆÉÇÕÒÁÃÉÑ GQview"
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr "ìÀÂÉÍÏÅ"
 
-#: src/config.c:319
-msgid "Ok"
-msgstr "Ok"
+#: src/bar_info.c:31
+msgid "Todo"
+msgstr "äÏÄÅÌÁÔØ"
 
-#: src/config.c:324
-msgid "Apply"
-msgstr "ðÒÉÍÅÎÉÔØ"
+#: src/bar_info.c:32
+msgid "People"
+msgstr "ìÀÄÉ"
 
-#: src/config.c:329 src/utildlg.c:145 src/utilops.c:444 src/utilops.c:754
-#: src/utilops.c:885 src/utilops.c:983
-msgid "Cancel"
-msgstr "ïÔÍÅÎÁ"
+#: src/bar_info.c:33
+msgid "Places"
+msgstr "íÅÓÔÁ"
 
-#: src/config.c:343
-msgid "General"
-msgstr "ïÂÝÉÅ"
+#: src/bar_info.c:34
+msgid "Art"
+msgstr "éÓËÕÓÓÔ×Ï"
 
-#: src/config.c:351
-msgid "Initial directory"
-msgstr "éÓÈÏÄÎÙÊ ËÁÔÁÌÏÇ"
+#: src/bar_info.c:35
+msgid "Nature"
+msgstr "ðÒÉÒÏÄÁ"
 
-#: src/config.c:361
-msgid "On startup, change to this directory:"
-msgstr "ðÒÉ ÓÔÁÒÔÅ, ÉÚÍÅÎÉÔØ ÎÁ ËÁÔÁÌÏÇ:"
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr "óÏÂÓÔ×ÅÎÎÏÓÔØ"
 
-#: src/config.c:373
-msgid "Use current"
-msgstr "éÓÐÏÌØÚÏ×ÁÔØ ÔÅËÕÝÉÊ"
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr "ðÒÅÄÕÓÔÁÎÏ×ËÉ ËÌÀÞÅ×ÙÈ ÓÌÏ×"
 
-#: src/config.c:379
-msgid "Confirm file delete"
-msgstr "ðÏÄÔ×ÅÒÖÄÁÔØ ÕÄÁÌÅÎÉÅ ÆÁÊÌÏ×"
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr "óÐÉÓÏË ÌÀÂÉÍÙÈ ËÌÀÞÅ×ÙÈ ÓÌÏ×"
 
-#: src/config.c:381
-msgid "Remember tool state (float/hidden)"
-msgstr "ðÏÍÎÉÔØ ÒÁÓÐÏÌÏÖÅÎÉÅ ÉÎÓÔÒÕÍÅÎÔÏ× (Ó×ÏÂÏÄÎÏÅ/ÐÒÉËÒÅÐÌÅÎÎÏÅ)"
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr "ëÌÀÞÅ×ÙÅ ÓÌÏ×Á"
 
-#: src/config.c:383
-msgid "Remember window positions"
-msgstr "ðÏÍÎÉÔØ ÒÁÓÐÏÌÏÖÅÎÉÅ ÏËÎÁ"
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "éÍÑ ÆÁÊÌÁ:"
 
-#: src/config.c:385
-msgid "Slide show"
-msgstr "ðÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×"
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "÷ÒÅÍÑ ÆÁÊÌÁ:"
 
-#: src/config.c:398
-msgid "Delay before image change (seconds):"
-msgstr "ðÁÕÚÁ ÐÅÒÅÄ ÓÍÅÎÏÊ ËÁÒÔÉÎËÉ (ÓÅËÕÎÙ):"
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr "ëÌÀÞÅ×ÙÅ ÓÌÏ×Á"
 
-#: src/config.c:411
-msgid "Random"
-msgstr "óÌÕÞÁÊÎÏ"
+#: src/bar_info.c:1095
+msgid "Comment:"
+msgstr "ëÏÍÍÅÎÔÁÒÉÊ:"
 
-#: src/config.c:413
-msgid "Repeat"
-msgstr "ðÏ×ÔÏÒÑÔØ × ÃÉËÌÅ"
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr "òÅÄÁËÔÉÒÏ×ÁÎÉÅ ÓÐÉÓËÁ ÌÀÂÉÍÙÈ ËÌÀÞÅ×ÙÈ ÓÌÏ×"
 
-#: src/config.c:420
-msgid "Image"
-msgstr "éÚÏÂÒÁÖÅÎÉÅ"
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr "äÏÂÁ×ÉÔØ ËÌÀÞÅ×ÙÅ ÓÌÏ×Á × ×ÙÂÒÁÎÎÙÅ ÆÁÊÌÙ"
 
-#: src/config.c:428
-msgid "When new image is selected:"
-msgstr "ðÒÉ ×ÙÂÏÒÅ ÎÏ×ÏÇÏ ÉÚÏÂÒÁÖÅÎÉÑ:"
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr "äÏÂÁ×ÉÔØ ËÌÀÞÅ×ÙÅ ÓÌÏ×Á × ×ÙÂÒÁÎÎÙÅ ÆÁÊÌÙ, ÚÁÍÅÎÑÑ ÓÕÝÅÓÔ×ÕÀÝÉÅ"
 
-#: src/config.c:438
-msgid "Zoom to original size"
-msgstr "íÁÛÔÁÂÉÒÏ×ÁÔØ Ë ÒÁÚÍÅÒÕ ÏÒÉÇÉÎÁÌÁ"
+#: src/bar_info.c:1130
+msgid "Save comment now"
+msgstr "óÏÈÒÁÎÉÔØ ËÏÍÍÅÎÔÁÒÉÊ ÓÅÊÞÁÓ"
 
-#: src/config.c:444 src/img-view.c:306 src/menu.c:473 src/menu.c:547
-#: src/menu.c:587 src/menu.c:678
-msgid "Fit image to window"
-msgstr "ë ÒÁÚÍÅÒÕ ÏËÎÁ"
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "ðÏÌÅ"
 
-#: src/config.c:450
-msgid "Leave Zoom at previous setting"
-msgstr "éÓÐÏÌØÚÏ×ÁÔØ ÐÏÓÌÅÄÎÉÊ ÚÁÄÁÎÎÙÊ ÍÁÛÔÁÂ"
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "éÍÑ"
 
-#: src/config.c:457
-msgid "Fit window to image when tools are hidden/floating"
-msgstr ""
-"ðÏÄÂÉÒÁÔØ ÒÁÚÍÅÒÙ ÏËÎÁ Ë ÉÚÏÂÒÁÖÅÎÉÀ   \n"
-"ËÏÇÄÁ ÉÎÓÔÒÕÍÅÎÔÙ ÐÒÉËÒÅÐÌÅÎÎÙ/Ó×ÏÂÏÄÎÙ"
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "úÎÁÞÅÎÉÅ"
 
-#: src/config.c:464
-msgid "Limit size when auto-sizing window"
-msgstr "ïÇÒÁÎÉÞÉÔØ ÒÁÚÍÅÒ auto-ÒÁÚÍÅÒÎÏÇÏ ÏËÎÁ"
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "æÏÒÍÁÔ"
 
-#: src/config.c:474 src/menu.c:477
-msgid "Thumbnails"
-msgstr "üËÓËÉÚÙ"
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "üÌÅÍÅÎÔÙ"
 
-#: src/config.c:490
-msgid "Size:"
-msgstr "òÁÚÍÅÒ:"
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "ïÐÉÓÁÎÉÅ"
 
-#: src/config.c:519
-msgid "Cache thumbnails"
-msgstr "ëÜÛÉÒÏ×ÁÔØ ÜËÓËÉÚÙ"
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "äÁÎÎÙÅ Exif"
 
-#: src/config.c:521
-msgid "Use xvpics thumbnails when found (read only)"
-msgstr "éÓÐÏÌØÚÏ×ÁÔØ ÜËÓËÉÚÙ ÏÔ xvpics, ÅÓÌÉ ÎÁÊÄÅÎÙ (ÔÏÌØËÏ ÞÔÅÎÉÅ)"
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "òÁÓÛÉÒÅÎÎÙÊ ×ÉÄ"
 
-#: src/config.c:524
-msgid "Progressive keyboard scrolling"
+#: src/bar_sort.c:218
+msgid "Unlink failed"
+msgstr "õÄÁÌÅÎÉÅ ÓÓÙÌËÉ ÎÅ ÕÄÁÌÏÓØ"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr "óÏÚÄÁÎÉÅ ÓÓÙÌËÉ ÎÅ ÕÄÁÌÏÓØ"
+
+#: src/bar_sort.c:435
+#, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
 msgstr ""
+"ëÏÌÌÅËÃÉÑ:\n"
+"%s\n"
+"ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ."
 
-#: src/config.c:526
-msgid "Mouse wheel scrolls image"
+#: src/bar_sort.c:436
+msgid "Collection exists"
+msgstr "ëÏÌÌÅËÃÉÑ ceotcndetn"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
 msgstr ""
+"îÅ ÕÄÁÌÏÓØ ÓÏÈÒÁÎÉÔØ ËÏÌÌÅËÃÉÀ:\n"
+"%s"
 
-#: src/config.c:533
-msgid "Filtering"
-msgstr "æÉÌØÔÒÁÃÉÑ"
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "îÅ ÕÄÁÌÏÓØ ÓÏÈÒÁÎÉÔØ"
 
-#: src/config.c:542
-msgid "Show entries that begin with a dot"
-msgstr "ðÏËÁÚÙ×ÁÔØ ÆÁÊÌÙ ÎÁÞÉÎÁÀÝÉÅÓÑ Ó ÔÏÞËÉ"
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "äÏÂÁ×ÉÔØ ÚÁËÌÁÄËÕ"
 
-#: src/config.c:544
-msgid "Disable File Filtering"
-msgstr "úÁÐÒÅÔÉÔØ æÉÌØÔÒÁÃÉÀ æÁÊÌÁ"
+#: src/bar_sort.c:489
+msgid "Add Collection"
+msgstr "äÏÂÁ×ÉÔØ ËÏÌÌÅËÃÉÀ"
 
-#: src/config.c:546
-msgid "Include files of type:"
-msgstr "÷ËÌÀÞÁÔØ ÆÁÊÌÙ ÔÉÐÁ:"
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "éÍÑ:"
 
-#: src/config.c:596
-msgid "Custom file types:"
-msgstr "É/ÉÌÉ Ó×ÏÊ ÔÉРÆÁÊÌÁ:"
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "íÅÎÅÄÖÅÒ ÓÏÒÔÉÒÏ×ËÉ"
 
-#: src/config.c:609
-msgid "format: [.foo;.bar]"
-msgstr "ÆÏÒÍÁÔ: [.foo;.bar]"
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "ðÁÐËÉ"
 
-#: src/config.c:618
-msgid "External Editors"
-msgstr "÷ÎÅÛÎÉÅ òÅÄÁËÔÏÒÙ"
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "ëÏÌÌÅËÃÉÉ"
 
-#: src/config.c:630
-msgid "#"
-msgstr ""
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "ëÏÐÉÒÏ×ÁÔØ"
 
-#: src/config.c:633
-msgid "Menu name"
-msgstr "éÍÑ × ÍÅÎÀ"
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "ðÅÒÅÍÅÓÔÉÔØ"
 
-#: src/config.c:636
-msgid "Command Line"
-msgstr "ëÏÍÍÁÎÄÎÁÑ ÓÔÒÏËÁ"
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr "óÏÚÄÁÔØ ÓÓÙÌËÕ"
 
-#: src/config.c:666 src/menu.c:500
-msgid "About"
-msgstr "ï ÐÒÏÇÒÁÍÍÅ..."
+#: src/bar_sort.c:610
+msgid "Add image"
+msgstr "äÏÂÁ×ÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ"
 
-#: src/config.c:682
-#, c-format
-msgid ""
-"GQview %s\n"
-"\n"
-"Copyright (c) 2000 by John Ellis\n"
-"http://gqview.sorceforge.net\n"
-"or http://gqview.netpedia.net\n"
-"gqview@email.com\n"
-"\n"
-"Released under the GNU Public License"
-msgstr ""
+#: src/bar_sort.c:617
+msgid "Add selection"
+msgstr "äÏÂÁ×ÉÔØ ×ÙÄÅÌÅÎÉÅ"
 
-#: src/filelist.c:51
-msgid " Slideshow"
-msgstr " ðÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×..."
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "ïÔÍÅÎÉÔØ ÐÏÓÌÅÄÎÅÅ ÉÚÏÂÒÁÖÅÎÉÅ"
 
-#: src/filelist.c:55
-#, c-format
-msgid "%d files (%d)%s"
-msgstr "%d ÆÁÊÌÏ× (%d)%s"
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "ÇÏÔÏ×Ï"
 
-#: src/filelist.c:57
-#, c-format
-msgid "%d files%s"
-msgstr "%d ÆÁÊÌÏ×%s"
+#: src/cache_maint.c:304
+msgid "Removing old metadata..."
+msgstr "õÄÁÌÑÅÍ ÓÔÁÒÙÅ ÍÅÔÁÄÁÎÎÙÅ..."
 
-#: src/filelist.c:1025
-msgid "Loading thumbs..."
-msgstr "úÁÇÒÕÚËÁ ÜËÓËÉÚÏ×"
+#: src/cache_maint.c:308
+msgid "Clearing cached thumbnails..."
+msgstr "ïÞÉÝÁÅÍ ËÅÛÉÒÏ×ÁÎÙÅ ÉËÏÎËÉ..."
 
-#: src/image.c:66
-#, c-format
-msgid "( ? x ? ) %d bytes"
-msgstr "( ? x ? ) %d ÂÁÊÔ"
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+msgid "Removing old thumbnails..."
+msgstr "õÄÁÌÑÅÍ ÓÔÁÒÙÅ ÉËÏÎËÉ..."
 
-#: src/image.c:68
-#, c-format
-msgid "( %d x %d ) %d bytes"
-msgstr "( %d x %d ) %d ÂÁÊÔ"
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr "õÐÒÁ×ÌÅÎÉÅ"
 
-#: src/img-main.c:247
-msgid "GQview full screen"
-msgstr "GQview ÎÁ ×ÅÓØ ÜËÒÁÎ"
+#: src/cache_maint.c:792 src/utilops.c:904
+msgid "Invalid folder"
+msgstr "îÅÐÒÁ×ÉÌØÎÙÊ ËÁÔÁÌÏÇ"
 
-#: src/img-view.c:303 src/menu.c:470 src/menu.c:544 src/menu.c:584
-#: src/menu.c:674
-msgid "Zoom in"
-msgstr "íÁÓÛÔÁ +"
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr "÷ÙÂÒÁÎÙÊ ËÁÔÁÌÏÇ ÎÅ ÍÏÖÅÔ ÂÙÔØ ÎÁÊÄÅÎ."
 
-#: src/img-view.c:304 src/menu.c:471 src/menu.c:545 src/menu.c:585
-#: src/menu.c:676
-msgid "Zoom out"
-msgstr "íÁÓÛÔÁ -"
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+msgid "Create thumbnails"
+msgstr "óÏÚÄÁÎÉÅ ÉËÏÎÏË"
 
-#: src/img-view.c:305 src/menu.c:472 src/menu.c:546 src/menu.c:586
-msgid "Zoom 1:1"
-msgstr "íÁÓÛÔÁ 1:1"
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+msgid "S_tart"
+msgstr "_îÁÞÁÔØ"
 
-#. edit menu
-#: src/img-view.c:309 src/menu.c:457 src/menu.c:519 src/menu.c:550
-#: src/menu.c:590
-msgid "Edit"
-msgstr "ðÒÁ×ËÁ"
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "ðÁÐËÁ:"
 
-#: src/img-view.c:314 src/menu.c:446 src/menu.c:526 src/menu.c:557
-#: src/menu.c:595
-msgid "Copy..."
-msgstr "ëÏÐÉÒÏ×ÁÔØ..."
+#: src/cache_maint.c:845
+msgid "Select folder"
+msgstr "÷ÙÂÒÁÔØ ËÁÔÁÌÏÇ"
 
-#: src/img-view.c:315 src/menu.c:447 src/menu.c:527 src/menu.c:558
-#: src/menu.c:596
-msgid "Move..."
-msgstr "ðÅÒÅÍÅÓÔÉÔØ..."
+#: src/cache_maint.c:849
+msgid "Include subfolders"
+msgstr "÷ËÌÀÞÁÔØ ÐÏÄËÁÔÁÌÏÇÉ"
 
-#: src/img-view.c:316 src/menu.c:448 src/menu.c:528 src/menu.c:559
-#: src/menu.c:597
-msgid "Rename..."
-msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ..."
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr "óÏÈÒÁÎÑÔØ ÉËÏÎËÉ ÔÁÍ ÖÅ, ÇÄÅ É ÉÓÈÏÄÎÙÅ ÉÚÏÂÒÁÖÅÎÉÑ"
 
-#: src/img-view.c:317 src/menu.c:449 src/menu.c:529 src/menu.c:560
-#: src/menu.c:598
-msgid "Delete..."
-msgstr "õÄÁÌÉÔØ..."
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr "ÎÁÖÍÉÔÅ ÎÁÞÁÔØ ÄÌÑ ÚÁÐÕÓËÁ"
 
-#: src/img-view.c:320
-msgid "Close window"
-msgstr "úÁËÒÙÔØ ÏËÎÏ"
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "×ÙÐÏÌÎÑÀ..."
 
-#: src/main.c:90 src/main.c:119
-#, c-format
-msgid "GQview running: %s\n"
-msgstr "GQview ×ÙÐÏÌÎÑÅÔ: %s\n"
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "ïÞÉÝÁÅÍ ÉËÏÎËÉ..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "ïÞÉÓÔÉÔØ ËÜÛ"
 
-#: src/main.c:330
+#: src/cache_maint.c:1113
 msgid ""
-"Usage: gqview [options] [path]\n"
-"\n"
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
 msgstr ""
-"éÓÐÏÌØÚÏ×ÁÎÉÅ: gqview [ÐÁÒÁÍÅÔÒÙ] [ÐÕÔØ]\n"
-"\n"
+"üÔÏ ÏÐÅÒÁÃÉÑ ÕÄÁÌÉÔ ×ÓÅ ÉËÏÎËÉ, ËÏÔÏÒÙÅ\n"
+"ÂÙÌÉ ÓÏÈÒÁÎÅÎÙ ÎÁ ÄÉÓË, ÐÒÏÄÏÌÖÉÔØ?"
 
-#: src/main.c:331
-msgid "valid options are:\n"
-msgstr "ÄÏÐÕÓÔÉÍÙÅ ÐÁÒÁÍÅÔÒÙ:\n"
+#: src/cache_maint.c:1163
+msgid "Cache Maintenance - GQview"
+msgstr "õÐÒÁ×ÌÅÎÉÅ ËÅÛÅÍ - GQview"
 
-#: src/main.c:332
-#, fuzzy
-msgid "  +t, --with-tools           force show of tools\n"
-msgstr "  +t, +tools                 ÐÏËÁÚÙ×ÁÔØ ÏËÎÏ ÉÎÓÔÒÕÍÅÎÔÏ×\n"
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr "õÐÒÁ×ÌÅÎÉÅ ËÅÛÅÍ É ÄÁÎÎÙÍÉ"
 
-#: src/main.c:333
-#, fuzzy
-msgid "  -t, --without-tools        force hide of tools\n"
-msgstr "  -t, -tools                 ÓÐÒÑÔÁÔØ ÏËÎÏ ÉÎÓÔÒÕÍÅÎÔÏ×\n"
+#: src/cache_maint.c:1177
+msgid "GQview thumbnail cache"
+msgstr "GQview ËÅÛ ÉËÏÎÏË"
 
-#: src/main.c:334
-#, fuzzy
-msgid "  -f, --fullscreen           start in full screen mode\n"
-msgstr "  -t, -tools                 ÓÐÒÑÔÁÔØ ÏËÎÏ ÉÎÓÔÒÕÍÅÎÔÏ×\n"
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+msgid "Location:"
+msgstr "íÅÓÔÏÐÏÌÏÖÅÎÉÅ:"
 
-#: src/main.c:335
-#, fuzzy
-msgid "  -s, --slideshow            start in slideshow mode\n"
-msgstr "  -t, -tools                 ÓÐÒÑÔÁÔØ ÏËÎÏ ÉÎÓÔÒÕÍÅÎÔÏ×\n"
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+msgid "Clean up"
+msgstr "ïÞÉÓÔÉÔØ"
 
-#: src/main.c:336
-#, fuzzy
-msgid "  --debug                    turn on debug output\n"
-msgstr "  -debug                     ×Ù×ÏÄÉÔØ ÏÔÌÁÄÏÞÎÕÀ ÉÎÆÏÒÍÁÃÉÀ\n"
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr "õÄÁÌÉÔØ ÏÓÉÒÏÔÅ×ÛÉÅ ÉÌÉ ÕÓÔÁÒÅ×ÛÉÅ ÉËÏÎËÉ"
 
-#: src/main.c:337
-#, fuzzy
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+msgid "Delete all cached thumbnails."
+msgstr "õÄÁÌÉÔØ ×ÓÅ ËÅÛÉÒÏ×ÁÎÙÅ ÉËÏÎËÉ."
+
+#: src/cache_maint.c:1197
+msgid "Shared thumbnail cache"
+msgstr "ïÂÝÉÊ ËÅÛ ÉËÏÎÏË"
+
+#: src/cache_maint.c:1220
+msgid "Render"
+msgstr "óÏÚÄÁÔØ"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr "óÏÚÄÁÔØ ÉËÏÎËÉ ÄÌÑ ×ÙÂÒÁÎÏÇÏ ËÁÔÁÌÏÇÁ"
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr "íÅÔÁÄÁÎÎÙÅ"
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr "õÄÁÌÉÔØ ÏÓÉÒÏÔÅ×ÛÉÅ ËÌÀÞÅ×ÙÅ ÓÌÏ×Á É ËÏÍÍÅÎÔÁÒÉÉ"
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "âÅÚÙÍÑÎÎÙÊ"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "âÅÚÙÍÑÎÎÙÊ (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - ËÏÌÌÅËÃÉÑ GQview"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "úÁËÒÙÔØ ËÏÌÌÅËÃÉÀ"
+
+#: src/collect.c:1103
 msgid ""
-"  -h, --help                 show this message\n"
-"\n"
+"Collection has been modified.\n"
+"Save first?"
 msgstr ""
-"  -help                      ÐÏËÁÚÁÔØ üôï ÓÏÏÂÝÅÎÉÅ\n"
-"\n"
+"ëÏÌÌÅËÃÉÑ ÂÙÌÁ ÉÚÍÅÎÅÎÁ.\n"
+"óÏÈÒÁÎÉÔØ ÓÎÁÞÁÌÁ?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr "_ïÔÍÅÎÉÔØ"
 
-#: src/main.c:342
+#: src/collect-dlg.c:58
 #, c-format
 msgid ""
-"invalid or ignored: %s\n"
-"Use -help for options\n"
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
 msgstr ""
-"ÎÅ×ÅÒÎÙÊ ÐÁÒÁÍÅÔÒ: %s\n"
-"îÁÂÅÒÉÔÅ gqview -help ÄÌÑ ÓÐÒÁ×ËÉ.\n"
+"õËÁÚÁÎÙÊ ÐÕÔØ:\n"
+"%s\n"
+"Ñ×ÌÑÅÔÓÑ ËÁÔÁÌÏÇÏÍ, Á ËÏÌÌÅËÃÉÉ - ÆÁÊÌÙ"
 
-#: src/main.c:369
-msgid "The Gimp"
-msgstr ""
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "îÅÐÒÁ×ÉÌØÎÏÅ ÉÍÑ ÆÁÊÌÁ"
 
-#: src/main.c:372
-msgid "Electric Eyes"
-msgstr ""
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ"
 
-#: src/main.c:375
-msgid "XV"
-msgstr ""
+#: src/collect-dlg.c:73
+msgid "Overwrite existing file?"
+msgstr "úÁÍÅÎÉÔØ ÓÕÝÅÓÔ×ÕÀÝÉÊ ÆÁÊÌ?"
 
-#: src/main.c:378
-msgid "Xpaint"
-msgstr ""
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+msgid "_Overwrite"
+msgstr "_ðÅÒÅÚÁÐÉÓÁÔØ"
 
-#: src/menu.c:373
-#, c-format
-msgid "in %s..."
-msgstr "× %s..."
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "óÏÈÒÁÎÉÔØ ËÏÌÌÅËÃÉÀ"
 
-#: src/menu.c:375
-msgid "in (unknown)..."
-msgstr "× (ÎÅÉÚ×ÅÓÔÎÏ)..."
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "ïÔËÒÙÔØ ËÏÌÌÅËÃÉÀ"
 
-#: src/menu.c:394
-msgid "Options..."
-msgstr "ëÏÎÆÉÇÕÒÁÃÉÑ..."
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "äÏÂÁ×ÉÔØ ËÏÌÌÅËÃÉÀ"
 
-#: src/menu.c:396
-msgid "Remove old thumbnails"
-msgstr "õÄÁÌÉÔØ ÓÔÁÒÙÅ ÜËÓËÉÚÙ"
+#: src/collect-dlg.c:185
+msgid "_Append"
+msgstr "_äÏÂÁ×ÉÔØ"
 
-#: src/menu.c:398 src/menu.c:410 src/menu.c:422
-msgid "Set as wallpaper"
-msgstr ""
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "æÁÊÌÙ ËÏÌÌÅËÃÉÊ"
 
-#. file menu
-#: src/menu.c:440
-msgid "File"
-msgstr "æÁÊÌ"
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "ëÏÌÌÅËÃÉÑ ÐÕÓÔÁÑ"
 
-#: src/menu.c:444
-msgid "Create Dir..."
-msgstr "óÏÚÄÁÔØ ËÁÔÁÌÏÇ..."
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "ôÅËÕÝÁÑ ËÏÌÌÅËÃÉÑ ÐÕÓÔÁÑ, ÓÏÈÒÁÎÅÎÉÅ ÏÔÍÅÎÅÎÏ."
 
-#: src/menu.c:451
-msgid "Exit"
-msgstr "÷ÙÈÏÄ"
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "ðÕÓÔÏ"
 
-#. view menu
-#: src/menu.c:466
-msgid "View"
-msgstr "ðÒÏÓÍÏÔÒ"
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d ÉÚÏÂÒÁÖÅÎÉÊ (%d)"
 
-#: src/menu.c:476 src/menu.c:563
-msgid "Full screen"
-msgstr "îÁ ×ÅÓØ ÜËÒÁÎ"
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d ÉÚÏÂÒÁÖÅÎÉÊ"
 
-#: src/menu.c:485
-msgid "Refresh Lists"
-msgstr "ïÂÎÏ×ÉÔØ ÓÐÉÓÏË ÆÁÊÌÏ×"
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "úÁÇÒÕÖÁÅÍ ÉËÏÎËÉ..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "ðÒ_ÏÓÍÏÔÒ"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "ðÒÏÓÍÏÔÒ × _ÎÏ×ÏÍ ÏËÎÅ"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "õÄ_ÁÌÉÔØ"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "äÏÂÁ×ÉÔØ ÉÚ ÓÐÉÓËÁ ÆÁÊÌÏ×"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "äÏÂÁ×ÉÔØ ÉÚ ËÏÌÌÅËÃÉÉ..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "÷ÙÄÅÌÉÔØ ×Ó£"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "óÎÑÔØ ×ÙÄÅÌÅÎÉÅ"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "_ó×ÏÊÓÔ×Á"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "_ëÏÐÉÒÏ×ÁÔØ..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "_ðÅÒÅÍÅÓÔÉÔØ..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "ðÅÒÅ_ÉÍÅÎÏ×ÁÔØ..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "_õÄÁÌÉÔØ..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "ðÏËÁÚÁÔØ _ÉÍÅÎÁ ÆÁÊÌÏ×"
+
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "_óÏÈÒÁÎÉÔØ ËÏÌÌÅËÃÉÀ"
+
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "óÏÈÒÁÎÉÔØ ËÏÌÌÅËÃÉÀ _ËÁË..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "îÁ_ÊÔÉ ÐÏ×ÔÏÒÑÀÝÉÅÓÑ..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+msgid "Print..."
+msgstr "ðÅÞÁÔØ..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+msgid "Dropped list includes folders."
+msgstr "óÐÉÓÏË ×ËÌÀÞÁÅÔ ËÁÔÁÌÏÇÉ."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "_äÏÂÁ×ÉÔØ ÓÏÄÅÒÖÉÍÏÅ"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "_òÅËÕÒÓÉ×ÎÏ ÄÏÂÁ×ÉÔØ ÓÏÄÅÒÖÉÍÏÅ"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+msgid "_Skip folders"
+msgstr "_ðÒÏÐÕÓÔÉÔØ ËÁÔÁÌÏÇÉ"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "ïÔÍÅÎÁ"
 
-#: src/menu.c:486
-msgid "(Un)Float file list"
-msgstr "(îÅ)ïÓ×ÏÂÏÄÉÔØ ÉÎÓÔÒÕÍÅÎÔÙ"
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "ðÅÒÅÔÁÝÉÔÅ ÆÁÊÌÙ ÄÌÑ ÉÈ ÓÒÁ×ÎÅÎÉÑ."
 
-#: src/menu.c:487 src/menu.c:562
-msgid "(Un)Hide file list"
-msgstr "îÅÔ/äÁ ÉÎÓÔÒÕÍÅÎÔÁÍ"
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d ÆÁÊÌÏ×"
 
-#: src/menu.c:490
-msgid "Toggle slideshow"
-msgstr "÷ËÌ/÷ÙËÌ. ÐÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×"
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d ÓÏ×ÐÁÄÅÎÉÊ ÎÁÊÄÅÎÏ × %d ÆÁÊÌÁÈ"
 
-#. help menu
-#: src/menu.c:496
-msgid "Help"
-msgstr "ðÏÍÏÝØ"
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[ÎÁÂÏÒ 1]"
 
-#: src/menu.c:523 src/menu.c:554
-msgid "View in new window"
-msgstr "ðÒÏÓÍÏÔÒ × ÎÏ×ÏÍ ÏËÎÅ"
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "úÁÇÒÕÖÁÅÍ ËÏÎÔÒÏÌØÎÙÅ ÓÕÍÍÙ..."
 
-#: src/menu.c:531
-msgid "Refresh"
-msgstr "ïÂÎÏ×ÉÔØ"
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "úÁÇÒÕÖÁÅÍ ÒÁÚÍÅÒÙ..."
 
-#: src/menu.c:601
-msgid "Exit full screen"
-msgstr "÷ÙÊÔÉ ÉÚ ÐÏÌÎÏÇÏ ÜËÒÁÎÁ"
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "úÁÇÒÕÖÁÅÍ ÄÁÎÎÙÅ ÐÏÄÏÂÉÑ..."
 
-#: src/menu.c:661
-msgid "Create thumbnails"
-msgstr "óÏÚÄÁÔØ ÜËÓËÉÚÙ"
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "óÒÁ×ÎÉ×ÁÅÍ..."
 
-#: src/menu.c:670
-msgid "Change to home directory"
-msgstr "ðÅÒÅÊÔÉ × ÄÏÍÁÛÎÉÊ ËÁÔÁÌÏÇ"
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "óÏÒÔÉÒÕÅÍ..."
 
-#: src/menu.c:672
-msgid "Refresh file list"
-msgstr "ïÂÎÏ×ÉÔØ ÓÐÉÓÏË ÆÁÊÌÏ×"
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "÷ÙÂÒÁÔØ ÐÏ×ÔÏÒÑÀÝÕÀÓÑ ÇÒÕÐÐÕ _1"
 
-#: src/menu.c:680
-msgid "Set zoom 1:1"
-msgstr "íÁÓÛÔÁ 1:1"
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "÷ÙÂÒÁÔØ ÐÏ×ÔÏÒÑÀÝÕÀÓÑ ÇÒÕÐÐÕ _2"
 
-#: src/menu.c:682
-msgid "Configure options"
-msgstr "ëÏÎÆÉÇÕÒÁÃÉÑ"
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "äÏÂÁ×ÉÔØ × ÎÏ×ÕÀ ËÏÌÌÅËÃÉÀ"
 
-#: src/menu.c:684
-msgid "Float Controls"
-msgstr "ÐÒÉËÒÅÐÉÔØ/Ó×ÏÂÏÄÉÔØ ÉÎÓÔÒÕÍÅÎÔÙ"
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "_ïÞÉÓÔÉÔØ"
 
-#: src/rcfile.c:132
-#, c-format
-msgid "error saving config file: %s\n"
-msgstr "ÏÛÉÂËÁ ÚÁÐÉÓÉ ÆÁÊÌÁ ËÏÎÆÉÇÕÒÁÃÉÉ: %s\n"
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "_úÁËÒÙÔØ ÏËÎÏ"
 
-#: src/thumb.c:127 src/thumb.c:151
+#: src/dupe.c:2382
 #, c-format
-msgid "create dir failed: %s\n"
-msgstr "ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ ÎÅÕÄÁÌÏÓØ: %s\n"
+msgid "%d files (set 2)"
+msgstr "%d ÆÁÊÌÏ× (ÎÁÂÏÒ 2)"
 
-#: src/thumb.c:233
-#, c-format
-msgid "Unable to delete dir: %s\n"
-msgstr "îÅÍÏÇÕ ÕÄÁÌÉÔØ ËÁÔÁÌÏÇ: %s\n"
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "òÁÚÍÅÒ"
 
-#: src/thumb.c:249
-#, c-format
-msgid "failed to delete:%s\n"
-msgstr "ÎÅÕÄÁÌÏÓØ ÕÄÁÌÉÔØ:%s\n"
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "äÁÔÁ"
 
-#: src/utildlg.c:68
-msgid "     Ok     "
-msgstr "     Ok     "
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "òÁÚÍÅÒÙ"
 
-#: src/utilops.c:166
-msgid "Source to copy matches destination"
-msgstr ""
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "ëÏÎÔÒÏÌØÎÁÑ ÓÕÍÍÁ"
 
-#: src/utilops.c:167
-#, fuzzy, c-format
-msgid ""
-"Unable to copy file:\n"
-"%s\n"
-"to itself."
-msgstr ""
-"îÅÍÏÇÕ ÓËÏÐÉÒÏ×ÁÔØ ÆÁÊÌ:\n"
-"%s\n"
-"×:\n"
-"%s"
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "ðÕÔØ"
 
-#: src/utilops.c:171
-msgid "Source to move matches destination"
-msgstr ""
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "ðÏÈÏÖÅÓÔØ (×ÙÓÏËÁÑ)"
 
-#: src/utilops.c:172
-#, fuzzy, c-format
-msgid ""
-"Unable to move file:\n"
-"%s\n"
-"to itself."
-msgstr ""
-"îÅÍÏÇÕ ÐÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ:\n"
-"%s\n"
-"×:\n"
-"%s"
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "ðÏÈÏÖÅÓÔØ"
 
-#: src/utilops.c:175 src/utilops.c:231 src/utilops.c:516
-msgid "Continue"
-msgstr "ðÒÏÄÏÌÖÉÔØ"
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "ðÏÈÏÖÅÓÔØ (ÎÉÚËÁÑ)"
 
-#: src/utilops.c:182
-#, c-format
-msgid ""
-"Overwrite file:\n"
-" %s\n"
-" with:\b %s"
-msgstr ""
-"æÁÊÌ Ó ÔÁËÉÍ ÉÍÅÎÅÍ ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ !\n"
-"ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ ?:\n"
-" %s\n"
-" ÆÁÊÌÏÍ:\b %s"
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "ðÏÈÏÖÅÓÔØ (ÚÁÄÁÎÎÁÑ)"
 
-#: src/utilops.c:183 src/utilops.c:289 src/utilops.c:651 src/utilops.c:835
-msgid "Overwrite file"
-msgstr "ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ"
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "ðÏÉÓË ÐÏ×ÔÏÒÑÀÝÉÈÓÑ - GQview"
 
-#: src/utilops.c:186
-msgid "Skip"
-msgstr "ðÒÏÐÕÓÔÉÔØ"
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "óÒÁ×ÎÉÔØ Ó:"
 
-#: src/utilops.c:187
-msgid "Yes to all"
-msgstr "äÁ ÄÌÑ ×ÓÅÈ"
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "óÒÁ×ÎÉÔØ ÐÏ:"
 
-#: src/utilops.c:188
-msgid "Yes"
-msgstr "äÁ"
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "éËÏÎËÉ"
 
-#: src/utilops.c:222 src/utilops.c:317
-msgid "Error copying file"
-msgstr "ïÛÉÂËÁ ËÏÐÉÒÏ×ÁÎÉÑ ÆÁÊÌÁ"
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "óÒÁ×ÎÉÔØ Ä×Á ÎÁÂÏÒÁ ÆÁÊÌÏ×"
 
-#: src/utilops.c:223
-#, c-format
-msgid ""
-"Unable to copy file:\n"
-"%sto:\n"
-"%s\n"
-" during multiple file copy."
-msgstr ""
-"îÅÍÏÇÕ ÓËÏÐÉÒÏ×ÁÔØ ÆÁÊÌ:\n"
-"%s ×:\n"
-"%s\n"
-" during multiple file copy."
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
 
-#: src/utilops.c:227 src/utilops.c:322
-msgid "Error moving file"
-msgstr "ïÛÉÂËÁ ÐÅÒÅÍÅÝÅÎÉÑ ÆÁÊÌÁ"
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
 
-#: src/utilops.c:228
-#, c-format
-msgid ""
-"Unable to move file:\n"
-"%sto:\n"
-"%s\n"
-" during multiple file move."
-msgstr ""
-"îÅÍÏÇÕ ÐÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ:\n"
-"%s ×:\n"
-"%s\n"
-" during multiple file move."
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
 
-#: src/utilops.c:282
-msgid "Source matches destination"
-msgstr ""
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "ðÏ×ÅÒÎÕÔØ jpeg ÐÏ ÞÁÓÏ×ÏÊ ÓÔÒÅÌËÅ"
 
-#: src/utilops.c:283
-msgid "Source and destination are the same, operation cancelled."
-msgstr ""
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "ðÏ×ÅÒÎÕÔØ jpeg ÐÒÏÔÉ× ÞÁÓÏ×ÏÊ ÓÔÒÅÌËÉ"
 
-#: src/utilops.c:288
-#, c-format
-msgid ""
-"Overwrite file:\n"
-"%s\n"
-" with:\n"
-"%s"
-msgstr ""
-"æÁÊÌ Ó ÔÁËÉÍ ÉÍÅÎÅÍ ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ !\n"
-"ðÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ ?:\n"
-"%s\n"
-" ÆÁÊÌÏÍ:\n"
-"%s"
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "ÏÓÔÁÎÁ×ÌÉ×ÁÀ..."
 
-#: src/utilops.c:292 src/utilops.c:654 src/utilops.c:838
-msgid "Overwrite"
-msgstr "ðÅÒÅÐÉÓÁÔØ"
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "òÅÄÁËÔÉÒÏ×ÁÔØ ÒÅÚÕÌØÔÁÔ ËÏÍÁÎÄÙ"
 
-#: src/utilops.c:318
+#: src/editors.c:134
 #, c-format
-msgid ""
-"Unable to copy file:\n"
-"%s\n"
-"to:\n"
-"%s"
-msgstr ""
-"îÅÍÏÇÕ ÓËÏÐÉÒÏ×ÁÔØ ÆÁÊÌ:\n"
-"%s\n"
-"×:\n"
-"%s"
+msgid "Output of %s"
+msgstr "÷Ù×ÏÄ %s"
 
-#: src/utilops.c:323
+#: src/editors.c:303
 #, c-format
 msgid ""
-"Unable to move file:\n"
+"Failed to run command:\n"
 "%s\n"
-"to:\n"
-"%s"
 msgstr ""
-"îÅÍÏÇÕ ÐÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ:\n"
+"îÅ ÍÏÇÕ ×ÙÐÏÌÎÉÔØ ËÏÍÁÎÄÕ:\n"
 "%s\n"
-"×:\n"
-"%s"
 
-#: src/utilops.c:367
-msgid "Invalid destination"
-msgstr "îÅÐÒÁ×ÉÌØÎÏÅ ÎÁÚÎÁÞÅÎÉÅ"
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "ÏÓÔÁÎÏ×ÌÅÎÏ ÐÏÌØÚÏ×ÁÔÅÌÅÍ"
 
-#: src/utilops.c:367
-msgid ""
-"When operating with multiple files, please select\n"
-" a directory, not file."
-msgstr ""
-"ëÏÇÄÁ ÏÐÅÒÁÃÉÑ ÐÒÏÉÚ×ÏÄÉÔÓÑ ÎÁÄ ÎÅÓËÏÌØËÉÍÉ ÆÁÊÌÁÍÉ,\n"
-" ÐÏÖÁÌÕÊÓÔÁ ÚÁÄÁÊÔÅ ËÁÔÁÌÏÇ, ÎÅ ÆÁÊÌ."
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "ÎÅÉÚ×ÅÓÔÎÏ"
 
-#: src/utilops.c:369
-msgid "Invalid directory"
-msgstr "îÅÐÒÁ×ÉÌØÎÙÊ ËÁÔÁÌÏÇ"
+#: src/exif.c:113
+msgid "top left"
+msgstr "Ó×ÅÒÈÕ ÓÌÅ×Á"
 
-#: src/utilops.c:369
-msgid "Please select an existing directory"
-msgstr "ðÏÖÁÌÕÊÓÔÁ ×ÙÂÅÒÉÔÅ ÓÕÝÅÓÔ×ÕÀÝÉÊ ËÁÔÁÌÏÇ"
+#: src/exif.c:114
+msgid "top right"
+msgstr "Ó×ÅÒÈÕ ÓÐÒÁ×Á"
 
-#: src/utilops.c:427
-msgid "GQview - copy"
-msgstr "GQview - ËÏÐÉÒÏ×ÁÎÉÅ"
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "ÓÎÉÚÕ ÓÐÒÁ×Á"
 
-#: src/utilops.c:428
-msgid "Copy"
-msgstr "ëÏÐÉÒÏ×ÁÔØ"
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "ÓÎÉÚÕ ÓÌÅ×Á"
 
-#: src/utilops.c:430
-#, c-format
-msgid ""
-"Copy file:\n"
-"%s\n"
-"to:"
-msgstr ""
-"ëÏÐÉÒÏ×ÁÔØ ÆÁÊÌ:\n"
-"%s\n"
-"×:"
+#: src/exif.c:117
+msgid "left top"
+msgstr "ÓÌÅ×Á Ó×ÅÒÈÕ"
 
-#: src/utilops.c:432
-#, c-format
-msgid ""
-"Copy multiple files from:\n"
-"%s\n"
-"to:"
-msgstr ""
-"ëÏÐÉÒÏ×ÁÔØ ×ÙÄÅÌÅÎÎÙÅ ÆÁÊÌÙ ÉÚ:\n"
-"%s\n"
-"×:"
+#: src/exif.c:118
+msgid "right top"
+msgstr "ÓÐÒÁ×Á Ó×ÅÒÈÕ"
 
-#: src/utilops.c:436
-msgid "GQview - move"
-msgstr "GQview - ÐÅÒÅÍÅÓÔÉÔØ"
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "ÓÐÒÁ×Á ÓÎÉÚÕ"
 
-#: src/utilops.c:437
-msgid "Move"
-msgstr "ðÅÒÅÍÅÓÔÉÔØ"
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "ÓÌÅ×Á ÓÎÉÚÕ"
 
-#: src/utilops.c:439
-#, c-format
-msgid ""
-"Move file:\n"
-"%s\n"
-"to:"
+#: src/exif.c:127
+msgid "inch"
+msgstr "ÄÀÊÍ"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "ÓÁÎÔÉÍÅÔÒ"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "ÓÒÅÄÎÉÊ"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "ÃÅÎÔÒÁÌØÎÏ-×Ú×ÅÛÅÎÎÙÊ"
+
+#: src/exif.c:142
+msgid "spot"
+msgstr "ÔÏÞÅÞÎÙÊ"
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr "ÍÎÏÇÏ-ÔÏÞÅÞÎÙÊ"
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr "ÍÎÏÇÏ-ÓÅÇÍÅÎÔÎÙÊ"
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "ÞÁÓÔÉÞÎÙÊ"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "ÄÒÕÇÏÊ"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "ÎÅ ÏÐÒÅÄÅÌÅÎÁ"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "ÒÕÞÎÁÑ"
+
+#: src/exif.c:153
+msgid "normal"
+msgstr "ÎÏÒÍÁÌØÎÁÑ"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "ÁÐÅÒÔÕÒÁ"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "ÚÁÔ×ÏÒ"
+
+#: src/exif.c:156
+msgid "creative"
+msgstr "Ô×ÏÒÞÅÓÔ×Ï"
+
+#: src/exif.c:157
+msgid "action"
+msgstr "ÄÅÊÓÔ×ÉÅ"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "ÐÏÒÔÒÅÔ"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "ÌÁÎÄÛÁÆÔ"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "ÄÎÅ×ÎÏÊ Ó×ÅÔ"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "ÆÌÕÏÒÅÓÃÅÎÔÎÙÊ"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "×ÏÌØÆÒÁÍ (ÒÁÓËÁÌÅÎÎÙÊ)"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "×ÓÐÙÛËÁ"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "ÎÅÔ"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "ÄÁ"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr "ÄÁ, ÎÅ ÏÂÎÁÒÕÖÅÎÎÙÊ ÓÔÒÏÂÏÍ"
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr "ÄÁ, ÏÂÎÁÒÕÖÅÎÎÙÊ ÓÔÒÏÂÏÍ"
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "ïÐÉÓÁÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "ïÒÉÅÎÔÁÃÉÑ"
+
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "á×ÔÏÒÓËÏÅ ÐÒÁ×Ï"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "ðÒÏÇÒÁÍÍÁ ÜËÓÐÏÚÉÃÉÉ"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "þÕ×ÓÔ×ÉÔÅÌØÎÏÓÔØ ISO"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "äÁÔÁ ÓßÅÍËÉ"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "äÁÔÁ ÏÃÉÆÒÏ×ËÉ"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "óËÏÒÏÓÔØ ÚÁÔ×ÏÒÁ"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "áÐÅÒÔÕÒÁ"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "óÍÅÝÅÎÉÅ ÜËÓÐÏÚÉÃÉÉ"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "òÁÓÓÔÏÑÎÉÅ ÄÏ ÏÂßÅËÔÁ"
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "íÅÔÏÄ ÉÚÍÅÒÅÎÉÑ"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "éÓÔÏÞÎÉË Ó×ÅÔÁ"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "÷ÓÐÙÛËÁ"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "æÏËÕÓÎÏÅ ÒÁÓÓÔÏÑÎÉÅ"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "ûÉÒÉÎÁ"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "÷ÙÓÏÔÁ"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "ëÁÍÅÒÁ"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "òÁÚÒÅÛÅÎÉÅ"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "ÂÅÓËÏÎÅÞÎÏÓÔØ"
+
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "ÒÅÖÉÍ:"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "×ËÌÀÞÅÎ"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "×ÙËÌÀÞÅÎ"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "Á×ÔÏÍÁÔÉÞÅÓËÉ"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr "ÎÅ ÏÂÎÁÒÕÖÅÎÏ ÓÔÒÏÂÏÍ"
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr "ÏÂÎÁÒÕÖÅÎÏ ÓÔÒÏÂÏÍ"
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "ÓÎÉÖÅÎÉÅ ÜÆÆÅËÔÁ ËÒÁÓÎÙÈ ÇÌÁÚ"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "ÔÏÞËÁ"
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d ÂÁÊÔ"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f ë"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f íÂ"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f çÂ"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview ÎÁ ×ÅÓØ ÜËÒÁÎ"
+
+#: src/fullscreen.c:397
+msgid "Full size"
+msgstr "ðÏÌÎÙÊ ÒÁÚÍÅÒ"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr "íÏÎÉÔÏÒ"
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr "üËÒÁÎ"
+
+#: src/fullscreen.c:644
+msgid "Stay above other windows"
+msgstr "òÁÓÐÏÌÁÇÁÔØÓÑ ÐÏ×ÅÒÈ ×ÓÅÈ ÏËÏÎ"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr "ïÐÒÅÄÅÌÑÅÔÓÑ ÍÅÎÅÄÖÅÒÏÍ ÏËÏÎ"
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr "áËÔÉ×ÎÙÊ ÜËÒÁÎ"
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr "áËÔÉ×ÎÙÊ ÍÏÎÉÔÏÒ"
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "íÁÓÛÔÁ _+"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "íÁÓÛÔÁ _-"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "íÁÓÛÔÁ _1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "íÁÓÛÔÁÂÉÒÏ×ÁÔØ Ë _ÒÁÚÍÅÒÕ ÏËÎÁ"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "_õÓÔÁÎÏ×ÉÔØ × ËÁÞÅÓÔ×Å ÏÂÏÅ×"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "_ïÓÔÁÎÏ×ÉÔØ ÐÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "_ðÒÏÄÏÌÖÉÔØ ÐÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "ðÒ_ÉÏÓÔÁÎÏ×ÉÔØ ÐÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "_îÁÞÁÔØ ÐÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "_÷ÙÊÔÉ ÉÚ ÐÏÌÎÏÇÏ ÜËÒÁÎÁ"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "îÁ ×ÅÓØ _ÜËÒÁÎ"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "_úÁËÒÙÔØ ÏËÎÏ"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "òÁÚÍÅÒ ÆÁÊÌÁ:"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "òÁÚÍÅÒÎÏÓÔØ:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "ðÒÏÚÒÁÞÎÏÓÔØ:"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "òÁÚÍÅÒ ÉÚÏÂÒÁÖÅÎÉÑ:"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "ëÏÜÆÆÉÃÉÅÎÔ ÓÖÁÔÉÑ:"
+
+#: src/info.c:368
+msgid "File type:"
+msgstr "ôÉРÆÁÊÌÁ:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "÷ÌÁÄÅÌÅÃ:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "çÒÕÐÐÁ:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "ïÂÝÉÅ"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "éÚÏÂÒÁÖÅÎÉÅ %d ÉÚ %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "ó×ÏÊÓÔ×Á ÉÚÏÂÒÁÖÅÎÉÑ - GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "ðÏ Õ×ÅÌÉÞÅÎÉÀ"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " ðÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " ðÒÉÏÓÔÁÎÏ×ÌÅÎÏ"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d ÆÁÊÌÏ× (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d ÆÁÊÌÏ×%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d ÆÁÊÌÏ×%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(ÎÅÔ ÐÒÁ× ÎÁ ÞÔÅÎÉÅ) %s ÂÁÊÔ"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s ÂÁÊÔ"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s ÂÁÊÔ"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview éÎÓÔÒÕÍÅÎÔÙ"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "éÎÓÔÒÕÍÅÎÔÙ"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "æÁÊÌÙ"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "éÚÏÂÒÁÖÅÎÉÅ"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(ÓÍÅÎÁ ÎÏÍÅÒÁ ÐÁÎÅÌÉ - ÐÅÒÅÔÑÇÉ×ÁÎÉÅÍ)"
+
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "óÐÒÑÔ_ÁÔØ ÓÐÉÓÏË ÆÁÊÌÏ×"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "× %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "× (ÎÅÉÚ×ÅÓÔÎÏ)..."
+
+#: src/layout_util.c:637
+msgid "empty"
+msgstr "ÐÕÓÔÏ"
+
+#: src/layout_util.c:748
+msgid "_File"
+msgstr "_æÁÊÌ"
+
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "ðÒ_Á×ËÁ"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "_éÚÍÅÎÉÔØ"
+
+#: src/layout_util.c:752
+msgid "_Help"
+msgstr "_ðÏÍÏÝØ"
+
+#: src/layout_util.c:754
+msgid "New _window"
+msgstr "îÏ×ÏÅ _ÏËÎÏ"
+
+#: src/layout_util.c:755
+msgid "_New collection"
+msgstr "_îÏ×ÁÑ ËÏÌÌÅËÃÉÑ"
+
+#: src/layout_util.c:756
+msgid "_Open collection..."
+msgstr "ïÔËÒ_ÙÔØ ËÏÌÌÅËÃÉÀ..."
+
+#: src/layout_util.c:757
+msgid "Open _recent"
+msgstr "ïÔËÒÙÔØ Î_ÅÄÁ×ÎÅÅ"
+
+#: src/layout_util.c:758
+msgid "_Search..."
+msgstr "_ðÏÉÓË..."
+
+#: src/layout_util.c:760
+msgid "_Print..."
+msgstr "ðÅ_ÞÁÔØ..."
+
+#: src/layout_util.c:761
+msgid "N_ew folder..."
+msgstr "îÏ×Á_Ñ ÐÁÐËÁ..."
+
+#: src/layout_util.c:767
+msgid "_Quit"
+msgstr "_÷ÙÈÏÄ"
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "ðÏ×ÅÒÎÕÔØ ÐÏ _ÞÁÓÏ×ÏÊ ÓÔÒÅÌËÅ"
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "ðÏ×ÅÒÎÕÔØ Ð_ÒÏÔÉ× ÞÁÓÏ×ÏÊ ÓÔÒÅÌËÉ"
+
+#: src/layout_util.c:781
+msgid "Rotate 1_80"
+msgstr "ðÏ×ÅÒÎÕÔØ ÎÁ 1_80"
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "_úÅÒËÁÌØÎÏ"
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "_ðÅÒÅ×ÅÒÎÕÔØ"
+
+#: src/layout_util.c:785
+msgid "Select _all"
+msgstr "÷ÙÄÅÌÉÔØ ×Ó_£"
+
+#: src/layout_util.c:786
+msgid "Select _none"
+msgstr "óÎÑÔØ ×_ÙÄÅÌÅÎÉÅ"
+
+#: src/layout_util.c:787
+msgid "P_references..."
+msgstr "_îÁÓÔÒÏÊËÉ..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr "õ_ÐÒÁ×ÌÅÎÉÅ ÉËÏÎËÁÍÉ"
+
+#: src/layout_util.c:794
+msgid "_Zoom to fit"
+msgstr "íÁÓÛÔÁ ˠÒÁÚÍÅÒÕ _ÏËÎÁ"
+
+#: src/layout_util.c:795
+msgid "F_ull screen"
+msgstr "ðÏÌÎÙÊ _ÜËÒÁÎ"
+
+#: src/layout_util.c:796
+msgid "_Hide file list"
+msgstr "óÐÒÑÔ_ÁÔØ ÓÐÉÓÏË ÆÁÊÌÏ×"
+
+#: src/layout_util.c:797
+msgid "Toggle _slideshow"
+msgstr "ðÅÒÅËÌÀÞÉÔØ ÐÒÏÓÍÏÔÒ ÓÌÁ_ÊÄÏ×"
+
+#: src/layout_util.c:798
+msgid "_Refresh"
+msgstr "ï_ÂÎÏ×ÉÔØ"
+
+#: src/layout_util.c:800
+msgid "_Contents"
+msgstr "_óÏÄÅÒÖÁÎÉÅ"
+
+#: src/layout_util.c:801
+msgid "_Keyboard shortcuts"
+msgstr "_çÏÒÑÞÉÅ ËÌÁ×ÉÛÉ"
+
+#: src/layout_util.c:802
+msgid "_Release notes"
+msgstr "_éÎÆÏÒÍÁÃÉÑ Ï ×ÅÒÓÉÉ"
+
+#: src/layout_util.c:803
+msgid "_About"
+msgstr "_ï ÐÒÏÇÒÁÍÍÅ..."
+
+#: src/layout_util.c:807
+msgid "_Thumbnails"
+msgstr "_ðÉËÔÏÇÒÁÍÍÙ"
+
+#: src/layout_util.c:808
+msgid "Tr_ee"
+msgstr "_äÅÒÅ×Ï"
+
+#: src/layout_util.c:809
+msgid "_Float file list"
+msgstr "ïÓ×ÏÂÏÄÉÔØ ÓÐÉÓÏË _ÆÁÊÌÏ×"
+
+#: src/layout_util.c:810
+msgid "Hide tool_bar"
+msgstr "óÐÒÑÔÁÔØ ÉÎÓ_ÔÒÕÍÅÎÔÙ"
+
+#: src/layout_util.c:811
+msgid "_Keywords"
+msgstr "ëÌ_ÀÞÅ×ÙÅ ÓÌÏ×Á"
+
+#: src/layout_util.c:812
+msgid "E_xif data"
+msgstr "äÁÎÎÙÅ _exif"
+
+#: src/layout_util.c:813
+msgid "Sort _manager"
+msgstr "_íÅÎÅÄÖÅÒ ÓÏÒÔÉÒÏ×ËÉ"
+
+#: src/layout_util.c:817
+msgid "_List"
+msgstr "_óÐÉÓÏË"
+
+#: src/layout_util.c:818
+msgid "I_cons"
+msgstr "é_ËÏÎËÉ"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "ðÏËÁÚÁÔØ ÉËÏÎËÉ"
+
+#: src/layout_util.c:1085
+msgid "Change to home folder"
+msgstr "ðÅÒÅÊÔÉ × ÄÏÍÁÛÎÉÊ ËÁÔÁÌÏÇ"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "ïÂÎÏ×ÉÔØ ÓÐÉÓÏË ÆÁÊÌÏ×"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "íÁÓÛÔÁ +"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "íÁÓÛÔÁ -"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "íÁÓÛÔÁÂÉÒÏ×ÁÔØ Ë ÒÁÚÍÅÒÕ ÏËÎÁ"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "íÁÓÛÔÁ 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "ëÏÎÆÉÇÕÒÁÃÉÑ"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "ÐÒÉËÒÅÐÉÔØ/ÏÓ×ÏÂÏÄÉÔØ ÉÎÓÔÒÕÍÅÎÔÙ"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "ðÏÍÏÝØ - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "ëÏÍÁÎÄÎÁÑ ÓÔÒÏËÁ"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+msgid "next image"
+msgstr "ÓÌÅÄÕÀÝÅÅ ÉÚÏÂÒÁÖÅÎÉÅ"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr "ÐÒÅÄÙÄÕÝÅÅ ÉÚÏÂÒÁÖÅÎÉÅ"
+
+#: src/main.c:529
+msgid "first image"
+msgstr "ÐÅÒ×ÏÅ ÉÚÏÂÒÁÖÅÎÉÅ"
+
+#: src/main.c:530
+msgid "last image"
+msgstr "ÐÏÓÌÅÄÎÅÅ ÉÚÏÂÒÁÖÅÎÉÅ"
+
+#: src/main.c:531
+msgid "toggle full screen"
+msgstr "ÐÅÒÅËÌÀÞÉÔØ ÐÏÌÎÏÜËÒÁÎÎÙÊ ÒÅÖÉÍ"
+
+#: src/main.c:532
+msgid "start full screen"
+msgstr "×ÏÊÔÉ × ÐÏÌÎÏÜËÒÁÎÎÙÊ ÒÅÖÉÍ"
+
+#: src/main.c:533
+msgid "stop full screen"
+msgstr "×ÙÊÔÉ ÉÚ ÐÏÌÎÏÜËÒÁÎÎÏÇÏ ÒÅÖÉÍÁ"
+
+#: src/main.c:534
+msgid "toggle slide show"
+msgstr "ÐÅÒÅËÌÀÞÉÔØ ÐÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×"
+
+#: src/main.c:535
+msgid "start slide show"
+msgstr "ÎÁÞÁÔØ ÐÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×"
+
+#: src/main.c:536
+msgid "stop slide show"
+msgstr "ÏÓÔÁÎÏ×ÉÔØ ÐÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×"
+
+#: src/main.c:537
+msgid "start recursive slide show"
+msgstr "ÎÁÞÁÔØ ÒÅËÕÒÓÉ×ÎÙÊ ÐÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr "ÕÓÔÁÎÏ×ÉÔØ ÚÁÄÅÒÖËÕ ÐÒÏÓÍÏÔÒÁ ÓÌÁÊÄÏ× (× ÓÅËÕÎÄÁÈ)"
+
+#: src/main.c:539
+msgid "show tools"
+msgstr "ÐÏËÁÚÁÔØ ÉÎÓÔÒÕÍÅÎÔÙ"
+
+#: src/main.c:540
+msgid "hide tools"
+msgstr "ÓÐÒÑÔÁÔØ ÉÎÓÔÒÕÍÅÎÔÙ"
+
+#: src/main.c:541
+msgid "quit"
+msgstr "×ÙÈÏÄ"
+
+#: src/main.c:542
+msgid "open file"
+msgstr "ÏÔËÒÙÔØ ÆÁÊÌ"
+
+#: src/main.c:543
+msgid "open file in new window"
+msgstr "ÏÔËÒÙÔØ ÆÁÊÌ × ÎÏ×ÏÍ ÏËÎÅ"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr "óÐÉÓÏË ËÏÍÁÎÄ ÕÄÁÌÅÎÎÏÇÏ ÄÏÓÔÕÐÁ:\n"
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr "õÄÁÌÅÎÎÙÊ GQview ÎÅ ÚÁÐÕÝÅÎ, ÚÁÐÕÓËÁÅÍ..."
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr "õÄÁÌÅÎÎÙÊ ÄÏÓÔÕРÎÅ ÄÏÓÔÕÐÅÎ\n"
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"éÓÐÏÌØÚÏ×ÁÎÉÅ: gqview [ÐÁÒÁÍÅÔÒÙ] [ÐÕÔØ]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "ÄÏÐÕÓÔÉÍÙÅ ÐÁÒÁÍÅÔÒÙ:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           ÐÏËÁÚÙ×ÁÔØ ÏËÎÏ ÉÎÓÔÒÕÍÅÎÔÏ×\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        ÓÐÒÑÔÁÔØ ÏËÎÏ ÉÎÓÔÒÕÍÅÎÔÏ×\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           ÚÁÐÕÓËÁÔØÓÑ × ÐÏÌÎÏÜËÒÁÎÎÏÍ ÒÅÖÉÍÅ\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            ÚÁÐÕÓËÁÔØÓÑ × ÒÅÖÉÍÅ ÐÏËÁÚÁ ÓÌÁÊÄÏ×\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+"  -l, --list                 ÏÔËÒÙÔØ ÏËÎÏ ËÏÌÌÅËÃÉÊ ÄÌÑ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ\n"
+
+#: src/main.c:951
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+"  -r, --remote               ÏÔÐÒÁ×ÉÔØ ÓÌÅÄÕÀÝÉÅ ËÏÍÁÎÄÙ × ÏÔËÒÙÔÏÅ ÏËÎÏ\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr "  -rh,--remote-help          ÐÏËÁÚÁÔØ ÓÐÉÓÏË ÕÄÁÌÅÎÎÙÈ ËÏÍÁÎÄ\n"
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    ×Ù×ÏÄÉÔØ ÏÔÌÁÄÏÞÎÕÀ ÉÎÆÏÒÍÁÃÉÀ\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              ÐÏËÁÚÁÔØ ÉÎÆÏÒÍÁÃÉÀ Ï ×ÅÒÓÉÉ\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 ÐÏËÁÚÁÔØ ÜÔÏ ÓÏÏÂÝÅÎÉÅ\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"ÎÅÐÒÁ×ÉÌØÎÏ ÉÌÉ ÉÇÎÏÒÉÒÏ×ÁÎÏ: %s\n"
+"éÓÐÏÌØÚÕÊÔÅ -help ÄÌÑ ÓÐÉÓËÁ ÐÁÒÁÍÅÔÒÏ×.\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "óÏÚÄÁÅÍ ËÁÔÁÌÏÇ GQview%s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "îÅ ÍÏÇÕ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ:%s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "äÏÍÁÛÎÉÊ ËÁÔÁÌÏÇ"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "äÅÓËÔÏÐ"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - ×ÙÈÏÄ"
+
+#: src/main.c:1156
+msgid "Quit GQview"
+msgstr "÷ÙÊÔÉ ÉÚ GQview"
+
+#: src/main.c:1156
+msgid "Collections have been modified. Quit anyway?"
+msgstr "ëÏÌÌÅËÃÉÉ ÂÙÌÉ ÉÚÍÅÎÅÎÙ. ÷ÓÅ ÒÁ×ÎÏ ×ÙÊÔÉ?"
+
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "óÏÒÔÉÒÏ×ËÁ ÐÏ ÒÁÚÍÅÒÕ"
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "óÏÒÔÉÒÏ×ËÁ ÐÏ ÄÁÔÅ"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "âÅÚ ÓÏÒÔÉÒÏ×ËÉ"
+
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "óÏÒÔÉÒÏ×ËÁ ÐÏ ÐÕÔÉ"
+
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "óÏÒÔÉÒÏ×ËÁ ÐÏ ÎÏÍÅÒÕ"
+
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "óÏÒÔÉÒÏ×ËÁ ÐÏ ÉÍÅÎÉ"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "óÏÒÔÉÒÏ×ËÁ"
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "ðÏ×ÅÒÎÕÔØ ÎÁ _180"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "âÌÉÖÁÊÛÉÊ (ÈÕÄÛÉÊ, ÎÏ ÂÙÓÔÒÙÊ)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "ðÌÉÔËÉ"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "âÉÌÉÎÅÊÎÙÊ"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "çÉÐÅÒ (ÌÕÞÛÉÊ, ÎÏ ÍÅÄÌÅÎÎÙÊ)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "îÅÔ"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "îÏÒÍÁÌØÎÙÊ"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "ìÕÞÛÉÊ"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr "÷ÙÂÒÁÎÙÊ"
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "óÂÒÏÓÉÔØ ÆÉÌØÔÒÙ"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"æÉÌØÔÒÙ ÂÕÄÕÔ ÓÂÒÏÛÅÎÙ × ÐÅÒ×ÏÎÁÞÁÌØÎÏÅ ÓÏÓÔÏÑÎÉÅ.\n"
+"ðÒÏÄÏÌÖÉÔØ ?"
+
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "óÂÒÏÓÉÔØ ÒÅÄÁËÔÏÒÙ"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"ëÏÍÁÎÄÙ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ ÂÕÄÕÔ ÓÂÒÏÛÅÎÙ × ÐÅÒ×ÏÎÁÞÁÌØÎÏÅ ÓÏÓÔÏÑÎÉÅ.\n"
+"ðÒÏÄÏÌÖÉÔØ ?"
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "ïÞÉÓÔÉÔØ ËÏÒÚÉÎÕ"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "óÏÄÅÒÖÉÍÏÅ ËÏÒÚÉÎÙ ÂÕÄÅÔ ÕÄÁÌÅÎÏ."
+
+#: src/preferences.c:770
+msgid "GQview Preferences"
+msgstr "GQview îÁÓÔÒÏÊËÉ"
+
+#: src/preferences.c:824
+msgid "Startup"
+msgstr "ðÒÉ ÚÁÐÕÓËÅ"
+
+#: src/preferences.c:826
+msgid "Change to folder:"
+msgstr "ðÅÒÅÊÔÉ × ËÁÔÁÌÏÇ:"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "éÓÐÏÌØÚÏ×ÁÔØ ÔÅËÕÝÉÊ"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "òÁÚÍÅÒ:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "ëÁÞÅÓÔ×Ï:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "ëÜÛÉÒÏ×ÁÔØ ÉËÏÎËÉ"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr "éÓÐÏÌØÚÏ×ÁÔØ ÏÂÛÉÊ ËÅÛ ÉËÏÎÏË"
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "ëÜÛÉÒÏ×ÁÔØ ÉËÏÎËÉ × .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "éÓÐÏÌØÚÏ×ÁÔØ ÉËÏÎËÉ ÏÔ xvpics, ÅÓÌÉ ÎÁÊÄÅÎÙ (ÔÏÌØËÏ ÞÔÅÎÉÅ)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "ðÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×"
+
+#: src/preferences.c:867
+msgid "Delay between image change:"
+msgstr "ðÁÕÚÁ ÐÅÒÅÄ ÓÍÅÎÏÊ ËÁÒÔÉÎËÉ:"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr "ÓÅËÕÎÄ"
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "óÌÕÞÁÊÎÏ"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "ðÏ×ÔÏÒÑÔØ × ÃÉËÌÅ"
+
+#: src/preferences.c:884
+msgid "Zoom"
+msgstr "íÁÓÛÔÁÂ"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "íÅÔÏÄ ÒÁÚÍÙ×ÁÎÉÑ:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "ä×ÕÈÐÒÏÈÏÄÎÏÅ ÍÁÓÛÔÁÂÉÒÏ×ÁÎÉÅ"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "òÁÚÒÅÛÉÔØ Õ×ÅÌÉÞÅÎÉÅ ÉÚÏÂÒÁÖÅÎÉÑ ÐÒÉ ÍÁÓÛÔÁÂÉÒÏ×ÁÎÉÉ Ë ÒÁÚÍÅÒÕ ÏËÎÁ."
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "õ×ÅÌÉÞÅÎÉÅ ÍÁÓÛÔÁÂÁ:"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "ðÒÉ ×ÙÂÏÒÅ ÎÏ×ÏÇÏ ÉÚÏÂÒÁÖÅÎÉÑ:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "íÁÓÛÔÁÂÉÒÏ×ÁÔØ Ë ÒÁÚÍÅÒÕ ÏÒÉÇÉÎÁÌÁ"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "éÓÐÏÌØÚÏ×ÁÔØ ÐÏÓÌÅÄÎÉÊ ÚÁÄÁÎÎÙÊ ÍÁÓÛÔÁÂ"
+
+#: src/preferences.c:917
+msgid "Appearance"
+msgstr "÷ÎÅÛÎÉÊ ×ÉÄ"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "÷Ù×ÏÄÉÔØ ÉÚÏÂÒÁÖÅÎÉÑ ÎÁ ÞÅÒÎÏÍ ÆÏÎÅ"
+
+#: src/preferences.c:922
+msgid "Convenience"
+msgstr "õÄÏÂÓÔ×Á"
+
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "ïÂÎÏ×ÉÔØ ÐÒÉ ÉÚÍÅÎÅÎÉÉ ÆÁÊÌÁ"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "úÁÒÁÎÅÅ ÚÁÇÒÕÖÁÔØ ÓÌÅÄÕÀÝÅÅ ÉÚÏÂÒÁÖÅÎÉÅ"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "á×ÔÏÍÁÔÉÞÅÓËÉ ×ÒÁÝÁÔØ ÉÚÏÂÒÁÖÅÎÉÅ ÐÏ ÉÎÆÏÒÍÁÃÉÉ Exif"
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "ïËÎÁ"
+
+#: src/preferences.c:940
+msgid "State"
+msgstr "óÏÓÔÏÑÎÉÅ"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "ðÏÍÎÉÔØ ÒÁÓÐÏÌÏÖÅÎÉÅ ÏËÏÎ"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "ðÏÍÎÉÔØ ÒÁÓÐÏÌÏÖÅÎÉÅ ÉÎÓÔÒÕÍÅÎÔÏ× (Ó×ÏÂÏÄÎÏÅ/ÓÐÒÑÔÁÎÎÏÅ)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr ""
+"ðÏÄÂÉÒÁÔØ ÒÁÚÍÅÒÙ ÏËÎÁ Ë ÉÚÏÂÒÁÖÅÎÉÀ\n"
+"ËÏÇÄÁ ÉÎÓÔÒÕÍÅÎÔÙ ÓÐÒÑÔÁÎÙ/Ó×ÏÂÏÄÎÙ"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "ïÇÒÁÎÉÞÉ×ÁÔØ ÒÁÚÍÅÒ ÐÒÉ Á×ÔÏ-ÐÏÄÂÏÒÅ ÒÁÚÍÅÒÁ ÏËÎÁ (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "òÁÚÍÅÝÅÎÉÅ"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "æÉÌØÔÒÁÃÉÑ"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "ðÏËÁÚÙ×ÁÔØ ÆÁÊÌÙ ÎÁÞÉÎÁÀÝÉÅÓÑ Ó ÔÏÞËÉ"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "þÕ×ÓÔ×ÉÔÅÌØÎÁÑ Ë ÒÅÇÉÓÔÒÕ ÓÏÒÔÉÒÏ×ËÁ"
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "úÁÐÒÅÔÉÔØ æÉÌØÔÒÁÃÉÀ æÁÊÌÏ×"
+
+#: src/preferences.c:986
+msgid "File types"
+msgstr "ôÉÐÙ ÆÁÊÌÏ×"
+
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "æÉÌØÔÒ"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "óÂÒÏÓÉÔØ"
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "òÅÄÁËÔÏÒÙ"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "éÍÑ × ÍÅÎÀ"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "òÁÓÛÉÒÅÎÎÙÅ"
+
+#: src/preferences.c:1138
+msgid "Full screen"
+msgstr "ðÏÌÎÙÊ ÜËÒÁÎ"
+
+#: src/preferences.c:1146
+msgid "Smooth image flip"
+msgstr "óÇÌÁÖÅÎÙÊ ÐÏ×ÏÒÏÔ ÉÚÏÂÒÁÖÅÎÉÑ"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr "ïÔËÌÀÞÉÔØ ÈÒÁÎÉÔÅÌØ ÜËÒÁÎÁ"
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "õÄÁÌÉÔØ"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "ðÏÄÔ×ÅÒÖÄÁÔØ ÕÄÁÌÅÎÉÅ ÆÁÊÌÏ×"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "÷ËÌÀÞÉÔØ ËÎÏÐËÕ Delete"
+
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "âÅÚÏÐÁÓÎÏÅ ÕÄÁÌÅÎÉÅ"
+
+#: src/preferences.c:1176
+msgid "Maximum size:"
+msgstr "íÁËÓÉÍÁÌØÎÙÊ ÒÁÚÍÅÒ:"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr "íâ"
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "ðÒÏÓÍÏÔÒ"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr "ðÏ×ÅÄÅÎÉÅ"
+
+#: src/preferences.c:1191
+msgid "Rectangular selection in icon view"
+msgstr "ðÒÑÍÏÕÇÏÌØÎÏÅ ×ÙÄÅÌÅÎÉÅ × ÐÒÏÓÍÏÔÒÅ ÉËÏÎÏË"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "òÁÚ×ÏÒÁÞÉ×ÁÔØ ÓÏÄÅÒÖÉÍÏÅ ÄÅÒÅ×Á ÓÐÉÓËÁ ÐÁÐÏË"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "ðÅÒÅÉÍÅÎÏ×ÁÎÉÅ × ÓÐÉÓËÅ"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr "îÁ×ÉÇÁÃÉÑ"
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "îÁÒÁÓÔÁÀÝÉÊ ËÌÁ×ÉÁÔÕÒÎÙÊ ÓËÒÏÌÌÉÎÇ"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "ëÏÌÅÓÉËÏ ÍÙÛËÉ Ä×ÉÇÁÅÔ ÉÚÏÂÒÁÖÅÎÉÅ"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr "òÁÚÎÏÅ"
+
+#: src/preferences.c:1209
+#, fuzzy
+msgid "Store keywords and comments local to source images"
+msgstr "óÏÈÒÁÎÑÔØ ÉËÏÎËÉ ÔÁÍ ÖÅ, ÇÄÅ É ÉÓÈÏÄÎÙÅ ÉÚÏÂÒÁÖÅÎÉÑ"
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "úÎÁÞÅÎÉÅ ÐÏÒÏÇÁ ÐÏÈÏÖÅÓÔÉ:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "òÁÚÍÅÒ ËÜÛÁ ×ÎÅ ÜËÒÁÎÁ (Mb ÎÁ ÉÚÏÂÒÁÖÅÎÉÅ):"
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "ï ÐÒÏÇÒÁÍÍÅ - GQview"
+
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"÷ÓÅ ÐÒÁ×Á ÚÁÝÉÝÅÎÙ (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"òÁÓÐÒÏÓÔÒÁÎÑÅÔÓÑ ÐÏÄ Ó×ÏÂÏÄÎÏÊ ÌÉÃÅÎÚÉÅÊ GNU"
+
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "óÐÉÓÏË ÒÁÚÒÁÂÏÔÞÉËÏ×..."
+
+#: src/print.c:111
+msgid "Selection"
+msgstr "÷ÙÄÅÌÅÎÉÅ"
+
+#: src/print.c:112
+msgid "All"
+msgstr "÷ÓÅ"
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr "ïÄÎÏ ÉÚÏÂÒÁÖÅÎÉÅ ÎÁ ÓÔÒÁÎÉÃÕ"
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr "ëÏÎÔÒÏÌØÎÁÑ ËÁÒÔÁ"
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr "ðÒÉÎÔÅÒ ÐÏ ÕÍÏÌÞÁÎÉÀ"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr "÷ÙÂÒÁÎÙÊ ÐÒÉÎÔÅÒ"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr "æÁÊÌ PostScript"
+
+#: src/print.c:140
+msgid "Image file"
+msgstr "çÒÁÆÉÞÅÓËÉÊ ÆÁÊÌ"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr "jpeg, ÎÉÚËÏÅ ËÁÞÅÓÔ×Ï"
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr "jpeg, ÎÏÒÍÁÌØÎÏÅ ËÁÞÅÓÔ×Ï"
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr "jpeg, ×ÙÓÏËÏÅ ËÁÞÅÓÔ×Ï"
+
+#: src/print.c:350 src/print.c:3201
+msgid "points"
+msgstr "ÔÏÞËÉ"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr "ÍÉÌÌÉÍÅÔÒÙ"
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr "ÓÁÎÔÉÍÅÔÒÙ"
+
+#: src/print.c:353
+msgid "inches"
+msgstr "ÄÀÊÍÙ"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr "ðÏÒÔÒÅÔ"
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr "ðÅÊÚÁÖ"
+
+#: src/print.c:366
+msgid "Letter"
+msgstr "ðÉÓØÍÏ"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr "àÒÉÄÉÞÅÓËÉÊ"
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr "éÓÐÏÌÎÉÔÅÌØÎÙÊ"
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr "ëÏÎ×ÅÒÔ #10"
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr "ëÏÎ×ÅÒÔ #9"
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr "ëÏÎ×ÅÒÔ C4"
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr "ëÏÎ×ÅÒÔ C5"
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr "ëÏÎ×ÅÒÔ C6"
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr "æÏÔÏÇÒÁÆÉÑ  6x4"
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr "æÏÔÏÇÒÁÆÉÑ 8x10"
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr "ðÏÞÔÏ×ÁÑ ÏÔËÒÙÔËÁ"
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr "ëÏÎÓÐÅËÔ"
+
+#: src/print.c:544
+#, c-format
+msgid "page %d of %d"
+msgstr "ÓÔÒÁÎÉÃÁ %d ÉÚ %d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "ðÒÅÄÐÒÏÓÍÏÔÒ"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+"îÅ ÍÏÇÕ ÏÔËÒÙÔØ ÔÒÕÂÕ ÄÌÑ ÐÅÞÁÔÉ.\n"
+"\"%s\""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "æÁÊÌ Ó ÉÍÅÎÅÍ %s ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr "ïÛÉÂËÁ ÚÁÐÉÓÉ × ÆÁÊÌ %s"
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr "ïÛÉÂËÁ SIGPIPE ÐÒÉ ÚÁÐÉÓÉ ÎÁ ÐÒÉÎÔÅÒ."
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr "óÔÒÁÎÉÃÁ %d"
+
+#: src/print.c:1986 src/print.c:1991
+msgid "Printing error"
+msgstr "ïÛÉÂËÁ ÐÅÞÁÔÉ"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr "ðÒÏÉÚÏÛÌÁ ÏÛÉÂËÁ ÐÒÉ ÐÅÞÁÔÉ × %s."
+
+#: src/print.c:1994
+msgid "Details"
+msgstr "ðÏÄÒÏÂÎÏÓÔÉ"
+
+#: src/print.c:2587 src/print.c:3332
+msgid "Print - GQview"
+msgstr "ðÅÞÁÔØ - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr "ðÅÞÁÔÁÀ %d ÓÔÒÁÎÉàנ%s."
+
+#: src/print.c:2691
+msgid "Format:"
+msgstr "æÏÒÍÁÔ:"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr "åÄÉÎÉÃÙ:"
+
+#: src/print.c:2810
+msgid "Orientation:"
+msgstr "ïÒÉÅÎÔÁÃÉÑ:"
+
+#: src/print.c:2942
+msgid "Destination:"
+msgstr "îÁÚÎÁÞÅÎÉÅ:"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "éÍÑ ÆÁÊÌÁ"
+
+#: src/print.c:3079
+msgid "Unlimited"
+msgstr "îÅÏÇÒÁÎÉÞÅÎÎÏ"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr "ðÏËÁÚÁÔØ"
+
+#: src/print.c:3199
+msgid "Font"
+msgstr "ûÒÉÆÔ"
+
+#: src/print.c:3359
+msgid "Source"
+msgstr "éÓÔÏÞÎÉË"
+
+#: src/print.c:3375
+msgid "Proof size:"
+msgstr "ëÏÎÔÒÏÌØÎÙÊ ÒÁÚÍÅÒ:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr "ôÅËÓÔ"
+
+#: src/print.c:3401
+msgid "Paper"
+msgstr "âÕÍÁÇÁ"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr "ïÔÓÔÕÐÙ"
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr "óÌÅ×Á:"
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr "óÐÒÁ×Á:"
+
+#: src/print.c:3432
+msgid "Top:"
+msgstr "ó×ÅÒÈÕ:"
+
+#: src/print.c:3435
+msgid "Bottom:"
+msgstr "óÎÉÚÕ:"
+
+#: src/print.c:3444
+msgid "Printer"
+msgstr "ðÒÉÎÔÅÒ"
+
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr "ó×ÏÊ ÐÒÉÎÔÅÒ:"
+
+#: src/print.c:3459
+msgid "File:"
+msgstr "æÁÊÌ:"
+
+#: src/print.c:3468
+msgid "File format:"
+msgstr "æÏÒÍÁÔ ÆÁÊÌÁ:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr "òÁÚÒÅÛÅÎÉÅ:"
+
+#: src/print.c:3481
+msgid "Remember print settings"
+msgstr "úÁÐÏÍÎÉÔØ ÕÓÔÁÎÏ×ËÉ ÐÅÞÁÔÉ"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "ÏÛÉÂËÁ ÚÁÐÉÓÉ ÆÁÊÌÁ ËÏÎÆÉÇÕÒÁÃÉÉ: %s\n"
+
+#: src/search.c:200
+msgid "folder"
+msgstr "ÐÁÐËÁ"
+
+#: src/search.c:201
+msgid "comments"
+msgstr "ËÏÍÍÅÎÔÁÒÉÉ"
+
+#: src/search.c:202
+msgid "results"
+msgstr "ÒÅÚÕÌØÔÁÔÙ"
+
+#: src/search.c:206
+msgid "contains"
+msgstr "ÓÏÄÅÒÖÉÔ"
+
+#: src/search.c:207
+msgid "is"
+msgstr "ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ"
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr "ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ"
+
+#: src/search.c:212
+msgid "less than"
+msgstr "ÍÅÎØÛÅ ÞÅÍ"
+
+#: src/search.c:213
+msgid "greater than"
+msgstr "ÂÏÌØÛÅ ÞÅÍ"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr "ÍÅÖÄÕ"
+
+#: src/search.c:219
+msgid "before"
+msgstr "ÐÅÒÅÄ"
+
+#: src/search.c:220
+msgid "after"
+msgstr "ÐÏÓÌÅ"
+
+#: src/search.c:225
+msgid "match all"
+msgstr "ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ×ÓÅÍ"
+
+#: src/search.c:226
+msgid "match any"
+msgstr "ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ ÌÀÂÏÍÕ"
+
+#: src/search.c:227
+msgid "exclude"
+msgstr "ÉÓËÌÀÞÁÑ"
+
+#: src/search.c:277
+#, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d ÆÁÊÌÏ× (%s, %d)"
+
+#: src/search.c:284
+#, c-format
+msgid "%s, %d files"
+msgstr "%s, %d ÆÁÊÌÏ×"
+
+#: src/search.c:301
+msgid "Searching..."
+msgstr "éÝÅÍ..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr "æÁÊÌ ÎÅ ÎÁÊÄÅÎ"
+
+#: src/search.c:2094
+msgid "Please enter an existing file for image content."
+msgstr "ðÏÖÁÌÕÊÓÔÁ, ×ÙÂÅÒÉÔÅ ÓÕÝÅÓÔ×ÕÀÝÉÊ ÆÁÊÌ ÄÌÑ ÓÏÄÅÒÖÉÍÏÇÏ ÉÚÏÂÒÁÖÅÎÉÑ."
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr "ëÁÔÁÌÏÇ ÎÅ ÎÁÊÄÅÎ"
+
+#: src/search.c:2141
+msgid "Please enter an existing folder to search."
+msgstr "ðÏÖÁÌÕÊÓÔÁ, ×ÙÂÅÒÉÔÅ ÓÕÝÅÓÔ×ÕÀÝÉÊ ËÁÔÁÌÏÇ ÄÌÑ ÐÏÉÓËÁ."
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr "ðÏÉÓË ÉÚÏÂÒÁÖÅÎÉÊ - GQview"
+
+#: src/search.c:2599
+msgid "Search:"
+msgstr "ðÏÉÓË:"
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr "òÅËÕÒÓÉ×ÎÙÊ"
+
+#: src/search.c:2617
+msgid "File name"
+msgstr "éÍÑ ÆÁÊÌÁ"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr "õÞÉÔÙ×ÁÔØ ÒÅÇÉÓÔÒ"
+
+#: src/search.c:2627
+msgid "File size is"
+msgstr "òÁÚÍÅÒ ÆÁÊÌÁ"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+msgid "and"
+msgstr "É"
+
+#: src/search.c:2639
+msgid "File date is"
+msgstr "÷ÒÅÍÑ ÆÁÊÌÁ"
+
+#: src/search.c:2656
+msgid "Image dimensions are"
+msgstr "òÁÚÍÅÒ ÉÚÏÂÒÁÖÅÎÉÑ"
+
+#: src/search.c:2676
+msgid "Image content is"
+msgstr "óÏÄÅÒÖÉÍÏÅ ÉÚÏÂÒÁÖÅÎÉÑ"
+
+#: src/search.c:2682
+#, no-c-format
+msgid "% similar to"
+msgstr "% ÐÏÈÏÖÅÓÔÉ ÎÁ"
+
+#: src/search.c:2751
+msgid "Rank"
+msgstr "òÁÎÇ"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "îÅ ÕÄÁÌÏÓØ ÚÁÇÒÕÚÉÔØ ÉËÏÎËÉ ÉÚ ËÜÛÁ, ÐÙÔÁÀÓØ ÐÅÒÅÓÏÚÄÁÔØ.\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "îÅ ÍÏÇÕ ÚÁÐÉÓÁÔØ ÓÐÉÓÏË ÉÓÔÏÒÉÉ ×:%s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "îÏ×ÁÑ ÚÁËÌÁÄËÁ"
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "òÅÄÁËÔÉÒÏ×ÁÔØ ÚÁËÌÁÄËÕ"
+
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "ðÕÔØ:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "éËÏÎËÁ:"
+
+#: src/ui_bookmark.c:627
+msgid "Select icon"
+msgstr "÷ÙÂÒÁÔØ ÉËÏÎËÕ"
+
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "_ó×ÏÊÓÔ×Á..."
+
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "ðÅÒÅÍÅÓÔÉÔØ _××ÅÒÈ"
+
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "ðÅÒÅÍÅÓÔÉÔØ ×_ÎÉÚ"
+
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "_õÄÁÌÉÔØ"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"îÅ ÍÏÇÕ ÚÁÇÒÕÚÉÔØ:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "îÅ ÍÏÇÕ ÐÅÒÅÉÍÅÎÏ×ÁÔØ ÆÁÊÌ %s × %s."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"îÅ ÍÏÇÕ ÕÄÁÌÉÔØ ÆÁÊÌ:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "õÄÁÌÅÎÉÅ ÆÁÊÌÁ ÎÅ ÐÒÏÛÌÏ"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "õÄÁÌÉÔØ ÆÁÊÌ"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"óÏÂÉÒÁÅÍÓÑ ÕÄÁÌÉÔØ ÆÁÊÌ:\n"
+" %s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "_ðÅÒÅÉÍÅÎÏ×ÁÔØ"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "äÏÂÁ×ÉÔØ _ÚÁËÌÁÄËÕ"
+
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "_õÄÁÌÉÔØ"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+msgid "New folder"
+msgstr "îÏ×ÁÑ ÐÁÐËÁ"
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"îÅ ÍÏÇÕ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+msgid "Error creating folder"
+msgstr "ïÛÉÂËÁ ÓÏÚÄÁÎÉÑ ËÁÔÁÌÏÇÁ"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "÷ÓÅ ÆÁÊÌÙ"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "ðÏËÁÚÁÔØ ÓËÒÙÔÙÅ"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "æÉÌØÔÒ:"
+
+#: src/ui_tabcomp.c:840
+msgid "Select path"
+msgstr "÷ÙÄÅÌÉÔØ ÐÕÔØ"
+
+#: src/ui_tabcomp.c:856
+msgid "All files"
+msgstr "÷ÓÅ ÆÁÊÌÙ"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+msgid "Overwrite file?"
+msgstr "ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ?"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr "úÁÍÅÎÉÔØ ÓÕÝÅÓÔ×ÕÀÝÉÊ ÆÁÊÌ ÎÏ×ÙÍ."
+
+#: src/utilops.c:480
+msgid "Overwrite _all"
+msgstr "_ðÅÒÅÚÁÐÉÓÁÔØ ×ÓÅ"
+
+#: src/utilops.c:482
+msgid "S_kip all"
+msgstr "ð_ÒÏÐÕÓÔÉÔØ ×ÓÅ"
+
+#: src/utilops.c:483
+msgid "_Skip"
+msgstr "ðÒ_ÏÐÕÓÔÉÔØ"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+msgid "Existing file"
+msgstr "óÕÝÅÓÔ×ÕÀÝÉÊ ÆÁÊÌ"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+msgid "New file"
+msgstr "îÏ×ÙÊ ÆÁÊÌ"
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "á×ÔÏÍÁÔÉÞÅÓËÉ ÐÅÒÅÉÍÅÎÏ×Ù×ÁÔØ"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "éÓÈÏÄÎÉË ÄÌÑ ËÏÐÉÒÏ×ÁÎÉÑ ÓÏ×ÐÁÄÁÅÔ Ó ÃÅÌÅ×ÙÍ"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"îÅ ÍÏÇÕ ÓËÏÐÉÒÏ×ÁÔØ ÆÁÊÌ:\n"
+"%s\n"
+"ÓÁÍ × ÓÅÂÑ."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "éÓÈÏÄÎÉË ÄÌÑ ÐÅÒÅÍÅÝÅÎÉÑ ÓÏ×ÐÁÄÁÅÔ Ó ÃÅÌÅ×ÙÍ"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"îÅ ÍÏÇÕ ÐÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ:\n"
+"%s\n"
+"ÓÁÍ × ÓÅÂÑ."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+msgid "Co_ntinue"
+msgstr "_ðÒÏÄÏÌÖÉÔØ"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "ïÛÉÂËÁ ËÏÐÉÒÏ×ÁÎÉÑ ÆÁÊÌÁ"
+
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"îÅ ÍÏÇÕ ÓËÏÐÉÒÏ×ÁÔØ ÆÁÊÌ:\n"
+"%s\n"
+"×:\n"
+"%s\n"
+"×Ï ×ÒÅÍÑ ËÏÐÉÒÏ×ÁÎÉÑ ÎÅÓËÏÌØËÉÈ ÆÁÊÌÏ×."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "ïÛÉÂËÁ ÐÅÒÅÍÅÝÅÎÉÑ ÆÁÊÌÁ"
+
+#: src/utilops.c:636
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"îÅ ÍÏÇÕ ÐÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ:\n"
+"%s\n"
+"×:\n"
+"%s\n"
+"×Ï ×ÒÅÍÑ ÐÅÒÅÍÅÝÅÎÉÑ ÎÅÓËÏÌØËÉÈ ÆÁÊÌÏ×."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "éÓÈÏÄÎÉË ÓÏ×ÐÁÄÁÅÔ Ó ÃÅÌØÀ"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "éÓÈÏÄÎÉË ÓÏ×ÐÁÄÁÅÔ Ó ÃÅÌØÀ, ÏÐÅÒÁÃÉÑ ÏÔÍÅÎÅÎÁ."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"îÅ ÍÏÇÕ ÓËÏÐÉÒÏ×ÁÔØ ÆÁÊÌ:\n"
+"%s\n"
+"×:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
 msgstr ""
-"ðÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ:\n"
+"îÅ ÍÏÇÕ ÐÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ:\n"
 "%s\n"
-"×:"
+"×:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "îÅÐÒÁ×ÉÌØÎÏÅ ÎÁÚÎÁÞÅÎÉÅ"
+
+#: src/utilops.c:900
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"ëÏÇÄÁ ÏÐÅÒÁÃÉÑ ÐÒÏÉÚ×ÏÄÉÔÓÑ ÎÁÄ ÎÅÓËÏÌØËÉÍÉ ÆÁÊÌÁÍÉ,\n"
+"ÐÏÖÁÌÕÊÓÔÁ, ÚÁÄÁÊÔÅ ËÁÔÁÌÏÇ, Á ÎÅ ÆÁÊÌ."
+
+#: src/utilops.c:905
+msgid "Please select an existing folder."
+msgstr "ðÏÖÁÌÕÊÓÔÁ, ×ÙÂÅÒÉÔÅ ÓÕÝÅÓÔ×ÕÀÝÉÊ ËÁÔÁÌÏÇ."
+
+#: src/utilops.c:956
+msgid "Copy - GQview"
+msgstr "ëÏÐÉÒÏ×ÁÎÉÅ - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "_ëÏÐÉÒÏ×ÁÔØ"
+
+#: src/utilops.c:960
+msgid "Copy file"
+msgstr "ëÏÐÉÒÏ×ÁÔØ ÆÁÊÌ"
+
+#: src/utilops.c:964
+msgid "Copy multiple files"
+msgstr "ëÏÐÉÒÏ×ÁÔØ ÎÅÓËÏÌØËÏ ÆÁÊÌÏ×"
+
+#: src/utilops.c:970
+msgid "Move - GQview"
+msgstr "ðÅÒÅÍÅÝÅÎÉÅ - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "ðÅÒÅÍÅÓ_ÔÉÔØ"
+
+#: src/utilops.c:974
+msgid "Move file"
+msgstr "ðÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ"
+
+#: src/utilops.c:978
+msgid "Move multiple files"
+msgstr "ðÅÒÅÍÅÓÔÉÔØ ÎÅÓËÏÌØËÏ ÆÁÊÌÏ×"
+
+#: src/utilops.c:992 src/utilops.c:1502
+msgid "File name:"
+msgstr "éÍÑ ÆÁÊÌÁ:"
+
+#: src/utilops.c:996
+msgid "Choose the destination folder."
+msgstr "÷ÙÂÒÁÔØ ÐÁÐËÕ ÎÁÚÎÁÞÅÎÉÑ."
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "ïÛÉÂËÁ ÕÄÁÌÅÎÉÑ"
 
-#: src/utilops.c:441
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "îÅ ÍÏÇÕ ÕÄÁÌÉÔØ ÓÔÁÒÙÊ ÆÁÊÌ ÉÚ ËÏÒÚÉÎÙ"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+msgid "Could not create folder"
+msgstr "îÅ ÍÏÇÕ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "÷ ÄÏÓÔÕÐÅ ÏÔËÁÚÁÎÏ"
+
+#: src/utilops.c:1212
 #, c-format
 msgid ""
-"Move multiple files from:\n"
-"%s\n"
-"to:"
+"Unable to access or create the trash folder.\n"
+"\"%s\""
 msgstr ""
-"ðÅÒÅÍÅÓÔÉÔØ ×ÙÄÅÌÅÎÎÙÅ ÆÁÊÌÙ ÉÚ:\n"
-"%s\n"
-"×:"
+"îÅ ÍÏÇÕ ÐÏÌÕÞÉÔØ ÄÏÓÔÕРÉÌÉ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ ËÏÒÚÉÎÙ.\n"
+"\"%s\""
+
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "÷ÙËÌÀÞÉÔØ ÂÅÚÏÐÁÓÎÏÅ ÕÄÁÌÅÎÉÅ"
+
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "âÅÚÏÐÁÓÎÏÅ ÕÄÁÌÅÎÉÅ ÆÁÊÌÏ×: %s"
 
-#: src/utilops.c:514
+#: src/utilops.c:1276
 #, c-format
 msgid ""
 "Unable to delete file:\n"
@@ -701,101 +2790,114 @@ msgid ""
 msgstr ""
 "îÅ×ÏÚÍÏÖÎÏ ÕÄÁÌÉÔØ ÆÁÊÌ:\n"
 " %s\n"
-" ðÒÏÄÏÌÖÁÔØ ÏÐÅÒÁÃÉÀ ÕÄÁÌÅÎÉÑ ÄÌÑ ÏÓÔÁ×ÛÉÈÓÑ ÆÁÊÌÏ× ?"
+" ðÒÏÄÏÌÖÁÔØ ÏÐÅÒÁÃÉÀ ÕÄÁÌÅÎÉÑ ÄÌÑ ÏÓÔÁ×ÛÉÈÓÑ ÆÁÊÌÏ×?"
 
-#: src/utilops.c:515 src/utilops.c:521
-msgid "Delete failed"
-msgstr "õÄÁÌÉÔØ ÎÅÕÄÁÌÏÓØ"
-
-#: src/utilops.c:520 src/utilops.c:565
+#: src/utilops.c:1347
 #, c-format
-msgid ""
-"Unable to delete file:\n"
-"%s"
-msgstr ""
-"îÅÍÏÇÕ ÕÄÁÌÉÔØ ÆÁÊÌ:\n"
-"%s"
+msgid "File %d of %d"
+msgstr "æÁÊÌ %d ÉÚ %d"
 
-#: src/utilops.c:550
-msgid "Delete files"
-msgstr "õÄÁÌÉÔØ ÆÁÊÌÙ"
+#: src/utilops.c:1416
+msgid "Delete files - GQview"
+msgstr "õÄÁÌÅÎÉÅ ÆÁÊÌÏ× - GQview"
 
-#: src/utilops.c:550
-msgid "About to delete multiple files..."
-msgstr "÷Ù ÈÏÔÉÔÅ ÕÄÁÌÉÔØ ÏÔÍÅÞÅÎÎÙÅ ÆÁÊÌÙ ?"
+#: src/utilops.c:1420
+msgid "Delete multiple files"
+msgstr "õÄÁÌÉÔØ ÎÅÓËÏÌØËÏ ÆÁÊÌÏ×"
 
-#: src/utilops.c:551 src/utilops.c:596
-msgid "Delete"
-msgstr "õÄÁÌÉÔØ"
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "ðÒÏÓÍÏÔÒ %d ÆÁÊÌÏ×"
 
-#: src/utilops.c:566
-msgid "File deletion failed"
-msgstr "õÄÁÌÅÎÉÅ ÆÁÊÌÁ ÎÅÕÄÁÌÏÓØ"
+#: src/utilops.c:1494
+msgid "Delete file - GQview"
+msgstr "õÄÁÌÅÎÉÅ ÆÁÊÌÁ - GQview"
 
-#: src/utilops.c:594
-#, c-format
-msgid ""
-"About to delete the file:\n"
-" %s"
-msgstr ""
-"èÏÔÉÔÅ ÕÄÁÌÉÔØ ÆÁÊÌ ?:\n"
-" %s"
+#: src/utilops.c:1498
+msgid "Delete file?"
+msgstr "õÄÁÌÉÔØ ÆÁÊÌ?"
 
-#: src/utilops.c:595
-msgid "Delete file"
-msgstr "õÄÁÌÉÔØ ÆÁÊÌ"
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr "úÁÍÅÎÉÔØ ÓÕÝÅÓÔ×ÕÀÝÉÊ ÆÁÊÌ ÐÒÉ ÐÅÒÅÉÍÅÎÏ×ÁÎÉÉ ÎÏ×ÏÇÏ."
 
-#: src/utilops.c:650 src/utilops.c:834
+#: src/utilops.c:1661
 #, c-format
 msgid ""
-"Overwrite file:\n"
+"Unable to rename file:\n"
 "%s\n"
-"by renaming:\n"
+" to:\n"
 "%s"
 msgstr ""
-"ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ:\n"
+"îÅ ÍÏÇÕ ÐÅÒÅÉÍÅÎÏ×ÁÔØ ÆÁÊÌ:\n"
 "%s\n"
-"ÐÅÒÅÉÍÅÎÏ×Á×:\n"
+" ×:\n"
 "%s"
 
-#: src/utilops.c:663
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "ïÛÉÂËÁ ÐÅÒÅÉÍÅÎÏ×ÁÎÉÑ ÆÁÊÌÁ"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"îÅ ÍÏÇÕ Á×ÔÏÍÁÔÉÞÅÓËÉ ÐÅÒÅÉÍÅÎÏ×ÁÔØ Ó ×ÙÂÒÁÎÙÍ\n"
+"ÎÁÂÏÒÏÍ ÞÉÓÅÌ, ÓÕÝÅÓÔ×ÕÅÔ ÏÄÉΠÉÌÉ ÂÏÌØÛÅ ÆÁÊÌÏ×,\n"
+"ÓÏ×ÐÁÄÁÀÝÉÈ Ó ÐÏÌÕÞÅÎÙÍ ÓÐÉÓËÏÍ ÉÍÅÎ.\n"
+
+#: src/utilops.c:1809
 #, c-format
 msgid ""
-"Unable to rename file:\n"
+"Failed to rename\n"
 "%s\n"
-" to:\n"
-"%s"
+"The number was %d."
 msgstr ""
-"îÅÍÏÇÕ ÐÅÒÅÉÍÅÎÏ×ÁÔØ ÆÁÊÌ:\n"
+"îÅ ÍÏÇÕ ÐÅÒÅÉÍÅÎÏ×ÁÔØ ÆÁÊÌ\n"
 "%s\n"
-" ×:\n"
-"%s"
+"îÏÍÅÒ %d."
 
-#: src/utilops.c:664 src/utilops.c:847
-msgid "Error renaming file"
-msgstr "ïÛÉÂËÁ ÐÅÒÅÉÍÅÎÏ×ÁÎÉÑ ÆÁÊÌÁ"
+#: src/utilops.c:2031 src/utilops.c:2249
+msgid "Rename - GQview"
+msgstr "ðÅÒÅÉÍÅÎÏ×ÁÎÉÅ - GQview"
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "GQview - rename"
-msgstr "GQview - ÐÅÒÅÉÍÅÎÏ×ÁÔØ"
+#: src/utilops.c:2034
+msgid "Rename multiple files"
+msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ ÎÅÓËÏÌØËÏ ÆÁÊÌÏ×"
 
-#: src/utilops.c:754
-msgid "Rename multiple files:"
-msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ ×ÙÄÅÌÅÎÎÙÅ ÆÁÊÌÙ:"
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "ïÒÉÇÉÎÁÌØÎÏÅ ÉÍÑ"
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "Rename"
-msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ"
+#: src/utilops.c:2110 src/utilops.c:2262
+msgid "Original name:"
+msgstr "ïÒÉÇÉÎÁÌØÎÏÅ ÉÍÑ:"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+msgid "New name:"
+msgstr "îÏ×ÏÅ ÉÍÑ:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "ôÅËÓÔ × ÎÁÞÁÌÅ"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "îÁÞÁÌØÎÙÊ #"
 
-#: src/utilops.c:790
-msgid "Rename:"
-msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ:"
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "ôÅËÓÔ × ËÏÎÃÅ"
 
-#: src/utilops.c:799
-msgid "to:"
-msgstr "×:"
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "úÁÐÏÌÎÅÎÉÅ:"
 
-#: src/utilops.c:846
+#: src/utilops.c:2207 src/view_file_list.c:459
 #, c-format
 msgid ""
 "Unable to rename file:\n"
@@ -803,23 +2905,31 @@ msgid ""
 "to:\n"
 "%s"
 msgstr ""
-"îÅÍÏÇÕ ÐÅÒÅÉÍÅÎÏ×ÁÔØ ÆÁÊÌ:\n"
+"îÅ ÍÏÇÕ ÐÅÒÅÉÍÅÎÏ×ÁÔØ ÆÁÊÌ:\n"
 "%s\n"
-" ×:\n"
+"×:\n"
 "%s"
 
-#: src/utilops.c:884
+#: src/utilops.c:2252
+msgid "Rename file"
+msgstr "ðÅÒÅÉÍÅÎÏ×ÁÔØ ÆÁÊÌ"
+
+#: src/utilops.c:2311
 #, c-format
 msgid ""
-"Rename file:\n"
+"The folder:\n"
 "%s\n"
-"to:"
+"already exists."
 msgstr ""
-"ðÅÒÅÉÍÅÎÏ×ÁÔØ ÆÁÊÌ:\n"
+"ëÁÔÁÌÏÇ:\n"
 "%s\n"
-"×:"
+"ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ."
+
+#: src/utilops.c:2312
+msgid "Folder exists"
+msgstr "ëÁÔÁÌÏÇ ÓÕÝÅÓÔ×ÕÅÔ"
 
-#: src/utilops.c:928
+#: src/utilops.c:2317
 #, c-format
 msgid ""
 "The path:\n"
@@ -830,60 +2940,532 @@ msgstr ""
 "%s\n"
 "ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ ËÁË ÆÁÊÌ."
 
-#: src/utilops.c:929
-msgid "Could not create directory"
-msgstr "îÅÍÏÇÕ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ"
+#: src/utilops.c:2369
+msgid "New folder - GQview"
+msgstr "îÏ×ÙÊ ËÁÔÁÌÏÇ - GQview"
 
-#: src/utilops.c:934
+#: src/utilops.c:2372
 #, c-format
 msgid ""
-"The directory:\n"
+"Create folder in:\n"
 "%s\n"
-"already exists."
+"named:"
 msgstr ""
-"ëÁÔÁÌÏÇ:\n"
+"óÏÚÄÁÔØ ËÁÔÁÌÏÇ ×:\n"
 "%s\n"
-"ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ."
+"Ó ÉÍÅÎÅÍ:"
 
-#: src/utilops.c:935
-msgid "Directory exists"
-msgstr "ëÁÔÁÌÏÇ ÓÕÝÅÓÔ×ÕÅÔ"
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "ÎÏ×ÁÑ_ÐÁÐËÁ"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "îÁ _ÕÒÏ×ÅÎØ ×ÙÛÅ"
 
-#: src/utilops.c:942
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "ðÒÏÓÍÏÔÒ _ÓÌÁÊÄÏ×"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "òÅËÕÒÓÉ×ÎÙÊ ÐÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "îÁÊÔÉ _ÐÏ×ÔÏÒÑÀÝÉÅÓÑ..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "òÅËÕÒÓÉ×ÎÙÊ ÐÏÉÓË ÐÏ×ÔÏÒÑÀÝÉÈÓÑ..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "_îÏ×ÁÑ ÐÁÐËÁ..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "ðÒÏËÁÚÁÔØ ËÁË _ÄÅÒÅ×Ï"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "ï_ÂÎÏ×ÉÔØ"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "óÏ_ÒÔÉÒÏ×ËÁ"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "ðÏËÁÚÁÔØ ËÁË _ÉËÏÎËÉ"
+
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "ðÏËÁÚÁÔØ É_ËÏÎËÉ"
+
+#: src/view_file_list.c:447
 #, c-format
 msgid ""
-"Unable to create directory:\n"
+"Invalid file name:\n"
 "%s"
 msgstr ""
-"îÅÍÏÇÕ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ:\n"
+"îÅÐÒÁ×ÉÌØÎÏÅ ÉÍÑ ÆÁÊÌÁ:\n"
 "%s"
 
-#: src/utilops.c:943
-msgid "Error creating directory"
-msgstr "ïÛÉÂËÁ ÓÏÚÄÁÎÉÑ ËÁÔÁÌÏÇÁ"
+#~ msgid "Purge thumbnails"
+#~ msgstr "õÄÁÌÉÔØ ÉËÏÎËÉ"
 
-#: src/utilops.c:982
-#, c-format
-msgid ""
-"Create directory in:\n"
-"%s\n"
-"named:"
-msgstr ""
-"óÏÚÄÁÔØ ËÁÔÁÌÏÇ ×:\n"
-"%s\n"
-"Ó ÉÍÅÎÅÍ:"
+#~ msgid "/File/tear1"
+#~ msgstr "/æÁÊÌ/tear1"
 
-#: src/utilops.c:983
-msgid "GQview - new directory"
-msgstr "GQview - ÎÏ×ÙÊ ËÁÔÁÌÏÇ"
+#~ msgid "/File/_New collection"
+#~ msgstr "/æÁÊÌ/_îÏ×ÁÑ ËÏÌÌÅËÃÉÑ"
 
-#: src/utilops.c:983
-msgid "Create"
-msgstr "óÏÚÄÁÔØ"
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/æÁÊÌ/ïÔËÒÙÔØ _ËÏÌÌÅËÃÉÀ"
 
-#: src/window.c:151
-msgid "GQview Tools"
-msgstr "GQview éÎÓÔÒÕÍÅÎÔÙ"
+#~ msgid "/File/sep1"
+#~ msgstr "/æÁÊÌ/sep1"
+
+#~ msgid "/File/_Search..."
+#~ msgstr "/æÁÊÌ/ðÏÉ_ÓË..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/æÁÊÌ/îÁÊÔÉ _ÐÏ×ÔÏÒÑÀÝÉÅÓÑ..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/æÁÊÌ/sep2"
+
+#~ msgid "/File/_Print..."
+#~ msgstr "/æÁÊÌ/ðÅ_ÞÁÔØ..."
+
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/æÁÊÌ/îÏ×ÁÑ Ð_ÁÐËÁ..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/æÁÊÌ/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/æÁÊÌ/ëÏÐ_ÉÒÏ×ÁÔØ..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/æÁÊÌ/ðÅÒÅ_ÍÅÓÔÉÔØ..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/æÁÊÌ/ðÅ_ÒÅÉÍÅÎÏ×ÁÔØ..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/æÁÊÌ/_õÄÁÌÉÔØ..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/æÁÊÌ/sep4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/æÁÊÌ/_úÁËÒÙÔØ ÏËÎÏ"
+
+#~ msgid "/File/_Quit"
+#~ msgstr "/æÁÊÌ/_÷ÙÈÏÄ"
+
+#~ msgid "/_Edit"
+#~ msgstr "/ðÒ_Á×ËÁ"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/ðÒÁ×ËÁ/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/ðÒÁ×ËÁ/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/ðÒÁ×ËÁ/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/ðÒÁ×ËÁ/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/ðÒÁ×ËÁ/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/ðÒÁ×ËÁ/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/ðÒÁ×ËÁ/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/ðÒÁ×ËÁ/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/ðÒÁ×ËÁ/editor8"
+
+#~ msgid "/Edit/editor9"
+#~ msgstr "/ðÒÁ×ËÁ/editor9"
+
+#~ msgid "/Edit/editor0"
+#~ msgstr "/ðÒÁ×ËÁ/editor0"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/ðÒÁ×ËÁ/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/ðÒÁ×ËÁ/_éÚÍÅÎÉÔØ"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/ðÒÁ×ËÁ/_ó×ÏÊÓÔ×Á..."
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/ðÒÁ×ËÁ/éÚÍÅÎÉÔØ/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/ðÒÁ×ËÁ/éÚÍÅÎÉÔØ/ðÏ×ÅÒÎÕÔØ _ÐÏ ÞÁÓÏ×ÏÊ ÓÔÒÅÌËÅ"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/ðÒÁ×ËÁ/éÚÍÅÎÉÔØ/ðÏ×ÅÒÎÕÔØ Ð_ÒÏÔÉ× ÞÁÓÏ×ÏÊ ÓÔÒÅÌËÉ"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/ðÒÁ×ËÁ/éÚÍÅÎÉÔØ/ðÏ×ÅÒÎÕÔØ ÎÁ 1_80"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/ðÒÁ×ËÁ/éÚÍÅÎÉÔØ/_úÅÒËÁÌØÎÏ"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/ðÒÁ×ËÁ/éÚÍÅÎÉÔØ/ð_ÅÒÅ×ÅÒÎÕÔØ"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/ðÒÁ×ËÁ/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/ðÒÁ×ËÁ/_÷ÙÄÅÌÉÔØ ×ÓÅ"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/ðÒÁ×ËÁ/óÎ_ÑÔØ ×ÙÄÅÌÅÎÉÅ"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/ðÒÁ×ËÁ/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/ðÒÁ×ËÁ/_ëÏÎÆÉÇÕÒÁÃÉÑ..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/ðÒÁ×ËÁ/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/ðÒÁ×ËÁ/õÓÔÁÎÏ×ÉÔØ × ËÁÞÅÓÔ×Å _ÏÂÏÅ×"
+
+#~ msgid "/_View"
+#~ msgstr "/ðÒ_ÏÓÍÏÔÒ"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/íÁÓÛÔÁ _+"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/íÁÓÛÔÁ _-"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/íÁÓÛÔÁ _1:1"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/_ðÏËÁÚÙ×ÁÔØ ÉËÏÎËÉ"
+
+#~ msgid "/View/I_cons"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/_éËÏÎËÉ"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/_îÁ ×ÅÓØ ÜËÒÁÎ"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/sep3"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/óÐÒ_ÑÔÁÔØ ÓÐÉÓÏË ÆÁÊÌÏ×"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/sep4"
+
+#~ msgid "/View/_Keywords"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/ë_ÌÀÞÅ×ÙÅ ÓÌÏ×Á"
+
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/_íÅÎÅÄÖÅÒ ÓÏÒÔÉÒÏ×ËÉ"
+
+#~ msgid "/View/sep5"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/sep5"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/ðÅÒÅËÌ_ÀÞÉÔØ ÐÒÏÓÍÏÔÒ ÓÌÁÊÄÏ×"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/ï_ÂÎÏ×ÉÔØ ÓÐÉÓËÉ"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/ðÏÍÏÝØ/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/ðÏÍÏÝØ/sep1"
+
+#~ msgid "/Help/_About"
+#~ msgstr "/ðÏÍÏÝØ/_ï ÐÒÏÇÒÁÍÍÅ"
+
+#~ msgid "GQview configuration"
+#~ msgstr "ëÏÎÆÉÇÕÒÁÃÉÑ GQview"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/ðÒÁ×ËÁ/_õÄÁÌÉÔØ ÓÔÁÒÙÅ ÉËÏÎËÉ"
+
+#~ msgid "path"
+#~ msgstr "ÐÕÔØ"
+
+#~ msgid "Save"
+#~ msgstr "óÏÈÒÁÎÉÔØ"
+
+#~ msgid "Close"
+#~ msgstr "úÁËÒÙÔØ"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ ËÏÌÌÅËÃÉÉ:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "óÏÈÒÁÎÉÔØ ËÏÌÌÅËÃÉÀ ËÁË:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "ïÔËÒÙÔØ ËÏÌÌÅËÃÉÀ ÉÚ:"
+
+#~ msgid "Open"
+#~ msgstr "ïÔËÒÙÔØ"
+
+#~ msgid "Append collection from:"
+#~ msgstr "äÏÂÁ×ÉÔØ ËÏÌÌÅËÃÉÀ ÉÚ:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "÷ÙÈÏÄ"
+
+#~ msgid "Exit"
+#~ msgstr "÷ÙÈÏÄ"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "îÅÐÒÁ×ÉÌØÎÙÊ ËÁÔÁÌÏÇ"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "ðÒÉ ÓÔÁÒÔÅ ÐÅÒÅÊÔÉ × ËÁÔÁÌÏÇ:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "íÁÓÛÔÁÂÉÒÏ×ÁÎÉÅ:"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "ðÏÍÅÝÁÔØ ÄÉÁÌÏÇÉ ÐÏÄ ÍÙÛØÀ"
+
+#~ msgid "Include files of type:"
+#~ msgstr "÷ËÌÀÞÁÔØ ÆÁÊÌÙ ÔÉÐÁ:"
+
+#~ msgid "Remove"
+#~ msgstr "õÄÁÌÉÔØ"
+
+#~ msgid "Add"
+#~ msgstr "äÏÂÁ×ÉÔØ"
+
+#~ msgid "Command Line"
+#~ msgstr "ëÏÍÁÎÄÎÁÑ ÓÔÒÏËÁ"
+
+#~ msgid "Help"
+#~ msgstr "ðÏÍÏÝØ"
+
+#~ msgid "Full screen size:"
+#~ msgstr "òÁÚÍÅÒ ÐÏÌÎÏÇÏ ÜËÒÁÎÁ:"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "òÁÚÍÅÒ ÆÁÊÌÁ:"
+
+#, fuzzy
+#~ msgid "Width:"
+#~ msgstr "ûÉÒÉÎÁ"
+
+#, fuzzy
+#~ msgid "Height:"
+#~ msgstr "÷ÙÓÏÔÁ"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ:\n"
+#~ " %s\n"
+#~ " ÆÁÊÌÏÍ:\n"
+#~ " %s"
+
+#~ msgid "Yes"
+#~ msgstr "äÁ"
+
+#~ msgid "Yes to all"
+#~ msgstr "äÁ ÄÌÑ ×ÓÅÈ"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ:\n"
+#~ "%s\n"
+#~ " ÆÁÊÌÏÍ:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "ëÏÐÉÒÏ×ÁÔØ ÆÁÊÌ:\n"
+#~ "%s\n"
+#~ "×:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "ðÅÒÅÍÅÓÔÉÔØ ÆÁÊÌ:\n"
+#~ "%s\n"
+#~ "×:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "óÏÂÉÒÁÅÍÓÑ ÕÄÁÌÑÔØ ÏÔÍÅÞÅÎÎÙÅ ÆÁÊÌÙ..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "ðÅÒÅÚÁÐÉÓÁÔØ ÆÁÊÌ:\n"
+#~ "%s\n"
+#~ "ÐÅÒÅÉÍÅÎÏ×Á×:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "×:"
+
+#~ msgid "Create"
+#~ msgstr "óÏÚÄÁÔØ"
+
+#~ msgid "Initial directory"
+#~ msgstr "éÓÈÏÄÎÙÊ ËÁÔÁÌÏÇ"
+
+#~ msgid "New Directory"
+#~ msgstr "îÏ×ÙÊ ËÁÔÁÌÏÇ"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "îÅ ÍÏÇÕ ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ:\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "ïÛÉÂËÁ ÓÏÚÄÁÎÉÑ ËÁÔÁÌÏÇÁ"
+
+#~ msgid "Image details"
+#~ msgstr "ðÏÄÒÏÂÎÏÓÔÉ"
+
+#~ msgid "/View/Image _details"
+#~ msgstr "/ðÒÏÓÍÏÔÒ/ðÏÄ_ÒÏÂÎÏÓÔÉ"
+
+#~ msgid "Full screen ignores window manager"
+#~ msgstr "éÇÎÏÒÉÒÏ×ÁÔØ ÏËÏÎÎÙÊ ÍÅÎÅÄÖÅÒ ÐÒÉ ÐÒÏÓÍÏÔÒÅ ÎÁ ÐÏÌÎÙÊ ÜËÒÁÎ"
+
+#~ msgid "Add contents"
+#~ msgstr "äÏÂÁ×ÉÔØ ÓÏÄÅÒÖÉÍÏÅ"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "òÅËÕÒÓÉ×ÎÏ ÄÏÂÁ×ÉÔØ ÓÏÄÅÒÖÉÍÏÅ"
+
+#~ msgid "Skip directories"
+#~ msgstr "ðÒÏÐÕÓÔÉÔØ ËÁÔÁÌÏÇÉ"
+
+#~ msgid "Invalid directory"
+#~ msgstr "îÅÐÒÁ×ÉÌØÎÙÊ ËÁÔÁÌÏÇ"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - ËÏÐÉÒÏ×ÁÎÉÅ"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - ÐÅÒÅÍÅÓÔÉÔØ"
+
+#~ msgid "Directory exists"
+#~ msgstr "ëÁÔÁÌÏÇ ÓÕÝÅÓÔ×ÕÅÔ"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - ÎÏ×ÙÊ ËÁÔÁÌÏÇ"
+
+#~ msgid "Misc."
+#~ msgstr "òÁÚÎÏÅ"
+
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/æÁÊÌ/_óÏÚÄÁÔØ ËÁÔÁÌÏÇ..."
+
+#~ msgid "Edit"
+#~ msgstr "ðÒÁ×ËÁ"
+
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "÷ÓÔÁ×ÌÑÔØ ÆÁÊÌ ÎÁ ÐÏÚÉÃÉÀ ËÕÒÓÏÒÁ"
+
+#~ msgid "File named %s already exists."
+#~ msgstr "æÁÊÌ %s ÕÖÅ ÓÕÝÅÓÔ×ÕÅÔ."
+
+#, fuzzy
+#~ msgid "Date:"
+#~ msgstr "äÁÔÁ"
+
+#, fuzzy
+#~ msgid "top"
+#~ msgstr "×:"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview ×ÙÐÏÌÎÑÅÔ: %s\n"
+
+#~ msgid "Electric Eyes"
+#~ msgstr "Electric Eyes"
+
+#~ msgid "Apply"
+#~ msgstr "ðÒÉÍÅÎÉÔØ"
+
+#~ msgid "format: [.foo;.bar]"
+#~ msgstr "ÆÏÒÍÁÔ: [.foo;.bar]"
+
+#~ msgid "create dir failed: %s\n"
+#~ msgstr "ÓÏÚÄÁÔØ ËÁÔÁÌÏÇ ÎÅ ÕÄÁÌÏÓØ: %s\n"
+
+#~ msgid "Unable to delete dir: %s\n"
+#~ msgstr "îÅ ÍÏÇÕ ÕÄÁÌÉÔØ ËÁÔÁÌÏÇ: %s\n"
+
+#~ msgid "failed to delete:%s\n"
+#~ msgstr "ÎÅ ÕÄÁÌÏÓØ :%s\n"
+
+#~ msgid "External Editors"
+#~ msgstr "÷ÎÅÛÎÉÅ òÅÄÁËÔÏÒÙ"
+
+#~ msgid "     Ok     "
+#~ msgstr "     Ok     "
 
 #~ msgid ""
 #~ "Overwrite file:\n"
index d6b0069..88c8b15 100644 (file)
--- a/po/sk.po
+++ b/po/sk.po
+# translation of sk.po to 
 # Slovak translations of Gqview.
-# Copyright (C) 2000 Free Software Foundation, Inc.
-# Martin Pekar <cortex@nextra.sk>, 2000.
+# Copyright (C) 2000,2004 Free Software Foundation, Inc.
+# Edited by Martin Pekar <cortex@nextra.sk>, 2000.
+# Edited by Ivan Priesol <priesol@iris-sk.sk>, 2001,2004.
 #
-#, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: 0.8.0\n"
-"POT-Creation-Date: 2000-04-13 15:57-0400\n"
-"PO-Revision-Date: 2000-04-08 14:00+0500\n"
-"Last-Translator: Martin Pekar <cortex@nextra.sk>\n"
+"Project-Id-Version: sk\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2004-02-11 23:45+0100\n"
+"Last-Translator: \n"
+"Language-Team:  <sk@li.org>\n"
 "MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=iso-8859-2\n"
-"Content-Transfer-Encoding:  8bit\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.0.1\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+# src/preferences.c:368
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Nástroje"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "clona"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+# src/utilops.c:980
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Názov súboru:"
+
+# src/ui_pathsel.c:799
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Dátum súboru:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+# src/dupe.c:1948
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Porovna» do:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Ulo¾i» zbierku"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "Znaèka"
+
+# src/dupe.c:1652 src/dupe.c:1941
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Meno"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "Hodnota"
+
+# src/preferences.c:401
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "Formát"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "Prvky"
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "Popis"
+
+# src/main.c:622
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "Exif"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "Roz¹írený pohµad"
+
+# src/utilops.c:664 src/utilops.c:676
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Mazanie zlyhalo"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+# src/utilops.c:1144
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Adresár:\n"
+"%s\n"
+"u¾ existuje."
+
+# src/collect-dlg.c:206
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Zbierka je prázdna"
+
+# src/collect-dlg.c:82 src/collect.c:1011
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Zlyhalo ulo¾enie zbierky:\n"
+"%s"
+
+# src/collect-dlg.c:83 src/collect.c:1012
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Zlyhanie zápisu"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "Prida» zálo¾ku"
+
+# src/preferences.c:897
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Zbierky"
+
+# src/dupe.c:1652 src/dupe.c:1941
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "Meno:"
+
+# src/menu.c:526
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "Správca triedenia"
+
+# src/preferences.c:368
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "Zlo¾ky"
+
+# src/preferences.c:897
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Zbierky"
+
+# src/utilops.c:592
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Kopírova»"
+
+# src/utilops.c:601
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Presunú»"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+# src/collect-table.c:86
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d obrázkov"
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Zru¹i» výber"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "Vráti» posledný obrázok"
+
+# src/preferences.c:400
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "hotovo"
+
+# src/dupe.c:841
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Naèítavam podobnostné dáta..."
+
+# src/cache_maint.c:245
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Èistím miniatúry..."
+
+# src/cache_maint.c:249
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Èistím staré miniatúry..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+# src/collect-dlg.c:59
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Nesprávne meno súboru"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+# src/preferences.c:603
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Ke¹ova» miniatúry"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "©tart #"
+
+# src/preferences.c:368
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "Zlo¾ka:"
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Zru¹i» výber"
+
+# src/collect-dlg.c:59
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Nesprávne meno súboru"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "pracujem..."
+
+# src/cache_maint.c:245
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Èistím miniatúry..."
+
+# src/preferences.c:163 src/preferences.c:604
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Vyèisti» ke¹"
+
+# src/preferences.c:163
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Chystám sa vymaza» v¹etky miniatúry, ktoré\n"
+"boli ulo¾ené na disk, pokraèova»?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "Vlastnosti obrázka - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+# src/fullscreen.c:117
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview: celoobrazovkový mód"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "akcia"
+
+# src/dupe.c:1412 src/dupe.c:1570
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "Vyèisti»"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+# src/preferences.c:603
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "Ke¹ova» miniatúry"
+
+# src/preferences.c:603
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "Zobrazi» miniatúry"
+
+# src/ui_pathsel.c:437 src/ui_pathsel.c:460 src/utilops.c:944
+# src/utilops.c:1095
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "Premenova»"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
 
-#: src/config.c:307
-msgid "GQview configuration"
-msgstr "Konfigurácia GQview"
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+# src/collect.c:329 src/image.c:1058
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Nepomenovaný"
+
+# src/collect.c:333
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Nepomenovaný (%d)"
+
+# src/collect.c:930
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - GQview zbierka"
+
+# src/collect.c:1048
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Zatvori» zbierku"
+
+# src/collect.c:1048
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Zbierka bola zmenená.\n"
+"Ulo¾i»?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+# src/collect-dlg.c:58
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Zadaná cesta:\n"
+"%s\n"
+"je adresár, ale zbierky sú súbory"
+
+# src/collect-dlg.c:59
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Nesprávne meno súboru"
+
+# src/collect-dlg.c:69
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Prepísa» súbor"
+
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Prepísa» súbor"
+
+# src/collect-dlg.c:73 src/utilops.c:463 src/utilops.c:830 src/utilops.c:1036
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Prepísa»"
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Ulo¾i» zbierku"
+
+# src/collect-dlg.c:172
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Otvori» zbierku"
+
+# src/collect-dlg.c:180
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Pripoji» zbierku"
+
+# src/collect-dlg.c:182
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Pripoji»"
+
+# src/collect-dlg.c:194
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Súbory zbierok"
+
+# src/collect-dlg.c:206
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Zbierka je prázdna"
+
+# src/collect-dlg.c:206
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Aktuálna zbierka je prázdna, zápis zru¹ený."
+
+# src/collect-table.c:78 src/menu.c:684
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Prázdne"
+
+# src/collect-table.c:82
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d obrázkov (%d)"
 
-#: src/config.c:319
-msgid "Ok"
-msgstr "Ok"
+# src/collect-table.c:86
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d obrázkov"
+
+# src/collect-table.c:100 src/dupe.c:668 src/filelist.c:1811
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Naèítavam miniatúry..."
+
+# src/menu.c:753
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "_Zobrazi»"
+
+# src/collect-table.c:620 src/dupe.c:1388 src/dupe.c:1560 src/img-view.c:801
+# src/menu.c:906 src/menu.c:964
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "Zobrazi» v _novom okne"
+
+# src/collect-table.c:622 src/dupe.c:1410 src/dupe.c:1568
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "Vy_maza»"
+
+# src/collect-table.c:624
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Pripoji» zo zoznamu súborov"
+
+# src/collect-table.c:625
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Pripoji» zo zbierky..."
+
+# src/collect-table.c:627 src/dupe.c:1391 src/dupe.c:1563
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Vybra» v¹etko"
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Zru¹i» výber"
+
+# src/menu.c:748
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "_Vlastnosti"
+
+# src/collect-table.c:633 src/dupe.c:1401 src/img-view.c:804 src/menu.c:910
+# src/menu.c:969
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "Kopírova»..."
+
+# src/collect-table.c:634 src/dupe.c:1403 src/img-view.c:805 src/menu.c:912
+# src/menu.c:971
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "Presunú»..."
 
-#: src/config.c:324
-msgid "Apply"
-msgstr "Pou¾i»"
+# src/collect-table.c:635 src/dupe.c:1405 src/img-view.c:806 src/menu.c:914
+# src/menu.c:973
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "P_remenova»..."
+
+# src/collect-table.c:636 src/dupe.c:1407 src/img-view.c:807 src/menu.c:916
+# src/menu.c:975
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "Vymaza»..."
+
+# src/ui_pathsel.c:764
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "Zobrazi» meno súboru"
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "Ulo¾i» zbierku"
+
+# src/collect-table.c:642
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "Ulo¾i» zbierku _ako..."
+
+# src/collect-table.c:644 src/menu.c:885
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "Nájs» duplikáty..."
+
+# src/menu.c:721
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Súbor/P_remenova»..."
+
+# src/collect-table.c:1818 src/dupe.c:2170
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "Odstraòovaný zoznam obsahuje adresáre."
+
+# src/collect-table.c:1820 src/dupe.c:2172
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "Prid_a» obsah"
 
-#: src/config.c:329 src/utildlg.c:145 src/utilops.c:444 src/utilops.c:754
-#: src/utilops.c:885 src/utilops.c:983
+# src/collect-table.c:1821 src/dupe.c:2173
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "Prida» obsah _rekurzívne"
+
+# src/collect-table.c:1822 src/dupe.c:2174
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "Pre_skoèi» adresáre"
+
+# src/collect-table.c:1824 src/dupe.c:2176 src/preferences.c:536
+# src/ui_utildlg.c:105
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
 msgid "Cancel"
 msgstr "Zru¹i»"
 
-#: src/config.c:343
+# src/dupe.c:61
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Pritiahnu» súbory pre ich porovnanie."
+
+# src/dupe.c:67 src/dupe.c:1449
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d súborov"
+
+# src/dupe.c:71
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d zhôd, v %d súboroch"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[sada 1]"
+
+# src/dupe.c:775
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Naèítavam kontrolné súèty..."
+
+# src/dupe.c:807
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Naèítavam rozmery..."
+
+# src/dupe.c:841
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Naèítavam podobnostné dáta..."
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Porovnávam..."
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "Triedim..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "Vybra» skupinu _1 duplikátov"
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "Vybra» skupinu _2 duplikátov"
+
+# src/dupe.c:1398
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Prida» do novej zbierky"
+
+# src/dupe.c:1412 src/dupe.c:1570
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "Vymaza»"
+
+# src/dupe.c:1415 src/dupe.c:1573 src/img-view.c:841
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "Zavrie» okno"
+
+# src/filelist.c:88
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "%d súborov (sada 2)"
+
+# src/dupe.c:1653 src/dupe.c:1942
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Veµkos»"
+
+# src/dupe.c:1654 src/dupe.c:1943
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Dátum"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Rozmery"
+
+# src/dupe.c:1656
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Kontrolný súèet"
+
+# src/dupe.c:1657 src/dupe.c:1945
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Cesta"
+
+# src/dupe.c:1658
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Podobnos» (vysoká)"
+
+# src/dupe.c:1659
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Podobnos»"
+
+# src/dupe.c:1660
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Podobnos» (nízka)"
+
+# src/dupe.c:1660
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Podobnos» (voliteµná)"
+
+# src/dupe.c:1968
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Nájs» duplikáty - GQview"
+
+# src/dupe.c:1948
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Porovna» do:"
+
+# src/dupe.c:2045
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Porovna» podµa:"
+
+# src/dupe.c:2054 src/preferences.c:586
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Miniatúry"
+
+# src/dupe.c:2060
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Porovna» dve sady súborov"
+
+# src/main.c:552
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "Gimp"
+
+# src/main.c:558
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+# src/main.c:561
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+# src/menu.c:572
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr ""
+"Rotova» jpeg v smere\n"
+"hodinových ruèièiek"
+
+# src/menu.c:575
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr ""
+"Rotova» jpeg proti smeru\n"
+"hodinových ruèièiek"
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "zastavujem..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "Výsledky z príkazu na úpravu"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "Výstup z %s"
+
+# src/ui_help.c:191
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Zlyhanie spustenia príkazu:\n"
+"%s\n"
+
+# src/menu.c:522
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "zastavené u¾ívateµom"
+
+# src/menu.c:432 src/menu.c:461
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "neznámy"
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/exif.c:113
+msgid "top left"
+msgstr "hore vµavo"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "hore vpravo"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "dole vpravo"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "dole vµavo"
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/exif.c:117
+msgid "left top"
+msgstr "vµavo hore"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "vpravo hore"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "vpravo dole"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "vµavo dole"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "palce"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "centimeter"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "priemerný"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "stredovo vyvá¾ený"
+
+#: src/exif.c:142
+msgid "spot"
+msgstr "bodový"
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr "viacbodový"
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr "viacsegmentový"
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "èiastoèný"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "iné"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "nedefinované"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "manuálne"
+
+# src/preferences.c:401
+#: src/exif.c:153
+msgid "normal"
+msgstr "normálne"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "clona"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "uzávierka"
+
+# src/utilops.c:1216
+#: src/exif.c:156
+msgid "creative"
+msgstr "tvorivý"
+
+#: src/exif.c:157
+msgid "action"
+msgstr "akcia"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "na vý¹ku"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "na ¹írku"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "denné svetlo"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "fluorescenèné"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "volfrám (roz¾eravený)"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "blesk"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "nie"
+
+# src/utilops.c:343
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "áno"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr "áno, nedetekované snímacím impulzom"
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr "áno, detekované snímacím impulzom"
+
+# src/utilops.c:539
+#: src/exif.c:289
+msgid "Image description"
+msgstr "Popis obrázku"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "Orientácia"
+
+# src/utilops.c:592
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "Autorské práva"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "Expozièný program"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "Citlivos» ISO"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "Dátum originálu"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "Dátum digitalizácie"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "Rýchlos» uzávierky"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "Clona"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "Skreslenie expozície"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "Vzdialenos» subjektu"
+
+# src/preferences.c:693
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "Mód merania"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "Zdroj svetla"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "Blesk"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "Ohnisková vzdialenos»"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "©írka"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "Vý¹ka"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "Fotoaparát"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "Rozlí¹enie"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "nekoneèno"
+
+# src/preferences.c:368
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "mód:"
+
+# src/preferences.c:400
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "zapnuté"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "vypnuté"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "automaticky"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr "nedetekované snímacím impulzom"
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr "detekované snímacím impulzom"
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "redukcia \"èervených oèí\""
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "bod"
+
+# src/dupe.c:67 src/dupe.c:1449
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d bytov"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f K"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+# src/fullscreen.c:117
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview: celoobrazovkový mód"
+
+# src/preferences.c:368
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Veµkos» súboru:"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+# src/img-view.c:792 src/menu.c:947 src/menu.c:1083 src/preferences.c:716
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Prispôsobi» obrázok do okna"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+# src/img-view.c:789 src/menu.c:944 src/menu.c:1079
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "Priblí¾_i»"
+
+# src/img-view.c:790 src/menu.c:945 src/menu.c:1081
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "_Oddiali»"
+
+# src/img-view.c:791 src/menu.c:946
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "Zobrazenie _1:1"
+
+# src/img-view.c:792 src/menu.c:947 src/menu.c:1083 src/preferences.c:716
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "Prispôsobi» obrázok do okna"
+
+# src/img-view.c:797 src/menu.c:960
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "Nastavi» ako pozadie plochy"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "Za_stavi» prezentáciu"
+
+# src/img-view.c:816 src/menu.c:985
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "Pokraèova» v prezentácii"
+
+# src/img-view.c:820 src/img-view.c:827 src/menu.c:989 src/menu.c:995
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "Pozastavi» prezentáciu"
+
+# src/img-view.c:825 src/menu.c:994
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "_Spusti» prezentáciu"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "Ukonèi» celoobrazovkový mód"
+
+# src/img-view.c:837 src/menu.c:1001
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "Celooobrazovkový mód"
+
+# src/dupe.c:1415 src/dupe.c:1573 src/img-view.c:841
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "Zavrie» okno"
+
+# src/preferences.c:368
+#: src/info.c:361
+msgid "File size:"
+msgstr "Veµkos» súboru:"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Rozmery:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Priehµadnos»:"
+
+# src/preferences.c:676
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Veµkos» obrázoku:"
+
+# src/dupe.c:1948
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Kompresný pomer:"
+
+# src/ui_pathsel.c:799
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Dátum súboru:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Vlastník:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Skupina:"
+
+# src/preferences.c:551
+#: src/info.c:374 src/preferences.c:821
 msgid "General"
 msgstr "Hlavné"
 
-#: src/config.c:351
-msgid "Initial directory"
-msgstr "Poèiatoèný adresár"
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "Obrázok %d z %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Vlastnosti obrázka - GQview"
+
+# src/window.c:87
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Vzostupne"
+
+# src/filelist.c:76
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr "Prezentácia"
+
+# src/filelist.c:80
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Pozastavené"
+
+# src/filelist.c:86
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d súborov (%s, %d)%s"
+
+# src/filelist.c:88
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d súborov%s"
+
+# src/filelist.c:88
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d súborov%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(zákaz èítania) %s bytov"
+
+# src/window.c:379
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s bajtov"
+
+# src/window.c:383
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s bajtov"
+
+# src/window.c:234
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview : Nástroje"
+
+# src/preferences.c:368
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Nástroje"
+
+# src/preferences.c:368
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "Súbory"
+
+# src/preferences.c:676
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Obrázok"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(zmena poradia »ahaním)"
+
+# src/menu.c:1010
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "Sky» zoznam súborov"
+
+# src/menu.c:430 src/menu.c:457
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "v %s..."
+
+# src/menu.c:432 src/menu.c:461
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "v (neznámom)..."
+
+# src/collect-table.c:78 src/menu.c:684
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Prázdne"
+
+# src/menu.c:709
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Súbor"
+
+# src/menu.c:726
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "_Upravi»"
+
+# src/menu.c:626
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "N_astavi»"
+
+# src/menu.c:771
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/_Pomocník"
+
+# src/menu.c:711
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Súbor/Nové okno"
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "Ulo¾i» zbierku"
+
+# src/collect-dlg.c:172
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Otvori» zbierku"
+
+# src/menu.c:713
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Súbor/Otvo_ri» nedávne"
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Triedim..."
+
+# src/menu.c:721
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Súbor/P_remenova»..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "_Nová zlo¾ka..."
+
+# src/preferences.c:684
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Kvalita"
+
+# src/menu.c:572
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr ""
+"Rotova» v smere\n"
+"hodinových ruèièiek"
+
+# src/menu.c:575
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr ""
+"Rotova» proti smeru\n"
+"hodinových ruèièiek"
+
+# src/menu.c:578
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Rotova» _180"
+
+# src/menu.c:581
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "_Zrkadli»"
+
+# src/menu.c:584
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "_Preklopi»"
+
+# src/collect-table.c:627 src/dupe.c:1391 src/dupe.c:1563
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Vybra» v¹etko"
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Zru¹i» výber"
+
+# src/menu.c:748
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "_Vlastnosti..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+# src/menu.c:758
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Zobrazi»/Prispôsobi» oknu"
+
+# src/img-view.c:837 src/menu.c:1001
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "Celooobrazovkový mód"
+
+# src/menu.c:1010
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Sky» zoznam súborov"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "Za_stavi» prezentáciu"
+
+# src/menu.c:891 src/menu.c:920
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "Obnovi»"
+
+# src/menu.c:776
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Pomocník/_O GQview"
+
+# src/menu.c:773
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Pomocník/_Klávesové skratky"
+
+# src/menu.c:774
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Pomocník/_Poznámky k verzii"
+
+# src/menu.c:776
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/Pomocník/_O GQview"
+
+# src/dupe.c:2054 src/preferences.c:586
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Miniatúry"
+
+# src/menu.c:768
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Zobrazi»/Strom"
+
+# src/menu.c:766
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Zobrazi»/_Plávajúci zoznam súborov"
+
+# src/menu.c:754
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Zobrazi»/Skry» nástrojovú li¹tu"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "/Zobrazi»/Ikony"
+
+# src/menu.c:765
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Zobrazi»/E_xif dáta"
+
+# src/menu.c:526
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Správca triedenia"
+
+# src/menu.c:765
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Zobrazi»/Zoznam"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Ikona:"
+
+# src/preferences.c:603
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Zobrazi» miniatúry"
+
+# src/menu.c:1075
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Do domovského adresára"
+
+# src/menu.c:1077
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Obnovi» zoznam súborov"
+
+# src/img-view.c:789 src/menu.c:944 src/menu.c:1079
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Priblí¾i»"
+
+# src/img-view.c:790 src/menu.c:945 src/menu.c:1081
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Oddiali»"
+
+# src/img-view.c:792 src/menu.c:947 src/menu.c:1083 src/preferences.c:716
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Prispôsobi» obrázok do okna"
+
+# src/menu.c:1085
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Nastavi» zobrazenie 1:1"
+
+# src/menu.c:1087
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Konfigurova» voµby"
+
+# src/menu.c:1089
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Plávajúce ovládanie"
+
+# src/main.c:129
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Pomoc - GQview"
+
+# src/main.c:743
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Príkazový riadok"
+
+# src/preferences.c:660
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Predèíta» nasledujúci obrázok"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "Vráti» posledný obrázok"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Vráti» posledný obrázok"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "Ukonèi» celoobrazovkový mód"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "Ukonèi» celoobrazovkový mód"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "Ukonèi» celoobrazovkový mód"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "Za_stavi» prezentáciu"
+
+# src/img-view.c:825 src/menu.c:994
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "_Spusti» prezentáciu"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "Za_stavi» prezentáciu"
+
+# src/img-view.c:825 src/menu.c:994
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "_Spusti» prezentáciu"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+# src/window.c:234
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview : Nástroje"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+# src/utilops.c:1090
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr "Premenova» súbor:"
+
+# src/collect-table.c:620 src/dupe.c:1388 src/dupe.c:1560 src/img-view.c:801
+# src/menu.c:906 src/menu.c:964
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Zobrazi» v _novom okne"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+# src/main.c:457
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Pou¾itie: gqview [parametre] [cesta]\n"
+"\n"
+
+# src/main.c:458
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "mo¾né parametre sú:\n"
+
+# src/main.c:459
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           vynúti» zobrazenie nástrojov\n"
+
+# src/main.c:460
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools         vynúti» skrytie nástrojov\n"
+
+# src/main.c:461
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           ¹tart v celoobrazovkovom móde\n"
+
+# src/main.c:462
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            ¹tart v prezentaènom móde\n"
+
+# src/main.c:463
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+"  -l, --list                 otvori» okno so zbierkou pre príkazový riadok\n"
+
+# src/main.c:463
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+"  -l, --list                 otvori» okno so zbierkou pre príkazový riadok\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+# src/main.c:464
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    zapnú» ladiaci výstup\n"
+
+# src/main.c:465
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              vypísa» verziu programu\n"
+
+# src/main.c:466
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 zobrazí túto správu\n"
+"\n"
+
+# src/main.c:471
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"chybný alebo ignorovaný: %s\n"
+"Pou¾i --help pre parametre\n"
+
+# src/main.c:533
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Vytváram GQview adresár:%s\n"
+
+# src/main.c:536
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Nemô¾em vytvori» adresár:%s\n"
+
+# src/ui_pathsel.c:754
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Domov"
+
+# src/utilops.c:989
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "Plocha"
+
+# src/main.c:619
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - koniec"
+
+# src/img-view.c:559 src/window.c:533
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "O - GQview"
+
+# src/main.c:619
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Zbierky boli zmenené.\n"
+"Naozaj skonèi»?"
+
+# src/menu.c:510
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "Usporiadané podµa veµkosti"
+
+# src/menu.c:513
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "Usporiadané podµa dátumu"
+
+# src/menu.c:516
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Neusporiadané"
+
+# src/menu.c:519
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "Usporiadané podµa cesty"
+
+# src/menu.c:522
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "Usporiadané podµa èísla"
+
+# src/menu.c:526
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "Usporiadané podµa mena"
+
+# src/menu.c:559
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Usporiada»"
+
+# src/menu.c:578
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "Rotova» _180"
+
+# src/preferences.c:367
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Najbli¾¹ie (najhor¹ie, ale narýchlej¹ie)"
+
+# src/preferences.c:368
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Dla¾dice"
+
+# src/preferences.c:369
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilineárne"
+
+# src/preferences.c:370
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Hyper (najlep¹ie, ale najpomal¹ie)"
+
+# src/preferences.c:400
+#: src/preferences.c:418
+msgid "None"
+msgstr "®iadna"
+
+# src/preferences.c:401
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normálna"
+
+# src/preferences.c:402
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Najlep¹ia"
+
+#: src/preferences.c:498 src/print.c:365
+#, fuzzy
+msgid "Custom"
+msgstr "automaticky"
+
+# src/utilops.c:707
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "Reset filtrov"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Chystám sa nastavi» filtre na prednastavené hodnoty.\n"
+"Pokraèova»?"
+
+# src/utilops.c:707
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "Reset editorov"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Chystám sa nastaví» príkazy na úpravu na prednastavené hodnoty.\n"
+"Pokraèova»?"
+
+# src/preferences.c:163 src/preferences.c:604
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "Vyèisti» kô¹"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "Toto vyma¾e obsah ko¹a."
+
+# src/utilops.c:942 src/utilops.c:1091
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - premenovanie"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "©tart #"
+
+# src/menu.c:1075
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Do domovského adresára"
+
+# src/preferences.c:581
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Pou¾i» aktuálny"
+
+# src/preferences.c:595
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Rozmer:"
+
+# src/preferences.c:597
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Kvalita:"
+
+# src/preferences.c:603
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Ke¹ova» miniatúry"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+# src/preferences.c:610
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Ke¹ova» miniatúry do .thumbnails"
+
+# src/preferences.c:613
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Pou¾i» xvpics miniatúry ak sú nájdené (iba na èítanie)"
+
+# src/preferences.c:615
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Prezentácia"
+
+# src/preferences.c:628
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Odeskorenie pri zmene obrázku (v sekundách):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+# src/preferences.c:645
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Náhodne"
+
+# src/preferences.c:647
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Opakovane"
+
+# src/img-view.c:789 src/menu.c:944 src/menu.c:1079
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Priblí¾i»"
+
+# src/preferences.c:693
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Metóda vyhladzovania:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Dvojpriechodová zmena mierky"
+
+# src/preferences.c:729
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Povoli» zväè¹enie obrázku pre prispôsobenie veµkosti."
+
+# src/preferences.c:751
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Krok zväè¹enia/zmen¹enia:"
+
+# src/preferences.c:700
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Keï je zvolený nový obrázok:"
+
+# src/preferences.c:710
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Mierka na originálny rozmer"
+
+# src/preferences.c:722
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Ponecha» mierku na predchádajúcom nastavení"
+
+# src/collect-dlg.c:182
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Pripoji»"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Èierne pozadie"
+
+# src/utilops.c:328 src/utilops.c:394 src/utilops.c:668
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Pokraèova»"
+
+# src/menu.c:1077
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "Obnovi» pri zmene súboru"
+
+# src/preferences.c:660
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Predèíta» nasledujúci obrázok"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Automaticky rotova» podµa Exif"
+
+# src/preferences.c:773
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Okná"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "©tart #"
+
+# src/preferences.c:782
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Pamäta» si pozície okien"
+
+# src/preferences.c:784
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Pamäta» si stav nástrojov(plávajúce/skryté)"
+
+# src/preferences.c:787
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "Prispôsobi» okno na veµkos» obrázku, ak sú nástroje skryté/plávajúce"
+
+# src/preferences.c:794
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Obmedzi» rozmer ak sa okno automaticky prispôsobuje (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Rozlo¾enie"
+
+# src/preferences.c:812
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filtrovanie"
+
+# src/preferences.c:821
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Zobrazi» polo¾ky ktoré zaèínajú bodkou"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "Triedenie citlivé na veµkos» znakov"
+
+# src/preferences.c:823
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Vypnú» filtrovanie súborov"
+
+# src/ui_pathsel.c:799
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Dátum súboru:"
+
+# src/ui_pathsel.c:799
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "Filter"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "Prednastavené"
+
+# src/preferences.c:915
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Editory"
+
+# src/preferences.c:927
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+# src/preferences.c:930
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Meno ponuky"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "Pokroèilé"
+
+# src/img-view.c:837 src/menu.c:1001
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "Celooobrazovkový mód"
+
+# src/preferences.c:676
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Veµkos» obrázoku:"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Zmaza»"
+
+# src/preferences.c:667
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Potvrdi» zmazanie súboru"
+
+# src/preferences.c:669
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Povoli» klávesu Delete"
+
+# src/preferences.c:667
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "Bezpeèné mazanie"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Maximálna veµkos» (MB)"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+# src/collect-table.c:619 src/dupe.c:1386 src/dupe.c:1558
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Zobrazi»"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+# src/preferences.c:906
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Obdå¾nikový výber"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Zni¾ova» zlo¾ky adresárov v stromovom zobrazení"
+
+# src/preferences.c:658
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Premenovanie na mieste"
+
+#: src/preferences.c:1200
+#, fuzzy
+msgid "Navigation"
+msgstr "akcia"
+
+# src/preferences.c:764
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Progresívne posúvanie klávesnicou"
+
+# src/preferences.c:766
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Koliesko my¹i posúva obrázok"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+# src/preferences.c:875
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "U¾ivateµský prah podobnosti:"
+
+# src/preferences.c:735
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Veµkos» mimoobrazokovej ke¹e (MB na obrázok):"
+
+# src/img-view.c:559 src/window.c:533
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "O - GQview"
+
+# src/preferences.c:1041
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"WWW: %s\n"
+"email: %s\n"
+"\n"
+"Vydané pod GNU General Public License"
+
+# src/menu.c:748
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "Pïakovanie..."
+
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Zru¹i» výber"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+#, fuzzy
+msgid "Default printer"
+msgstr "Prednastavené"
+
+# src/preferences.c:875
+#: src/print.c:138
+#, fuzzy
+msgid "Custom printer"
+msgstr "U¾ivateµské typy súborov"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+# src/preferences.c:676
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Veµkos» obrázoku:"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+# src/main.c:561
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+#, fuzzy
+msgid "centimeters"
+msgstr "centimeter"
+
+#: src/print.c:353
+#, fuzzy
+msgid "inches"
+msgstr "palce"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+#, fuzzy
+msgid "Portrait"
+msgstr "na vý¹ku"
+
+#: src/print.c:360
+#, fuzzy
+msgid "Landscape"
+msgstr "na ¹írku"
+
+#: src/print.c:366
+#, fuzzy
+msgid "Letter"
+msgstr "centimeter"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, fuzzy, c-format
+msgid "page %d of %d"
+msgstr "Obrázok %d z %d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "Náhµad"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+# src/ui_pathsel.c:307
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "Súbor s názvom %s u¾ existuje."
 
-#: src/config.c:361
-msgid "On startup, change to this directory:"
-msgstr "Pri ¹tarte zobrazi» tento adresár:"
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
 
-#: src/config.c:373
-msgid "Use current"
-msgstr "Pou¾i» aktuálny"
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
 
-#: src/config.c:379
-msgid "Confirm file delete"
-msgstr "Potvrdi» zmazanie súboru"
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
 
-#: src/config.c:381
-msgid "Remember tool state (float/hidden)"
-msgstr "Zapamäta» si stav nástrojov(plávajúce/skryté)"
+# src/ui_pathsel.c:799
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Filter"
 
-#: src/config.c:383
-msgid "Remember window positions"
-msgstr "Zapamäta» si pozíciu okna"
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
 
-#: src/config.c:385
-msgid "Slide show"
-msgstr "Postupne zobrazova»"
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Prednastavené"
 
-#: src/config.c:398
-msgid "Delay before image change (seconds):"
-msgstr "Ome¹kanie medzi zobrazením obrázkov(v sekundách):"
+# src/img-view.c:559 src/window.c:533
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "O - GQview"
 
-#: src/config.c:411
-msgid "Random"
-msgstr "Náhodne"
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
 
-#: src/config.c:413
-msgid "Repeat"
-msgstr "Neprestajne"
+# src/preferences.c:401
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Formát"
 
-#: src/config.c:420
-msgid "Image"
-msgstr "Obrázok"
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
 
-#: src/config.c:428
-msgid "When new image is selected:"
-msgstr "Keï je zvolený nový obrázok:"
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Orientácia"
 
-#: src/config.c:438
-msgid "Zoom to original size"
-msgstr "Zväè¹i» na originálny rozmer"
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Popis"
 
-#: src/config.c:444 src/img-view.c:306 src/menu.c:473 src/menu.c:547
-#: src/menu.c:587 src/menu.c:678
-msgid "Fit image to window"
-msgstr "Zmesti» obrázok do okna"
+# src/utilops.c:980
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Názov súboru:"
 
-#: src/config.c:450
-msgid "Leave Zoom at previous setting"
-msgstr "Ponecha» zväè¹enie na predchádajúcom nastavení"
+# src/collect.c:329 src/image.c:1058
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Nepomenovaný"
 
-#: src/config.c:457
-msgid "Fit window to image when tools are hidden/floating"
-msgstr "Zmesti» okno do obrázku ak sú nástroje skryté/plávajúce"
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
 
-#: src/config.c:464
-msgid "Limit size when auto-sizing window"
-msgstr "Obmedzi» rozmer ak sa okno automaticky prispôsobuje"
+# src/preferences.c:400
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "zapnuté"
 
-#: src/config.c:474 src/menu.c:477
-msgid "Thumbnails"
-msgstr "Miniatúry"
+# src/menu.c:559
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Usporiada»"
 
-#: src/config.c:490
-msgid "Size:"
-msgstr "Rozmer:"
+# src/preferences.c:676
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Veµkos» obrázoku:"
 
-#: src/config.c:519
-msgid "Cache thumbnails"
-msgstr "Ke¹ova» miniatúry"
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
 
-#: src/config.c:521
-msgid "Use xvpics thumbnails when found (read only)"
-msgstr "Pou¾i» xvpics miniatúry ak sú nájdené (iba pre èítanie)"
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "clona"
 
-#: src/config.c:524
-msgid "Progressive keyboard scrolling"
-msgstr "Progresívne posúvanie klávesnicou"
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
 
-#: src/config.c:526
-msgid "Mouse wheel scrolls image"
+#: src/print.c:3426
+msgid "Left:"
 msgstr ""
 
-#: src/config.c:533
-msgid "Filtering"
-msgstr "Filtrovanie"
+#: src/print.c:3429
+#, fuzzy
+msgid "Right:"
+msgstr "Vý¹ka"
 
-#: src/config.c:542
-msgid "Show entries that begin with a dot"
-msgstr "Zobrazi» polo¾ky ktoré zaèínajú s bodkou"
+#: src/print.c:3432
+#, fuzzy
+msgid "Top:"
+msgstr "Skupina:"
 
-#: src/config.c:544
-msgid "Disable File Filtering"
-msgstr "Vypnú» filtrovanie súborov"
+# src/utilops.c:989
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "na:"
 
-#: src/config.c:546
-msgid "Include files of type:"
-msgstr "Zahrnú» súbory typu:"
+# src/ui_pathsel.c:799
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Filter"
 
-#: src/config.c:596
-msgid "Custom file types:"
+# src/preferences.c:875
+#: src/print.c:3450
+#, fuzzy
+msgid "Custom printer:"
 msgstr "U¾ivateµské typy súborov"
 
-#: src/config.c:609
-msgid "format: [.foo;.bar]"
-msgstr "formát: [.foo;.bar]"
-
-#: src/config.c:618
-msgid "External Editors"
-msgstr "Externé editory"
-
-#: src/config.c:630
-msgid "#"
-msgstr "#"
+# src/ui_pathsel.c:799
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Filter:"
 
-#: src/config.c:633
-msgid "Menu name"
-msgstr "Meno ponuky"
+# src/ui_pathsel.c:799
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Dátum súboru:"
 
-#: src/config.c:636
-msgid "Command Line"
-msgstr "Príkazový riadok"
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
 
-#: src/config.c:666 src/menu.c:500
-msgid "About"
-msgstr "O programe"
+# src/preferences.c:782
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Pamäta» si pozície okien"
 
-#: src/config.c:682
+# src/rcfile.c:132
+#: src/rcfile.c:185
 #, c-format
-msgid ""
-"GQview %s\n"
-"\n"
-"Copyright (c) 2000 by John Ellis\n"
-"http://gqview.sorceforge.net\n"
-"or http://gqview.netpedia.net\n"
-"gqview@email.com\n"
-"\n"
-"Released under the GNU Public License"
-msgstr ""
-"GQview %s\n"
-"\n"
-"Copyright (c) 2000 by John Ellis\n"
-"http://gqview.sorceforge.net\n"
-"alebo http://gqview.netpedia.net\n"
-"gqview@email.com\n"
-"\n"
-"Vydané pod GNU Public License"
+msgid "error saving config file: %s\n"
+msgstr "chyba pri ukladaní konfiguraèného súboru: %s\n"
 
-#: src/filelist.c:51
-msgid " Slideshow"
-msgstr " Postupné zobrazovanie"
+# src/preferences.c:368
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Zlo¾ka:"
 
-#: src/filelist.c:55
-#, c-format
-msgid "%d files (%d)%s"
-msgstr "%d súborov (%d)%s"
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Prvky"
 
-#: src/filelist.c:57
-#, c-format
-msgid "%d files%s"
-msgstr "%d súborov%s"
+#: src/search.c:202
+#, fuzzy
+msgid "results"
+msgstr "Prednastavené"
 
-#: src/filelist.c:1025
-msgid "Loading thumbs..."
-msgstr "Naèítavam miniatúry..."
+# src/utilops.c:328 src/utilops.c:394 src/utilops.c:668
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Pokraèova»"
 
-#: src/image.c:66
-#, c-format
-msgid "( ? x ? ) %d bytes"
-msgstr "( ? x ? ) %d bajtov"
+#: src/search.c:207
+msgid "is"
+msgstr ""
 
-#: src/image.c:68
-#, c-format
-msgid "( %d x %d ) %d bytes"
-msgstr "( %d x %d ) %d bajtov"
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
 
-#: src/img-main.c:247
-msgid "GQview full screen"
-msgstr "GQview : zobrazenie na celú obrazovku"
+#: src/search.c:212
+msgid "less than"
+msgstr ""
 
-#: src/img-view.c:303 src/menu.c:470 src/menu.c:544 src/menu.c:584
-#: src/menu.c:674
-msgid "Zoom in"
-msgstr "Zväè¹i»"
+# src/menu.c:1066
+#: src/search.c:213
+#, fuzzy
+msgid "greater than"
+msgstr "Vytvori» miniatúry"
 
-#: src/img-view.c:304 src/menu.c:471 src/menu.c:545 src/menu.c:585
-#: src/menu.c:676
-msgid "Zoom out"
-msgstr "Zmen¹i»"
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
 
-#: src/img-view.c:305 src/menu.c:472 src/menu.c:546 src/menu.c:586
-msgid "Zoom 1:1"
-msgstr "Zobrazenie 1:1"
+#: src/search.c:219
+msgid "before"
+msgstr ""
 
-#. edit menu
-#: src/img-view.c:309 src/menu.c:457 src/menu.c:519 src/menu.c:550
-#: src/menu.c:590
-msgid "Edit"
-msgstr "Editova»"
+# src/ui_pathsel.c:799
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "Filter:"
 
-#: src/img-view.c:314 src/menu.c:446 src/menu.c:526 src/menu.c:557
-#: src/menu.c:595
-msgid "Copy..."
-msgstr "Kopírova»..."
+#: src/search.c:225
+msgid "match all"
+msgstr ""
 
-#: src/img-view.c:315 src/menu.c:447 src/menu.c:527 src/menu.c:558
-#: src/menu.c:596
-msgid "Move..."
-msgstr "Presunú»..."
+#: src/search.c:226
+msgid "match any"
+msgstr ""
 
-#: src/img-view.c:316 src/menu.c:448 src/menu.c:528 src/menu.c:559
-#: src/menu.c:597
-msgid "Rename..."
-msgstr "Premenova»..."
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
 
-#: src/img-view.c:317 src/menu.c:449 src/menu.c:529 src/menu.c:560
-#: src/menu.c:598
-msgid "Delete..."
-msgstr "Zmaza»..."
+# src/filelist.c:86
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d súborov (%s, %d)%s"
 
-#: src/img-view.c:320
-msgid "Close window"
-msgstr "Zavrie» okno"
+# src/filelist.c:88
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%s, %d súborov%s"
 
-#: src/main.c:90 src/main.c:119
-#, c-format
-msgid "GQview running: %s\n"
-msgstr "GQview spustení: %s\n"
+# src/dupe.c:871 src/dupe.c:892
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Triedim..."
 
-#: src/main.c:330
-msgid ""
-"Usage: gqview [options] [path]\n"
-"\n"
+#: src/search.c:2093
+msgid "File not found"
 msgstr ""
-"Pou¾itie: gqview [parametre] [cesta]\n"
-"\n"
-
-#: src/main.c:331
-msgid "valid options are:\n"
-msgstr "mo¾né parametre sú:\n"
 
-#: src/main.c:332
-msgid "  +t, --with-tools           force show of tools\n"
-msgstr "  +t, --with-tools           podporí zobrazenie nástrojov\n"
+# src/utilops.c:544
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Prosím zvoµte existujúci adresár"
 
-#: src/main.c:333
-msgid "  -t, --without-tools        force hide of tools\n"
-msgstr "  -t, --without-tools        podporí skrytie nástrojov\n"
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
 
-#: src/main.c:334
-msgid "  -f, --fullscreen           start in full screen mode\n"
-msgstr "  -f, --fullscreen           ¹tart v celoobrazovkovom móde\n"
+# src/utilops.c:544
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Prosím zvoµte existujúci adresár"
 
-#: src/main.c:335
-msgid "  -s, --slideshow            start in slideshow mode\n"
-msgstr "  -s, --slideshow            zaèa» s postupným zobrazovaním\n"
+#: src/search.c:2570
+#, fuzzy
+msgid "Image search - GQview"
+msgstr "Vlastnosti obrázka - GQview"
 
-#: src/main.c:336
-msgid "  --debug                    turn on debug output\n"
-msgstr "  --debug                    zapnú» kontrolný výstup\n"
+# src/dupe.c:871 src/dupe.c:892
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Triedim..."
 
-#: src/main.c:337
-msgid ""
-"  -h, --help                 show this message\n"
-"\n"
+#: src/search.c:2613
+msgid "Recurse"
 msgstr ""
-"  -h, --help                 zobrazí túto správu\n"
-"\n"
 
-#: src/main.c:342
-#, c-format
-msgid ""
-"invalid or ignored: %s\n"
-"Use -help for options\n"
+# src/utilops.c:980
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Názov súboru:"
+
+#: src/search.c:2623
+msgid "Match case"
 msgstr ""
-"chybný alebo ignorovaný: %s\n"
-"Pou¾i -help pre parametre\n"
 
-#: src/main.c:369
-msgid "The Gimp"
-msgstr "Gimp-e"
+# src/preferences.c:368
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Veµkos» súboru:"
 
-#: src/main.c:372
-msgid "Electric Eyes"
-msgstr "Electric Eyes"
+# src/preferences.c:645
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Náhodne"
 
-#: src/main.c:375
-msgid "XV"
-msgstr "XV"
+# src/ui_pathsel.c:799
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Dátum súboru:"
 
-#: src/main.c:378
-msgid "Xpaint"
-msgstr "Xpaint"
+# src/utilops.c:539
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Popis obrázku"
 
-#: src/menu.c:373
-#, c-format
-msgid "in %s..."
-msgstr "v %s..."
+# src/collect-table.c:1820 src/dupe.c:2172
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Prida» obsah"
 
-#: src/menu.c:375
-msgid "in (unknown)..."
-msgstr "v (neznámom)..."
+# src/dupe.c:1659
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Podobnos»"
 
-#: src/menu.c:394
-msgid "Options..."
-msgstr "Nastavenia..."
+# src/preferences.c:645
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Náhodne"
 
-#: src/menu.c:396
-msgid "Remove old thumbnails"
-msgstr "Odstráni» staré miniatúry"
+# src/thumb.c:268
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "Zlyhalo naèítanie miniatúry z ke¹e, pokus o opätovné vytvorenie\n"
 
-#: src/menu.c:398 src/menu.c:410 src/menu.c:422
-msgid "Set as wallpaper"
-msgstr "Da» na pozadie plochy"
+# src/ui_tabcomp.c:171
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Nemo¾no zapísa» históriu do: %s\n"
 
-#. file menu
-#: src/menu.c:440
-msgid "File"
-msgstr "Súbor"
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "Nová zálo¾ka"
 
-#: src/menu.c:444
-msgid "Create Dir..."
-msgstr "Vytvori» adresár..."
+# src/preferences.c:915
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "Upravi» zálo¾ku"
 
-#: src/menu.c:451
-msgid "Exit"
-msgstr "Koniec"
+# src/dupe.c:1657 src/dupe.c:1945
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "Cesta:"
 
-#. view menu
-#: src/menu.c:466
-msgid "View"
-msgstr "Zobrazenie"
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "Ikona:"
 
-#: src/menu.c:476 src/menu.c:563
-msgid "Full screen"
-msgstr "Celá obrazovka"
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Zru¹i» výber"
+
+# src/menu.c:748
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "_Vlastnosti..."
+
+# src/utilops.c:601
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "Pres_unú» hore"
+
+# src/utilops.c:601
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "Presunú» _dole"
+
+# src/collect-table.c:622 src/dupe.c:1410 src/dupe.c:1568
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "_Vymaza»"
+
+# src/ui_help.c:191
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Nemo¾no naèíta» súbor:\n"
+"%s"
 
-#: src/menu.c:485
-msgid "Refresh Lists"
-msgstr "Obnovi» zoznam"
+# src/ui_pathsel.c:313
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Nemo¾no premenova» %s na %s"
+
+# src/ui_pathsel.c:343 src/utilops.c:675 src/utilops.c:727
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Nemo¾no zmaza» súbor:\n"
+"%s"
+
+# src/ui_pathsel.c:344 src/utilops.c:728
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Zmazanie súboru zlyhalo"
 
-#: src/menu.c:486
-msgid "(Un)Float file list"
-msgstr "(Ne)Plávajúci zoznam súborov"
+# src/ui_pathsel.c:398 src/utilops.c:760
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Zmaza» súbor"
 
-#: src/menu.c:487 src/menu.c:562
-msgid "(Un)Hide file list"
-msgstr "(Ne)Zobrazený zoznam súborov"
+# src/ui_pathsel.c:397 src/utilops.c:759
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Pripravený zmaza» súbor:\n"
+" %s"
 
-#: src/menu.c:490
-msgid "Toggle slideshow"
-msgstr "Prepnú» postupné zobrazenie"
+# src/ui_pathsel.c:437 src/ui_pathsel.c:460 src/utilops.c:944
+# src/utilops.c:1095
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "P_remenova»"
+
+# src/preferences.c:915
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "Prida» zálo¾ku"
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "Vymaza»"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "_Nová zlo¾ka..."
 
-#. help menu
-#: src/menu.c:496
-msgid "Help"
-msgstr "Nápoveda"
+# src/ui_pathsel.c:517 src/utilops.c:1158
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Nemo¾no vytvori» adresár:\n"
+"%s"
 
-#: src/menu.c:523 src/menu.c:554
-msgid "View in new window"
-msgstr "Zobrazi» v novom okne"
+# src/ui_pathsel.c:518 src/utilops.c:1159
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Chyba vytvárania adresára"
 
-#: src/menu.c:531
-msgid "Refresh"
-msgstr "Obnovi»"
+# src/ui_pathsel.c:697
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "V¹etky súbory"
 
-#: src/menu.c:601
-msgid "Exit full screen"
-msgstr "Ukonèi» zobrazenie na celú obrazovku"
+# src/ui_pathsel.c:764
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Ukáza» skryté"
 
-#: src/menu.c:661
-msgid "Create thumbnails"
-msgstr "Vytvori» miniatúry"
+# src/ui_pathsel.c:799
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filter:"
 
-#: src/menu.c:670
-msgid "Change to home directory"
-msgstr "Do domovského adresára"
+# src/collect-table.c:627 src/dupe.c:1391 src/dupe.c:1563
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Vybra» v¹etko"
 
-#: src/menu.c:672
-msgid "Refresh file list"
-msgstr "Obnovi» zoznam súborov"
+# src/ui_pathsel.c:697
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "V¹etky súbory"
 
-#: src/menu.c:680
-msgid "Set zoom 1:1"
-msgstr "Nastavi» zobrazenie 1:1"
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Prepísa» súbor"
 
-#: src/menu.c:682
-msgid "Configure options"
-msgstr "Konfigurova» nastavenia"
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Prepísa» súbor"
 
-#: src/menu.c:684
-msgid "Float Controls"
-msgstr "Plávajúce ovládanie"
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
 
-#: src/rcfile.c:132
-#, c-format
-msgid "error saving config file: %s\n"
-msgstr "chyba ukladania konfiguraèného súboru: %s\n"
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Prepísa» súbor"
 
-#: src/thumb.c:127 src/thumb.c:151
-#, c-format
-msgid "create dir failed: %s\n"
-msgstr "vytvorenie adresára zlyhalo: %s\n"
+# src/utilops.c:345
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Preskoèi» v¹etko"
 
-#: src/thumb.c:233
-#, c-format
-msgid "Unable to delete dir: %s\n"
-msgstr "Nemo¾no zmaza» adresár: %s\n"
+# src/utilops.c:345
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Preskoèi»"
 
-#: src/thumb.c:249
-#, c-format
-msgid "failed to delete:%s\n"
-msgstr "zlyhalo zmazanie adresára:%s\n"
+# src/utilops.c:387 src/utilops.c:495
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Chyba pri presúvaní súboru"
 
-#: src/utildlg.c:68
-msgid "     Ok     "
-msgstr "     Ok     "
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "_Nová zlo¾ka..."
+
+# src/preferences.c:930
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Automatické premenovanie"
+
+# src/ui_pathsel.c:437 src/ui_pathsel.c:460 src/utilops.c:944
+# src/utilops.c:1095
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Premenova»"
 
-#: src/utilops.c:166
+# src/utilops.c:316
+#: src/utilops.c:543
 msgid "Source to copy matches destination"
-msgstr "Zdroj ku kopírovaniu sa zhoduje s cieµom"
+msgstr "Zdroj pre kopírovanie sa zhoduje s cieµom"
 
-#: src/utilops.c:167
+# src/utilops.c:317
+#: src/utilops.c:544
 #, c-format
 msgid ""
 "Unable to copy file:\n"
@@ -477,11 +3160,13 @@ msgstr ""
 "%s\n"
 "do seba."
 
-#: src/utilops.c:171
+# src/utilops.c:321
+#: src/utilops.c:548
 msgid "Source to move matches destination"
-msgstr "Zdroj k presunutiu sa zhoduje s cieµom"
+msgstr "Zdroj pre presúvanie sa zhoduje s cieµom"
 
-#: src/utilops.c:172
+# src/utilops.c:322
+#: src/utilops.c:549
 #, c-format
 msgid ""
 "Unable to move file:\n"
@@ -492,97 +3177,66 @@ msgstr ""
 "%s\n"
 "do seba."
 
-#: src/utilops.c:175 src/utilops.c:231 src/utilops.c:516
-msgid "Continue"
+# src/utilops.c:328 src/utilops.c:394 src/utilops.c:668
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
 msgstr "Pokraèova»"
 
-#: src/utilops.c:182
-#, c-format
-msgid ""
-"Overwrite file:\n"
-" %s\n"
-" with:\b %s"
-msgstr ""
-"Prepísa» súbor:\n"
-" %s\n"
-" s:\b %s"
-
-#: src/utilops.c:183 src/utilops.c:289 src/utilops.c:651 src/utilops.c:835
-msgid "Overwrite file"
-msgstr "Prepísa» súbor"
-
-#: src/utilops.c:186
-msgid "Skip"
-msgstr "Preskoèi»"
-
-#: src/utilops.c:187
-msgid "Yes to all"
-msgstr "Áno pre v¹etky"
-
-#: src/utilops.c:188
-msgid "Yes"
-msgstr "Áno"
-
-#: src/utilops.c:222 src/utilops.c:317
+# src/utilops.c:382 src/utilops.c:490
+#: src/utilops.c:630 src/utilops.c:850
 msgid "Error copying file"
 msgstr "Chyba kopírovania súboru"
 
-#: src/utilops.c:223
+# src/utilops.c:383
+#: src/utilops.c:631
 #, c-format
 msgid ""
 "Unable to copy file:\n"
-"%sto:\n"
 "%s\n"
-" during multiple file copy."
+"to:\n"
+"%s\n"
+"during multiple file copy."
 msgstr ""
 "Nemo¾no kopírova» súbor:\n"
-"%sdo:\n"
 "%s\n"
-" poèas viacnásobného kopírovania."
+"do:\n"
+"%s\n"
+"poèas viacnásobného kopírovania."
 
-#: src/utilops.c:227 src/utilops.c:322
+# src/utilops.c:387 src/utilops.c:495
+#: src/utilops.c:635 src/utilops.c:855
 msgid "Error moving file"
-msgstr "Chyba presunu súboru"
+msgstr "Chyba pri presúvaní súboru"
 
-#: src/utilops.c:228
+# src/utilops.c:388
+#: src/utilops.c:636
 #, c-format
 msgid ""
 "Unable to move file:\n"
-"%sto:\n"
 "%s\n"
-" during multiple file move."
+"to:\n"
+"%s\n"
+"during multiple file move."
 msgstr ""
 "Nemo¾no presunú» súbor:\n"
-"%sdo:\n"
 "%s\n"
-" poèas viacnásobného presúvania."
+"do:\n"
+"%s\n"
+"poèas viacnásobného presúvania."
 
-#: src/utilops.c:282
+# src/utilops.c:450
+#: src/utilops.c:774
 msgid "Source matches destination"
 msgstr "Zdroj zodpovedá cieµu"
 
-#: src/utilops.c:283
+# src/utilops.c:451
+#: src/utilops.c:775
 msgid "Source and destination are the same, operation cancelled."
 msgstr "Zdroj a cieµ sú tie isté, operácia zru¹ená."
 
-#: src/utilops.c:288
-#, c-format
-msgid ""
-"Overwrite file:\n"
-"%s\n"
-" with:\n"
-"%s"
-msgstr ""
-"Prepísa» súbor:\n"
-"%s\n"
-" s:\n"
-"%s"
-
-#: src/utilops.c:292 src/utilops.c:654 src/utilops.c:838
-msgid "Overwrite"
-msgstr "Prepísa»"
-
-#: src/utilops.c:318
+# src/utilops.c:491
+#: src/utilops.c:851
 #, c-format
 msgid ""
 "Unable to copy file:\n"
@@ -595,7 +3249,8 @@ msgstr ""
 "do:\n"
 "%s"
 
-#: src/utilops.c:323
+# src/utilops.c:496
+#: src/utilops.c:856
 #, c-format
 msgid ""
 "Unable to move file:\n"
@@ -608,87 +3263,128 @@ msgstr ""
 "do:\n"
 "%s"
 
-#: src/utilops.c:367
+# src/utilops.c:539
+#: src/utilops.c:899
 msgid "Invalid destination"
 msgstr "Chybný cieµ"
 
-#: src/utilops.c:367
+# src/utilops.c:540
+#: src/utilops.c:900
+#, fuzzy
 msgid ""
 "When operating with multiple files, please select\n"
-" a directory, not file."
+"a folder, not a file."
 msgstr ""
-"Keï narábate s viacerými súbormi, prosím zvolte\n"
+"Keï narábate s viacerými súbormi, prosím zvoµte\n"
 " adresár, nie súbory."
 
-#: src/utilops.c:369
-msgid "Invalid directory"
-msgstr "Chybný adresár"
-
-#: src/utilops.c:369
-msgid "Please select an existing directory"
+# src/utilops.c:544
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
 msgstr "Prosím zvoµte existujúci adresár"
 
-#: src/utilops.c:427
-msgid "GQview - copy"
-msgstr "GQview - kopírovanie"
+# src/main.c:129
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Pomoc - GQview"
 
-#: src/utilops.c:428
-msgid "Copy"
+# src/utilops.c:592
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
 msgstr "Kopírova»"
 
-#: src/utilops.c:430
-#, c-format
-msgid ""
-"Copy file:\n"
-"%s\n"
-"to:"
-msgstr ""
-"Kopírova» súbor:\n"
-"%s\n"
-"do:"
+# src/utilops.c:1090
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr "Premenova» súbor:"
 
-#: src/utilops.c:432
-#, c-format
-msgid ""
-"Copy multiple files from:\n"
-"%s\n"
-"to:"
-msgstr ""
-"Kopírova» viac súborov z:\n"
-"%s\n"
-"do:"
+# src/utilops.c:596
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "Kopírova» viacej súborov do:"
 
-#: src/utilops.c:436
-msgid "GQview - move"
-msgstr "GQview - presúvanie"
+# src/main.c:129
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Pomoc - GQview"
 
-#: src/utilops.c:437
-msgid "Move"
+# src/utilops.c:601
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
 msgstr "Presunú»"
 
-#: src/utilops.c:439
+# src/utilops.c:1090
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr "Premenova» súbor:"
+
+# src/utilops.c:605
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Presunú» viacej súborov do:"
+
+# src/utilops.c:980
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Názov súboru:"
+
+# src/utilops.c:450
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Zdroj zodpovedá cieµu"
+
+# src/utilops.c:664 src/utilops.c:676
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Mazanie zlyhalo"
+
+# src/utilops.c:322
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "Nemo¾no premenova» starý súbor z ko¹a"
+
+# src/utilops.c:1151
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Nemô¾em vytvori» adresár"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "Prístup odmietnutý"
+
+# src/ui_pathsel.c:517 src/utilops.c:1158
+#: src/utilops.c:1212
 #, c-format
 msgid ""
-"Move file:\n"
-"%s\n"
-"to:"
+"Unable to access or create the trash folder.\n"
+"\"%s\""
 msgstr ""
-"Presunú» súbor:\n"
-"%s\n"
-"do:"
+"Nemo¾no pristupova» alebo vytvori» zlo¾ku ko¹a.\n"
+"\"%s\""
 
-#: src/utilops.c:441
+# src/preferences.c:667
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "Vypnú» bezpeèné mazanie"
+
+# src/preferences.c:667
+#: src/utilops.c:1234
 #, c-format
-msgid ""
-"Move multiple files from:\n"
-"%s\n"
-"to:"
-msgstr ""
-"Presunú» viac súborov z:\n"
-"%s\n"
-"do:"
+msgid "Safe delete: %s"
+msgstr "Bezpeèné mazanie: %s"
 
-#: src/utilops.c:514
+# src/utilops.c:663
+#: src/utilops.c:1276
 #, c-format
 msgid ""
 "Unable to delete file:\n"
@@ -699,62 +3395,47 @@ msgstr ""
 " %s\n"
 " Pokraèova» s viacnásobnou operáciou mazania?"
 
-#: src/utilops.c:515 src/utilops.c:521
-msgid "Delete failed"
-msgstr "Zmazanie zlyhalo"
-
-#: src/utilops.c:520 src/utilops.c:565
+#: src/utilops.c:1347
 #, c-format
-msgid ""
-"Unable to delete file:\n"
-"%s"
-msgstr ""
-"Nemo¾no zmaza» súbor:\n"
-"%s"
+msgid "File %d of %d"
+msgstr "Súbor %d z %d"
 
-#: src/utilops.c:550
-msgid "Delete files"
+# src/utilops.c:707
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
 msgstr "Zmaza» súbory"
 
-#: src/utilops.c:550
-msgid "About to delete multiple files..."
-msgstr "Pripravený na viacnásobné mazanie súborov..."
-
-#: src/utilops.c:551 src/utilops.c:596
-msgid "Delete"
-msgstr "Zmaza»"
-
-#: src/utilops.c:566
-msgid "File deletion failed"
-msgstr "Zmazanie súboru zlyhalo"
+# src/utilops.c:942
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Premenova» viac súborov:"
 
-#: src/utilops.c:594
+# src/dupe.c:67 src/dupe.c:1449
+#: src/utilops.c:1438
 #, c-format
-msgid ""
-"About to delete the file:\n"
-" %s"
-msgstr ""
-"Pripravený zmaza» súbor:\n"
-" %s"
+msgid "Review %d files"
+msgstr "Prehµad %d súborov"
 
-#: src/utilops.c:595
-msgid "Delete file"
+# src/ui_pathsel.c:398 src/utilops.c:760
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
 msgstr "Zmaza» súbor"
 
-#: src/utilops.c:650 src/utilops.c:834
-#, c-format
-msgid ""
-"Overwrite file:\n"
-"%s\n"
-"by renaming:\n"
-"%s"
+# src/ui_pathsel.c:398 src/utilops.c:760
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Zmaza» súbor"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
 msgstr ""
-"Prepísa» súbor:\n"
-"%s\n"
-"s premenovaním:\n"
-"%s"
 
-#: src/utilops.c:663
+# src/utilops.c:842
+#: src/utilops.c:1661
 #, c-format
 msgid ""
 "Unable to rename file:\n"
@@ -767,31 +3448,80 @@ msgstr ""
 " na:\n"
 "%s"
 
-#: src/utilops.c:664 src/utilops.c:847
+# src/filelist.c:809 src/filelist.c:815 src/filelist.c:821 src/utilops.c:845
+# src/utilops.c:1048
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
 msgid "Error renaming file"
-msgstr "Chyba premenovania súboru"
+msgstr "Chyba pri premenovaní súboru"
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "GQview - rename"
-msgstr "GQview - premenovanie"
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Nemô¾em automaticky premenova» s vybranou\n"
+"èíselnou sadou, preto¾e existujú nejaké súbory,\n"
+"ktorých mená sa nachádzajú vo výslednom zozname.\n"
+
+# src/ui_pathsel.c:313
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"Zlyhanie premenovania\n"
+"%s\n"
+"Èíslo bolo: %d."
+
+# src/main.c:129
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Pomoc - GQview"
 
-#: src/utilops.c:754
-msgid "Rename multiple files:"
+# src/utilops.c:942
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
 msgstr "Premenova» viac súborov:"
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "Rename"
-msgstr "Premenova»"
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "Pôvodný názov"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Pôvodný názov"
 
-#: src/utilops.c:790
-msgid "Rename:"
+# src/utilops.c:980
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
 msgstr "Premenova»:"
 
-#: src/utilops.c:799
-msgid "to:"
-msgstr "na:"
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Zaèiatoèný text"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "©tart #"
 
-#: src/utilops.c:846
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Koncový text"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "výplò:"
+
+# src/filelist.c:820 src/utilops.c:1047
+#: src/utilops.c:2207 src/view_file_list.c:459
 #, c-format
 msgid ""
 "Unable to rename file:\n"
@@ -804,18 +3534,32 @@ msgstr ""
 "na:\n"
 "%s"
 
-#: src/utilops.c:884
-#, c-format
+# src/utilops.c:1090
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr "Premenova» súbor:"
+
+# src/utilops.c:1144
+#: src/utilops.c:2311
+#, fuzzy, c-format
 msgid ""
-"Rename file:\n"
+"The folder:\n"
 "%s\n"
-"to:"
+"already exists."
 msgstr ""
-"Premenova» súbor:\n"
+"Adresár:\n"
 "%s\n"
-"na:"
+"u¾ existuje."
 
-#: src/utilops.c:928
+# src/preferences.c:368
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Zlo¾ky"
+
+# src/utilops.c:1150
+#: src/utilops.c:2317
 #, c-format
 msgid ""
 "The path:\n"
@@ -826,57 +3570,648 @@ msgstr ""
 "%s\n"
 "u¾ existuje ako súbor."
 
-#: src/utilops.c:929
-msgid "Could not create directory"
-msgstr "Nemô¾em vytvori» adresár"
+# src/main.c:129
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Pomoc - GQview"
 
-#: src/utilops.c:934
-#, c-format
+# src/utilops.c:1211
+#: src/utilops.c:2372
+#, fuzzy, c-format
 msgid ""
-"The directory:\n"
+"Create folder in:\n"
 "%s\n"
-"already exists."
+"named:"
 msgstr ""
-"Adresár:\n"
+"Vytvori» adresár v:\n"
 "%s\n"
-"u¾ existuje."
+"s menom:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "nová zlo¾ka"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "O stupeò vy¹¹ie"
+
+# src/menu.c:879
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "Prezentácia"
+
+# src/menu.c:881
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Prezentácia rekurzívne"
+
+# src/collect-table.c:644 src/menu.c:885
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "Nájs» _duplikáty..."
+
+# src/menu.c:887
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Nájs» duplikáty rekurzívne..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "_Nová zlo¾ka..."
+
+# src/menu.c:761
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "Zobrazi» ako s_trom"
+
+# src/menu.c:891 src/menu.c:920
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "Obnovi»"
+
+# src/menu.c:559
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "U_sporiada»"
 
-#: src/utilops.c:935
-msgid "Directory exists"
-msgstr "Adresár existuje"
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "Zobrazi» ako _ikony"
 
-#: src/utilops.c:942
+# src/preferences.c:603
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "Zobrazi» miniatúry"
+
+# src/filelist.c:808
+#: src/view_file_list.c:447
 #, c-format
 msgid ""
-"Unable to create directory:\n"
+"Invalid file name:\n"
 "%s"
 msgstr ""
-"Nemo¾no vytvori» adresár:\n"
+"Nesprávne meno súboru:\n"
 "%s"
 
-#: src/utilops.c:943
-msgid "Error creating directory"
-msgstr "Chyba vytvárania adresára"
+# src/cache_maint.c:252
+#~ msgid "Purge thumbnails"
+#~ msgstr "Vyèisti» miniatúry"
 
-#: src/utilops.c:982
-#, c-format
-msgid ""
-"Create directory in:\n"
-"%s\n"
-"named:"
-msgstr ""
-"Vytvori» adresár v:\n"
-"%s\n"
-"s menom:"
+# src/menu.c:710
+#~ msgid "/File/tear1"
+#~ msgstr "/Súbor/tear1"
 
-#: src/utilops.c:983
-msgid "GQview - new directory"
-msgstr "GQview - nový adresár"
+# src/menu.c:711
+#~ msgid "/File/_New collection"
+#~ msgstr "/Súbor/_Nová zbierka"
 
-#: src/utilops.c:983
-msgid "Create"
-msgstr "Vytvori»"
+# src/menu.c:712
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Súbor/_Otvori» zbierku"
 
-#: src/window.c:151
-msgid "GQview Tools"
-msgstr "GQview : Nástroje"
+# src/menu.c:714
+#~ msgid "/File/sep1"
+#~ msgstr "/Súbor/sep1"
+
+# src/menu.c:721
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/Súbor/P_remenova»..."
+
+# src/menu.c:715
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Súbor/Nájs» duplikáty"
+
+# src/menu.c:716
+#~ msgid "/File/sep2"
+#~ msgstr "/Súbor/sep2"
+
+# src/menu.c:721
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Súbor/P_remenova»..."
+
+# src/menu.c:722
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Súbor/Nový adresár..."
+
+# src/menu.c:718
+#~ msgid "/File/sep3"
+#~ msgstr "/Súbor/sep3"
+
+# src/menu.c:719
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Súbor/K_opírova»..."
+
+# src/menu.c:720
+#~ msgid "/File/_Move..."
+#~ msgstr "/Súbor/_Presunú»..."
+
+# src/menu.c:721
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Súbor/P_remenova»..."
+
+# src/menu.c:722
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Súbor/_Vymaza»..."
+
+# src/menu.c:723
+#~ msgid "/File/sep4"
+#~ msgstr "/Súbor/sep4"
+
+# src/dupe.c:1415 src/dupe.c:1573 src/img-view.c:841
+#~ msgid "/File/C_lose window"
+#~ msgstr "/File/Zavrie» okno"
+
+# src/menu.c:724
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Súbor/_Koniec"
+
+# src/menu.c:726
+#~ msgid "/_Edit"
+#~ msgstr "/_Upravi»"
+
+# src/menu.c:727
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Upravi»/tear1"
+
+# src/menu.c:728
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Upravi»/editor1"
+
+# src/menu.c:729
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Upravi»/editor2"
+
+# src/menu.c:730
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Upravi»/editor3"
+
+# src/menu.c:731
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Upravi»/editor4"
+
+# src/menu.c:732
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Upravi»/editor5"
+
+# src/menu.c:733
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Upravi»/editor6"
+
+# src/menu.c:734
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Upravi»/editor7"
+
+# src/menu.c:735
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Upravi»/editor8"
+
+# src/menu.c:728
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Upravi»/editor1"
+
+# src/menu.c:728
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Upravi»/editor0"
+
+# src/menu.c:736
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Upravi»/sep1"
+
+# src/menu.c:737
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Upravi»/N_astavi»"
+
+# src/menu.c:748
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Upravi»/_Vlastnosti"
+
+# src/menu.c:738
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Upravi»/Nastavi»/tear1"
+
+# src/menu.c:739
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Upravi»/Nastavi»/Rotova» vp_ravo"
+
+# src/menu.c:740
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Upravi»/Nastavi»/Rotova» _vµavo"
+
+# src/menu.c:741
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Upravi»/Nastavi»/Rotova» 1_80"
+
+# src/menu.c:742
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Upravi»/Nastavi»/_Zrkadli»"
+
+# src/menu.c:743
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Upravi»/Nastavi»/_Preklopi»"
+
+# src/menu.c:744
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Upravi»/sep2"
+
+# src/menu.c:745
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Upravi»/Vybra» _v¹etko"
+
+# src/menu.c:746
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Upravi»/Vybra» n_iè"
+
+# src/menu.c:747
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Upravi»/sep3"
+
+# src/menu.c:748
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Upravi»/V_oµby..."
+
+# src/menu.c:750
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Upravi»/sep4"
+
+# src/menu.c:751
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Upravi»/Nastavi» ako _pozadie plochy"
+
+# src/menu.c:753
+#~ msgid "/_View"
+#~ msgstr "/_Zobrazi»"
+
+# src/menu.c:754
+#~ msgid "/View/tear1"
+#~ msgstr "/Zobrazi»/tear1"
+
+# src/menu.c:755
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Zobrazi»/Priblí¾i»"
+
+# src/menu.c:756
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Zobrazi»/Oddiali»"
+
+# src/menu.c:757
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Zobrazi»/Zobrazenie _1:1"
+
+# src/menu.c:759
+#~ msgid "/View/sep1"
+#~ msgstr "/Zobrazi»/sep1"
+
+# src/menu.c:762
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Zobrazi»/M_iniatúry"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#~ msgid "/View/I_cons"
+#~ msgstr "/Zobrazi»/Ikony"
+
+# src/menu.c:764
+#~ msgid "/View/sep2"
+#~ msgstr "/Zobrazi»/sep2"
+
+# src/menu.c:761
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Zobrazi»/_Celá obrazovka"
+
+# src/menu.c:768
+#~ msgid "/View/sep3"
+#~ msgstr "/Zobrazi»/sep3"
+
+# src/menu.c:767
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Zobrazi»/S_kry» zoznam súborov"
+
+# src/menu.c:759
+#~ msgid "/View/sep4"
+#~ msgstr "/Zobrazi»/sep1"
+
+# src/menu.c:755
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Zobrazi»/Správca triedenia"
+
+# src/menu.c:759
+#~ msgid "/View/sep5"
+#~ msgstr "/Zobrazi»/sep5"
+
+# src/menu.c:769
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Zobrazi»/Prepnú» prezentáciu"
+
+# src/menu.c:765
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Zobrazi»/_Obnovi» zoznamy"
+
+# src/menu.c:772
+#~ msgid "/Help/tear1"
+#~ msgstr "/Pomocník/tear1"
+
+# src/menu.c:775
+#~ msgid "/Help/sep1"
+#~ msgstr "/Pomocník/sep1"
+
+# src/preferences.c:507
+#~ msgid "GQview configuration"
+#~ msgstr "Konfigurácia GQview"
+
+# src/menu.c:749
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Upravi»/Odst_ráni» staré miniatúry"
+
+# src/dupe.c:1657 src/dupe.c:1945
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Cesta"
+
+# src/collect-dlg.c:167 src/collect.c:1052
+#~ msgid "Save"
+#~ msgstr "Ulo¾i»"
+
+# src/collect.c:1053 src/ui_help.c:302
+#~ msgid "Close"
+#~ msgstr "Zavrie»"
+
+# src/collect-dlg.c:68
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Prepísa» súbor zbierky:\n"
+#~ "%s"
+
+# src/collect-dlg.c:166
+#~ msgid "Save collection as:"
+#~ msgstr "Ulo¾i» zbierku ako:"
+
+# src/collect-dlg.c:173
+#~ msgid "Open collection from:"
+#~ msgstr "Otvori» zbierku z:"
+
+# src/collect-dlg.c:174
+#~ msgid "Open"
+#~ msgstr "Otvori»"
+
+# src/collect-dlg.c:181
+#~ msgid "Append collection from:"
+#~ msgstr "Pripoji» zbierku z:"
+
+# src/main.c:622
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Koniec"
+
+# src/main.c:622
+#~ msgid "Exit"
+#~ msgstr "Koniec"
+
+# src/preferences.c:165 src/preferences.c:523 src/ui_utildlg.c:208
+# src/utilops.c:220
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+# src/collect-dlg.c:59
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Nesprávne meno súboru"
+
+# src/preferences.c:569
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Pri ¹tarte nastavi» sa do adresára:"
+
+# src/preferences.c:695 src/preferences.c:697
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Priblí¾enie (zmena mierky):"
+
+# src/preferences.c:805
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Umiestòova» dialógy pod ukazovateµ my¹i"
+
+# src/preferences.c:825
+#~ msgid "Include files of type:"
+#~ msgstr "Zahrnú» súbory typu:"
+
+# src/collect-table.c:622 src/dupe.c:1410 src/dupe.c:1568
+#~ msgid "Remove"
+#~ msgstr "Vymaza»"
+
+#~ msgid "Add"
+#~ msgstr "Prida»"
+
+# src/preferences.c:933
+#~ msgid "Command Line"
+#~ msgstr "Príkazový riadok"
+
+# src/menu.c:771
+#~ msgid "Help"
+#~ msgstr "Pomoc"
+
+# src/img-view.c:837 src/menu.c:1001
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "Celooobrazovkový mód"
+
+# src/preferences.c:368
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Veµkos» súboru:"
+
+#, fuzzy
+#~ msgid "Width:"
+#~ msgstr "©írka"
+
+#, fuzzy
+#~ msgid "Height:"
+#~ msgstr "Vý¹ka"
+
+# src/utilops.c:338
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Prepísa» súbor:\n"
+#~ " %s\n"
+#~ " súborom:\n"
+#~ " %s"
+
+# src/utilops.c:343
+#~ msgid "Yes"
+#~ msgstr "Áno"
+
+# src/utilops.c:344
+#~ msgid "Yes to all"
+#~ msgstr "Áno pre v¹etky"
+
+# src/utilops.c:458
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Prepísa» súbor:\n"
+#~ "%s\n"
+#~ " súborom:\n"
+#~ "%s"
+
+# src/utilops.c:594
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Kopírova» súbor:\n"
+#~ "%s\n"
+#~ "do:"
+
+# src/utilops.c:603
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Presunú» súbor:\n"
+#~ "%s\n"
+#~ "do:"
+
+# src/utilops.c:707
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Pripravený na viacnásobné mazanie súborov..."
+
+# src/utilops.c:825 src/utilops.c:1031
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Prepísa» súbor:\n"
+#~ "%s\n"
+#~ "s premenovaním:\n"
+#~ "%s"
+
+# src/utilops.c:989
+#~ msgid "to:"
+#~ msgstr "na:"
+
+# src/utilops.c:1216
+#~ msgid "Create"
+#~ msgstr "Vytvori»"
+
+# src/preferences.c:559
+#~ msgid "Initial directory"
+#~ msgstr "Zaèiatoèný adresár"
+
+# src/ui_pathsel.c:507 src/ui_pathsel.c:759
+#~ msgid "New Directory"
+#~ msgstr "Nový adresár"
+
+# src/ui_pathsel.c:517 src/utilops.c:1158
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Nemo¾no vytvori» adresár:\n"
+#~ "%s"
+
+# src/ui_pathsel.c:518 src/utilops.c:1159
+#~ msgid "Error creating directory"
+#~ msgstr "Chyba vytvárania adresára"
+
+# src/utilops.c:539
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "Popis obrázku"
+
+# src/menu.c:769
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/Zobrazi»/Prepnú» prezentáciu"
+
+# src/collect-table.c:1820 src/dupe.c:2172
+#~ msgid "Add contents"
+#~ msgstr "Prida» obsah"
+
+# src/collect-table.c:1821 src/dupe.c:2173
+#~ msgid "Add contents recursive"
+#~ msgstr "Prida» obsah rekurzívne"
+
+# src/collect-table.c:1822 src/dupe.c:2174
+#~ msgid "Skip directories"
+#~ msgstr "Preskoèi» adresáre"
+
+# src/utilops.c:543
+#~ msgid "Invalid directory"
+#~ msgstr "Chybný adresár"
+
+# src/utilops.c:591
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - kopírovanie"
+
+# src/utilops.c:600
+#~ msgid "GQview - move"
+#~ msgstr "GQview - presúvanie"
+
+# src/utilops.c:1145
+#~ msgid "Directory exists"
+#~ msgstr "Adresár existuje"
+
+# src/utilops.c:1212
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - nový adresár"
+
+#~ msgid "Misc."
+#~ msgstr "Rôzne"
+
+# src/menu.c:717
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/Súbor/Vytvori» _Adresár"
+
+# src/menu.c:492
+#~ msgid "Edit"
+#~ msgstr "Editova»"
+
+# src/preferences.c:908
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "Vlo¾i» vybraté súbory na miesto ukazovateµa"
+
+# src/filelist.c:814
+#~ msgid "File named %s already exists."
+#~ msgstr "Súbor %s u¾ existuje."
+
+# src/dupe.c:1654 src/dupe.c:1943
+#, fuzzy
+#~ msgid "Date:"
+#~ msgstr "Dátum"
+
+# src/utilops.c:989
+#, fuzzy
+#~ msgid "top"
+#~ msgstr "na:"
+
+# src/main.c:146 src/main.c:176
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview spustení: %s\n"
+
+# src/main.c:555
+#~ msgid "Electric Eyes"
+#~ msgstr "Electric Eyes"
+
+# src/preferences.c:530
+#~ msgid "Apply"
+#~ msgstr "Pou¾i»"
+
+# src/preferences.c:888
+#~ msgid "format: [.foo;.bar]"
+#~ msgstr "formát: [.foo;.bar]"
diff --git a/po/sl.po b/po/sl.po
new file mode 100644 (file)
index 0000000..0babd69
--- /dev/null
+++ b/po/sl.po
@@ -0,0 +1,3738 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# Matej Erman <matej.erman@guest.arnes.si>, 2001.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview-0.10.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: fixme\n"
+"Last-Translator: Matej Erman <matej.erman@guest.arnes.si>\n"
+"Language-Team: slovene <sl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-2\n"
+"Content-Transfer-Encoding: 8 bit\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Polja"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "Datum"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+#, fuzzy
+msgid "Filename:"
+msgstr "Preimenuj:"
+
+#: src/bar_info.c:1007 src/info.c:360
+#, fuzzy
+msgid "File date:"
+msgstr "Filter:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Primerjaj:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Shrani zbirko"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr ""
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Ime"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr ""
+
+#: src/bar_exif.c:426
+#, fuzzy
+msgid "Format"
+msgstr "Normalno"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr ""
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr ""
+
+#: src/bar_exif.c:549 src/info.c:105
+#, fuzzy
+msgid "Exif"
+msgstr "Izhod"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr ""
+
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Brisanje je bilo neuspe¹no"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Imenik:\n"
+"%s\n"
+"¾e obstaja."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Prazna zbirka"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Neuspe¹no shranjevanje zbirke:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Shranjevanje je bilo neuspe¹no"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr ""
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Zbirke"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+#, fuzzy
+msgid "Name:"
+msgstr "Ime"
+
+#: src/bar_sort.c:569
+#, fuzzy
+msgid "Sort Manager"
+msgstr "Razvr¹èeno po imenu"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+#, fuzzy
+msgid "Folders"
+msgstr "Polja"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Zbirke"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Prepi¹i"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Premakni"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d slik"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Izberi niè"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr ""
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+#, fuzzy
+msgid "done"
+msgstr "Brez"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Berem podobnostne podatke..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Nalagam miniature..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Nalagam miniature..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Napaèno ime datoteke"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Predpomnilnik za miniature"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Datum"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+#, fuzzy
+msgid "Folder:"
+msgstr "Polja"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Izberi niè"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Napaèno ime datoteke"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+#, fuzzy
+msgid "running..."
+msgstr "Primerjam..."
+
+#: src/cache_maint.c:1043
+#, fuzzy
+msgid "Clearing thumbnails..."
+msgstr "Nalagam miniature..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Poèisti predpomnilnik"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Vse miniature, ki so bile shranjene na disk\n"
+"bodo zbrisane, nadaljujem?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr " - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview celozaslonsko"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "Zbirke"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "Poèisti"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "Predpomnilnik za miniature"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "Predpomnilnik za miniature"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "Preimenuj"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Neimenovano"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Neimenovano (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - GQview zbirka"
+
+#: src/collect.c:1098 src/collect.c:1102
+#, fuzzy
+msgid "Close collection"
+msgstr "Shrani zbirko"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Navedena pot:\n"
+"%s\n"
+"je imenik, zbirke so datoteke"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Napaèno ime datoteke"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Pi¹i prek datoteke"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Pi¹i prek datoteke"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Pi¹i prek"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Shrani zbirko"
+
+#: src/collect-dlg.c:176
+#, fuzzy
+msgid "Open collection"
+msgstr "Dodaj zbirko"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Dodaj zbirko"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Dodaj"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Datoteke od zbirk"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Prazna zbirka"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Trenutna zbirka je prazna, shranjevanje je opu¹èeno."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Prazno"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d slik (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d slik"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Nalagam miniature..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+#, fuzzy
+msgid "_View"
+msgstr "/P_ogled"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+#, fuzzy
+msgid "View in _new window"
+msgstr "Poglej v novem oknu"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+#, fuzzy
+msgid "Rem_ove"
+msgstr "Odstrani"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Dodaj iz seznama datotek"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Dodaj iz zbirke..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Izberi vse"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Izberi niè"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+#, fuzzy
+msgid "_Properties"
+msgstr "/Uredi/_Mo¾nosti..."
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+#, fuzzy
+msgid "_Copy..."
+msgstr "Prepi¹i..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+#, fuzzy
+msgid "_Move..."
+msgstr "Premakni..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+#, fuzzy
+msgid "_Rename..."
+msgstr "Preimenuj..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+#, fuzzy
+msgid "_Delete..."
+msgstr "Zbri¹i..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+#, fuzzy
+msgid "Show filename _text"
+msgstr "Poka¾i vse datoteke"
+
+#: src/collect-table.c:813
+#, fuzzy
+msgid "_Save collection"
+msgstr "Shrani zbirko"
+
+#: src/collect-table.c:815
+#, fuzzy
+msgid "Save collection _as..."
+msgstr "Shrani zbirko kot..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+#, fuzzy
+msgid "_Find duplicates..."
+msgstr "Najdi dvojnike..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Datoteka/Pr_eimenuj..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "Padajoèi seznam vkljuèuje imenike."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+#, fuzzy
+msgid "_Add contents"
+msgstr "Dodaj vsebino"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+#, fuzzy
+msgid "Add contents _recursive"
+msgstr "Dodaj vsebino brez upiranja"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "Preskoèi imenike"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Preklièi"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Spusti datoteke za njihovo primerjavo."
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d datotek"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "Na¹el %d ujemajoèih v %d datotekah"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr ""
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Berem povzetke..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Berem mere..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Berem podobnostne podatke..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Primerjam..."
+
+#: src/dupe.c:1535
+#, fuzzy
+msgid "Sorting..."
+msgstr "Primerjam..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr ""
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr ""
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Dodaj k novi zbirki"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+#, fuzzy
+msgid "C_lear"
+msgstr "Poèisti"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+#, fuzzy
+msgid "Close _window"
+msgstr "Zapri okno"
+
+#: src/dupe.c:2382
+#, fuzzy, c-format
+msgid "%d files (set 2)"
+msgstr "%d datotek %s"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Velikost"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Datum"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Mere"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Povzetek"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Pot"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Podobnost (velika)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Podobnost"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Podobnost (majhna)"
+
+#: src/dupe.c:2598
+#, fuzzy
+msgid "Similarity (custom)"
+msgstr "Podobnost (majhna)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Najdi dvojnike - GQview"
+
+#: src/dupe.c:3152
+#, fuzzy
+msgid "Compare to:"
+msgstr "Primerjaj:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Primerjaj:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Miniature"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr ""
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+#, fuzzy
+msgid "Rotate jpeg clockwise"
+msgstr "Obrni v smeri urinega kazalca"
+
+#: src/editors.c:59
+#, fuzzy
+msgid "Rotate jpeg counterclockwise"
+msgstr "Obrni v nasprotni smeri urinega kazalca"
+
+#: src/editors.c:104
+#, fuzzy
+msgid "stopping..."
+msgstr "Primerjam..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr ""
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr ""
+
+#: src/editors.c:303
+#, fuzzy, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Ne morem zbrisati datoteke:\n"
+"%s"
+
+#: src/editors.c:414
+#, fuzzy
+msgid "stopped by user"
+msgstr "Razvr¹èeno po imenu"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+#, fuzzy
+msgid "unknown"
+msgstr "v (neznanem)..."
+
+#: src/exif.c:113
+#, fuzzy
+msgid "top left"
+msgstr "Zbri¹i"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr ""
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr ""
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr ""
+
+#: src/exif.c:117
+#, fuzzy
+msgid "left top"
+msgstr "Zbri¹i"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr ""
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr ""
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr ""
+
+#: src/exif.c:127
+msgid "inch"
+msgstr ""
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr ""
+
+#: src/exif.c:140
+msgid "average"
+msgstr ""
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr ""
+
+#: src/exif.c:142
+msgid "spot"
+msgstr ""
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr ""
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr ""
+
+#: src/exif.c:145
+msgid "partial"
+msgstr ""
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr ""
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr ""
+
+#: src/exif.c:152
+msgid "manual"
+msgstr ""
+
+#: src/exif.c:153
+#, fuzzy
+msgid "normal"
+msgstr "Normalno"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr ""
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr ""
+
+#: src/exif.c:156
+#, fuzzy
+msgid "creative"
+msgstr "Ustvari"
+
+#: src/exif.c:157
+msgid "action"
+msgstr ""
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr ""
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr ""
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr ""
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr ""
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr ""
+
+#: src/exif.c:168
+msgid "flash"
+msgstr ""
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr ""
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+#, fuzzy
+msgid "yes"
+msgstr "Da"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr ""
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr ""
+
+#: src/exif.c:289
+#, fuzzy
+msgid "Image description"
+msgstr "Napèen izvor"
+
+#: src/exif.c:292
+#, fuzzy
+msgid "Orientation"
+msgstr "Mere"
+
+#: src/exif.c:303
+#, fuzzy
+msgid "Copyright"
+msgstr "Prepi¹i"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr ""
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr ""
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr ""
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr ""
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr ""
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr ""
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr ""
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr ""
+
+#: src/exif.c:323
+#, fuzzy
+msgid "Metering mode"
+msgstr "Naèin zameglevanja"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr ""
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr ""
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr ""
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr ""
+
+#: src/exif.c:337
+msgid "Height"
+msgstr ""
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr ""
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr ""
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr ""
+
+#: src/exif.c:1479
+#, fuzzy
+msgid "mode:"
+msgstr "Polja"
+
+#: src/exif.c:1483 src/utilops.c:1234
+#, fuzzy
+msgid "on"
+msgstr "Brez"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr ""
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr ""
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr ""
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr ""
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr ""
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr ""
+
+#: src/filelist.c:513
+#, fuzzy, c-format
+msgid "%d bytes"
+msgstr "%d datotek"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr ""
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr ""
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr ""
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview celozaslonsko"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Polja"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Prilagodi sliko k oknu"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+#, fuzzy
+msgid "Zoom _in"
+msgstr "Poveèaj"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+#, fuzzy
+msgid "Zoom _out"
+msgstr "Pomanj¹aj"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+#, fuzzy
+msgid "Zoom _1:1"
+msgstr "Poveèaj na 1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+#, fuzzy
+msgid "Fit image to _window"
+msgstr "Prilagodi sliko k oknu"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+#, fuzzy
+msgid "Set as _wallpaper"
+msgstr "Nastavi kot ozadje"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+#, fuzzy
+msgid "_Stop slideshow"
+msgstr "Ustavi diaprojekcijo"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+#, fuzzy
+msgid "Continue slides_how"
+msgstr "Nadaljuj z diaprojekcijo"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+#, fuzzy
+msgid "Pause slides_how"
+msgstr "Premor diaprojekcije"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+#, fuzzy
+msgid "_Start slideshow"
+msgstr "Zaèni z diaprojekcijo"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+#, fuzzy
+msgid "Exit _full screen"
+msgstr "Izhod iz celega zaslona"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+#, fuzzy
+msgid "_Full screen"
+msgstr "Cel zaslon"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+#, fuzzy
+msgid "C_lose window"
+msgstr "Zapri okno"
+
+#: src/info.c:361
+#, fuzzy
+msgid "File size:"
+msgstr "Polja"
+
+#: src/info.c:363
+#, fuzzy
+msgid "Dimensions:"
+msgstr "Mere"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr ""
+
+#: src/info.c:365 src/print.c:3371
+#, fuzzy
+msgid "Image size:"
+msgstr "Slika"
+
+#: src/info.c:367
+#, fuzzy
+msgid "Compress ratio:"
+msgstr "Primerjaj:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Filter:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr ""
+
+#: src/info.c:371
+msgid "Group:"
+msgstr ""
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Splo¹no"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr ""
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr ""
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr ""
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr "Diaprojekcija"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr "Premor"
+
+#: src/layout.c:358
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%d datotek (%d)%s"
+
+#: src/layout.c:365
+#, fuzzy, c-format
+msgid "%s, %d files%s"
+msgstr "%d datotek %s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d datotek %s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr ""
+
+#: src/layout.c:403
+#, fuzzy, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %d bajtov"
+
+#: src/layout.c:408
+#, fuzzy, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %d bajtov"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview orodja"
+
+#: src/layout_config.c:57
+#, fuzzy
+msgid "Tools"
+msgstr "Polja"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+#, fuzzy
+msgid "Files"
+msgstr "Polja"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Slika"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr ""
+
+#: src/layout_image.c:770
+#, fuzzy
+msgid "Hide file _list"
+msgstr "Skrij/prika¾i datoteèni seznam"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "v %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "v (neznanem)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Prazno"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Datoteka"
+
+#: src/layout_util.c:749 src/menu.c:91
+#, fuzzy
+msgid "_Edit"
+msgstr "/_Uredi"
+
+#: src/layout_util.c:750 src/menu.c:248
+#, fuzzy
+msgid "_Adjust"
+msgstr "Prikroji"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/_Pomoè"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Datoteka/Nova _zbirka"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "Shrani zbirko"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Dodaj zbirko"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Datoteka/Odpri _nedavno"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Primerjam..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Datoteka/Pr_eimenuj..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr " - GQview"
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Kakovost"
+
+#: src/layout_util.c:779 src/menu.c:194
+#, fuzzy
+msgid "_Rotate clockwise"
+msgstr "Obrni v smeri urinega kazalca"
+
+#: src/layout_util.c:780 src/menu.c:197
+#, fuzzy
+msgid "Rotate _counterclockwise"
+msgstr "Obrni v nasprotni smeri urinega kazalca"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Obrni za 180"
+
+#: src/layout_util.c:782 src/menu.c:203
+#, fuzzy
+msgid "_Mirror"
+msgstr "Zrcali"
+
+#: src/layout_util.c:783 src/menu.c:206
+#, fuzzy
+msgid "_Flip"
+msgstr "Zasukaj"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Izberi vse"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Izberi niè"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "/Uredi/_Mo¾nosti..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Pogled/_Ustrezno poveèaj"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "Cel zaslon"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Skrij/prika¾i datoteèni seznam"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "Ustavi diaprojekcijo"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "Osve¾i"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Pomoè/_O programu"
+
+#: src/layout_util.c:801
+msgid "_Keyboard shortcuts"
+msgstr ""
+
+#: src/layout_util.c:802
+msgid "_Release notes"
+msgstr ""
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "O programu"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Miniature"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Pogled/sep3"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Pogled/(Ne)_plavajoèi datoteèni seznam"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Pogled/tear1"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "Mere"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Pogled/_Osve¾i sezname"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Razvr¹èeno po imenu"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Pogled/_Osve¾i sezname"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Mere"
+
+#: src/layout_util.c:1083
+#, fuzzy
+msgid "Show thumbnails"
+msgstr "Predpomnilnik za miniature"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Poglej v domaèi imenik"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Osve¾i datoteèni seznam"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Poveèaj"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Pomanj¹aj"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Prilagodi sliko k oknu"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Nastavi poveèavo na 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Nastavi mo¾nosti"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Plavajoèi krmilniki"
+
+#: src/main.c:266
+#, fuzzy
+msgid "Help - GQview"
+msgstr " - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Ukazna vrstica"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Prednalo¾i naslednjo sliko"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "%d slik"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Prednalo¾i naslednjo sliko"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "Izhod iz celega zaslona"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "Izhod iz celega zaslona"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "Izhod iz celega zaslona"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "Ustavi diaprojekcijo"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "Zaèni z diaprojekcijo"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "Ustavi diaprojekcijo"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "Zaèni z diaprojekcijo"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview orodja"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr ""
+"Preimenuj datoteko:\n"
+"%s\n"
+"v:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Poglej v novem oknu"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr "Uporaba: gqview [mo¾nosti] [pot]\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "veljavne mo¾nosti so:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           poka¾e orodja\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        skrije orodja\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           se za¾ene v celozaslonskem naèinu\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            se za¾ene z diaprojekcijo\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+
+#: src/main.c:951
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                   vklopi razhro¹èevalni izhod\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              izpi¹e informacije o razlièici\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr "  -h, --help                 poka¾e to sporoèilo\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"napaèno ali ignorirano: %s\n"
+"Uporabite --help za mo¾nosti\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Ustarjam GQview imenik: %s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Ne morem ustvariti imenika: %s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Domov"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+#, fuzzy
+msgid "Desktop"
+msgstr "v:"
+
+#: src/main.c:1152
+#, fuzzy
+msgid "GQview - exit"
+msgstr "GQview - premakni"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr " - GQview"
+
+#: src/main.c:1156
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+
+#: src/menu.c:115
+#, fuzzy
+msgid "Sort by size"
+msgstr "Razvr¹èeno po velikosti"
+
+#: src/menu.c:118
+#, fuzzy
+msgid "Sort by date"
+msgstr "Razvr¹èeno po datumu"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Nerazvr¹èeno"
+
+#: src/menu.c:124
+#, fuzzy
+msgid "Sort by path"
+msgstr "Razvr¹èeno po poti"
+
+#: src/menu.c:127
+#, fuzzy
+msgid "Sort by number"
+msgstr "Razvr¹èeno po imenu"
+
+#: src/menu.c:131
+#, fuzzy
+msgid "Sort by name"
+msgstr "Razvr¹èeno po imenu"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Razvrsti"
+
+#: src/menu.c:200
+#, fuzzy
+msgid "Rotate _180"
+msgstr "Obrni za 180"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Najblji¾je (najslab¹e a najhitrej¹e)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Polja"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Dvolinearno"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Hiper (najbolj¹e a najpoèasnej¹e)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Brez"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normalno"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Najbolj¹e"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr ""
+
+#: src/preferences.c:662 src/preferences.c:665
+#, fuzzy
+msgid "Reset filters"
+msgstr "Zbri¹i datoteke"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:699 src/preferences.c:702
+#, fuzzy
+msgid "Reset editors"
+msgstr "Zbri¹i datoteke"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:727 src/preferences.c:730
+#, fuzzy
+msgid "Clear trash"
+msgstr "Poèisti predpomnilnik"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr ""
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - preimenuj"
+
+#: src/preferences.c:824
+msgid "Startup"
+msgstr ""
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Poglej v domaèi imenik"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Uporabi trenutnega"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Velikost:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Kakovost:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Predpomnilnik za miniature"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+#, fuzzy
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Predpomnilnik za miniature"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Uporabi xvpics miniature, ko so najdene (samo za branje)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Diaprojekcija"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Zamik med menjavo slik (sekund):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Nakljuèno"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Ponavljanje"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Poveèaj"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Naèin zameglevanja"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr ""
+
+#: src/preferences.c:895
+#, fuzzy
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Poveèaj slike, da se ustrezno prilagodijo."
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Veèanje poveèave"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Ko je oznaèena nova slika:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Poveèaj na originalno velikost"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Pusti poveèavo na prej¹njih nastavitvah"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Dodaj"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr ""
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Nadaljuj"
+
+#: src/preferences.c:924
+#, fuzzy
+msgid "Refresh on file change"
+msgstr "Osve¾i datoteèni seznam"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Prednalo¾i naslednjo sliko"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr ""
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Okna"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Datum"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Zapomni si polo¾aj okna"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Zapomni si polo¾aj orodja (plavajoèa/skrita)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "Prilagodi sliko k oknu, ko so orodja skrita/plavajoèa"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Omeji velikost pri samodejnem prilagajanju okna (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr ""
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filtriranje"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Poka¾i vnose, ki se zaènejo s piko"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr ""
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Onemogoèi filtritanje datotek"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Filter:"
+
+#: src/preferences.c:1008
+#, fuzzy
+msgid "Filter"
+msgstr "Filter:"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr ""
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Urejevalniki"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Ime v izbirniku"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr ""
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "Cel zaslon"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Slika"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Zbri¹i"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Potrditev brisanja datotek"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Omogoèi tipko delete"
+
+#: src/preferences.c:1158
+#, fuzzy
+msgid "Safe delete"
+msgstr "Potrditev brisanja datotek"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Polja"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Pogled"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Pravokotni izbor"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr ""
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Preimenovanje na mestu"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr ""
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Napredno premikanje s tipkovnico"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Mi¹kin kole¹èek za premikanje slike"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+#, fuzzy
+msgid "Custom similarity threshold:"
+msgstr "Izbrani datoteèni tipi:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Velikost predpomnilnika za izvenzaslonski prikaz (Mb na sliko):"
+
+#: src/preferences.c:1291
+#, fuzzy
+msgid "About - GQview"
+msgstr " - GQview"
+
+#: src/preferences.c:1304
+#, fuzzy, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Avtorke pravice (c) 2003 John Ellis\n"
+"http://gqview.sourceforge.net\n"
+"gqview@users.sourceforge.net\n"
+"\n"
+"Objavljeno pod GNU javno licenco"
+
+#: src/preferences.c:1322
+#, fuzzy
+msgid "Credits..."
+msgstr "/Uredi/_Mo¾nosti..."
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Izberi niè"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr ""
+
+#: src/print.c:138
+#, fuzzy
+msgid "Custom printer"
+msgstr "Izbrani datoteèni tipi:"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Slika"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr ""
+
+#: src/print.c:353
+msgid "inches"
+msgstr ""
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr ""
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr ""
+
+#: src/print.c:366
+msgid "Letter"
+msgstr ""
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, c-format
+msgid "page %d of %d"
+msgstr ""
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr ""
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, fuzzy, c-format
+msgid "A file with name %s already exists."
+msgstr "Datoteka z imenom %s ¾e obstaja."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Filter:"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Zbri¹i datoteke"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr " - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Normalno"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Mere"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Napèen izvor"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Preimenuj:"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Neimenovano"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "Brez"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Razvrsti"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Slika"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "Filter:"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr ""
+
+#: src/print.c:3432
+msgid "Top:"
+msgstr ""
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "v:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Filter:"
+
+#: src/print.c:3450
+#, fuzzy
+msgid "Custom printer:"
+msgstr "Izbrani datoteèni tipi:"
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Filter:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Filter:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Zapomni si polo¾aj okna"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "napaka pri shranjevanju nastavitvene datoteke %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Polja"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Dodaj vsebino"
+
+#: src/search.c:202
+msgid "results"
+msgstr ""
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Nadaljuj"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+#, fuzzy
+msgid "greater than"
+msgstr "Ustvari miniature"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "Filter:"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%d datotek (%d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%d datotek %s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Primerjam..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Prosim izberite obstojeè imenik"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Prosim izberite obstojeè imenik"
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr ""
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Primerjam..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Preimenuj:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Polja"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Nakljuèno"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Filter:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Napèen izvor"
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Dodaj vsebino"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Podobnost"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Nakljuèno"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr ""
+"Nisem mogel nelo¾iti miniature v predpomnilniku, poskusil jo bom ponovno "
+"ustvariti.\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Ne morem napisati seznama zgodovine v: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr ""
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+#, fuzzy
+msgid "Edit Bookmark"
+msgstr "Urejevalniki"
+
+#: src/ui_bookmark.c:612
+#, fuzzy
+msgid "Path:"
+msgstr "Pot"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr ""
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Izberi niè"
+
+#: src/ui_bookmark.c:718
+#, fuzzy
+msgid "_Properties..."
+msgstr "/Uredi/_Mo¾nosti..."
+
+#: src/ui_bookmark.c:720
+#, fuzzy
+msgid "Move _up"
+msgstr "Premakni"
+
+#: src/ui_bookmark.c:722
+#, fuzzy
+msgid "Move _down"
+msgstr "Premakni"
+
+#: src/ui_bookmark.c:724
+#, fuzzy
+msgid "_Remove"
+msgstr "Odstrani"
+
+#: src/ui_help.c:111
+#, fuzzy, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Ne morem zbrisati datoteke:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Neuspe¹no preimenovanje %s v %s."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Ne morem zbrisati datoteke:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Brisanje datotek je bilo neuspe¹no"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Zbri¹i datoteko"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"O brisanju datoteke:\n"
+"%s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+#, fuzzy
+msgid "_Rename"
+msgstr "Preimenuj"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+#, fuzzy
+msgid "Add _Bookmark"
+msgstr "Urejevalniki"
+
+#: src/ui_pathsel.c:636
+#, fuzzy
+msgid "_Delete"
+msgstr "Zbri¹i"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr " - GQview"
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Ne morem usvariti imenika:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Napaka pri ustvarjanju imenika"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Vse datoteke"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Poka¾i skrite"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filter:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Izberi vse"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "Vse datoteke"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Pi¹i prek datoteke"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Pi¹i prek datoteke"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Pi¹i prek datoteke"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Preskoèi"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Preskoèi"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Napaka pri premikanju datoteke"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr " - GQview"
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+#, fuzzy
+msgid "Auto rename"
+msgstr "Ime v izbirniku"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Preimenuj"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Izvor za prepisovanje se ujema s ciljem"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Ne morem prepisati datoteke:\n"
+"%s\n"
+"same vase."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Izvor za premikanje se ujema s ciljem"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Ne morem premakniti daoteke:\n"
+"%s\n"
+"same vase."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Nadaljuj"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Napaka pri prepisovanju datoteke"
+
+#: src/utilops.c:631
+#, fuzzy, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Ne morem prepisati datoteke:\n"
+"%s v:\n"
+"%s\n"
+"med mno¾iènim prepisovanjem datotek."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Napaka pri premikanju datoteke"
+
+#: src/utilops.c:636
+#, fuzzy, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Ne morem premakniti datoteke:\n"
+"%s v:\n"
+"%s\n"
+"med mno¾iènim premikanjem datotek."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Izvor se ujema s ciljem"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Izvor in cilj sta enaka, operacija preklicana."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Me morem prepisati datoteke:\n"
+"%s\n"
+"v:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Ne morem premakniti datoteke:\n"
+"%s\n"
+"v:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Napèen izvor"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"Ko operirate z mno¾ico datotek, prosim izberite\n"
+"imenik in ne datoteke."
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Prosim izberite obstojeè imenik"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr " - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+#, fuzzy
+msgid "_Copy"
+msgstr "Prepi¹i"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr ""
+"Preimenuj datoteko:\n"
+"%s\n"
+"v:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "Prepi¹i mno¾ico datotek v:"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr " - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+#, fuzzy
+msgid "_Move"
+msgstr "Premakni"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr ""
+"Preimenuj datoteko:\n"
+"%s\n"
+"v:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Premakni mno¾ico datotek v:"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Preimenuj:"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Izvor se ujema s ciljem"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Brisanje je bilo neuspe¹no"
+
+#: src/utilops.c:1124
+#, fuzzy
+msgid "Unable to remove old file from trash folder"
+msgstr ""
+"Ne morem premakniti daoteke:\n"
+"%s\n"
+"same vase."
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Ne morem ustvariti imenika"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr ""
+
+#: src/utilops.c:1212
+#, fuzzy, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Ne morem usvariti imenika:\n"
+"%s"
+
+#: src/utilops.c:1216
+#, fuzzy
+msgid "Turn off safe delete"
+msgstr "Potrditev brisanja datotek"
+
+#: src/utilops.c:1234
+#, fuzzy, c-format
+msgid "Safe delete: %s"
+msgstr "Potrditev brisanja datotek"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Ne morem zbrisati datoteke:\n"
+" %s\n"
+" Nadaljujem mno¾ièno brisanje datotek?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr ""
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Zbri¹i datoteke"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Preimenuj mno¾ico datotek"
+
+#: src/utilops.c:1438
+#, fuzzy, c-format
+msgid "Review %d files"
+msgstr "%d datotek"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Zbri¹i datoteko"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Zbri¹i datoteko"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Ne morem preimenovati datoteke:\n"
+"%s\n"
+"v:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Napaka pri preimenovanju datoteke"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+
+#: src/utilops.c:1809
+#, fuzzy, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr "Neuspe¹no preimenovanje %s v %s."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr " - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "Preimenuj mno¾ico datotek"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr ""
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Preimenuj:"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "Preimenuj:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr ""
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr ""
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr ""
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr ""
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Ne morem preimenovati datoteke:\n"
+"%s\n"
+"v:\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr ""
+"Preimenuj datoteko:\n"
+"%s\n"
+"v:"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Imenik:\n"
+"%s\n"
+"¾e obstaja."
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Polja"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"Pot:\n"
+"%s\n"
+"¾e obstaja kot datoteka."
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr " - GQview"
+
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Ustvari imenik v:\n"
+"%s\n"
+"z imenom:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr ""
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr ""
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+#, fuzzy
+msgid "_Slideshow"
+msgstr "Diaprojekcija"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Diaprojekcija brez upiranja"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+#, fuzzy
+msgid "Find _duplicates..."
+msgstr "Najdi dvojnike..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Najdi dvojnike brez upiranja..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr ""
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+#, fuzzy
+msgid "View as _tree"
+msgstr "/Pogled/_Cel zaslon"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+#, fuzzy
+msgid "Re_fresh"
+msgstr "Osve¾i"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+#, fuzzy
+msgid "_Sort"
+msgstr "Razvrsti"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+#, fuzzy
+msgid "View as _icons"
+msgstr "Mere"
+
+#: src/view_file_list.c:421
+#, fuzzy
+msgid "Show _thumbnails"
+msgstr "Predpomnilnik za miniature"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Napaèno ime datoteke:\n"
+"%s"
+
+#, fuzzy
+#~ msgid "Purge thumbnails"
+#~ msgstr "Ustvari miniature"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/Datoteka/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/Datoteka/Nova _zbirka"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Datoteka/_Odpri zbirko..."
+
+#~ msgid "/File/sep1"
+#~ msgstr "/Datoteka/sep1"
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/Datoteka/Pr_eimenuj..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Datoteka/Najdi _dvojnike..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Datoteka/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Datoteka/Pr_eimenuj..."
+
+#, fuzzy
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Datoteka/Z_bri¹i..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Datoteka/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Datoteka/_Prepi¹i..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Datoteka/P_remakni..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Datoteka/Pr_eimenuj..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Datoteka/Z_bri¹i..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/File/sep4"
+
+#, fuzzy
+#~ msgid "/File/C_lose window"
+#~ msgstr "Zapri okno"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Datoteka/Iz_hod"
+
+#~ msgid "/_Edit"
+#~ msgstr "/_Uredi"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Uredi/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Uredi/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "Uredi/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Uredi/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "Uredi/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Uredi/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Uredi/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Uredi/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Uredi/editor9"
+
+#, fuzzy
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Uredi/editor1"
+
+#, fuzzy
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Uredi/editor1"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Uredi/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Uredi/_Prikroji"
+
+#, fuzzy
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Uredi/_Mo¾nosti..."
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Uredi/Prikroji/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Uredi/Prikroji/_Obrni v smeri urinega kazalca"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Uredi/Prikroji/O_brni v nasprotni smeri urinega kazalca"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Uredi/Prikroji/Obrni za _180"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Uredi/Prikroji/_Zrcali"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "Uredi/Prikroji/Z_asukaj"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Uredi/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Uredi/Izberi _vse"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Uredi/Izberi _niè"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Uredi/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Uredi/_Mo¾nosti..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Uredi/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Uredi/Nastavi kot _ozadje"
+
+#~ msgid "/_View"
+#~ msgstr "/P_ogled"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Pogled/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Pogled/Po_veèaj"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Pogled/Po_manj¹aj"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Pogled/Poveèaj na _1:1"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Pogled/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Pogled/M_iniature"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Pogled/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Pogled/_Cel zaslon"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Pogled/sep3"
+
+#, fuzzy
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Pogled/_Skrij - prika¾i datoteèni seznam"
+
+#, fuzzy
+#~ msgid "/View/sep4"
+#~ msgstr "/Pogled/sep1"
+
+#, fuzzy
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Pogled/Po_veèaj"
+
+#, fuzzy
+#~ msgid "/View/sep5"
+#~ msgstr "/Pogled/sep1"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Pogled/Preklopi _diaprojekcijo"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Pogled/_Osve¾i sezname"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Pomoè/tear1"
+
+#, fuzzy
+#~ msgid "/Help/sep1"
+#~ msgstr "/Pomoè/tear1"
+
+#~ msgid "/Help/_About"
+#~ msgstr "/Pomoè/_O programu"
+
+#~ msgid "GQview configuration"
+#~ msgstr "GQview nastavitve"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Uredi/Odstrani _stare miniature"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Pot"
+
+#~ msgid "Save"
+#~ msgstr "Shrani"
+
+#, fuzzy
+#~ msgid "Close"
+#~ msgstr "Poèisti"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Pi¹i prek datoteke za zbirko:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "Shrani zbirko kot:"
+
+#, fuzzy
+#~ msgid "Open collection from:"
+#~ msgstr "Dodaj zbirko iz:"
+
+#, fuzzy
+#~ msgid "Open"
+#~ msgstr "Dodaj"
+
+#~ msgid "Append collection from:"
+#~ msgstr "Dodaj zbirko iz:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Izhod"
+
+#~ msgid "Exit"
+#~ msgstr "Izhod"
+
+#~ msgid "Ok"
+#~ msgstr "V redu"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Napaèno ime datoteke"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Ob zagonu poglej v ta imenik:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Poveèava (skala):"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Postavi dvogovore pod mi¹ko"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Vkljuèi datoteène tipe:"
+
+#~ msgid "Remove"
+#~ msgstr "Odstrani"
+
+#~ msgid "Command Line"
+#~ msgstr "Ukazna vrstica"
+
+#, fuzzy
+#~ msgid "Help"
+#~ msgstr "/_Pomoè"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "Cel zaslon"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Polja"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Pi¹i datoteko:\n"
+#~ "%s\n"
+#~ "prek:\n"
+#~ "%s"
+
+#~ msgid "Yes"
+#~ msgstr "Da"
+
+#~ msgid "Yes to all"
+#~ msgstr "Da za vse"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Pi¹i prek datoteke:\n"
+#~ "%s\n"
+#~ "z:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Prepi¹i datoteko:\n"
+#~ "%s\n"
+#~ "v:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Premakni datoteko:\n"
+#~ "%s\n"
+#~ "v:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "O brisanju mno¾ice datotek..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Pi¹i prek datoteke:\n"
+#~ "%s\n"
+#~ "s preimenovanjem:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "v:"
+
+#~ msgid "Create"
+#~ msgstr "Ustvari"
+
+#~ msgid "Initial directory"
+#~ msgstr "Zaèetni imenik"
+
+#, fuzzy
+#~ msgid "New Directory"
+#~ msgstr "GQview - nov imenik"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Ne morem usvariti imenika:\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "Napaka pri ustvarjanju imenika"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "Napèen izvor"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/Pogled/Preklopi _diaprojekcijo"
+
+#~ msgid "Add contents"
+#~ msgstr "Dodaj vsebino"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "Dodaj vsebino brez upiranja"
+
+#~ msgid "Skip directories"
+#~ msgstr "Preskoèi imenike"
+
+#~ msgid "Invalid directory"
+#~ msgstr "Napaèen imenik"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - prepi¹i"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - premakni"
+
+#~ msgid "Directory exists"
+#~ msgstr "Imenik obstaja"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - nov imenik"
+
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/Datoteka/Ustvari _imenik..."
+
+#~ msgid "Edit"
+#~ msgstr "Uredi"
+
+#~ msgid "File named %s already exists."
+#~ msgstr "Datoteka z imenom %s ¾e obstaja."
+
+#, fuzzy
+#~ msgid "Date:"
+#~ msgstr "Datum"
+
+#, fuzzy
+#~ msgid "top"
+#~ msgstr "v:"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview teèe: %s\n"
+
+#~ msgid "Electric Eyes"
+#~ msgstr "Electric Eyes"
+
+#~ msgid "Apply"
+#~ msgstr "Uveljavi"
+
+#~ msgid "format: [.foo;.bar]"
+#~ msgstr "oblika: [.foo;.bar]"
+
+#~ msgid "Load collection"
+#~ msgstr "Nalo¾i zbirko"
+
+#~ msgid "Load collection from:"
+#~ msgstr "Nalo¾i zbirko iz:"
+
+#~ msgid "Load"
+#~ msgstr "Nalo¾i"
+
+#~ msgid "create dir failed: %s\n"
+#~ msgstr "neuspe¹no shranjevanje imenika: %s\n"
+
+#~ msgid "Unable to delete dir: %s\n"
+#~ msgstr "Ne morem zbrisati imenika: %s\n"
+
+#~ msgid "failed to delete:%s\n"
+#~ msgstr "neuspe¹no brisanje: %s\n"
+
+#, fuzzy
+#~ msgid "External Editors"
+#~ msgstr "Zunanji urejevalniki"
+
+#~ msgid "     Ok     "
+#~ msgstr "     V redu     "
diff --git a/po/sv.po b/po/sv.po
new file mode 100644 (file)
index 0000000..1f85036
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,3354 @@
+# Swedish translations for gqview package
+# Svenska översättningar för paketet gqview.
+# Copyright (C) 2003 John Ellis
+# This file is distributed under the same license as the gqview package.
+# Hans Öfverbeck <hans.ofverbeck@home.se>, 2003-2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview 1.5.7\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2005-02-01 23:26+0100\n"
+"Last-Translator: Hans Ofverbeck <hans.ofverbeck@home.se>\n"
+"Language-Team: Swedish <sv@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr "Favorit"
+
+#: src/bar_info.c:31
+msgid "Todo"
+msgstr "Att göra"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr "Folk"
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr "Platser"
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr "Konst"
+
+#: src/bar_info.c:35
+msgid "Nature"
+msgstr "Natur"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr "Ägodelar"
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr "Förinställda nyckelord"
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr "Lista över favoritnyckelord."
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr "Nyckelord"
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Filnamn:"
+
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Fildatum:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr "Nyckelord:"
+
+#: src/bar_info.c:1095
+msgid "Comment:"
+msgstr "Kommentar:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr "Redigera listan över favoritnyckelord."
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr "Lägg till nyckelord till de valda filerna"
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr "Lägg till nyckelord till de valda filerna, skriv över befintliga."
+
+#: src/bar_info.c:1130
+msgid "Save comment now"
+msgstr "Spara kommentar nu"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "Tagg"
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Namn"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "Värde"
+
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "Format"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "Element"
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "Beskrivning"
+
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "Exif"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "Avancerad vy"
+
+#: src/bar_sort.c:218
+msgid "Unlink failed"
+msgstr "Borttagning av länk misslyckades"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr "Länkning misslyckades"
+
+#: src/bar_sort.c:435
+#, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Albumet:\n"
+"%s\n"
+"finns redan."
+
+#: src/bar_sort.c:436
+msgid "Collection exists"
+msgstr "Albumet finns"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Kunde inte spara albumet:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Lyckades inte spara"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "Lägg till bokmärke"
+
+#: src/bar_sort.c:489
+msgid "Add Collection"
+msgstr "Lägg till album"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "Namn:"
+
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "Sorteringshanterare"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "Mappar"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Album"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Kopiera"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Flytta"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr "Länka"
+
+#: src/bar_sort.c:610
+msgid "Add image"
+msgstr "Lägg till bild"
+
+#: src/bar_sort.c:617
+msgid "Add selection"
+msgstr "Lägg till markering"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "Ångra senaste bild"
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "färdig"
+
+#: src/cache_maint.c:304
+msgid "Removing old metadata..."
+msgstr "Tar bort gammal metadata..."
+
+#: src/cache_maint.c:308
+msgid "Clearing cached thumbnails..."
+msgstr "Tömmer cachade miniatyrbilder..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+msgid "Removing old thumbnails..."
+msgstr "Tar bort gamla miniatyrbilder..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr "Underhåll"
+
+#: src/cache_maint.c:792 src/utilops.c:904
+msgid "Invalid folder"
+msgstr "Ogiltig mapp"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr "Den angivna mappen kan inte hittas."
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+msgid "Create thumbnails"
+msgstr "Skapa miniatyrbilder"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+msgid "S_tart"
+msgstr "_Starta"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "Mapp:"
+
+#: src/cache_maint.c:845
+msgid "Select folder"
+msgstr "Markera mapp"
+
+#: src/cache_maint.c:849
+msgid "Include subfolders"
+msgstr "Inkludera undermappar"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr "Lagra miniatyrbilder i närheten av originalbilder"
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr "tryck på starta för att börja"
+
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "kör..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Tömmer miniatyrbilder..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Töm cache"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Detta kommer att ta bort alla miniatyrbilder\n"
+"som sparats på hårddisken, fortsätt?"
+
+#: src/cache_maint.c:1163
+msgid "Cache Maintenance - GQview"
+msgstr "Cache-hantering - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr "Cache- och Datahantering"
+
+#: src/cache_maint.c:1177
+msgid "GQview thumbnail cache"
+msgstr "GQview miniatyrbildscache"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+msgid "Location:"
+msgstr "Plats:"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+msgid "Clean up"
+msgstr "Städa"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr "Ta bort övergivna eller föråldrade miniatyrbilder."
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+msgid "Delete all cached thumbnails."
+msgstr "Radera alla cachade miniatyrbilder."
+
+#: src/cache_maint.c:1197
+msgid "Shared thumbnail cache"
+msgstr "Delad miniatyrbildscache"
+
+#: src/cache_maint.c:1220
+msgid "Render"
+msgstr "Skapa"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr "Skapa miniatyrbilder för en specifik mapp."
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr "Metadata"
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr "Ta bort övergivna nyckelord och kommentarer."
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Namnlös"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Namnlös (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - GQview Album"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Stäng album"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Albumet har ändrats.\n"
+"Spara först?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr "_Kasta bort"
+
+#: src/collect-dlg.c:58
+#, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Angiven sökväg:\n"
+"%s\n"
+"är en mapp, album är filer"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Ogiltigt filnamn"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Skriv över fil"
+
+#: src/collect-dlg.c:73
+msgid "Overwrite existing file?"
+msgstr "Skriv över befintlig fil?"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+msgid "_Overwrite"
+msgstr "Skriv _över"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Spara album"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Öppna album"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Komplettera album"
+
+#: src/collect-dlg.c:185
+msgid "_Append"
+msgstr "_Komplettera"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Albumfiler"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Tomt album"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Detta album är tomt, försöket att spara avbröts."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Tom"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d bilder (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d bilder"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Läser in miniatyrbilder..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "_Visa"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "Visa i _nytt fönster"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "_Ta bort"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Lägg till från fillista"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Lägg till från album..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Markera alla"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Markera ingen"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "_Egenskaper"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "_Kopiera..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "Fl_ytta..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "_Byt namn..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "_Ta bort..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "Visa _filnamnstext"
+
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "_Spara album"
+
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "Spara album s_om..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "_Hitta dubletter..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+msgid "Print..."
+msgstr "Skriv ut..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+msgid "Dropped list includes folders."
+msgstr "Släppt lista innehåller mappar."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "_Lägg till innehåll"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "Lägg till innehåll _rekursivt"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+msgid "_Skip folders"
+msgstr "Hoppa _över mappar"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Släpp filer för att jämföra."
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d filer"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d dubletter funna i %d filer"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[grupp 1]"
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Läser in kontrollsummor..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Läser in dimensioner..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Läser in likhetsdata..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Jämför..."
+
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "Sorterar..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "Markera dubletter i grupp _1"
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "Markera dubletter i grupp _2"
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Lägg till i nytt album"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "T_öm"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "Stäng _fönster"
+
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "%d filer (grupp 2)"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Storlek"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Datum"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Dimensioner"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Kontrollsumma"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Sökväg"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Likhet (stor)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Likhet"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Likhet (liten)"
+
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Likhet (anpassad)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Hitta dubletter - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "Jämför med:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "Jämför med avseende på:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Miniatyrbilder"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "Jämför två filgrupper"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "Rotera jpeg medurs"
+
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "Rotera jpeg moturs"
+
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "stoppar..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "Redigera resultaten från kommandot"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "Utdata från %s"
+
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Misslyckades att köra kommandot:\n"
+"%s\n"
+
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "stoppad av användaren"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "okänd"
+
+#: src/exif.c:113
+msgid "top left"
+msgstr "överst vänster"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "överst höger"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "underst höger"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "underst vänster"
+
+#: src/exif.c:117
+msgid "left top"
+msgstr "vänster överst"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "höger överst"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "höger underst"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "vänster underst"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "tum"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "centimeter"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "medelvärde"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "centrumvägt"
+
+#: src/exif.c:142
+msgid "spot"
+msgstr "spot"
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr "multi-spot"
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr "flersegment"
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "partiell"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "annan"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "ej definierad"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "manuell"
+
+#: src/exif.c:153
+msgid "normal"
+msgstr "normal"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "bländare"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "slutare"
+
+#: src/exif.c:156
+msgid "creative"
+msgstr "kreativt"
+
+#: src/exif.c:157
+msgid "action"
+msgstr "aktivt"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "stående"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "liggande"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "dagsljus"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "lysrör (fluorescerande)"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "volfram (glödande)"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "blixt"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "nej"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "ja"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr "ja, inte upptäckt av sensor"
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr "ja, upptäckt av sensor"
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "Bildbeskrivning"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "Orientering"
+
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "Copyright"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "Exponeringsprogram"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "ISO-känslighet"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "Ursprungsdatum"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "Digitaliseringsdatum"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "Slutarhastighet"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "Bländare"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "Exponeringskompensation"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "Avstånd till motiv"
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "Mätmetod"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "Ljuskälla"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "Blixt"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "Brännvidd"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "Bredd"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "Höjd"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "Kamera"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "Upplösning"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "oändligt"
+
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "läge:"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "på"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "av"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "auto"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr "inte upptäckt av sensor"
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr "upptäckt av sensor"
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "reducering av röda ögon"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "punkt"
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d byte"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f kilobyte"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f megabyte"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f gigabyte"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview helskärmsläge"
+
+#: src/fullscreen.c:397
+msgid "Full size"
+msgstr "Full storlek"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr "Bildskärm"
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr "Skärm"
+
+#: src/fullscreen.c:644
+msgid "Stay above other windows"
+msgstr "Stanna ovanför andra fönster"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr "Hanteras av fönsterhanteraren"
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr "Aktiv skärm"
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr "Aktiv bildskärm"
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "Zooma _in"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "Zooma _ut"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "Zooma _1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "Anpassa bild till fönster_storlek"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "Ställ in som skrivbords_underlag"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "_Stoppa bildspel"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "Forts_ätt bildspel"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "_Pausa bildspel"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "_Starta bildspel"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "Avsluta _helskärmsläge"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "_Helskärmsläge"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "_Stäng fönster"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "Filstorlek:"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Dimensioner:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Transparent:"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Bildstorlek:"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Kompression:"
+
+#: src/info.c:368
+msgid "File type:"
+msgstr "Filtyp:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Ägare:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Grupp:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Allmänt"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "Bild %d av %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Bildegenskaper - GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Stigande"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Bildspel"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Pausat"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d filer (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d filer%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d filer%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(ingen läsrättighet) %s byte"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? × ? ) %s byte"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d × %d ) %s byte"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview Verktyg"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Verktyg"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "Filer"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Bild"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(dra-och-släpp för att byta ordning)"
+
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "Dölj fil_lista"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "i %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "i (okänd)..."
+
+#: src/layout_util.c:637
+msgid "empty"
+msgstr "tom"
+
+#: src/layout_util.c:748
+msgid "_File"
+msgstr "_Arkiv"
+
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "_Redigera"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "_Justera"
+
+#: src/layout_util.c:752
+msgid "_Help"
+msgstr "_Hjälp"
+
+#: src/layout_util.c:754
+msgid "New _window"
+msgstr "Nytt _fönster"
+
+#: src/layout_util.c:755
+msgid "_New collection"
+msgstr "_Nytt album"
+
+#: src/layout_util.c:756
+msgid "_Open collection..."
+msgstr "Öppna _album..."
+
+#: src/layout_util.c:757
+msgid "Open _recent"
+msgstr "_Öppna senaste"
+
+#: src/layout_util.c:758
+msgid "_Search..."
+msgstr "_Sök..."
+
+#: src/layout_util.c:760
+msgid "_Print..."
+msgstr "_Skriv ut..."
+
+#: src/layout_util.c:761
+msgid "N_ew folder..."
+msgstr "Ny _mapp..."
+
+#: src/layout_util.c:767
+msgid "_Quit"
+msgstr "A_vsluta"
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "_Rotera medurs"
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "Rotera mot_urs"
+
+#: src/layout_util.c:781
+msgid "Rotate 1_80"
+msgstr "Rotera 1_80°"
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "Spegla _horisontellt"
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "Spegla _vertikalt"
+
+#: src/layout_util.c:785
+msgid "Select _all"
+msgstr "Markera _alla"
+
+#: src/layout_util.c:786
+msgid "Select _none"
+msgstr "Markera _ingen"
+
+#: src/layout_util.c:787
+msgid "P_references..."
+msgstr "In_ställningar..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr "_Miniatyrbildsunderhåll..."
+
+#: src/layout_util.c:794
+msgid "_Zoom to fit"
+msgstr "_Zooma så bilden passar"
+
+#: src/layout_util.c:795
+msgid "F_ull screen"
+msgstr "_Helskärm"
+
+#: src/layout_util.c:796
+msgid "_Hide file list"
+msgstr "_Dölj fillista"
+
+#: src/layout_util.c:797
+msgid "Toggle _slideshow"
+msgstr "Växla _bildspel"
+
+#: src/layout_util.c:798
+msgid "_Refresh"
+msgstr "_Uppdatera"
+
+#: src/layout_util.c:800
+msgid "_Contents"
+msgstr "_Innehåll"
+
+#: src/layout_util.c:801
+msgid "_Keyboard shortcuts"
+msgstr "_Tangentbordsgenvägar"
+
+#: src/layout_util.c:802
+msgid "_Release notes"
+msgstr "_Utgåvenoteringar"
+
+#: src/layout_util.c:803
+msgid "_About"
+msgstr "_Om"
+
+#: src/layout_util.c:807
+msgid "_Thumbnails"
+msgstr "_Miniatyrbilder"
+
+#: src/layout_util.c:808
+msgid "Tr_ee"
+msgstr "T_räd"
+
+#: src/layout_util.c:809
+msgid "_Float file list"
+msgstr "_Ta loss fillista"
+
+#: src/layout_util.c:810
+msgid "Hide tool_bar"
+msgstr "Dölj _verktygsrad"
+
+#: src/layout_util.c:811
+msgid "_Keywords"
+msgstr "_Nyckelord"
+
+#: src/layout_util.c:812
+msgid "E_xif data"
+msgstr "_Exif-information"
+
+#: src/layout_util.c:813
+msgid "Sort _manager"
+msgstr "_Sorteringshanterare"
+
+#: src/layout_util.c:817
+msgid "_List"
+msgstr "_Lista"
+
+#: src/layout_util.c:818
+msgid "I_cons"
+msgstr "I_koner"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Visa miniatyrbilder"
+
+#: src/layout_util.c:1085
+msgid "Change to home folder"
+msgstr "Byt till hemmappen"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Uppdatera fillista"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Zooma in"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Zooma ut"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Anpassa bild till fönsterstorlek"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Ställ in zoom 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Konfigurera alternativ"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Ta loss kontroller"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Hjälp - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Kommandorad"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+msgid "next image"
+msgstr "nästa bild"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr "föregående bild"
+
+#: src/main.c:529
+msgid "first image"
+msgstr "första bilden"
+
+#: src/main.c:530
+msgid "last image"
+msgstr "sista bilden"
+
+#: src/main.c:531
+msgid "toggle full screen"
+msgstr "växla helskärmsläge"
+
+#: src/main.c:532
+msgid "start full screen"
+msgstr "aktivera helskärmsläge"
+
+#: src/main.c:533
+msgid "stop full screen"
+msgstr "avaktivera helskärmsläge"
+
+#: src/main.c:534
+msgid "toggle slide show"
+msgstr "växla bildspel"
+
+#: src/main.c:535
+msgid "start slide show"
+msgstr "starta bildspel"
+
+#: src/main.c:536
+msgid "stop slide show"
+msgstr "stoppa bildspel"
+
+#: src/main.c:537
+msgid "start recursive slide show"
+msgstr "starta rekursivt bildspel"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr "ställ in bildspelsfördröjning i sekunder"
+
+#: src/main.c:539
+msgid "show tools"
+msgstr "visa verktyg"
+
+#: src/main.c:540
+msgid "hide tools"
+msgstr "dölj verktyg"
+
+#: src/main.c:541
+msgid "quit"
+msgstr "avsluta"
+
+#: src/main.c:542
+msgid "open file"
+msgstr "öppna fil"
+
+#: src/main.c:543
+msgid "open file in new window"
+msgstr "öppna fil i ett nytt fönster"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr "Lista över fjärrkommandon:\n"
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr "Fjärr-GQview inte igång, startar..."
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr "Fjärr ej tillgänglig\n"
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Användning: gqview [flaggor] [sökväg]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "giltiga flaggor är:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           tvingar verktygen att visas\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        tvingar verktygen att döljas\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           starta i helskärmsläge\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            starta i bildspelsläge\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr "  -l, --list                 öppna albumfönster för angivna filer\n"
+
+#: src/main.c:951
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+"  -r, --remote               skicka följande kommandon till ett öppet "
+"fönster\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr "  -rh,--remote-help          visa lista över fjärrkommandon\n"
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    slå på felsökningsmeddelanden\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              visa versionsinformation\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 visa denna hjälptext\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"ogiltig eller ignorerad: %s\n"
+"Använd --help för att visa parametrar\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Skapar GQview-mapp:%s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Kunde inte skapa mapp:%s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Hem"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "Skrivbord"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - avsluta"
+
+#: src/main.c:1156
+msgid "Quit GQview"
+msgstr "Avsluta GQview"
+
+#: src/main.c:1156
+msgid "Collections have been modified. Quit anyway?"
+msgstr "Album har ändrats. Avsluta ändå?"
+
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "Sortera efter storlek"
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "Sortera efter datum"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Osorterade"
+
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "Sortera efter sökväg"
+
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "Sortera efter nummer"
+
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "Sortera efter namn"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Sortera"
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "Rotera 1_80°"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Närmast (sämst, men snabbast)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Brickor"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilinjär"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Super (bäst, men långsammast)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Ingen"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Normal"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Bäst"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr "Egendefinierat"
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "Återställ filfilter"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Detta kommer att återställa filfiltren till standardinställningarna.\n"
+"Fortsätt?"
+
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "Återställ redigeringsprogram"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Detta kommer att återställa redigeringskommandona\n"
+"till standardinställningarna.\n"
+"Fortsätt?"
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "Töm papperskorgen"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "Detta kommer att ta bort papperskorgens innehåll."
+
+#: src/preferences.c:770
+msgid "GQview Preferences"
+msgstr "GQview Inställningar"
+
+#: src/preferences.c:824
+msgid "Startup"
+msgstr "Uppstart"
+
+#: src/preferences.c:826
+msgid "Change to folder:"
+msgstr "Byt till mapp:"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Använd aktuell"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Storlek:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Kvalitet:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Cacha miniatyrbilder"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr "Använd delad miniatyrbildscache"
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Cacha miniatyrbilder i .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Använd xvpics-miniatyrbilder om sådana finns (endast läsning)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Bildspel"
+
+#: src/preferences.c:867
+msgid "Delay between image change:"
+msgstr "Fördröjning mellan bildväxlingar:"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr "sekunder"
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Slumpmässigt"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Upprepa"
+
+#: src/preferences.c:884
+msgid "Zoom"
+msgstr "Zooma"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Ditheringmetod:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Tvåstegszoomning"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Tillåt förstoring av bilder för att passa fönstret."
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Zoomökning:"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "När en ny bild väljs:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Zooma till originalstorlek"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Använd föregående zoominställning"
+
+#: src/preferences.c:917
+msgid "Appearance"
+msgstr "Utseende"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Svart bakgrund"
+
+#: src/preferences.c:922
+msgid "Convenience"
+msgstr "Bekvämlighet"
+
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "Uppdatera vid filändring"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Läs in nästa bild i förväg"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Rotera bild automatiskt baserat på Exif-informationen"
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Fönster"
+
+#: src/preferences.c:940
+msgid "State"
+msgstr "Tillstånd"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Kom ihåg fönsterpositioner"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Kom ihåg verktygstillstånd (flytande/dolt)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "Anpassa fönstret till bilden när verktygen är dolda/flytande"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Begränsa storlek vid automatisk storleksändring av fönster (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Layout"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filtrering"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Visa poster som börjar med en punkt"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "Skiftlägeskänslig sortering"
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Avaktivera filfiltrering"
+
+#: src/preferences.c:986
+msgid "File types"
+msgstr "Filtyper"
+
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "Filter"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "Standardinställningar"
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Redigerare"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "Nr."
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Menynamn"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "Avancerat"
+
+#: src/preferences.c:1138
+msgid "Full screen"
+msgstr "Helskärm"
+
+#: src/preferences.c:1146
+msgid "Smooth image flip"
+msgstr "Mjuk bildväxling"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr "Avaktivera skärmsläckare"
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Ta bort"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Bekräfta filborttagning"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Aktivera Delete-knappen"
+
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "Säker borttagning"
+
+#: src/preferences.c:1176
+msgid "Maximum size:"
+msgstr "Maximal storlek:"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr "Mbyte"
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Visa"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr "Beteende"
+
+#: src/preferences.c:1191
+msgid "Rectangular selection in icon view"
+msgstr "Rektangulär markering i ikonvy"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Gå in i undermappar i trädvyn"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Namnbyte på plats"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr "Navigering"
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Progressiv tangentbordsrullning"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Mushjulet rullar bilden"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr "Diverse"
+
+#: src/preferences.c:1209
+#, fuzzy
+msgid "Store keywords and comments local to source images"
+msgstr "Lagra miniatyrbilder i närheten av originalbilder"
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "Anpassad likhetströskel:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Storlek på dold cache (megabyte per bild):"
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "Om - GQview"
+
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright © %s John Ellis\n"
+"webbplats: %s\n"
+"e-post: %s\n"
+"\n"
+"Utgiven under GNU General Public License"
+
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "Tack..."
+
+#: src/print.c:111
+msgid "Selection"
+msgstr "Markering"
+
+#: src/print.c:112
+msgid "All"
+msgstr "Allt"
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr "En bild per sida"
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr "Provkarta"
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr "Standardskrivare"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr "Annan skrivare"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr "Postscript-fil"
+
+#: src/print.c:140
+msgid "Image file"
+msgstr "Bildfil"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr "jpeg, låg kvalitet"
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr "jpeg, normal kvalitet"
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr "jpeg, hög kvalitet"
+
+#: src/print.c:350 src/print.c:3201
+msgid "points"
+msgstr "punkter"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr "millimeter"
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr "centimeter"
+
+#: src/print.c:353
+msgid "inches"
+msgstr "tum"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr "Stående"
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr "Liggande"
+
+#: src/print.c:366
+msgid "Letter"
+msgstr "\"Letter\"-format"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr "\"Legal\"-format"
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr "\"Executive\"-format"
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr "\"Envelope #10\"-format"
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr "\"Envelope #9\"-format"
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr "Kuvert C4"
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr "Kuvert C5"
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr "Kuvert C6"
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr "Foto, 6×4 tum"
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr "Foto, 8×10 tum"
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr "Vykortsformat, 10×14,8 cm"
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr "\"Tabloid\"-format"
+
+#: src/print.c:544
+#, c-format
+msgid "page %d of %d"
+msgstr "sida %d av %d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "Förhandsgranskning"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+"Kan inte öppna rör för skrivning.\n"
+"\"%s\""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "En fil med namnet %s finns redan."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr "Misslyckades skriva till filen %s"
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr "Brutet rör-fel vid utskrift."
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr "Sida %d"
+
+#: src/print.c:1986 src/print.c:1991
+msgid "Printing error"
+msgstr "Utskriftsfel"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr "Ett fel uppstod vid utskrift till %s."
+
+#: src/print.c:1994
+msgid "Details"
+msgstr "Detaljer"
+
+#: src/print.c:2587 src/print.c:3332
+msgid "Print - GQview"
+msgstr "Skriv ut - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr "Skriver ut %d sidor till %s."
+
+#: src/print.c:2691
+msgid "Format:"
+msgstr "Format:"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr "Måttenhet:"
+
+#: src/print.c:2810
+msgid "Orientation:"
+msgstr "Orientering:"
+
+#: src/print.c:2942
+msgid "Destination:"
+msgstr "Destination:"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Filnamn"
+
+#: src/print.c:3079
+msgid "Unlimited"
+msgstr "Obegränsad"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr "Visa"
+
+#: src/print.c:3199
+msgid "Font"
+msgstr "Typsnitt"
+
+#: src/print.c:3359
+msgid "Source"
+msgstr "Källa"
+
+#: src/print.c:3375
+msgid "Proof size:"
+msgstr "Utkaststorlek:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr "Text"
+
+#: src/print.c:3401
+msgid "Paper"
+msgstr "Papper"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr "Marginaler"
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr "Vänster:"
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr "Höger:"
+
+#: src/print.c:3432
+msgid "Top:"
+msgstr "Överkant:"
+
+#: src/print.c:3435
+msgid "Bottom:"
+msgstr "Underkant:"
+
+#: src/print.c:3444
+msgid "Printer"
+msgstr "Skrivare"
+
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr "Anpassad skrivare:"
+
+#: src/print.c:3459
+msgid "File:"
+msgstr "Fil:"
+
+#: src/print.c:3468
+msgid "File format:"
+msgstr "Filformat:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr "Punkter/tum:"
+
+#: src/print.c:3481
+msgid "Remember print settings"
+msgstr "Kom ihåg utskriftsinställningar"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "fel vid sparande av konfigurationsfil: %s\n"
+
+#: src/search.c:200
+msgid "folder"
+msgstr "mapp"
+
+#: src/search.c:201
+msgid "comments"
+msgstr "kommentarer"
+
+#: src/search.c:202
+msgid "results"
+msgstr "resultat"
+
+#: src/search.c:206
+msgid "contains"
+msgstr "innehåller"
+
+#: src/search.c:207
+msgid "is"
+msgstr "är"
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr "lika med"
+
+#: src/search.c:212
+msgid "less than"
+msgstr "mindre än"
+
+#: src/search.c:213
+msgid "greater than"
+msgstr "större än"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr "mellan"
+
+#: src/search.c:219
+msgid "before"
+msgstr "före"
+
+#: src/search.c:220
+msgid "after"
+msgstr "efter"
+
+#: src/search.c:225
+msgid "match all"
+msgstr "matcha alla"
+
+#: src/search.c:226
+msgid "match any"
+msgstr "matcha godtycklig"
+
+#: src/search.c:227
+msgid "exclude"
+msgstr "exkludera"
+
+#: src/search.c:277
+#, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d filer (%s, %d)"
+
+#: src/search.c:284
+#, c-format
+msgid "%s, %d files"
+msgstr "%s, %d filer"
+
+#: src/search.c:301
+msgid "Searching..."
+msgstr "Söker..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr "Filen hittades inte"
+
+#: src/search.c:2094
+msgid "Please enter an existing file for image content."
+msgstr "Välj en befintlig fil för bildinnehåll."
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr "Mappen hittades inte"
+
+#: src/search.c:2141
+msgid "Please enter an existing folder to search."
+msgstr "Välj en befintlig mapp att genomsöka."
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr "Bildsökning - GQview"
+
+#: src/search.c:2599
+msgid "Search:"
+msgstr "Sök:"
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr "Rekursera"
+
+#: src/search.c:2617
+msgid "File name"
+msgstr "Filnamn"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr "Matcha skiftläge"
+
+#: src/search.c:2627
+msgid "File size is"
+msgstr "Filens storlek är"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+msgid "and"
+msgstr "och"
+
+#: src/search.c:2639
+msgid "File date is"
+msgstr "Filens datum är"
+
+#: src/search.c:2656
+msgid "Image dimensions are"
+msgstr "Bildens dimensioner är"
+
+#: src/search.c:2676
+msgid "Image content is"
+msgstr "Bildens innehåll är"
+
+#: src/search.c:2682
+#, no-c-format
+msgid "% similar to"
+msgstr "% likhet med"
+
+#: src/search.c:2751
+msgid "Rank"
+msgstr "Rang"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "Misslyckades läsa in miniatyrbild från cache, försöker återskapa.\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Kan inte skriva historiklistor till: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "Nytt bokmärke"
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "Redigera bokmärke"
+
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "Sökväg:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "Ikon:"
+
+#: src/ui_bookmark.c:627
+msgid "Select icon"
+msgstr "Markera ikon"
+
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "_Egenskaper..."
+
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "Flytta _upp"
+
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "Flytta _ner"
+
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "_Ta bort"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr "Kan inte läsa in:%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Misslyckades att byta namn från %s till %s."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Kan inte ta bort filen:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Borttagning av fil misslyckades"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Ta bort fil"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Kommer att ta bort filen:\n"
+"%s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "_Byt namn"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "_Lägg till bokmärke"
+
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "_Ta bort"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+msgid "New folder"
+msgstr "Ny mapp"
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Kan inte skapa mappen:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+msgid "Error creating folder"
+msgstr "Fel vid skapande av mapp"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Alla filer"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Visa dolda"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Filter:"
+
+#: src/ui_tabcomp.c:840
+msgid "Select path"
+msgstr "Markera sökväg"
+
+#: src/ui_tabcomp.c:856
+msgid "All files"
+msgstr "Alla filer"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Skriv över fil"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+msgid "Overwrite file?"
+msgstr "Skriv över fil?"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr "Ersätt befintlig fil med ny fil."
+
+#: src/utilops.c:480
+msgid "Overwrite _all"
+msgstr "Skriv över _alla"
+
+#: src/utilops.c:482
+msgid "S_kip all"
+msgstr "H_oppa över alla"
+
+#: src/utilops.c:483
+msgid "_Skip"
+msgstr "_Hoppa över"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+msgid "Existing file"
+msgstr "Befintlig fil"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+msgid "New file"
+msgstr "Ny fil"
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Automatiskt namnbyte"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Byt namn"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Källan att kopiera är samma som målet"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Kan inte kopiera filen:\n"
+"%s\n"
+"till sig själv."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Källan att flytta är samma som målet"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Kan inte flytta filen:\n"
+"%s\n"
+"till sig själv."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+msgid "Co_ntinue"
+msgstr "_Fortsätt"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Fel vid kopiering av fil"
+
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Kan inte kopiera filen:\n"
+"%s\n"
+"till:\n"
+"%s\n"
+"vid kopiering av flera filer."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Fel vid flytt av fil"
+
+#: src/utilops.c:636
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Kan inte flytta filen:\n"
+"%s\n"
+"till:\n"
+"%s\n"
+"vid flytt av flera filer."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Källan är samma som målet"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Källa och mål är samma, operationen avbröts."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Kan inte kopiera filen:\n"
+"%s\n"
+"till:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Kan inte flytta filen:\n"
+"%s\n"
+"till:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Ogiltigt mål"
+
+#: src/utilops.c:900
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"Vid operationer med flera filer på en gång, var god\n"
+"välj en mapp, inte en fil."
+
+#: src/utilops.c:905
+msgid "Please select an existing folder."
+msgstr "Välj en befintlig mapp"
+
+#: src/utilops.c:956
+msgid "Copy - GQview"
+msgstr "Kopiera - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "_Kopiera"
+
+#: src/utilops.c:960
+msgid "Copy file"
+msgstr "Kopiera fil"
+
+#: src/utilops.c:964
+msgid "Copy multiple files"
+msgstr "Kopiera flera filer"
+
+#: src/utilops.c:970
+msgid "Move - GQview"
+msgstr "Flytta - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "Fl_ytta"
+
+#: src/utilops.c:974
+msgid "Move file"
+msgstr "Flytta fil"
+
+#: src/utilops.c:978
+msgid "Move multiple files"
+msgstr "Flytta flera filer"
+
+#: src/utilops.c:992 src/utilops.c:1502
+msgid "File name:"
+msgstr "Filnamn:"
+
+#: src/utilops.c:996
+msgid "Choose the destination folder."
+msgstr "Välj målmapp."
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Borttagning misslyckades"
+
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "Kan inte ta bort en gammal fil från papperskorgsmappen"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+msgid "Could not create folder"
+msgstr "Kunde inte skapa mapp"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "Åtkomst nekas"
+
+#: src/utilops.c:1212
+#, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Kan inte komma åt eller skapa papperskorgsmappen:\n"
+"\"%s\""
+
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "Stäng av säker borttagning"
+
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "Säker borttagning: %s"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Kan inte ta bort filen:\n"
+" %s\n"
+" Fortsätta ta bort flera filer?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr "Fil %d av %d"
+
+#: src/utilops.c:1416
+msgid "Delete files - GQview"
+msgstr "Ta bort filer - GQview"
+
+#: src/utilops.c:1420
+msgid "Delete multiple files"
+msgstr "Ta bort flera filer"
+
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "Granska %d filer"
+
+#: src/utilops.c:1494
+msgid "Delete file - GQview"
+msgstr "Ta bort fil - GQview"
+
+#: src/utilops.c:1498
+msgid "Delete file?"
+msgstr "Ta bort fil?"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr "Ersätt befintlig fil genom att byta namn på ny fil."
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Kan inte byta namn på filen:\n"
+"%s\n"
+" till:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Fel vid namnbyte av fil"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Kan inte byta namn automatiskt med den valda\n"
+"nummermängden, en eller fler filer finns redan\n"
+"vars namn finns i den resulterande namnlistan.\n"
+
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"Misslyckades med att byta namn på\n"
+"%s\n"
+"Numret var %d."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+msgid "Rename - GQview"
+msgstr "Byt namn - GQview"
+
+#: src/utilops.c:2034
+msgid "Rename multiple files"
+msgstr "Byt namn på flera filer"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "Ursprungligt namn"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+msgid "Original name:"
+msgstr "Ursprungligt namn:"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+msgid "New name:"
+msgstr "Nytt namn:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Starttext"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "Startnr."
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Sluttext"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "Utfyllnad:"
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Kan inte byta namn på filen:\n"
+"%s\n"
+"till:\n"
+"%s"
+
+#: src/utilops.c:2252
+msgid "Rename file"
+msgstr "Byt namn på filen"
+
+#: src/utilops.c:2311
+#, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Mappen:\n"
+"%s\n"
+"finns redan."
+
+#: src/utilops.c:2312
+msgid "Folder exists"
+msgstr "Mappen finns"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"Sökvägen:\n"
+"%s\n"
+"finns redan som fil."
+
+#: src/utilops.c:2369
+msgid "New folder - GQview"
+msgstr "Ny mapp - GQview"
+
+#: src/utilops.c:2372
+#, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Skapa en mapp i:\n"
+"%s\n"
+"med namnet:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "ny_mapp"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "_Upp en nivå"
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "_Bildspel"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Rekursivt bildspel"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "Hitta _dubletter..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Rekursiv sökning efter dubletter..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "Ny _mapp..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "Visa som t_räd"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "Upp_datera"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "_Sortera"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "Visa som _ikoner"
+
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "Visa _miniatyrbilder"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Ogiltigt filnamn:\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "Kasta miniatyrbilder"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/Arkiv/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/Arkiv/_Nytt album"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Arkiv/Öppna a_lbum..."
+
+#~ msgid "/File/sep1"
+#~ msgstr "/Arkiv/sep1"
+
+#~ msgid "/File/_Search..."
+#~ msgstr "/Arkiv/_Sök..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "Arkiv/Hitta _dubletter..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Arkiv/sep2"
+
+#~ msgid "/File/_Print..."
+#~ msgstr "/Arkiv/Skriv _ut..."
+
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Arkiv/Ny _mapp..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Arkiv/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Arkiv/_Kopiera..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Arkiv/Fl_ytta..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Arkiv/_Byt namn..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Arkiv/_Ta bort..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Arkiv/sep4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/Arkiv/St_äng fönster"
+
+#~ msgid "/File/_Quit"
+#~ msgstr "/Arkiv/_Avsluta"
+
+#~ msgid "/_Edit"
+#~ msgstr "/_Redigera"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Redigera/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Redigera/redigeringsprogram1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Redigera/redigeringsprogram2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Redigera/redigeringsprogram3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Redigera/redigeringsprogram4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Redigera/redigeringsprogram5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Redigera/redigeringsprogram6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Redigera/redigeringsprogram7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Redigera/redigeringsprogram8"
+
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Redigera/redigeringsprogram9"
+
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Redigera/redigeringsprogram0"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Redigera/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Redigera/_Justera"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Redigera/_Egenskaper"
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Redigera/Justera/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Redigera/Justera/_Rotera medurs"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Redigera/Justera/Rotera _moturs"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Redigera/Justera/Rotera 1_80°"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Redigera/Justera/Spegla _horisontellt"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Redigera/Justera/Spegla _vertikalt"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Redigera/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Redigera/Markera _alla"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Redigera/Markera i_ngen"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Redigera/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Redigera/_Inställningar..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Redigera/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Redigera/Ställ in som skrivbords_underlag"
+
+#~ msgid "/_View"
+#~ msgstr "/_Visa"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Visa/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Visa/Zooma _in"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Visa/Zooma _ut"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Visa/Zooma _1:1"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Visa/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Visa/_Miniatyrbilder"
+
+#~ msgid "/View/I_cons"
+#~ msgstr "/Visa/I_koner"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Visa/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Visa/_Helskärm"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Visa/sep3"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Visa/Dölj _fillista"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/Visa/sep4"
+
+#~ msgid "/View/_Keywords"
+#~ msgstr "/Visa/_Nyckelord"
+
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Visa/_Sorteringshanterare"
+
+#~ msgid "/View/sep5"
+#~ msgstr "/Visa/sep5"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Visa/Växla _bildspel"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Visa/Upp_datera listor"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Hjälp/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Hjälp/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "GQview konfiguration"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Redigera/Ra_dera gamla miniatyrbilder"
+
+#~ msgid "path"
+#~ msgstr "sökväg"
+
+#~ msgid "Save"
+#~ msgstr "Spara"
+
+#~ msgid "Close"
+#~ msgstr "Stäng"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Skriv över albumfil:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "Spara album som:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "Öppna album från:"
+
+#~ msgid "Open"
+#~ msgstr "Öppna"
+
+#~ msgid "Append collection from:"
+#~ msgstr "Komplettera album med innehåll från:"
+
+#~ msgid "exit"
+#~ msgstr "avsluta"
+
+#~ msgid "Exit"
+#~ msgstr "Avsluta"
+
+#~ msgid "Ok"
+#~ msgstr "OK"
+
+#~ msgid "Initial folder"
+#~ msgstr "Startmapp"
+
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Vid start, byt till denna mapp:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Zoom (skalning):"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Placera dialogrutor under muspekaren"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Inkludera filer av typen:"
+
+#~ msgid "Remove"
+#~ msgstr "Ta bort"
+
+#~ msgid "Add"
+#~ msgstr "Lägg till"
+
+#~ msgid "Command Line"
+#~ msgstr "Kommandorad"
+
+#~ msgid "Help"
+#~ msgstr "Hjälp"
+
+#~ msgid "Full screen size:"
+#~ msgstr "Storlek för helskärmsläge:"
+
+#~ msgid "Point size:"
+#~ msgstr "Textstorlek (punkter):"
+
+#~ msgid "Width:"
+#~ msgstr "Bredd:"
+
+#~ msgid "Height:"
+#~ msgstr "Höjd:"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Skriv över filen:\n"
+#~ " %s\n"
+#~ " med:\n"
+#~ " %s"
+
+#~ msgid "Yes"
+#~ msgstr "Ja"
+
+#~ msgid "Yes to all"
+#~ msgstr "Ja till alla"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Skriv över filen:\n"
+#~ "%s\n"
+#~ " med:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Kopiera filen:\n"
+#~ "%s\n"
+#~ "till:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Flytta filen:\n"
+#~ "%s\n"
+#~ "till:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Kommer att ta bort flera filer..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Skriver över filen:\n"
+#~ "%s\n"
+#~ "genom att byta namn:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "till:"
+
+#~ msgid "Create"
+#~ msgstr "Skapa"
diff --git a/po/th.po b/po/th.po
new file mode 100644 (file)
index 0000000..938bfa1
--- /dev/null
+++ b/po/th.po
@@ -0,0 +1,3701 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview-1.1.5\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2002-02-25 20:55GMT\n"
+"Last-Translator: Phanumas Thanyaboon <maskung@hotmail.com>\n"
+"Language-Team: thai <th@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 0.9.5\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Tiles"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "วันที่"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+#, fuzzy
+msgid "Filename:"
+msgstr "เปลี่ยนชื่อ:"
+
+#: src/bar_info.c:1007 src/info.c:360
+#, fuzzy
+msgid "File date:"
+msgstr "ฟิลเตอร์:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "เปรียบเทียบกับ:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "บันทึก collecion"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr ""
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "ชื่อ"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr ""
+
+#: src/bar_exif.c:426
+#, fuzzy
+msgid "Format"
+msgstr "ธรรมดา"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr ""
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr ""
+
+#: src/bar_exif.c:549 src/info.c:105
+#, fuzzy
+msgid "Exif"
+msgstr "ออก"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr ""
+
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "การลบล้มเหลว"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"ไดเรคทอรี:\n"
+"%s\n"
+"มีอยู่แล้ว"
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "collection ว่าง"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"เกิดความล้มเหลวในการเขียนแฟ้ม collecion:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "การบันทึกข้อมูลล้มเหลว"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr ""
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "ต่อท้าย collection"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+#, fuzzy
+msgid "Name:"
+msgstr "ชื่อ"
+
+#: src/bar_sort.c:569
+#, fuzzy
+msgid "Sort Manager"
+msgstr "เรียงตามชื่อ"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+#, fuzzy
+msgid "Folders"
+msgstr "Tiles"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr ""
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "คัดลอก"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "ย้าย"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d ภาพ"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "ไม่เลือกสิ่งใด"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr ""
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+#, fuzzy
+msgid "done"
+msgstr "ไม่มี"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "กำลังอ่านข้อมูลที่คล้ายกัน..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "สร้างภาพเล็ก..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "ลบภาพเล็กเก่า..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "ชื่อแฟ้มไม่ถูกต้อง"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "แคชรูปเล็ก"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "วันที่"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+#, fuzzy
+msgid "Folder:"
+msgstr "Tiles"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "ไม่เลือกสิ่งใด"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "ชื่อแฟ้มไม่ถูกต้อง"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+#, fuzzy
+msgid "running..."
+msgstr "กำลังเปรียบเทียบ..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "สร้างภาพเล็ก..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "ล้างแคช"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"จะทำการลบรูปเล็กทุกรูปที่มี\n"
+"ซึ่งถูกบันทึกลงดิสก์หรือไม่?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "ช่วยเหลือ - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview ดูภาพเต็มหน้าจอ"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+msgid "Location:"
+msgstr ""
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "ล้าง"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "แคชรูปเล็ก"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "แคชรูปเล็ก"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "เปลี่ยนชื่อ"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "ไม่มีชื่อ"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "ไม่มีชื่อ (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - GQview Collection"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "ปิดcollection"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Collection ถูกแก้ไข \n"
+"บันทึกแฟ้มก่อนหรือไม่?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"กำหนดเส้นทาง:\n"
+"%s\n"
+"เป็นไดเรคทอรี,collection เป็นแฟ้ม"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "ชื่อแฟ้มไม่ถูกต้อง"
+
+#: src/collect-dlg.c:68
+#, fuzzy
+msgid "Overwrite File"
+msgstr "เขียนทับแฟ้ม"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "เขียนทับแฟ้ม"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "เขียนทับ"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "บันทึก collecion"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "เปิด collection"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "ต่อท้าย collection"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "ต่อท้าย"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "แฟ้ม collection"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "collection ว่าง"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "collection ปัจจุบันว่าง,การบันทึกถูกยกเลิก"
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "ว่าง"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d ภาพ (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d ภาพ"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "กำลังโหลดรูปเล็ก..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+#, fuzzy
+msgid "_View"
+msgstr "/ดู"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+#, fuzzy
+msgid "View in _new window"
+msgstr "มองในหน้าต่างใหม่"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+#, fuzzy
+msgid "Rem_ove"
+msgstr "ลบ"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "ต่อท้ายจากแฟ้มรายการ"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "ต่อท้ายจาก collection..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "เลือกทั้งหมด"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "ไม่เลือกสิ่งใด"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+#, fuzzy
+msgid "_Properties"
+msgstr "/แกไข/ออพชัน..."
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+#, fuzzy
+msgid "_Copy..."
+msgstr "คัดลอก..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+#, fuzzy
+msgid "_Move..."
+msgstr "ย้าย..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+#, fuzzy
+msgid "_Rename..."
+msgstr "เปลี่ยนชื่อ..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+#, fuzzy
+msgid "_Delete..."
+msgstr "ลบ..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+#, fuzzy
+msgid "Show filename _text"
+msgstr "แสดงสิ่งที่ซ่อน"
+
+#: src/collect-table.c:813
+#, fuzzy
+msgid "_Save collection"
+msgstr "บันทึก collecion"
+
+#: src/collect-table.c:815
+#, fuzzy
+msgid "Save collection _as..."
+msgstr "บันทึก collection เป็น..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+#, fuzzy
+msgid "_Find duplicates..."
+msgstr "หาตัวซ้ำ..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/แฟ้ม/เปลี่ยนชื่อ..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "ทิ้งรายการรวมทั้งไดเรคทอรี"
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+#, fuzzy
+msgid "_Add contents"
+msgstr "เพิ่มเนื้อหา"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+#, fuzzy
+msgid "Add contents _recursive"
+msgstr "เพิ่มเนื้อหาแบบรีเคอซีฟ "
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "ข้ามไดเรคทอรี"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "ยกเลิก"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "ทิ้งแฟ้มลงไปเพื่อเปรียบเทียบ"
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d แฟ้ม"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d เข้ากันได้ถูกพบใน %d แฟ้ม"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr ""
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "กำลังอ่าน checksum..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "กำลังอ่าน dimensions..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "กำลังอ่านข้อมูลที่คล้ายกัน..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "กำลังเปรียบเทียบ..."
+
+#: src/dupe.c:1535
+#, fuzzy
+msgid "Sorting..."
+msgstr "กำลังเปรียบเทียบ..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr ""
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr ""
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "เพิ่มไปยัง collection ใหม่"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+#, fuzzy
+msgid "C_lear"
+msgstr "ล้าง"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+#, fuzzy
+msgid "Close _window"
+msgstr "ปิดหน้าต่าง"
+
+#: src/dupe.c:2382
+#, fuzzy, c-format
+msgid "%d files (set 2)"
+msgstr "%d แฟ้ม%s"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "ขนาด"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "วันที่"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Dimensions"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Checksum"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "เส้นทาง"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "ความคล้ายกัน (สูง)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "ความคล้ายกัน"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "ความคล้ายกัน (ต่ำ)"
+
+#: src/dupe.c:2598
+#, fuzzy
+msgid "Similarity (custom)"
+msgstr "ความคล้ายกัน (ต่ำ)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "หาตัวซำ้ - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "เปรียบเทียบกับ:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "เปรียบเทียบโดย"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "รูปเล็ก"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "เปรียบเทียบแฟ้ม 2 กลุ่ม"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr ""
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr ""
+
+#: src/editors.c:58
+#, fuzzy
+msgid "Rotate jpeg clockwise"
+msgstr "หมุนตามเข็มนาฬิกา"
+
+#: src/editors.c:59
+#, fuzzy
+msgid "Rotate jpeg counterclockwise"
+msgstr "หมุนทวนเข็มนาฬิกา"
+
+#: src/editors.c:104
+#, fuzzy
+msgid "stopping..."
+msgstr "กำลังเปรียบเทียบ..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr ""
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr ""
+
+#: src/editors.c:303
+#, fuzzy, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"ไม่สามารถโหลด:\n"
+"%s"
+
+#: src/editors.c:414
+#, fuzzy
+msgid "stopped by user"
+msgstr "เรียงตามหมายเลข"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+#, fuzzy
+msgid "unknown"
+msgstr "ใน (ไม่รู้จัก)..."
+
+#: src/exif.c:113
+#, fuzzy
+msgid "top left"
+msgstr "ลบ"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr ""
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr ""
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr ""
+
+#: src/exif.c:117
+#, fuzzy
+msgid "left top"
+msgstr "ลบ"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr ""
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr ""
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr ""
+
+#: src/exif.c:127
+msgid "inch"
+msgstr ""
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr ""
+
+#: src/exif.c:140
+msgid "average"
+msgstr ""
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr ""
+
+#: src/exif.c:142
+msgid "spot"
+msgstr ""
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr ""
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr ""
+
+#: src/exif.c:145
+msgid "partial"
+msgstr ""
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr ""
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr ""
+
+#: src/exif.c:152
+msgid "manual"
+msgstr ""
+
+#: src/exif.c:153
+#, fuzzy
+msgid "normal"
+msgstr "ธรรมดา"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr ""
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr ""
+
+#: src/exif.c:156
+#, fuzzy
+msgid "creative"
+msgstr "สร้าง"
+
+#: src/exif.c:157
+msgid "action"
+msgstr ""
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr ""
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr ""
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr ""
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr ""
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr ""
+
+#: src/exif.c:168
+msgid "flash"
+msgstr ""
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr ""
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+#, fuzzy
+msgid "yes"
+msgstr "ใช่"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr ""
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr ""
+
+#: src/exif.c:289
+#, fuzzy
+msgid "Image description"
+msgstr "ปลายทางไม่ถูกต้อง"
+
+#: src/exif.c:292
+#, fuzzy
+msgid "Orientation"
+msgstr "Dimensions"
+
+#: src/exif.c:303
+#, fuzzy
+msgid "Copyright"
+msgstr "คัดลอก"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr ""
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr ""
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr ""
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr ""
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr ""
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr ""
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr ""
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr ""
+
+#: src/exif.c:323
+#, fuzzy
+msgid "Metering mode"
+msgstr "ขั้นตอนวิธี Dithering:"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr ""
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr ""
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr ""
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr ""
+
+#: src/exif.c:337
+msgid "Height"
+msgstr ""
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr ""
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr ""
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr ""
+
+#: src/exif.c:1479
+#, fuzzy
+msgid "mode:"
+msgstr "Tiles"
+
+#: src/exif.c:1483 src/utilops.c:1234
+#, fuzzy
+msgid "on"
+msgstr "ไม่มี"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr ""
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr ""
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr ""
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr ""
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr ""
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr ""
+
+#: src/filelist.c:513
+#, fuzzy, c-format
+msgid "%d bytes"
+msgstr "%d แฟ้ม"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr ""
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr ""
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr ""
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview ดูภาพเต็มหน้าจอ"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Tiles"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "ทำภาพให้พอดีหน้าต่าง"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+#, fuzzy
+msgid "Zoom _in"
+msgstr "ซูมเข้า "
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+#, fuzzy
+msgid "Zoom _out"
+msgstr "ซูมออก"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+#, fuzzy
+msgid "Zoom _1:1"
+msgstr "ซูม 1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+#, fuzzy
+msgid "Fit image to _window"
+msgstr "ทำภาพให้พอดีหน้าต่าง"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+#, fuzzy
+msgid "Set as _wallpaper"
+msgstr "กำหนดเป็นวอลล์เปเปอร์"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+#, fuzzy
+msgid "_Stop slideshow"
+msgstr "หยุดการดูไสลด์"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+#, fuzzy
+msgid "Continue slides_how"
+msgstr "ดูไสลด์ต่อไป"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+#, fuzzy
+msgid "Pause slides_how"
+msgstr "หยุดการดูไสลด์ชั่วคราว"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+#, fuzzy
+msgid "_Start slideshow"
+msgstr "เริ่มต้นแสดงไสลด์"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+#, fuzzy
+msgid "Exit _full screen"
+msgstr "ออกจากโหมดเต็มจอภาพ"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+#, fuzzy
+msgid "_Full screen"
+msgstr "เต็มจอภาพ"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+#, fuzzy
+msgid "C_lose window"
+msgstr "ปิดหน้าต่าง"
+
+#: src/info.c:361
+#, fuzzy
+msgid "File size:"
+msgstr "Tiles"
+
+#: src/info.c:363
+#, fuzzy
+msgid "Dimensions:"
+msgstr "Dimensions"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr ""
+
+#: src/info.c:365 src/print.c:3371
+#, fuzzy
+msgid "Image size:"
+msgstr "รูป"
+
+#: src/info.c:367
+#, fuzzy
+msgid "Compress ratio:"
+msgstr "เปรียบเทียบกับ:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "ฟิลเตอร์:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr ""
+
+#: src/info.c:371
+msgid "Group:"
+msgstr ""
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "ทั่วไป"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr ""
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr ""
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "มากไปน้อย"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr "แสดงสไลด์"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr "หยุดชั่วคราว"
+
+#: src/layout.c:358
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%d แฟ้ม (%d)%s"
+
+#: src/layout.c:365
+#, fuzzy, c-format
+msgid "%s, %d files%s"
+msgstr "%d แฟ้ม%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d แฟ้ม%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr ""
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s ไบต์"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s ไบต์"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview - เครื่องมือ"
+
+#: src/layout_config.c:57
+#, fuzzy
+msgid "Tools"
+msgstr "Tiles"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+#, fuzzy
+msgid "Files"
+msgstr "Tiles"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "รูป"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr ""
+
+#: src/layout_image.c:770
+#, fuzzy
+msgid "Hide file _list"
+msgstr "(ไม่)ซ่อนรายการแฟ้ม"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "ใน %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "ใน (ไม่รู้จัก)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "ว่าง"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/แฟ้ม"
+
+#: src/layout_util.c:749 src/menu.c:91
+#, fuzzy
+msgid "_Edit"
+msgstr "/แฟ้ม/แก้ไข"
+
+#: src/layout_util.c:750 src/menu.c:248
+#, fuzzy
+msgid "_Adjust"
+msgstr "ปรับเปลี่ยน"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/ช่วยเหลือ"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/แฟ้ม/collection ใหม"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "บันทึก collecion"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "เปิด collection"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/แฟ้ม/เปิดครั้งล่าสุด"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "กำลังเปรียบเทียบ..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/แฟ้ม/เปลี่ยนชื่อ..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "ช่วยเหลือ - GQview"
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "คุณภาพ"
+
+#: src/layout_util.c:779 src/menu.c:194
+#, fuzzy
+msgid "_Rotate clockwise"
+msgstr "หมุนตามเข็มนาฬิกา"
+
+#: src/layout_util.c:780 src/menu.c:197
+#, fuzzy
+msgid "Rotate _counterclockwise"
+msgstr "หมุนทวนเข็มนาฬิกา"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "หมุน 180 องศา"
+
+#: src/layout_util.c:782 src/menu.c:203
+#, fuzzy
+msgid "_Mirror"
+msgstr "กระจก"
+
+#: src/layout_util.c:783 src/menu.c:206
+#, fuzzy
+msgid "_Flip"
+msgstr "พลิก"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "เลือกทั้งหมด"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "ไม่เลือกสิ่งใด"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "/แกไข/ออพชัน..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/ดู/ซูมพอดีกรอบ"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "เต็มจอภาพ"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "(ไม่)ซ่อนรายการแฟ้ม"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "หยุดการดูไสลด์"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "รีเฟรช"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/ช่วยเหลือ/เกี่ยวกับ"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/ช่วยเหลือ/คีย์ลัด"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/ช่วยเหลือ/Release notes"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/ช่วยเหลือ/เกี่ยวกับ"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "รูปเล็ก"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/มุมมอง/sep3"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/ดู/(ไม่)ลอยแฟ้มรายการ"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/ดู/tear1"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "/มุมมอง/sep3"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/ดู/_รีเฟรชรายการ"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "เรียงตามชื่อ"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/ดู/_รีเฟรชรายการ"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "/มุมมอง/sep3"
+
+#: src/layout_util.c:1083
+#, fuzzy
+msgid "Show thumbnails"
+msgstr "แคชรูปเล็ก"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "เปลี่ยนไปยังโฮมไดเรคทอร"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "รีเฟรชรายการแฟ้ม"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "ซูมเข้า "
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "ซูมออก"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "ทำภาพให้พอดีหน้าต่าง"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "กำหนดซูม1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "ปรับแต่งออพชั่น"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "ควบคุมการลอย"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "ช่วยเหลือ - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr ""
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "โหลดล่วงหน้ารูปต่อไป"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "%d ภาพ"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "โหลดล่วงหน้ารูปต่อไป"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "ออกจากโหมดเต็มจอภาพ"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "ออกจากโหมดเต็มจอภาพ"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "ออกจากโหมดเต็มจอภาพ"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "หยุดการดูไสลด์"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "เริ่มต้นแสดงไสลด์"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "หยุดการดูไสลด์"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "เริ่มต้นแสดงไสลด์"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview - เครื่องมือ"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr ""
+"เปลี่ยนชื่อแฟ้ม:\n"
+"%s\n"
+"เป็น:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "มองในหน้าต่างใหม่"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Usage: gqview [options] [path]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "valid options are:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           force show of tools\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        force hide of tools\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           start in full screen mode\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            start in slideshow mode\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr "  -l, --list                 open collection window for command line\n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr "  -l, --list                 open collection window for command line\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    turn on debug output\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              print version info\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 show this message\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "กำลังสร้าง GQview dir:%s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "ไม่สามารถสร้าง GQview ไดเร็อทอรี:%s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "โฮม"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+#, fuzzy
+msgid "Desktop"
+msgstr "สู่:"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - ออก"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "ช่วยเหลือ - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Collection ถูกแก้ไข\n"
+"ต้องการออกหรือไม่?์"
+
+#: src/menu.c:115
+#, fuzzy
+msgid "Sort by size"
+msgstr "เรียงตามขนาด"
+
+#: src/menu.c:118
+#, fuzzy
+msgid "Sort by date"
+msgstr "เรียงตามวันที่"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "ไม่เรียง"
+
+#: src/menu.c:124
+#, fuzzy
+msgid "Sort by path"
+msgstr "เรียงตามพาธ"
+
+#: src/menu.c:127
+#, fuzzy
+msgid "Sort by number"
+msgstr "เรียงตามหมายเลข"
+
+#: src/menu.c:131
+#, fuzzy
+msgid "Sort by name"
+msgstr "เรียงตามชื่อ"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "เรียง"
+
+#: src/menu.c:200
+#, fuzzy
+msgid "Rotate _180"
+msgstr "หมุน 180 องศา"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Nearest (เลวที่สุด, แต่เร้วที่สุด)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Tiles"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Bilinear"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Hyper (ดีที่สุด, แต่ช้าที่สุด)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "ไม่มี"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "ธรรมดา"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "ดีที่สุด"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr ""
+
+#: src/preferences.c:662 src/preferences.c:665
+#, fuzzy
+msgid "Reset filters"
+msgstr "ลบแฟ้ม"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:699 src/preferences.c:702
+#, fuzzy
+msgid "Reset editors"
+msgstr "ลบแฟ้ม"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:727 src/preferences.c:730
+#, fuzzy
+msgid "Clear trash"
+msgstr "ล้างแคช"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr ""
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - เปลี่ยนชื่อ"
+
+#: src/preferences.c:824
+msgid "Startup"
+msgstr ""
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "เปลี่ยนไปยังโฮมไดเรคทอร"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "ใช้ขณะนี้"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "ขนาด:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "คุณภาพ:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "แคชรูปเล็ก"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "แคชรูปเล็กสู่รูปเล็ก"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "ใช้ รูปเล็กของ xvpics เมื่อถูกพบ (อ่านอย่างเดียว)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "การแสดงไสลด์"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "หน่วงเวลาก่อนเปลี่ยนรูป (วินาที):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "สุ่ม"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "ทำซ้ำ"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "ซูมเข้า "
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "ขั้นตอนวิธี Dithering:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr ""
+
+#: src/preferences.c:895
+#, fuzzy
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "ขยายภาพเพื่อซูมพอดี"
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "เพิ่มการซูม"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "เมื่อภาพใหม่ถูกเลือก:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "ซูมยังขนาดเริ่มต้น"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "ออกจากซูมไปค่าที่เซตไว้่ก่อนหน้า"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "ต่อท้าย"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr ""
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "ดำเนินการต่อ"
+
+#: src/preferences.c:924
+#, fuzzy
+msgid "Refresh on file change"
+msgstr "รีเฟรชรายการแฟ้ม"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "โหลดล่วงหน้ารูปต่อไป"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr ""
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "หน้าต่าง"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "วันที่"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "จำตำแหน่งหน้าต่าง"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "จำสถานะเครื่องมือ (ลอย/ซ่อน)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "กำหนดหน้าต่างเท่ารูปภาพเมื่อเครื่องมือถูกซ่อน/แสดง"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "จำกัดขนาดเมื่อกำหนดขนาดหน้าต่างอัตโนมัติ (%)"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr ""
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "การกรอง"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "แสดงข้อมูลที่เริ่มต้นด้วยจุด"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr ""
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "ยกเลิกการกรองแฟ้ม"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "ฟิลเตอร์:"
+
+#: src/preferences.c:1008
+#, fuzzy
+msgid "Filter"
+msgstr "ฟิลเตอร์:"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr ""
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "อิดิเตอร์"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr ""
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "เมนู ชื่อ"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr ""
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "เต็มจอภาพ"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "รูป"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "ลบ"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "ยืนยันการลบ"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "อนุญาตให้ใช้ปุ่ม Delete"
+
+#: src/preferences.c:1158
+#, fuzzy
+msgid "Safe delete"
+msgstr "ยืนยันการลบ"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Tiles"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "มอง"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "การเลือกแบบสี่เหลี่ยม"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr ""
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "การเปลี่ยนชื่อแบบแทนที่"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr ""
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "ลักษณะคีย์บอร์ดใช้เลื่อนภาพ"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "เมาส์ลูกกลิ้งใช้เลื่อนภาพ"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+#, fuzzy
+msgid "Custom similarity threshold:"
+msgstr "แฟ้มไม่ระบุชนิด"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr ""
+
+#: src/preferences.c:1291
+#, fuzzy
+msgid "About - GQview"
+msgstr "ช่วยเหลือ - GQview"
+
+#: src/preferences.c:1304
+#, fuzzy, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"สงวนลิขสิทธิ์ (c) 2003 โดย John Ellis\n"
+"http://gqview.sourceforge.net\n"
+"gqview@users.sourceforge.net\n"
+"\n"
+"Released ภายใต้ the GNU General Public License"
+
+#: src/preferences.c:1322
+#, fuzzy
+msgid "Credits..."
+msgstr "/แกไข/ออพชัน..."
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "ไม่เลือกสิ่งใด"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr ""
+
+#: src/print.c:138
+#, fuzzy
+msgid "Custom printer"
+msgstr "แฟ้มไม่ระบุชนิด"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "รูป"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+msgid "points"
+msgstr ""
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr ""
+
+#: src/print.c:353
+msgid "inches"
+msgstr ""
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr ""
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr ""
+
+#: src/print.c:366
+msgid "Letter"
+msgstr ""
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, c-format
+msgid "page %d of %d"
+msgstr ""
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr ""
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, fuzzy, c-format
+msgid "A file with name %s already exists."
+msgstr "แฟม้ชื่อ %s มีอยู่แล้ว"
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "ฟิลเตอร์:"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "ลบแฟ้ม"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "ช่วยเหลือ - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "ธรรมดา"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Dimensions"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "ปลายทางไม่ถูกต้อง"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "เปลี่ยนชื่อ:"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "ไม่มีชื่อ"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "ไม่มี"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "เรียง"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "รูป"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "ฟิลเตอร์:"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr ""
+
+#: src/print.c:3432
+msgid "Top:"
+msgstr ""
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "สู่:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "ฟิลเตอร์:"
+
+#: src/print.c:3450
+#, fuzzy
+msgid "Custom printer:"
+msgstr "แฟ้มไม่ระบุชนิด"
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "ฟิลเตอร์:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "ฟิลเตอร์:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "จำตำแหน่งหน้าต่าง"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "เกิดความผิดพลาด์์ในการบันทึกแฟ้ม config:-%s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Tiles"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "เพิ่มเนื้อหา"
+
+#: src/search.c:202
+msgid "results"
+msgstr ""
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "ดำเนินการต่อ"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+#, fuzzy
+msgid "greater than"
+msgstr "สร้างรูปเล็ก"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "ฟิลเตอร์:"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%d แฟ้ม (%d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%d แฟ้ม%s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "กำลังเปรียบเทียบ..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "โปรดเลือกได้เรคทอรีที่มีอยู่แล้ว"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "โปรดเลือกได้เรคทอรีที่มีอยู่แล้ว"
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr ""
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "กำลังเปรียบเทียบ..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "เปลี่ยนชื่อ:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Tiles"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "สุ่ม"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "ฟิลเตอร์:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "ปลายทางไม่ถูกต้อง"
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "เพิ่มเนื้อหา"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "ความคล้ายกัน"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "สุ่ม"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "ภาพเล็กในแคชล้มเหลวระหว่างโหลด,กำลังพยามสร้างใหม่\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "ไม่สามารถเขียนรายการประวัติศาสตร์สู่:-%s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr ""
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+#, fuzzy
+msgid "Edit Bookmark"
+msgstr "อิดิเตอร์"
+
+#: src/ui_bookmark.c:612
+#, fuzzy
+msgid "Path:"
+msgstr "เส้นทาง"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr ""
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "ไม่เลือกสิ่งใด"
+
+#: src/ui_bookmark.c:718
+#, fuzzy
+msgid "_Properties..."
+msgstr "/แกไข/ออพชัน..."
+
+#: src/ui_bookmark.c:720
+#, fuzzy
+msgid "Move _up"
+msgstr "ย้าย"
+
+#: src/ui_bookmark.c:722
+#, fuzzy
+msgid "Move _down"
+msgstr "ย้าย"
+
+#: src/ui_bookmark.c:724
+#, fuzzy
+msgid "_Remove"
+msgstr "ลบ"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"ไม่สามารถโหลด:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "ล้มเหล้วในการเปลี่ยนชื่อ %s เป็น %s"
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"ไม่สามารถลบแฟ้ม:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "การลบแฟ้มผิดพลาด"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "ลบแฟ้ม"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"เกี่ยวกับการลบแฟ้ม:\n"
+"%s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+#, fuzzy
+msgid "_Rename"
+msgstr "เปลี่ยนชื่อ"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+#, fuzzy
+msgid "Add _Bookmark"
+msgstr "อิดิเตอร์"
+
+#: src/ui_pathsel.c:636
+#, fuzzy
+msgid "_Delete"
+msgstr "ลบ"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "ช่วยเหลือ - GQview"
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"ไม่สามารถสร้างไดเรคทอรี\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "การสร้างไดเรคทอรีผิดพลาด"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "ทุกแฟ้ม"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "แสดงสิ่งที่ซ่อน"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "ฟิลเตอร์:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "เลือกทั้งหมด"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "ทุกแฟ้ม"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "เขียนทับแฟ้ม"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "เขียนทับแฟ้ม"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "เขียนทับแฟ้ม"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "ข้าม"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "ข้าม"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "เกิดความผิดพลาดขณะย้ายแฟ้ม"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "ช่วยเหลือ - GQview"
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+#, fuzzy
+msgid "Auto rename"
+msgstr "เมนู ชื่อ"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "เปลี่ยนชื่อ"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "คัดลอกต้นฉบับที่เหมือนกันกับปลายทาง"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"ไม่สามารถคัดลอกแฟ้ม:\n"
+"%s\n"
+"สู่ตัวเอง"
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "ย้ายต้นเฉพาะที่เหมือนกับปลายทาง"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"ไม่สามารถย้ายแฟ้ม:\n"
+"%s\n"
+"สู่ตัวเอง"
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "ดำเนินการต่อ"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "เกิดความผิดพลาดขณะกำลังคัดลอกแฟ้ม"
+
+#: src/utilops.c:631
+#, fuzzy, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"ไม่สามารถคัดลอกแฟ้ม:\n"
+"%s สู่:\n"
+"%s\n"
+" ระหว่างหลายแฟ้มที่ถูกคัดลอก"
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "เกิดความผิดพลาดขณะย้ายแฟ้ม"
+
+#: src/utilops.c:636
+#, fuzzy, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"ไม่สามารถย้ายแฟ้ม:\n"
+"%sสู่:\n"
+"%s\n"
+" ระหว่างย้ายหลายแฟ้ม"
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "ต้นทางเหมือนปลายทาง"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "ต้นทางและปลายทางเหมือนกัน, การดำเนินการถูกยกเลิก"
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"ไม่สามารถคัดลอกแฟ้ม:\n"
+"%s\n"
+"สู่:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"ไม่สามารถย้ายแฟ้ม:\n"
+"%s\n"
+"สู่:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "ปลายทางไม่ถูกต้อง"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"เมื่อดำเนินการกับหลายแฟ้ม,โปรดเลือก\n"
+"ไดเรคทอรีไม,่ใช่แฟ้ม"
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "โปรดเลือกได้เรคทอรีที่มีอยู่แล้ว"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "ช่วยเหลือ - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+#, fuzzy
+msgid "_Copy"
+msgstr "คัดลอก"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr ""
+"เปลี่ยนชื่อแฟ้ม:\n"
+"%s\n"
+"เป็น:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "คัดลอกหลายแฟ้มสู่:"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "ช่วยเหลือ - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+#, fuzzy
+msgid "_Move"
+msgstr "ย้าย"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr ""
+"เปลี่ยนชื่อแฟ้ม:\n"
+"%s\n"
+"เป็น:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "ย้ายหลายแฟ้มสู่:"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "เปลี่ยนชื่อ:"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "ต้นทางเหมือนปลายทาง"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "การลบล้มเหลว"
+
+#: src/utilops.c:1124
+#, fuzzy
+msgid "Unable to remove old file from trash folder"
+msgstr ""
+"ไม่สามารถย้ายแฟ้ม:\n"
+"%s\n"
+"สู่ตัวเอง"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "ไม่สามารถสร้างไดเรคทอรี"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr ""
+
+#: src/utilops.c:1212
+#, fuzzy, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"ไม่สามารถสร้างไดเรคทอรี\n"
+"%s"
+
+#: src/utilops.c:1216
+#, fuzzy
+msgid "Turn off safe delete"
+msgstr "ยืนยันการลบ"
+
+#: src/utilops.c:1234
+#, fuzzy, c-format
+msgid "Safe delete: %s"
+msgstr "ยืนยันการลบ"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"ไม่สามารถลบแฟ้ม:\n"
+" %s\n"
+" ดำเนินการลบหลายแฟ้มต่อหรือไม่?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr ""
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "ลบแฟ้ม"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "เปลี่ยนชื่อหลายแฟ้ม"
+
+#: src/utilops.c:1438
+#, fuzzy, c-format
+msgid "Review %d files"
+msgstr "%d แฟ้ม"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "ลบแฟ้ม"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "ลบแฟ้ม"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"ไม่สามารถเปลี่ยนชื่อแฟ้ม:\n"
+"%s\n"
+" เป็น่:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "เกิดความผิดพลาดในการเปลี่ยนชื่อแฟ้ม"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+
+#: src/utilops.c:1809
+#, fuzzy, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr "ล้มเหล้วในการเปลี่ยนชื่อ %s เป็น %s"
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "ช่วยเหลือ - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "เปลี่ยนชื่อหลายแฟ้ม"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr ""
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "เปลี่ยนชื่อ:"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "เปลี่ยนชื่อ:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr ""
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr ""
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr ""
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr ""
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"ไม่สามารถเปลี่ยนชื่อแฟ้ม:\n"
+"%s\n"
+"เป็น:\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr ""
+"เปลี่ยนชื่อแฟ้ม:\n"
+"%s\n"
+"เป็น:"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"ไดเรคทอรี:\n"
+"%s\n"
+"มีอยู่แล้ว"
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Tiles"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"พาธ:\n"
+"%s\n"
+"มีอยู่แล้วเป็นแฟ้ม"
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "ช่วยเหลือ - GQview"
+
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"สร้างไดเรคทอรีใน:\n"
+"%s\n"
+"ชื่อ:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr ""
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr ""
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+#, fuzzy
+msgid "_Slideshow"
+msgstr "แสดงไสลด์"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "แสดงไสลด์แบบรีเคอร์ซีฟ"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+#, fuzzy
+msgid "Find _duplicates..."
+msgstr "หาตัวซ้ำ..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "หาตัวซ้ำแบบรีเคอร์ซีฟ..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr ""
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+#, fuzzy
+msgid "View as _tree"
+msgstr "/ดู/เต็มจอ"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+#, fuzzy
+msgid "Re_fresh"
+msgstr "รีเฟรช"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+#, fuzzy
+msgid "_Sort"
+msgstr "เรียง"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+#, fuzzy
+msgid "View as _icons"
+msgstr "Dimensions"
+
+#: src/view_file_list.c:421
+#, fuzzy
+msgid "Show _thumbnails"
+msgstr "แคชรูปเล็ก"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"ชื่อแฟ้มไม่ถูกต้อง:\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "ลบภาพเล็ก"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/แฟ้ม/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/แฟ้ม/collection ใหม"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/แฟ้ม/เปิด collection..."
+
+#~ msgid "/File/sep1"
+#~ msgstr "/File/sep1"
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/แฟ้ม/เปลี่ยนชื่อ..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/แฟ้ม/หาตัวซ้ำ..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/File/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/แฟ้ม/เปลี่ยนชื่อ..."
+
+#, fuzzy
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/แฟ้ม/ลบ..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/File/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/แฟ้ม/คัดลอก..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "แฟ้ม/ย้าย..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/แฟ้ม/เปลี่ยนชื่อ..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/แฟ้ม/ลบ..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/File/sep4"
+
+#, fuzzy
+#~ msgid "/File/C_lose window"
+#~ msgstr "ปิดหน้าต่าง"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/แฟ้ม/ออก"
+
+#~ msgid "/_Edit"
+#~ msgstr "/แฟ้ม/แก้ไข"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/แกไข/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/แกไข/ตัวแก้ไข1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/แกไข/ตัวแก้ไข2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/แกไข/ตัวแก้ไข3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/แกไข/ตัวแก้ไข4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/แกไข/ตัวแก้ไข5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/แกไข/ตัวแก้ไข6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/แกไข/ตัวแก้ไข7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/แกไข/ตัวแก้ไข8"
+
+#, fuzzy
+#~ msgid "/Edit/editor9"
+#~ msgstr "/แกไข/ตัวแก้ไข1"
+
+#, fuzzy
+#~ msgid "/Edit/editor0"
+#~ msgstr "/แกไข/ตัวแก้ไข1"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/แกไข/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/แกไข/ปรับเปลี่ยน"
+
+#, fuzzy
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/แกไข/ออพชัน..."
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/แกไข/ปรับเปลี่ยน/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/แกไข/ปรับเปลี่ยน/หมุนตามเข็มนาฬิกา"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/แกไข/ปรับเปลี่ยน/หมุนทวนเข็มนาฬิกา"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/แกไข/ปรับเปลี่ยน/หมุน 180"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/แกไข/ปรับเปลี่ยน/เงากระจก"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/แกไข/ปรับเปลี่ยน/พลิก"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/แกไข/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/แกไข/เลือกทั้งหมด"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/แกไข/ไม่เลือกสิ่งใด"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/แกไข/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/แกไข/ออพชัน..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/แกไข/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/แกไข/กำหนดเป็นวอลเปเปอร์"
+
+#~ msgid "/_View"
+#~ msgstr "/ดู"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/ดู/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/ดู/ซูมเข้า"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/ดู/ซูมออก"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/ดู/ซูม1:1"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/ดู/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/ดู/ภาพเล็ก"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/ดู/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/ดู/เต็มจอ"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/มุมมอง/sep3"
+
+#, fuzzy
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/ดู/(ไม่)ซ่อนแฟ้มรายการ"
+
+#, fuzzy
+#~ msgid "/View/sep4"
+#~ msgstr "/ดู/sep1"
+
+#, fuzzy
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/ดู/ซูมเข้า"
+
+#, fuzzy
+#~ msgid "/View/sep5"
+#~ msgstr "/ดู/sep1"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/มุมมอง/สลับการแสดงสไลด์"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/ดู/_รีเฟรชรายการ"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/ช่วยเหลือ/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/ช่วยเหลือ/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "GQview ปรับแต่งระบบ"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/แกไข/ลบรูปเล็กเก่า"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "เส้นทาง"
+
+#~ msgid "Save"
+#~ msgstr "บันทึก"
+
+#~ msgid "Close"
+#~ msgstr "ปิด"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "เขียนทับแฟ้มcollection:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "บันทึก collection เป็น:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "เปิด collection จาก:"
+
+#~ msgid "Open"
+#~ msgstr "เปิด"
+
+#~ msgid "Append collection from:"
+#~ msgstr "ต่อท้าย collection จาก"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "ออก"
+
+#~ msgid "Exit"
+#~ msgstr "ออก"
+
+#~ msgid "Ok"
+#~ msgstr "ตกลง"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "ชื่อแฟ้มไม่ถูกต้อง"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "เมื่อเริ่มระบบเปลี่ยนเป็นไดเรีคทอรีนี้"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "ซูม (โดยการสเกล)"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "แสดงไดอะลอกภายใต้เมาส์"
+
+#~ msgid "Include files of type:"
+#~ msgstr "รวมถึงแฟ้มชนิด:"
+
+#~ msgid "Remove"
+#~ msgstr "ลบ"
+
+#, fuzzy
+#~ msgid "Help"
+#~ msgstr "/ช่วยเหลือ"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "เต็มจอภาพ"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Tiles"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "เขียนทับแฟ้ม:\n"
+#~ " %s\n"
+#~ " ด้วย:\n"
+#~ " %s"
+
+#~ msgid "Yes"
+#~ msgstr "ใช่"
+
+#~ msgid "Yes to all"
+#~ msgstr "ใช่ทั้งหมด"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "เขียนทับแฟ้ม:\n"
+#~ "%s\n"
+#~ " ด้วย:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "คัดลอกแฟ้ม:\n"
+#~ "%s\n"
+#~ "สู่:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "ย้ายแฟ้ม:\n"
+#~ "%s\n"
+#~ "สู่:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "เกี่ยวกับการลบหลายแฟ้ม..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "เขียนทับแฟ้ม:\n"
+#~ "%s\n"
+#~ "โดยการเปลี่ยนชื่อ:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "สู่:"
+
+#~ msgid "Create"
+#~ msgstr "สร้าง"
+
+#~ msgid "Initial directory"
+#~ msgstr "ไดเรคทอรีเริ่มต้น"
+
+#~ msgid "New Directory"
+#~ msgstr "ไดเรคทอรีใหม่"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "ไม่สามารถสร้างไดเรคทอรี\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "การสร้างไดเรคทอรีผิดพลาด"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "ปลายทางไม่ถูกต้อง"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/มุมมอง/สลับการแสดงสไลด์"
+
+#~ msgid "Add contents"
+#~ msgstr "เพิ่มเนื้อหา"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "เพิ่มเนื้อหาแบบรีเคอซีฟ "
+
+#~ msgid "Skip directories"
+#~ msgstr "ข้ามไดเรคทอรี"
+
+#~ msgid "Invalid directory"
+#~ msgstr "ไดเรคทอรีไม่ถูกต้อง"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - คัดลอก"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - ย้าย"
+
+#~ msgid "Directory exists"
+#~ msgstr "ไดเรคทอรีมีอยู่แล้ว"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - ไดเรคทอรีใหม่"
+
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/แฟ้ม/สร้างไดเรคทอรี..."
+
+#~ msgid "Edit"
+#~ msgstr "แก้ไข"
+
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "แทรกแฟ้ม ณ ตำแหน่งที่ตัวชี้ชี้อยู่"
+
+#~ msgid "File named %s already exists."
+#~ msgstr "แฟ้มชื่อ %s มีอยู่แล้ว"
+
+#, fuzzy
+#~ msgid "Date:"
+#~ msgstr "วันที่"
+
+#, fuzzy
+#~ msgid "top"
+#~ msgstr "สู่:"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview - กำลังรัน:%s\n"
+
+#~ msgid "Apply"
+#~ msgstr "Apply"
index 14c9162..54b115d 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
@@ -2,11 +2,11 @@
 # Copyright (C) 1999-2000 Free Software Foundation, Inc.
 # Fatih Demir <kabalak@gmx.net> , 1999-2000 .
 # ---------------------------------------------------------------------
-#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: GQview  0.8.0\n"
-"POT-Creation-Date: 2000-04-13 15:57-0400\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
 "PO-Revision-Date: 2000-04-07 17:09+0200\n"
 "Last-Translator: Fatih Demir <kabalak@gmx.net>\n"
 "Language-Team: Turkish Gnome Translation Team <gnotrap@gmx.net>\n"
@@ -14,753 +14,3065 @@ msgstr ""
 "Content-Type: text/plain; charset=iso-8859-9\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: src/config.c:307
-msgid "GQview configuration"
-msgstr "GQView ayarlarý"
-
-#: src/config.c:319
-msgid "Ok"
-msgstr "Tamam"
-
-#: src/config.c:324
-msgid "Apply"
-msgstr "Uygula"
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
 
-#: src/config.c:329 src/utildlg.c:145 src/utilops.c:444 src/utilops.c:754
-#: src/utilops.c:885 src/utilops.c:983
-msgid "Cancel"
-msgstr "Vazgeç"
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Dosya"
 
-#: src/config.c:343
-msgid "General"
-msgstr "Genel"
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
 
-#: src/config.c:351
-msgid "Initial directory"
-msgstr "Baþlangýç dizini"
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
 
-#: src/config.c:361
-msgid "On startup, change to this directory:"
-msgstr "Baþlarken bu dizine deðiþtir"
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
 
-#: src/config.c:373
-msgid "Use current"
-msgstr "Þu ankini kullan"
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "Sil"
 
-#: src/config.c:379
-msgid "Confirm file delete"
-msgstr "Silmeyi onayla"
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
 
-#: src/config.c:381
-msgid "Remember tool state (float/hidden)"
-msgstr "Durumu unutma "
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
 
-#: src/config.c:383
-msgid "Remember window positions"
-msgstr "Pencere yerlerini aklýnda tut"
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
 
-#: src/config.c:385
-msgid "Slide show"
-msgstr "Resim þovu"
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
 
-#: src/config.c:398
-msgid "Delay before image change (seconds):"
-msgstr "Resim deðiþiminde kaç saniye beklensin :"
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+#, fuzzy
+msgid "Filename:"
+msgstr "Yeniden adlandýr :"
 
-#: src/config.c:411
-msgid "Random"
-msgstr "Tesadüfen"
+#: src/bar_info.c:1007 src/info.c:360
+#, fuzzy
+msgid "File date:"
+msgstr "Filtralama"
 
-#: src/config.c:413
-msgid "Repeat"
-msgstr "Tekrarla"
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
 
-#: src/config.c:420
-msgid "Image"
-msgstr "Resim"
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "Büyült"
 
-#: src/config.c:428
-msgid "When new image is selected:"
-msgstr "Yeni bir resim seçildiyse"
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
 
-#: src/config.c:438
-msgid "Zoom to original size"
-msgstr "Orijinal boyuta getir"
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
 
-#: src/config.c:444 src/img-view.c:306 src/menu.c:473 src/menu.c:547
-#: src/menu.c:587 src/menu.c:678
-msgid "Fit image to window"
-msgstr "Pencerenin boyutuna ayarla"
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
 
-#: src/config.c:450
-msgid "Leave Zoom at previous setting"
-msgstr "Önceki büyütme/küçültme ayarlarýný geçerli say"
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Seçenekler ..."
 
-#: src/config.c:457
-msgid "Fit window to image when tools are hidden/floating"
-msgstr "Çerezler gizli ya da dinamik çalýþýyorsa pencereyi resme göre ayarla"
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr ""
 
-#: src/config.c:464
-msgid "Limit size when auto-sizing window"
-msgstr "Boyutu otomatik boyutlamada sýnýrla"
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+#, fuzzy
+msgid "Name"
+msgstr "Yeniden adlandýr"
 
-#: src/config.c:474 src/menu.c:477
-msgid "Thumbnails"
-msgstr "Týrnaklar"
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr ""
 
-#: src/config.c:490
-msgid "Size:"
-msgstr "Boy :"
+#: src/bar_exif.c:426
+#, fuzzy
+msgid "Format"
+msgstr "Genel"
 
-#: src/config.c:519
-msgid "Cache thumbnails"
-msgstr "Týrnaklarý arabellekte tut"
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr ""
 
-#: src/config.c:521
-msgid "Use xvpics thumbnails when found (read only)"
-msgstr "xvpics týrnaklarýný bulunca onlarý kullan (salt-okunur)"
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr ""
 
-#: src/config.c:524
-msgid "Progressive keyboard scrolling"
-msgstr "Geliþebilir klavye kaydýrmasý"
+#: src/bar_exif.c:549 src/info.c:105
+#, fuzzy
+msgid "Exif"
+msgstr "Çýk"
 
-#: src/config.c:526
-msgid "Mouse wheel scrolls image"
+#: src/bar_exif.c:622
+msgid "Advanced view"
 msgstr ""
 
-#: src/config.c:533
-msgid "Filtering"
-msgstr "Filtralama"
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Silerken bir hata oluþtu"
 
-#: src/config.c:542
-msgid "Show entries that begin with a dot"
-msgstr "Bir noktayla baþlayan birimleri göster"
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
 
-#: src/config.c:544
-msgid "Disable File Filtering"
-msgstr "Dosya filtralarýný kapat"
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"%s dizini \n"
+"zaten dosya halinde\n"
+"var ."
 
-#: src/config.c:546
-msgid "Include files of type:"
-msgstr "Bu tip dosyalarý içer"
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Üstüne yaz"
 
-#: src/config.c:596
-msgid "Custom file types:"
-msgstr "Benim dosya tiplerim :"
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, fuzzy, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr "%s'yi silemedim \n"
 
-#: src/config.c:609
-msgid "format: [.foo;.bar]"
-msgstr "þekil : [.foo;.bar]"
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr ""
 
-#: src/config.c:618
-msgid "External Editors"
-msgstr "Dýþtan kullanýlacak editörler"
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr ""
 
-#: src/config.c:630
-msgid "#"
-msgstr "#"
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "%s'yi silemedim \n"
 
-#: src/config.c:633
-msgid "Menu name"
-msgstr "Mönü adý"
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+#, fuzzy
+msgid "Name:"
+msgstr "Yeniden adlandýr"
 
-#: src/config.c:636
-msgid "Command Line"
-msgstr "Komuta"
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr ""
 
-#: src/config.c:666 src/menu.c:500
-msgid "About"
-msgstr "Hakkýnda"
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+#, fuzzy
+msgid "Folders"
+msgstr "Dosya"
 
-#: src/config.c:682
-#, fuzzy, c-format
-msgid ""
-"GQview %s\n"
-"\n"
-"Copyright (c) 2000 by John Ellis\n"
-"http://gqview.sorceforge.net\n"
-"or http://gqview.netpedia.net\n"
-"gqview@email.com\n"
-"\n"
-"Released under the GNU Public License"
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
 msgstr ""
-"GQview %s\n"
-"\n"
-"Telif hakký (c) 1999 John Ellis'den\n"
-"http://gqview.netpedia.net\n"
-"gqview@email.com\n"
-"\n"
-"GNU Public License'e göre açýklanmýþtýr"
 
-#: src/filelist.c:51
-msgid " Slideshow"
-msgstr "Resim þovu"
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Kopyala"
 
-#: src/filelist.c:55
-#, c-format
-msgid "%d files (%d)%s"
-msgstr "%d dosya (%d)%s"
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Taþý"
 
-#: src/filelist.c:57
-#, c-format
-msgid "%d files%s"
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
 msgstr "%d dosya %s"
 
-#: src/filelist.c:1025
-msgid "Loading thumbs..."
-msgstr "Týrnaklarý yükliyorum .."
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Seçenekler ..."
 
-#: src/image.c:66
-#, c-format
-msgid "( ? x ? ) %d bytes"
-msgstr "( ? x ? ) %d byte"
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr ""
 
-#: src/image.c:68
-#, c-format
-msgid "( %d x %d ) %d bytes"
-msgstr "( %d x %d ) %d byte"
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr ""
 
-#: src/img-main.c:247
-msgid "GQview full screen"
-msgstr "GQview tam ekran"
+#: src/cache_maint.c:304
+msgid "Removing old metadata..."
+msgstr ""
 
-#: src/img-view.c:303 src/menu.c:470 src/menu.c:544 src/menu.c:584
-#: src/menu.c:674
-msgid "Zoom in"
-msgstr "Büyült"
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Týrnaklarý yükliyorum .."
 
-#: src/img-view.c:304 src/menu.c:471 src/menu.c:545 src/menu.c:585
-#: src/menu.c:676
-msgid "Zoom out"
-msgstr "Küçült"
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Týrnaklarý yükliyorum .."
 
-#: src/img-view.c:305 src/menu.c:472 src/menu.c:546 src/menu.c:586
-msgid "Zoom 1:1"
-msgstr "1:1 göster"
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
 
-#. edit menu
-#: src/img-view.c:309 src/menu.c:457 src/menu.c:519 src/menu.c:550
-#: src/menu.c:590
-msgid "Edit"
-msgstr "Düzenle"
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "geçerli opsiyonlar :\n"
 
-#: src/img-view.c:314 src/menu.c:446 src/menu.c:526 src/menu.c:557
-#: src/menu.c:595
-msgid "Copy..."
-msgstr "Kopyala ..."
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
 
-#: src/img-view.c:315 src/menu.c:447 src/menu.c:527 src/menu.c:558
-#: src/menu.c:596
-msgid "Move..."
-msgstr "Taþý ..."
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Týrnaklarý arabellekte tut"
 
-#: src/img-view.c:316 src/menu.c:448 src/menu.c:528 src/menu.c:559
-#: src/menu.c:597
-msgid "Rename..."
-msgstr "Yeniden adlandýr .."
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Sil"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+#, fuzzy
+msgid "Folder:"
+msgstr "Dosya"
 
-#: src/img-view.c:317 src/menu.c:449 src/menu.c:529 src/menu.c:560
-#: src/menu.c:598
-msgid "Delete..."
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
 msgstr "Sil .."
 
-#: src/img-view.c:320
-msgid "Close window"
-msgstr "Pencereyi kapat"
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "geçerli opsiyonlar :\n"
 
-#: src/main.c:90 src/main.c:119
-#, c-format
-msgid "GQview running: %s\n"
-msgstr "GQview çalýþýyor : %s\n"
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
 
-#: src/main.c:330
-msgid ""
-"Usage: gqview [options] [path]\n"
-"\n"
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
 msgstr ""
-"Kullaným : gqview [seçenekler] [dizin]\n"
-"\n"
 
-#: src/main.c:331
-msgid "valid options are:\n"
-msgstr "geçerli opsiyonlar :\n"
+#: src/cache_maint.c:997 src/editors.c:549
+#, fuzzy
+msgid "running..."
+msgstr "Kopyala ..."
 
-#: src/main.c:332
+#: src/cache_maint.c:1043
 #, fuzzy
-msgid "  +t, --with-tools           force show of tools\n"
-msgstr "  +t, +tools                 çerezleri zorunlu olarak göster\n"
+msgid "Clearing thumbnails..."
+msgstr "Týrnaklarý yükliyorum .."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr ""
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
 
-#: src/main.c:333
+#: src/cache_maint.c:1163
 #, fuzzy
-msgid "  -t, --without-tools        force hide of tools\n"
-msgstr "  -t, -tools                 çerezleri zorunlu olarak gizle\n"
+msgid "Cache Maintenance - GQview"
+msgstr ""
+"%s'yi yeniden\n"
+"adlandýr :\n"
+" "
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
 
-#: src/main.c:334
+#: src/cache_maint.c:1177
 #, fuzzy
-msgid "  -f, --fullscreen           start in full screen mode\n"
-msgstr "  -t, -tools                 çerezleri zorunlu olarak gizle\n"
+msgid "GQview thumbnail cache"
+msgstr "GQview tam ekran"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+msgid "Location:"
+msgstr ""
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+msgid "Clean up"
+msgstr ""
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
 
-#: src/main.c:335
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
 #, fuzzy
-msgid "  -s, --slideshow            start in slideshow mode\n"
-msgstr "  -t, -tools                 çerezleri zorunlu olarak gizle\n"
+msgid "Delete all cached thumbnails."
+msgstr "Týrnaklarý arabellekte tut"
 
-#: src/main.c:336
+#: src/cache_maint.c:1197
 #, fuzzy
-msgid "  --debug                    turn on debug output\n"
-msgstr "  -debug                     dýþa-atýmý aç\n"
+msgid "Shared thumbnail cache"
+msgstr "Týrnaklarý arabellekte tut"
 
-#: src/main.c:337
+#: src/cache_maint.c:1220
 #, fuzzy
-msgid ""
-"  -h, --help                 show this message\n"
-"\n"
-msgstr "  -help                      bu mesajý gösterir\n"
+msgid "Render"
+msgstr "Yeniden adlandýr"
 
-#: src/main.c:342
-#, c-format
-msgid ""
-"invalid or ignored: %s\n"
-"Use -help for options\n"
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
 msgstr ""
-"%s geçersiz ya da dikkate alýnmýyor\n"
-"-help ile seçenekleri öðrenebilirsin\n"
-
-#: src/main.c:369
-msgid "The Gimp"
-msgstr "The Gimp"
 
-#: src/main.c:372
-msgid "Electric Eyes"
-msgstr "Electric Eyes"
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
 
-#: src/main.c:375
-msgid "XV"
-msgstr "XV"
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
 
-#: src/main.c:378
-msgid "Xpaint"
-msgstr "Xpaint"
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr ""
 
-#: src/menu.c:373
+#: src/collect.c:353
 #, c-format
-msgid "in %s..."
-msgstr "%s'de"
+msgid "Untitled (%d)"
+msgstr ""
 
-#: src/menu.c:375
-msgid "in (unknown)..."
-msgstr "(bennebileyimne)'de"
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr ""
 
-#: src/menu.c:394
-msgid "Options..."
+#: src/collect.c:1098 src/collect.c:1102
+#, fuzzy
+msgid "Close collection"
 msgstr "Seçenekler ..."
 
-#: src/menu.c:396
-msgid "Remove old thumbnails"
-msgstr "Eski týrnaklarý sil"
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
 
-#: src/menu.c:398 src/menu.c:410 src/menu.c:422
-msgid "Set as wallpaper"
-msgstr "Ardalan yap"
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
 
-#. file menu
-#: src/menu.c:440
-msgid "File"
-msgstr "Dosya"
+#: src/collect-dlg.c:58
+#, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
 
-#: src/menu.c:444
-msgid "Create Dir..."
-msgstr "Dizin yarat ..."
+#: src/collect-dlg.c:59
+#, fuzzy
+msgid "Invalid filename"
+msgstr "geçerli opsiyonlar :\n"
 
-#: src/menu.c:451
-msgid "Exit"
-msgstr "Çýk"
+#: src/collect-dlg.c:68
+#, fuzzy
+msgid "Overwrite File"
+msgstr "Üstüne yaz"
 
-#. view menu
-#: src/menu.c:466
-msgid "View"
-msgstr "Göster"
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Üstüne yaz"
 
-#: src/menu.c:476 src/menu.c:563
-msgid "Full screen"
-msgstr "Tam ekran"
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Üstüne yaz"
 
-#: src/menu.c:485
-msgid "Refresh Lists"
-msgstr "Listeleri yenile"
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr ""
 
-#: src/menu.c:486
-msgid "(Un)Float file list"
-msgstr "Dosya listesini dinamik et/etme"
+#: src/collect-dlg.c:176
+#, fuzzy
+msgid "Open collection"
+msgstr "Seçenekler ..."
 
-#: src/menu.c:487 src/menu.c:562
-msgid "(Un)Hide file list"
-msgstr "Dosya listesini göster/gizle"
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr ""
 
-#: src/menu.c:490
-msgid "Toggle slideshow"
-msgstr "Resim þovunu aç/kapat"
+#: src/collect-dlg.c:185
+msgid "_Append"
+msgstr ""
 
-#. help menu
-#: src/menu.c:496
-msgid "Help"
-msgstr "Yardým"
+#: src/collect-dlg.c:203
+#, fuzzy
+msgid "Collection Files"
+msgstr "Üstüne yaz"
 
-#: src/menu.c:523 src/menu.c:554
-msgid "View in new window"
-msgstr "Yeni penerede göster"
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr ""
 
-#: src/menu.c:531
-msgid "Refresh"
-msgstr "Yenile"
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr ""
 
-#: src/menu.c:601
-msgid "Exit full screen"
-msgstr "Tam ekrandan çýk"
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr ""
 
-#: src/menu.c:661
-msgid "Create thumbnails"
-msgstr "Týrnaklarý yarat"
+#: src/collect-table.c:168
+#, fuzzy, c-format
+msgid "%d images (%d)"
+msgstr "%d dosya (%d)%s"
 
-#: src/menu.c:670
-msgid "Change to home directory"
-msgstr "Ev dizinime geç"
+#: src/collect-table.c:172
+#, fuzzy, c-format
+msgid "%d images"
+msgstr "%d dosya %s"
 
-#: src/menu.c:672
-msgid "Refresh file list"
-msgstr "Dosya listesini yenile"
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Týrnaklarý yükliyorum .."
 
-#: src/menu.c:680
-msgid "Set zoom 1:1"
-msgstr "1:1 göster"
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+#, fuzzy
+msgid "_View"
+msgstr "Göster"
 
-#: src/menu.c:682
-msgid "Configure options"
-msgstr "Seçenekleri ayarla"
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+#, fuzzy
+msgid "View in _new window"
+msgstr "Yeni penerede göster"
 
-#: src/menu.c:684
-msgid "Float Controls"
-msgstr "Dinamik ayarlamalar"
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+#, fuzzy
+msgid "Rem_ove"
+msgstr "Yeniden adlandýr"
 
-#: src/rcfile.c:132
-#, c-format
-msgid "error saving config file: %s\n"
-msgstr "%s ayar dosyasýný kaydederken bir hata oluþtu\n"
+#: src/collect-table.c:781
+#, fuzzy
+msgid "Append from file list"
+msgstr "Dosya listesini yenile"
 
-#: src/thumb.c:127 src/thumb.c:151
-#, c-format
-msgid "create dir failed: %s\n"
-msgstr "%s dizinini yaratamadým \n"
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr ""
 
-#: src/thumb.c:233
-#, c-format
-msgid "Unable to delete dir: %s\n"
-msgstr "%s dizinini silemedim \n"
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+#, fuzzy
+msgid "Select all"
+msgstr "Silerken bir hata oluþtu"
 
-#: src/thumb.c:249
-#, c-format
-msgid "failed to delete:%s\n"
-msgstr "%s'yi silemedim \n"
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr ""
 
-#: src/utildlg.c:68
-msgid "     Ok     "
-msgstr "     Tamam"
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+#, fuzzy
+msgid "_Properties"
+msgstr "Seçenekler ..."
 
-#: src/utilops.c:166
-msgid "Source to copy matches destination"
-msgstr "Kopyalanacak kaynak hedefle eþittir"
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+#, fuzzy
+msgid "_Copy..."
+msgstr "Kopyala ..."
 
-#: src/utilops.c:167
-#, fuzzy, c-format
-msgid ""
-"Unable to copy file:\n"
-"%s\n"
-"to itself."
-msgstr ""
-"%s dosyasýný \n"
-"%s 'ye kopyalayamadým ,\n"
-"bir yerde \n"
-"bir hata oluþtu"
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+#, fuzzy
+msgid "_Move..."
+msgstr "Taþý ..."
 
-#: src/utilops.c:171
-msgid "Source to move matches destination"
-msgstr "Taþýlacak kaynak hedefle eþittir"
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+#, fuzzy
+msgid "_Rename..."
+msgstr "Yeniden adlandýr .."
 
-#: src/utilops.c:172
-#, fuzzy, c-format
-msgid ""
-"Unable to move file:\n"
-"%s\n"
-"to itself."
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+#, fuzzy
+msgid "_Delete..."
+msgstr "Sil .."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
 msgstr ""
-"%s'yi %s'ye \n"
-"taþýyamadým\n"
-"( bir hata oluþtu ).\n"
-" "
 
-#: src/utilops.c:175 src/utilops.c:231 src/utilops.c:516
-msgid "Continue"
-msgstr "Devam et"
+#: src/collect-table.c:813
+#, fuzzy
+msgid "_Save collection"
+msgstr "Seçenekler ..."
 
-#: src/utilops.c:182
-#, c-format
-msgid ""
-"Overwrite file:\n"
-" %s\n"
-" with:\b %s"
-msgstr ""
-"%s 'nin üstüne\n"
-" \b %s 'yi\n"
-" yaz"
+#: src/collect-table.c:815
+#, fuzzy
+msgid "Save collection _as..."
+msgstr "Seçenekler ..."
 
-#: src/utilops.c:183 src/utilops.c:289 src/utilops.c:651 src/utilops.c:835
-msgid "Overwrite file"
-msgstr "Üstüne yaz"
+#: src/collect-table.c:818 src/layout_util.c:759
+#, fuzzy
+msgid "_Find duplicates..."
+msgstr "Yeniden adlandýr .."
 
-#: src/utilops.c:186
-msgid "Skip"
-msgstr "Atla"
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "Yeniden adlandýr .."
 
-#: src/utilops.c:187
-msgid "Yes to all"
-msgstr "Hepsine evet"
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+msgid "Dropped list includes folders."
+msgstr ""
 
-#: src/utilops.c:188
-msgid "Yes"
-msgstr "Evet"
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr ""
 
-#: src/utilops.c:222 src/utilops.c:317
-msgid "Error copying file"
-msgstr "Kopyalarken hata oluþtu"
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+#, fuzzy
+msgid "Add contents _recursive"
+msgstr "Yeniden adlandýr .."
 
-#: src/utilops.c:223
-#, c-format
-msgid ""
-"Unable to copy file:\n"
-"%sto:\n"
-"%s\n"
-" during multiple file copy."
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "Baþlangýç dizini"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Vazgeç"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
 msgstr ""
-"%s dosyasý %s 'ye kopyalanýrken\n"
-"bir hata \n"
-"oluþtu.\n"
-" "
 
-#: src/utilops.c:227 src/utilops.c:322
-msgid "Error moving file"
-msgstr "Taþýrken bir hata oluþtu"
+#: src/dupe.c:100
+#, fuzzy, c-format
+msgid "%d files"
+msgstr "%d dosya %s"
 
-#: src/utilops.c:228
+#: src/dupe.c:104
 #, c-format
-msgid ""
-"Unable to move file:\n"
-"%sto:\n"
-"%s\n"
-" during multiple file move."
+msgid "%d matches found in %d files"
 msgstr ""
-"Çoklu taþýmada\n"
-"%s'yi %s'ye\n"
-"taþýyamadým.\n"
-" "
 
-#: src/utilops.c:282
-msgid "Source matches destination"
-msgstr "Kaynak hedefle eþittir"
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr ""
 
-#: src/utilops.c:283
-msgid "Source and destination are the same, operation cancelled."
-msgstr "Kaynak ve hedef eþittir, iþlem durduruldu ."
+#: src/dupe.c:1422
+#, fuzzy
+msgid "Reading checksums..."
+msgstr "Týrnaklarý yükliyorum .."
 
-#: src/utilops.c:288
-#, c-format
-msgid ""
-"Overwrite file:\n"
-"%s\n"
-" with:\n"
-"%s"
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
 msgstr ""
-"%s dosyanýnýn\n"
-"üstüne \n"
-"%s 'yi\n"
-"yaz"
 
-#: src/utilops.c:292 src/utilops.c:654 src/utilops.c:838
-msgid "Overwrite"
-msgstr "Üstüne yaz"
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr ""
 
-#: src/utilops.c:318
-#, c-format
-msgid ""
-"Unable to copy file:\n"
-"%s\n"
-"to:\n"
-"%s"
+#: src/dupe.c:1524 src/dupe.c:1555
+#, fuzzy
+msgid "Comparing..."
+msgstr "Kopyala ..."
+
+#: src/dupe.c:1535
+#, fuzzy
+msgid "Sorting..."
+msgstr "Kopyala ..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
 msgstr ""
-"%s dosyasýný \n"
-"%s 'ye kopyalayamadým ,\n"
-"bir yerde \n"
-"bir hata oluþtu"
 
-#: src/utilops.c:323
-#, c-format
-msgid ""
-"Unable to move file:\n"
-"%s\n"
-"to:\n"
-"%s"
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
 msgstr ""
-"%s'yi %s'ye \n"
-"taþýyamadým\n"
-"( bir hata oluþtu ).\n"
-" "
 
-#: src/utilops.c:367
-msgid "Invalid destination"
-msgstr "Geçersiz hedef"
+#: src/dupe.c:2205 src/search.c:983
+#, fuzzy
+msgid "Add to new collection"
+msgstr "%s'yi silemedim \n"
 
-#: src/utilops.c:367
-msgid ""
-"When operating with multiple files, please select\n"
-" a directory, not file."
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
 msgstr ""
-"Çoklu bir eylem yaparken lütfen bir dosya deðil , bir\n"
-"dizin seçin ."
 
-#: src/utilops.c:369
-msgid "Invalid directory"
-msgstr "Geçersiz dizin"
+#: src/dupe.c:2224 src/dupe.c:2512
+#, fuzzy
+msgid "Close _window"
+msgstr "Pencereyi kapat"
 
-#: src/utilops.c:369
-msgid "Please select an existing directory"
-msgstr "Lütfen varolan bir dizini seç"
+#: src/dupe.c:2382
+#, fuzzy, c-format
+msgid "%d files (set 2)"
+msgstr "%d dosya %s"
 
-#: src/utilops.c:427
-msgid "GQview - copy"
-msgstr "GQview - kopyala"
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+#, fuzzy
+msgid "Size"
+msgstr "Boy :"
 
-#: src/utilops.c:428
-msgid "Copy"
-msgstr "Kopyala"
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+#, fuzzy
+msgid "Date"
+msgstr "Sil"
 
-#: src/utilops.c:430
-#, c-format
-msgid ""
-"Copy file:\n"
-"%s\n"
-"to:"
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
 msgstr ""
-"%s dosyasýný\n"
-"buraya\n"
-"gönder :"
 
-#: src/utilops.c:432
-#, c-format
-msgid ""
-"Copy multiple files from:\n"
-"%s\n"
-"to:"
+#: src/dupe.c:2593
+msgid "Checksum"
 msgstr ""
-"Çoklu kopyalarken \n"
-"%s'den yola çýkýp\n"
-"buraya ulaþ :"
 
-#: src/utilops.c:436
-msgid "GQview - move"
-msgstr "GQview - taþý"
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr ""
 
-#: src/utilops.c:437
-msgid "Move"
-msgstr "Taþý"
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr ""
 
-#: src/utilops.c:439
-#, c-format
-msgid ""
-"Move file:\n"
-"%s\n"
-"to:"
+#: src/dupe.c:2596
+msgid "Similarity"
 msgstr ""
-"%s dosyasýný\n"
-"buraya \n"
-"gönder :"
 
-#: src/utilops.c:441
-#, c-format
-msgid ""
-"Move multiple files from:\n"
-"%s\n"
-"to:"
+#: src/dupe.c:2597
+msgid "Similarity (low)"
 msgstr ""
-"Çoklu taþýrken\n"
-"%s'den yola çýkýp\n"
-"buraya ulaþ :"
 
-#: src/utilops.c:514
-#, c-format
-msgid ""
-"Unable to delete file:\n"
-" %s\n"
-" Continue multiple delete operation?"
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
 msgstr ""
-"%s dosyasýný\n"
-" silemedim ,\n"
-" yine de öbür dosyalarý sileyim mi ?"
 
-#: src/utilops.c:515 src/utilops.c:521
-msgid "Delete failed"
-msgstr "Silerken bir hata oluþtu"
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr ""
 
-#: src/utilops.c:520 src/utilops.c:565
-#, c-format
-msgid ""
-"Unable to delete file:\n"
-"%s"
+#: src/dupe.c:3152
+msgid "Compare to:"
 msgstr ""
-"%s 'yi maalesef\n"
-"silemedim"
 
-#: src/utilops.c:550
-msgid "Delete files"
-msgstr "Dosyalarý sil"
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr ""
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Týrnaklar"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr ""
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr ""
+
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr ""
+
+#: src/editors.c:104
+#, fuzzy
+msgid "stopping..."
+msgstr "Kopyala ..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr ""
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr ""
+
+#: src/editors.c:303
+#, fuzzy, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"%s 'yi maalesef\n"
+"silemedim"
+
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr ""
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+#, fuzzy
+msgid "unknown"
+msgstr "(bennebileyimne)'de"
+
+#: src/exif.c:113
+#, fuzzy
+msgid "top left"
+msgstr "Sil"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr ""
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr ""
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr ""
+
+#: src/exif.c:117
+#, fuzzy
+msgid "left top"
+msgstr "Sil"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr ""
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr ""
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr ""
+
+#: src/exif.c:127
+msgid "inch"
+msgstr ""
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr ""
+
+#: src/exif.c:140
+msgid "average"
+msgstr ""
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr ""
+
+#: src/exif.c:142
+msgid "spot"
+msgstr ""
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr ""
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr ""
+
+#: src/exif.c:145
+msgid "partial"
+msgstr ""
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr ""
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr ""
+
+#: src/exif.c:152
+msgid "manual"
+msgstr ""
+
+#: src/exif.c:153
+#, fuzzy
+msgid "normal"
+msgstr "Genel"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr ""
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr ""
+
+#: src/exif.c:156
+#, fuzzy
+msgid "creative"
+msgstr "Yarat"
+
+#: src/exif.c:157
+msgid "action"
+msgstr ""
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr ""
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr ""
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr ""
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr ""
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr ""
+
+#: src/exif.c:168
+msgid "flash"
+msgstr ""
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr ""
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+#, fuzzy
+msgid "yes"
+msgstr "Evet"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr ""
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr ""
+
+#: src/exif.c:289
+#, fuzzy
+msgid "Image description"
+msgstr "Geçersiz hedef"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr ""
+
+#: src/exif.c:303
+#, fuzzy
+msgid "Copyright"
+msgstr "Kopyala"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr ""
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr ""
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr ""
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr ""
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr ""
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr ""
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr ""
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr ""
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr ""
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr ""
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr ""
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr ""
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr ""
+
+#: src/exif.c:337
+msgid "Height"
+msgstr ""
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr ""
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr ""
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr ""
+
+#: src/exif.c:1479
+#, fuzzy
+msgid "mode:"
+msgstr "Dosya"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr ""
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr ""
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr ""
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr ""
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr ""
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr ""
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr ""
+
+#: src/filelist.c:513
+#, fuzzy, c-format
+msgid "%d bytes"
+msgstr "%d dosya %s"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr ""
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr ""
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr ""
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview tam ekran"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Dosya"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Pencerenin boyutuna ayarla"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+#, fuzzy
+msgid "Zoom _in"
+msgstr "Büyült"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+#, fuzzy
+msgid "Zoom _out"
+msgstr "Küçült"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+#, fuzzy
+msgid "Zoom _1:1"
+msgstr "1:1 göster"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+#, fuzzy
+msgid "Fit image to _window"
+msgstr "Pencerenin boyutuna ayarla"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+#, fuzzy
+msgid "Set as _wallpaper"
+msgstr "Ardalan yap"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+#, fuzzy
+msgid "_Stop slideshow"
+msgstr "Resim þovu"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+#, fuzzy
+msgid "Continue slides_how"
+msgstr "Resim þovunu aç/kapat"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+#, fuzzy
+msgid "Pause slides_how"
+msgstr "Resim þovu"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+#, fuzzy
+msgid "_Start slideshow"
+msgstr "Resim þovu"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+#, fuzzy
+msgid "Exit _full screen"
+msgstr "Tam ekrandan çýk"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+#, fuzzy
+msgid "_Full screen"
+msgstr "Tam ekran"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+#, fuzzy
+msgid "C_lose window"
+msgstr "Pencereyi kapat"
+
+#: src/info.c:361
+#, fuzzy
+msgid "File size:"
+msgstr "Dosya"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr ""
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr ""
+
+#: src/info.c:365 src/print.c:3371
+#, fuzzy
+msgid "Image size:"
+msgstr "Resim"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr ""
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Filtralama"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr ""
+
+#: src/info.c:371
+msgid "Group:"
+msgstr ""
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Genel"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr ""
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr ""
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr ""
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr "Resim þovu"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr ""
+
+#: src/layout.c:358
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%d dosya (%d)%s"
+
+#: src/layout.c:365
+#, fuzzy, c-format
+msgid "%s, %d files%s"
+msgstr "%d dosya %s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d dosya %s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr ""
+
+#: src/layout.c:403
+#, fuzzy, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %d byte"
+
+#: src/layout.c:408
+#, fuzzy, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %d byte"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview Çerezleri"
+
+#: src/layout_config.c:57
+#, fuzzy
+msgid "Tools"
+msgstr "Dosya"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+#, fuzzy
+msgid "Files"
+msgstr "Dosya"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Resim"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr ""
+
+#: src/layout_image.c:770
+#, fuzzy
+msgid "Hide file _list"
+msgstr "Dosya listesini göster/gizle"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "%s'de"
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "(bennebileyimne)'de"
+
+#: src/layout_util.c:637
+msgid "empty"
+msgstr ""
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "Dosya"
+
+#: src/layout_util.c:749 src/menu.c:91
+#, fuzzy
+msgid "_Edit"
+msgstr "Düzenle"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr ""
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "Yardým"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "Seçenekler ..."
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "Seçenekler ..."
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Seçenekler ..."
+
+#: src/layout_util.c:757
+msgid "Open _recent"
+msgstr ""
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Kopyala ..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "Yeniden adlandýr .."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "Sil .."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Yeniden adlandýr .."
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr ""
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr ""
+
+#: src/layout_util.c:781
+msgid "Rotate 1_80"
+msgstr ""
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr ""
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr ""
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Silerken bir hata oluþtu"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Seçenekler ..."
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "Seçenekler ..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "Küçült"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "Tam ekran"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Dosya listesini göster/gizle"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "Resim þovu"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "Yenile"
+
+#: src/layout_util.c:800
+msgid "_Contents"
+msgstr ""
+
+#: src/layout_util.c:801
+msgid "_Keyboard shortcuts"
+msgstr ""
+
+#: src/layout_util.c:802
+msgid "_Release notes"
+msgstr ""
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "Hakkýnda"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Týrnaklar"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "Tam ekran"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "Dosya listesini dinamik et/etme"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "GQview Çerezleri"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "Týrnaklar"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "Listeleri yenile"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Büyült"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "Listeleri yenile"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Týrnaklar"
+
+#: src/layout_util.c:1083
+#, fuzzy
+msgid "Show thumbnails"
+msgstr "Týrnaklarý arabellekte tut"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Ev dizinime geç"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Dosya listesini yenile"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Büyült"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Küçült"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Pencerenin boyutuna ayarla"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "1:1 göster"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Seçenekleri ayarla"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Dinamik ayarlamalar"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr ""
+
+#: src/main.c:489 src/main.c:1305
+#, fuzzy
+msgid "Command line"
+msgstr "Komuta"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "%d dosya %s"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "%d dosya %s"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "%d dosya %s"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "Tam ekrandan çýk"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "Tam ekrandan çýk"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "Tam ekrandan çýk"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "Resim þovu"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "Resim þovu"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "Resim þovu"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "Resim þovu"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview Çerezleri"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr ""
+"%s'yi yeniden\n"
+"adlandýr :\n"
+" "
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Yeni penerede göster"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Kullaným : gqview [seçenekler] [dizin]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "geçerli opsiyonlar :\n"
+
+#: src/main.c:946
+#, fuzzy
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, +tools                 çerezleri zorunlu olarak göster\n"
+
+#: src/main.c:947
+#, fuzzy
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, -tools                 çerezleri zorunlu olarak gizle\n"
+
+#: src/main.c:948
+#, fuzzy
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -t, -tools                 çerezleri zorunlu olarak gizle\n"
+
+#: src/main.c:949
+#, fuzzy
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -t, -tools                 çerezleri zorunlu olarak gizle\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+
+#: src/main.c:951
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+#, fuzzy
+msgid "  --debug                    turn on debug output\n"
+msgstr "  -debug                     dýþa-atýmý aç\n"
+
+#: src/main.c:954
+#, fuzzy
+msgid "  -v, --version              print version info\n"
+msgstr "  -t, -tools                 çerezleri zorunlu olarak gizle\n"
+
+#: src/main.c:955
+#, fuzzy
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr "  -h, --help                 bu mesajý gösterir\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"%s geçersiz ya da dikkate alýnmýyor\n"
+"--help ile seçenekleri öðrenebilirsin\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr ""
+
+#: src/main.c:1040
+#, fuzzy, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Dizini yaratamadým"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr ""
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr ""
+
+#: src/main.c:1152
+#, fuzzy
+msgid "GQview - exit"
+msgstr "GQview - taþý"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr ""
+"%s'yi yeniden\n"
+"adlandýr :\n"
+" "
+
+#: src/main.c:1156
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr ""
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr ""
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr ""
+
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr ""
+
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr ""
+
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr ""
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr ""
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr ""
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr ""
+
+#: src/preferences.c:386
+#, fuzzy
+msgid "Tiles"
+msgstr "Dosya"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr ""
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr ""
+
+#: src/preferences.c:418
+msgid "None"
+msgstr ""
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr ""
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr ""
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr ""
+
+#: src/preferences.c:662 src/preferences.c:665
+#, fuzzy
+msgid "Reset filters"
+msgstr "Dosyalarý sil"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:699 src/preferences.c:702
+#, fuzzy
+msgid "Reset editors"
+msgstr "Dosyalarý sil"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr ""
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr ""
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - yeniden adlandýr"
+
+#: src/preferences.c:824
+msgid "Startup"
+msgstr ""
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Ev dizinime geç"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Þu ankini kullan"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Boy :"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr ""
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Týrnaklarý arabellekte tut"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+#, fuzzy
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Týrnaklarý arabellekte tut"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "xvpics týrnaklarýný bulunca onlarý kullan (salt-okunur)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Resim þovu"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Resim deðiþiminde kaç saniye beklensin :"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Tesadüfen"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Tekrarla"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Büyült"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr ""
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr ""
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr ""
+
+#: src/preferences.c:899
+#, fuzzy
+msgid "Zoom increment:"
+msgstr "Büyült"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Yeni bir resim seçildiyse"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Orijinal boyuta getir"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Önceki büyütme/küçültme ayarlarýný geçerli say"
+
+#: src/preferences.c:917
+msgid "Appearance"
+msgstr ""
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr ""
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Devam et"
+
+#: src/preferences.c:924
+#, fuzzy
+msgid "Refresh on file change"
+msgstr "Dosya listesini yenile"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr ""
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr ""
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr ""
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Sil"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Pencere yerlerini aklýnda tut"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Durumu unutma "
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "Çerezler gizli ya da dinamik çalýþýyorsa pencereyi resme göre ayarla"
+
+#: src/preferences.c:953
+#, fuzzy
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Boyutu otomatik boyutlamada sýnýrla"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr ""
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Filtralama"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Bir noktayla baþlayan birimleri göster"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr ""
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Dosya filtralarýný kapat"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Filtralama"
+
+#: src/preferences.c:1008
+#, fuzzy
+msgid "Filter"
+msgstr "Filtralama"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr ""
+
+#: src/preferences.c:1066
+#, fuzzy
+msgid "Editors"
+msgstr "Düzenle"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Mönü adý"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr ""
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "Tam ekran"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Resim"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Sil"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Silmeyi onayla"
+
+#: src/preferences.c:1155
+#, fuzzy
+msgid "Enable Delete key"
+msgstr ""
+"%s 'yi maalesef\n"
+"silemedim"
+
+#: src/preferences.c:1158
+#, fuzzy
+msgid "Safe delete"
+msgstr "Silmeyi onayla"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Dosya"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Göster"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+msgid "Rectangular selection in icon view"
+msgstr ""
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr ""
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr ""
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr ""
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Geliþebilir klavye kaydýrmasý"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr ""
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+#, fuzzy
+msgid "Custom similarity threshold:"
+msgstr "Benim dosya tiplerim :"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr ""
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr ""
+
+#: src/preferences.c:1304
+#, fuzzy, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Telif hakký (c) 2003 John Ellis'den\n"
+"http://gqview.netpedia.net\n"
+"gqview@users.sourceforge.net\n"
+"\n"
+"GNU Public License'e göre açýklanmýþtýr"
+
+#: src/preferences.c:1322
+#, fuzzy
+msgid "Credits..."
+msgstr "Seçenekler ..."
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Seçenekler ..."
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr ""
+
+#: src/print.c:138
+#, fuzzy
+msgid "Custom printer"
+msgstr "Benim dosya tiplerim :"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Resim"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr ""
+
+#: src/print.c:353
+msgid "inches"
+msgstr ""
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr ""
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr ""
+
+#: src/print.c:366
+msgid "Letter"
+msgstr ""
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, c-format
+msgid "page %d of %d"
+msgstr ""
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr ""
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, fuzzy, c-format
+msgid "A file with name %s already exists."
+msgstr ""
+"%s dizini \n"
+"zaten dosya halinde\n"
+"var ."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Filtralama"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Dosyalarý sil"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr ""
+"%s'yi yeniden\n"
+"adlandýr :\n"
+" "
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Genel"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+msgid "Orientation:"
+msgstr ""
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Geçersiz hedef"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Yeniden adlandýr :"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Silerken bir hata oluþtu"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "Xpaint"
+
+#: src/print.c:3359
+msgid "Source"
+msgstr ""
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Resim"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "Filtralama"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr ""
+
+#: src/print.c:3432
+msgid "Top:"
+msgstr ""
+
+#: src/print.c:3435
+msgid "Bottom:"
+msgstr ""
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Filtralama"
+
+#: src/print.c:3450
+#, fuzzy
+msgid "Custom printer:"
+msgstr "Benim dosya tiplerim :"
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Filtralama"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Filtralama"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Pencere yerlerini aklýnda tut"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "%s ayar dosyasýný kaydederken bir hata oluþtu\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Dosya"
+
+#: src/search.c:201
+msgid "comments"
+msgstr ""
+
+#: src/search.c:202
+msgid "results"
+msgstr ""
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Devam et"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+#, fuzzy
+msgid "greater than"
+msgstr "Týrnaklarý yarat"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "Filtralama"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%d dosya (%d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%d dosya %s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Kopyala ..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Lütfen varolan bir dizini seç"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Lütfen varolan bir dizini seç"
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr ""
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Kopyala ..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Yeniden adlandýr :"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Dosya"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Tesadüfen"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Filtralama"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Geçersiz hedef"
+
+#: src/search.c:2676
+msgid "Image content is"
+msgstr ""
+
+#: src/search.c:2682
+#, no-c-format
+msgid "% similar to"
+msgstr ""
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Tesadüfen"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr ""
+
+#: src/ui_bookmark.c:148
+#, fuzzy, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr ""
+"%s dizinini maalesef\n"
+"yaratamadým"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr ""
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+#, fuzzy
+msgid "Edit Bookmark"
+msgstr "Düzenle"
+
+#: src/ui_bookmark.c:612
+#, fuzzy
+msgid "Path:"
+msgstr "Sil"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr ""
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Seçenekler ..."
+
+#: src/ui_bookmark.c:718
+#, fuzzy
+msgid "_Properties..."
+msgstr "Seçenekler ..."
+
+#: src/ui_bookmark.c:720
+#, fuzzy
+msgid "Move _up"
+msgstr "Taþý"
+
+#: src/ui_bookmark.c:722
+#, fuzzy
+msgid "Move _down"
+msgstr "Taþý"
+
+#: src/ui_bookmark.c:724
+#, fuzzy
+msgid "_Remove"
+msgstr "Yeniden adlandýr"
+
+#: src/ui_help.c:111
+#, fuzzy, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"%s 'yi maalesef\n"
+"silemedim"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, fuzzy, c-format
+msgid "Failed to rename %s to %s."
+msgstr ""
+"%s dosyasýný\n"
+"%s'ye adlandýrýrken\n"
+"maalesef bir hata\n"
+"oluþtu"
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"%s 'yi maalesef\n"
+"silemedim"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Silerken bir hata oluþtu"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Dosyayý sil"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"%s dosyasýný\n"
+"silmek üzereyim"
 
-#: src/utilops.c:550
-msgid "About to delete multiple files..."
-msgstr "Dosyalarý silmek üzereyim ..."
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+#, fuzzy
+msgid "_Rename"
+msgstr "Yeniden adlandýr"
 
-#: src/utilops.c:551 src/utilops.c:596
-msgid "Delete"
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+#, fuzzy
+msgid "Add _Bookmark"
+msgstr "Düzenle"
+
+#: src/ui_pathsel.c:636
+#, fuzzy
+msgid "_Delete"
 msgstr "Sil"
 
-#: src/utilops.c:566
-msgid "File deletion failed"
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "Sil .."
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"%s dizinini maalesef\n"
+"yaratamadým"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Dizini yaratýrken bir hata oluþtu"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr ""
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr ""
+
+#: src/ui_pathsel.c:1132
+#, fuzzy
+msgid "Filter:"
+msgstr "Filtralama"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Silerken bir hata oluþtu"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "%d dosya %s"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Üstüne yaz"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Üstüne yaz"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Üstüne yaz"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Atla"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Atla"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Taþýrken bir hata oluþtu"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "Sil .."
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+#, fuzzy
+msgid "Auto rename"
+msgstr "Mönü adý"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Yeniden adlandýr"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Kopyalanacak kaynak hedefle eþittir"
+
+#: src/utilops.c:544
+#, fuzzy, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"%s dosyasýný \n"
+"%s 'ye kopyalayamadým ,\n"
+"bir yerde \n"
+"bir hata oluþtu"
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Taþýlacak kaynak hedefle eþittir"
+
+#: src/utilops.c:549
+#, fuzzy, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"%s'yi %s'ye \n"
+"taþýyamadým\n"
+"( bir hata oluþtu ).\n"
+" "
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Devam et"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Kopyalarken hata oluþtu"
+
+#: src/utilops.c:631
+#, fuzzy, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"%s dosyasý %s 'ye kopyalanýrken\n"
+"bir hata \n"
+"oluþtu.\n"
+" "
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Taþýrken bir hata oluþtu"
+
+#: src/utilops.c:636
+#, fuzzy, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Çoklu taþýmada\n"
+"%s'yi %s'ye\n"
+"taþýyamadým.\n"
+" "
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Kaynak hedefle eþittir"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Kaynak ve hedef eþittir, iþlem durduruldu ."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"%s dosyasýný \n"
+"%s 'ye kopyalayamadým ,\n"
+"bir yerde \n"
+"bir hata oluþtu"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"%s'yi %s'ye \n"
+"taþýyamadým\n"
+"( bir hata oluþtu ).\n"
+" "
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Geçersiz hedef"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"Çoklu bir eylem yaparken lütfen bir dosya deðil , bir\n"
+"dizin seçin ."
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Lütfen varolan bir dizini seç"
+
+#: src/utilops.c:956
+msgid "Copy - GQview"
+msgstr ""
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+#, fuzzy
+msgid "_Copy"
+msgstr "Kopyala"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr ""
+"%s'yi yeniden\n"
+"adlandýr :\n"
+" "
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr ""
+"Çoklu kopyalarken \n"
+"%s'den yola çýkýp\n"
+"buraya ulaþ :"
+
+#: src/utilops.c:970
+msgid "Move - GQview"
+msgstr ""
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+#, fuzzy
+msgid "_Move"
+msgstr "Taþý"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr ""
+"%s'yi yeniden\n"
+"adlandýr :\n"
+" "
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr ""
+"Çoklu taþýrken\n"
+"%s'den yola çýkýp\n"
+"buraya ulaþ :"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Yeniden adlandýr :"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Kaynak hedefle eþittir"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
 msgstr "Silerken bir hata oluþtu"
 
-#: src/utilops.c:594
-#, c-format
-msgid ""
-"About to delete the file:\n"
-" %s"
-msgstr ""
-"%s dosyasýný\n"
-"silmek üzereyim"
+#: src/utilops.c:1124
+#, fuzzy
+msgid "Unable to remove old file from trash folder"
+msgstr ""
+"%s'yi %s'ye \n"
+"taþýyamadým\n"
+"( bir hata oluþtu ).\n"
+" "
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Dizini yaratamadým"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr ""
+
+#: src/utilops.c:1212
+#, fuzzy, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"%s dizinini maalesef\n"
+"yaratamadým"
+
+#: src/utilops.c:1216
+#, fuzzy
+msgid "Turn off safe delete"
+msgstr "Silmeyi onayla"
+
+#: src/utilops.c:1234
+#, fuzzy, c-format
+msgid "Safe delete: %s"
+msgstr "Silmeyi onayla"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"%s dosyasýný\n"
+" silemedim ,\n"
+" yine de öbür dosyalarý sileyim mi ?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr ""
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Dosyalarý sil"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Çoklu yeniden adlandýr :"
+
+#: src/utilops.c:1438
+#, fuzzy, c-format
+msgid "Review %d files"
+msgstr "%d dosya %s"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Dosyayý sil"
 
-#: src/utilops.c:595
-msgid "Delete file"
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
 msgstr "Dosyayý sil"
 
-#: src/utilops.c:650 src/utilops.c:834
-#, c-format
-msgid ""
-"Overwrite file:\n"
-"%s\n"
-"by renaming:\n"
-"%s"
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
 msgstr ""
-"%s'nin \n"
-"üstüne bunu yeniden\n"
-"adlandýrýrken yaz :\n"
-"%s"
 
-#: src/utilops.c:663
+#: src/utilops.c:1661
 #, c-format
 msgid ""
 "Unable to rename file:\n"
@@ -773,31 +3085,74 @@ msgstr ""
 "maalesef bir hata\n"
 "oluþtu"
 
-#: src/utilops.c:664 src/utilops.c:847
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
 msgid "Error renaming file"
 msgstr "Yeniden adlandýrýrken bir hata oluþtu"
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "GQview - rename"
-msgstr "GQview - yeniden adlandýr"
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+
+#: src/utilops.c:1809
+#, fuzzy, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"%s dosyasýný\n"
+"%s'ye adlandýrýrken\n"
+"maalesef bir hata\n"
+"oluþtu"
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr ""
+"%s'yi yeniden\n"
+"adlandýr :\n"
+" "
 
-#: src/utilops.c:754
-msgid "Rename multiple files:"
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
 msgstr "Çoklu yeniden adlandýr :"
 
-#: src/utilops.c:754 src/utilops.c:885
-msgid "Rename"
-msgstr "Yeniden adlandýr"
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr ""
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Yeniden adlandýr :"
 
-#: src/utilops.c:790
-msgid "Rename:"
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
 msgstr "Yeniden adlandýr :"
 
-#: src/utilops.c:799
-msgid "to:"
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr ""
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr ""
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr ""
+
+#: src/utilops.c:2150
+msgid "Padding:"
 msgstr ""
 
-#: src/utilops.c:846
+#: src/utilops.c:2207 src/view_file_list.c:459
 #, c-format
 msgid ""
 "Unable to rename file:\n"
@@ -810,61 +3165,49 @@ msgstr ""
 " \n"
 " "
 
-#: src/utilops.c:884
-#, c-format
-msgid ""
-"Rename file:\n"
-"%s\n"
-"to:"
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
 msgstr ""
 "%s'yi yeniden\n"
 "adlandýr :\n"
 " "
 
-#: src/utilops.c:928
-#, c-format
+#: src/utilops.c:2311
+#, fuzzy, c-format
 msgid ""
-"The path:\n"
+"The folder:\n"
 "%s\n"
-"already exists as a file."
+"already exists."
 msgstr ""
 "%s dizini \n"
 "zaten dosya halinde\n"
 "var ."
 
-#: src/utilops.c:929
-msgid "Could not create directory"
-msgstr "Dizini yaratamadým"
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Dosya"
 
-#: src/utilops.c:934
+#: src/utilops.c:2317
 #, c-format
 msgid ""
-"The directory:\n"
+"The path:\n"
 "%s\n"
-"already exists."
+"already exists as a file."
 msgstr ""
+"%s dizini \n"
+"zaten dosya halinde\n"
+"var ."
 
-#: src/utilops.c:935
-msgid "Directory exists"
-msgstr "Bu dizin zaten var"
-
-#: src/utilops.c:942
-#, c-format
-msgid ""
-"Unable to create directory:\n"
-"%s"
+#: src/utilops.c:2369
+msgid "New folder - GQview"
 msgstr ""
-"%s dizinini maalesef\n"
-"yaratamadým"
-
-#: src/utilops.c:943
-msgid "Error creating directory"
-msgstr "Dizini yaratýrken bir hata oluþtu"
 
-#: src/utilops.c:982
-#, c-format
+#: src/utilops.c:2372
+#, fuzzy, c-format
 msgid ""
-"Create directory in:\n"
+"Create folder in:\n"
 "%s\n"
 "named:"
 msgstr ""
@@ -872,14 +3215,444 @@ msgstr ""
 "dizin yarat ve\n"
 "böyle adlandýr :"
 
-#: src/utilops.c:983
-msgid "GQview - new directory"
-msgstr "GQview - yeni dizin"
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr ""
 
-#: src/utilops.c:983
-msgid "Create"
-msgstr "Yarat"
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr ""
 
-#: src/window.c:151
-msgid "GQview Tools"
-msgstr "GQview Çerezleri"
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+#, fuzzy
+msgid "_Slideshow"
+msgstr "Resim þovu"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+#, fuzzy
+msgid "Slideshow recursive"
+msgstr "Resim þovu"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+#, fuzzy
+msgid "Find _duplicates..."
+msgstr "Yeniden adlandýr .."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+#, fuzzy
+msgid "Find duplicates recursive..."
+msgstr "Yeniden adlandýr .."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr ""
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+#, fuzzy
+msgid "View as _tree"
+msgstr "Tam ekran"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+#, fuzzy
+msgid "Re_fresh"
+msgstr "Yenile"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr ""
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+#, fuzzy
+msgid "View as _icons"
+msgstr "Týrnaklar"
+
+#: src/view_file_list.c:421
+#, fuzzy
+msgid "Show _thumbnails"
+msgstr "Týrnaklarý arabellekte tut"
+
+#: src/view_file_list.c:447
+#, fuzzy, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr "geçerli opsiyonlar :\n"
+
+#, fuzzy
+#~ msgid "Purge thumbnails"
+#~ msgstr "Týrnaklarý yarat"
+
+#, fuzzy
+#~ msgid "/File/tear1"
+#~ msgstr "Filtralama"
+
+#, fuzzy
+#~ msgid "/File/_New collection"
+#~ msgstr "Seçenekler ..."
+
+#, fuzzy
+#~ msgid "/File/_Open collection..."
+#~ msgstr "Seçenekler ..."
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "Yeniden adlandýr .."
+
+#, fuzzy
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "Yeniden adlandýr .."
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "Yeniden adlandýr .."
+
+#, fuzzy
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "Sil .."
+
+#, fuzzy
+#~ msgid "/File/_Copy..."
+#~ msgstr "Kopyala ..."
+
+#, fuzzy
+#~ msgid "/File/_Move..."
+#~ msgstr "Taþý ..."
+
+#, fuzzy
+#~ msgid "/File/_Rename..."
+#~ msgstr "Yeniden adlandýr .."
+
+#, fuzzy
+#~ msgid "/File/_Delete..."
+#~ msgstr "Sil .."
+
+#, fuzzy
+#~ msgid "/File/sep4"
+#~ msgstr "Filtralama"
+
+#, fuzzy
+#~ msgid "/File/C_lose window"
+#~ msgstr "Pencereyi kapat"
+
+#, fuzzy
+#~ msgid "/_Edit"
+#~ msgstr "Düzenle"
+
+#, fuzzy
+#~ msgid "/Edit/editor1"
+#~ msgstr "Düzenle"
+
+#, fuzzy
+#~ msgid "/Edit/editor2"
+#~ msgstr "Düzenle"
+
+#, fuzzy
+#~ msgid "/Edit/editor3"
+#~ msgstr "Düzenle"
+
+#, fuzzy
+#~ msgid "/Edit/editor4"
+#~ msgstr "Düzenle"
+
+#, fuzzy
+#~ msgid "/Edit/editor5"
+#~ msgstr "Düzenle"
+
+#, fuzzy
+#~ msgid "/Edit/editor6"
+#~ msgstr "Düzenle"
+
+#, fuzzy
+#~ msgid "/Edit/editor7"
+#~ msgstr "Düzenle"
+
+#, fuzzy
+#~ msgid "/Edit/editor8"
+#~ msgstr "Düzenle"
+
+#, fuzzy
+#~ msgid "/Edit/editor9"
+#~ msgstr "Düzenle"
+
+#, fuzzy
+#~ msgid "/Edit/editor0"
+#~ msgstr "Düzenle"
+
+#, fuzzy
+#~ msgid "/Edit/_Properties"
+#~ msgstr "Seçenekler ..."
+
+#, fuzzy
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "Düzenle"
+
+#, fuzzy
+#~ msgid "/Edit/Select _all"
+#~ msgstr "Silerken bir hata oluþtu"
+
+#, fuzzy
+#~ msgid "/Edit/_Options..."
+#~ msgstr "Seçenekler ..."
+
+#, fuzzy
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "Ardalan yap"
+
+#, fuzzy
+#~ msgid "/_View"
+#~ msgstr "Göster"
+
+#, fuzzy
+#~ msgid "/View/Zoom _in"
+#~ msgstr "Büyült"
+
+#, fuzzy
+#~ msgid "/View/Zoom _out"
+#~ msgstr "Küçült"
+
+#, fuzzy
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "1:1 göster"
+
+#, fuzzy
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "Týrnaklar"
+
+#, fuzzy
+#~ msgid "/View/F_ull screen"
+#~ msgstr "Tam ekran"
+
+#, fuzzy
+#~ msgid "/View/_Hide file list"
+#~ msgstr "Dosya listesini göster/gizle"
+
+#, fuzzy
+#~ msgid "/View/sep4"
+#~ msgstr "Filtralama"
+
+#, fuzzy
+#~ msgid "/View/sep5"
+#~ msgstr "Filtralama"
+
+#, fuzzy
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "Resim þovunu aç/kapat"
+
+#, fuzzy
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "Listeleri yenile"
+
+#, fuzzy
+#~ msgid "/Help/sep1"
+#~ msgstr "Yardým"
+
+#~ msgid "GQview configuration"
+#~ msgstr "GQView ayarlarý"
+
+#, fuzzy
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "Eski týrnaklarý sil"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Sil"
+
+#, fuzzy
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr "Üstüne yaz"
+
+#, fuzzy
+#~ msgid "Open collection from:"
+#~ msgstr "Seçenekler ..."
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Çýk"
+
+#~ msgid "Exit"
+#~ msgstr "Çýk"
+
+#~ msgid "Ok"
+#~ msgstr "Tamam"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "geçerli opsiyonlar :\n"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Baþlarken bu dizine deðiþtir"
+
+#, fuzzy
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Büyült"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Bu tip dosyalarý içer"
+
+#, fuzzy
+#~ msgid "Remove"
+#~ msgstr "Yeniden adlandýr"
+
+#~ msgid "Command Line"
+#~ msgstr "Komuta"
+
+#, fuzzy
+#~ msgid "Help"
+#~ msgstr "Yardým"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "Tam ekran"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Dosya"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "%s 'nin üstüne\n"
+#~ " \n"
+#~ " %s 'yi\n"
+#~ " yaz"
+
+#~ msgid "Yes"
+#~ msgstr "Evet"
+
+#~ msgid "Yes to all"
+#~ msgstr "Hepsine evet"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "%s dosyanýnýn\n"
+#~ "üstüne \n"
+#~ "%s 'yi\n"
+#~ "yaz"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "%s dosyasýný\n"
+#~ "buraya\n"
+#~ "gönder :"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "%s dosyasýný\n"
+#~ "buraya \n"
+#~ "gönder :"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Dosyalarý silmek üzereyim ..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "%s'nin \n"
+#~ "üstüne bunu yeniden\n"
+#~ "adlandýrýrken yaz :\n"
+#~ "%s"
+
+#~ msgid "Create"
+#~ msgstr "Yarat"
+
+#~ msgid "Initial directory"
+#~ msgstr "Baþlangýç dizini"
+
+#, fuzzy
+#~ msgid "New Directory"
+#~ msgstr "GQview - yeni dizin"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "%s dizinini maalesef\n"
+#~ "yaratamadým"
+
+#~ msgid "Error creating directory"
+#~ msgstr "Dizini yaratýrken bir hata oluþtu"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "Geçersiz hedef"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "Týrnaklar"
+
+#, fuzzy
+#~ msgid "Skip directories"
+#~ msgstr "Baþlangýç dizini"
+
+#~ msgid "Invalid directory"
+#~ msgstr "Geçersiz dizin"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - kopyala"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - taþý"
+
+#~ msgid "Directory exists"
+#~ msgstr "Bu dizin zaten var"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - yeni dizin"
+
+#, fuzzy
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "Dizin yarat ..."
+
+#~ msgid "Edit"
+#~ msgstr "Düzenle"
+
+#, fuzzy
+#~ msgid "Date:"
+#~ msgstr "Sil"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview çalýþýyor : %s\n"
+
+#~ msgid "Electric Eyes"
+#~ msgstr "Electric Eyes"
+
+#~ msgid "Apply"
+#~ msgstr "Uygula"
+
+#~ msgid "format: [.foo;.bar]"
+#~ msgstr "þekil : [.foo;.bar]"
+
+#~ msgid "create dir failed: %s\n"
+#~ msgstr "%s dizinini yaratamadým \n"
+
+#~ msgid "Unable to delete dir: %s\n"
+#~ msgstr "%s dizinini silemedim \n"
+
+#~ msgid "failed to delete:%s\n"
+#~ msgstr "%s'yi silemedim \n"
+
+#~ msgid "     Ok     "
+#~ msgstr "     Tamam"
+
+#~ msgid "External Editors"
+#~ msgstr "Dýþtan kullanýlacak editörler"
diff --git a/po/uk.po b/po/uk.po
new file mode 100644 (file)
index 0000000..6bf6f50
--- /dev/null
+++ b/po/uk.po
@@ -0,0 +1,3712 @@
+# Ukrainian translation of GQview.
+# Copyright (C) 2001 Free Software Foundation, Inc.
+# Volodymyr M. Lisivka <lvm@mystery.lviv.net>, 2001,2002.
+# Olexander Kunytsa, 2002
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2002-05-07 17:15+0200\n"
+"Last-Translator: Volodymyr M. Lisivka <lvm@mystery.lviv.net>\n"
+"Language-Team:  <linux@linux.org.ua>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=koi8-u\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "ðÁÎÅÌØ"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "äÁÔÁ"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+#, fuzzy
+msgid "Filename:"
+msgstr "ðÅÒÅÊÍÅÎÕ×ÁÔÉ:"
+
+#: src/bar_info.c:1007 src/info.c:360
+#, fuzzy
+msgid "File date:"
+msgstr "æ¦ÌØÔÒ:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "ðÏÒ¦×ÎÑÔÉ Ú:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "úÂÅÒÅÇÔÉ ËÏÌÅËæÀ"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr ""
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "îÁÚ×Á"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr ""
+
+#: src/bar_exif.c:426
+#, fuzzy
+msgid "Format"
+msgstr "ú×ÉÞÁÊÎÉÊ"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr ""
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr ""
+
+#: src/bar_exif.c:549 src/info.c:105
+#, fuzzy
+msgid "Exif"
+msgstr "÷ÉÊÔÉ"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr ""
+
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "÷ÉÄÁÌÅÎÎÑ ÎÅ ×ÄÁÌÏÓÑ"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"ëÁÔÁÌÏÇ:\n"
+"%s\n"
+"×ÖÅ ¦ÓÎÕ¤."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "ëÏÌÅËæѠÐÏÒÏÖÎÑ"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"îÅ×ÄÁÌÏÓÑ ÚÁÐÉÓÁÔÉ ËÏÌÅËæÀ:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "îÅ×ÄÁÌÏÓÑ ÚÂÅÒÅÇÔÉ"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr ""
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "ëÏÌÅËæ§"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+#, fuzzy
+msgid "Name:"
+msgstr "îÁÚ×Á"
+
+#: src/bar_sort.c:569
+#, fuzzy
+msgid "Sort Manager"
+msgstr "óÏÔÒÕ×ÁÔÉ ÚÁ ÎÁÚ×ÏÀ"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+#, fuzzy
+msgid "Folders"
+msgstr "æÁÊÌÉ"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "ëÏÌÅËæ§"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "ëÏЦÀ×ÁÔÉ"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "ðÅÒÅÎÅÓÔÉ"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d ÚÏÂÒÁÖÅÎØ"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "úÎÑÔÉ ×ÉĦÌÅÎÎÑ"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr ""
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+#, fuzzy
+msgid "done"
+msgstr "î¦ÞÏÇÏ"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "þÉÔÁÎÎÑ ÄÁÎÉÈ ÐÒÏ ÓÈÏÖ¦ÓÔØ..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "úÎÉÝÅÎÎѠЦËÔÏÇÒÁÍ..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "÷ÉÔÉÒÁÎÎÑ ÓÔÁÒÉȠЦËÔÏÇÒÁÍ..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "îÅצÒÎÅ ¦Í'Ñ ÆÁÊÌÕ"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "ëÅÛÕ×ÁÔɠЦËÔÏÇÒÁÍÉ"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "äÁÔÁ"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+#, fuzzy
+msgid "Folder:"
+msgstr "æÁÊÌÉ"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "úÎÑÔÉ ×ÉĦÌÅÎÎÑ"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "îÅצÒÎÅ ¦Í'Ñ ÆÁÊÌÕ"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+#, fuzzy
+msgid "running..."
+msgstr "ðÏÒ¦×ÎÑÎÎÑ..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "úÎÉÝÅÎÎѠЦËÔÏÇÒÁÍ..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "ïÞÉÓÔÉÔÉ ËÅÛ"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"ãÅ ×ÉÄÁÌÉÔØ ×Ó¦ Ð¦ËÔÏÇÒÁÍÉ Ñ˦ ÂÕÌÉ\n"
+"ÚÂÅÒÅÖÅΦ ÎÁ ÄÉÓËÕ, ÐÒÏÄÏ×ÖÉÔÉ?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "äÏÐÏÍÏÇÁ - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview Õ ÐÏ×ÎÉÊ ÅËÒÁÎ"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "ëÏÌÅËæ§"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "ïÞÉÓÔÉÔÉ"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "ëÅÛÕ×ÁÔɠЦËÔÏÇÒÁÍÉ"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "ðÏËÁÚÕ×ÁÔɠЦËÔÏÇÒÁÍÉ"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "ðÅÒÅÊÍÅÎÕ×ÁÔÉ"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "âÅÚ ¦ÍÅΦ"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "âÅÚ ¦ÍÅΦ (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - ËÏÌÅËæѠGQview"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "úÁËÒÉÔÉ ËÏÌÅËæÀ"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"ëÏÌÅËæѠÂÕÌÁ ÚͦÎÅÎÁ.\n"
+"úÂÅÒÅÇÔÉ ÓÐÏÞÁÔËÕ?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"÷ËÁÚÁÎÉÊ ÛÌÑÈ:\n"
+"%s\n"
+"ÃÅ ËÁÔÁÌÏÇ, Á ËÏÌÅË槠ÃÅ ÆÁÊÌÉ"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "îÅצÒÎÅ ¦Í'Ñ ÆÁÊÌÕ"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "ðÅÒÅÐÉÓÁÔÉ ÆÁÊÌ"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "ðÅÒÅÐÉÓÁÔÉ ÆÁÊÌ"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "ðÅÒÅÐÉÓÁÔÉ"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "úÂÅÒÅÇÔÉ ËÏÌÅËæÀ"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "÷¦ÄËÒÉÔÉ ËÏÌÅËæÀ"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "ðÒɤÄÎÁÔÉ ËÏÌÅËæÀ"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "ðÒɤÄÎÁÔÉ"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "æÁÊÌÉ ËÏÌÅËæ§"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "ëÏÌÅËæѠÐÏÒÏÖÎÑ"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "ðÏÔÏÞÎÁ ËÏÌÅËæѠÐÏÒÏÖÎÑ, ÚÂÅÒÅÖÅÎÎÑ ÐÅÒÅÒ×ÁÎÅ."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "ðÏÒÏÖÎØÏ"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d ÚÏÂÒÁÖÅÎØ (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d ÚÏÂÒÁÖÅÎØ"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "úÁ×ÁÎÔÁÖÅÎÎѠЦËÔÏÇÒÁÍ..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+#, fuzzy
+msgid "_View"
+msgstr "/÷ÉÇÌÑÄ"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+#, fuzzy
+msgid "View in _new window"
+msgstr "ðÅÒÅÇÌÑÎÕÔÉ × ÎÏ×ÏÍՠצËΦ"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+#, fuzzy
+msgid "Rem_ove"
+msgstr "óÔÅÒÔÉ"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "äÏÄÁÔÉ Ú¦ ÓÐÉÓËÕ ÆÁÊ̦×"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "äÏÄÁÔÉ Ú ËÏÌÅËæ§..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "÷ÉĦÌÉÔÉ ×ÓÅ"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "úÎÑÔÉ ×ÉĦÌÅÎÎÑ"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+#, fuzzy
+msgid "_Properties"
+msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/ïÐæ§..."
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+#, fuzzy
+msgid "_Copy..."
+msgstr "ëÏЦÀ×ÁÔÉ..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+#, fuzzy
+msgid "_Move..."
+msgstr "ðÅÒÅÎÅÓÔÉ..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+#, fuzzy
+msgid "_Rename..."
+msgstr "ðÅÒŦÍÅÎÕ×ÁÔÉ..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+#, fuzzy
+msgid "_Delete..."
+msgstr "÷ÉÄÁÌÉÔÉ..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+#, fuzzy
+msgid "Show filename _text"
+msgstr "ðÏËÁÚÁÔÉ ÐÒÉÈÏ×ÁΦ"
+
+#: src/collect-table.c:813
+#, fuzzy
+msgid "_Save collection"
+msgstr "úÂÅÒÅÇÔÉ ËÏÌÅËæÀ"
+
+#: src/collect-table.c:815
+#, fuzzy
+msgid "Save collection _as..."
+msgstr "úÂÅÒÅÇÔÉ ËÏÌÅËæÀ ÑË..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+#, fuzzy
+msgid "_Find duplicates..."
+msgstr "úÎÁÊÔÉ ÄÕÂ̦ËÁÔÉ..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/æÁÊÌ/ðÅÒÅÊÍÅÎÕ×ÁÔÉ..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "óÐÉÓÏˠצÄËÉÎÕÔÉÈ ×ËÌÀÞÁ¤ ËÁÔÁÌÏÇÉ."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+#, fuzzy
+msgid "_Add contents"
+msgstr "äÏÄÁÔÉ ×ͦÓÔ"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+#, fuzzy
+msgid "Add contents _recursive"
+msgstr "òÅËÕÒÓÉ×ÎÏ ÄÏÄÁÔÉ ×ͦÓÔ"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "ðÒÏÐÕÓÔÉÔÉ ËÁÔÁÌÏÇÉ"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "÷¦ÄͦÎÉÔÉ"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "ëÉÎØÔÅ ÆÁÊÌÉ ÄÌÑ §È ÐÏÒ¦×ÎÑÎÎÑ."
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d ÆÁÊ̦×"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "%d ÓЦ×ÐÁĦÎØ ÚÎÁÊÄÅÎÏ × %d ÆÁÊÌÁÈ"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr ""
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "þÉÔÁÎÎÑ ËÏÎÔÒÏÌØÎÉÈ ÓÕÍ..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "þÉÔÁÎÎÑ ÒÏÚͦҦ×..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "þÉÔÁÎÎÑ ÄÁÎÉÈ ÐÒÏ ÓÈÏÖ¦ÓÔØ..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "ðÏÒ¦×ÎÑÎÎÑ..."
+
+#: src/dupe.c:1535
+#, fuzzy
+msgid "Sorting..."
+msgstr "ðÏÒ¦×ÎÑÎÎÑ..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr ""
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr ""
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "äÏÄÁÔÉ ÄÏ ÎÏ×ϧ ËÏÌÅËæ§"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+#, fuzzy
+msgid "C_lear"
+msgstr "ïÞÉÓÔÉÔÉ"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+#, fuzzy
+msgid "Close _window"
+msgstr "úÁËÒÉÔɠצËÎÏ"
+
+#: src/dupe.c:2382
+#, fuzzy, c-format
+msgid "%d files (set 2)"
+msgstr "%d ÆÁÊ̦×%s"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "òÏÚͦÒ"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "äÁÔÁ"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "òÏÚͦÒÉ"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "ëÏÎÔÒÏÌØÎÁ ÓÕÍÁ"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "ûÌÑÈ"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "óÈÏÖ¦ÓÔØ (×ÉÓÏËÁ)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "óÈÏÖ¦ÓÔØ"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "óÈÏÖ¦ÓÔØ (ÎÉÚØËÁ)"
+
+#: src/dupe.c:2598
+#, fuzzy
+msgid "Similarity (custom)"
+msgstr "óÈÏÖ¦ÓÔØ (ÎÉÚØËÁ)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "ðÏÛÕË ÄÕÂ̦ËÁԦנ- GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "ðÏÒ¦×ÎÑÔÉ Ú:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "ðÏÒ¦×ÎÑÔÉ ÚÁ ÄÏÐÏÍÏÇÏÀ:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "ð¦ËÔÏÇÒÁÍÉ"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "ðÏÒ¦×ÎÑÔÉ Ä×Á ÎÁÂÏÒÉ ÆÁÊ̦×"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+#, fuzzy
+msgid "Rotate jpeg clockwise"
+msgstr "ðÏ×ÅÒÎÕÔÉ ÚÁ ÇÏÄÉÎÎÉËÏ×ÏÀ ÓÔÒ¦ÌËÏÀ"
+
+#: src/editors.c:59
+#, fuzzy
+msgid "Rotate jpeg counterclockwise"
+msgstr "ðÏ×ÅÒÎÕÔÉ ÐÒÏÔÉ ÇÏÄÉÎÎÉËÏ×ϧ ÓÔÒ¦ÌËÉ"
+
+#: src/editors.c:104
+#, fuzzy
+msgid "stopping..."
+msgstr "ðÏÒ¦×ÎÑÎÎÑ..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr ""
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr ""
+
+#: src/editors.c:303
+#, fuzzy, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"îÅ ÍÏÖÕ ÚÁ×ÁÎÔÁÖÉÔÉ:\n"
+"%s"
+
+#: src/editors.c:414
+#, fuzzy
+msgid "stopped by user"
+msgstr "óÏÔÒÕ×ÁÔÉ ÚÁ ÞÉÓÌÏÍ"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+#, fuzzy
+msgid "unknown"
+msgstr "× (ÎÅצÄÏÍÏ)..."
+
+#: src/exif.c:113
+#, fuzzy
+msgid "top left"
+msgstr "÷ÉÄÁÌÉÔÉ"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr ""
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr ""
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr ""
+
+#: src/exif.c:117
+#, fuzzy
+msgid "left top"
+msgstr "÷ÉÄÁÌÉÔÉ"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr ""
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr ""
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr ""
+
+#: src/exif.c:127
+msgid "inch"
+msgstr ""
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr ""
+
+#: src/exif.c:140
+msgid "average"
+msgstr ""
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr ""
+
+#: src/exif.c:142
+msgid "spot"
+msgstr ""
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr ""
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr ""
+
+#: src/exif.c:145
+msgid "partial"
+msgstr ""
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr ""
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr ""
+
+#: src/exif.c:152
+msgid "manual"
+msgstr ""
+
+#: src/exif.c:153
+#, fuzzy
+msgid "normal"
+msgstr "ú×ÉÞÁÊÎÉÊ"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr ""
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr ""
+
+#: src/exif.c:156
+#, fuzzy
+msgid "creative"
+msgstr "óÔ×ÏÒÉÔÉ"
+
+#: src/exif.c:157
+msgid "action"
+msgstr ""
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr ""
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr ""
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr ""
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr ""
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr ""
+
+#: src/exif.c:168
+msgid "flash"
+msgstr ""
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr ""
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+#, fuzzy
+msgid "yes"
+msgstr "ôÁË"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr ""
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr ""
+
+#: src/exif.c:289
+#, fuzzy
+msgid "Image description"
+msgstr "îÅצÒÎÁ Ã¦ÌØ"
+
+#: src/exif.c:292
+#, fuzzy
+msgid "Orientation"
+msgstr "òÏÚͦÒÉ"
+
+#: src/exif.c:303
+#, fuzzy
+msgid "Copyright"
+msgstr "ëÏЦÀ×ÁÔÉ"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr ""
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr ""
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr ""
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr ""
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr ""
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr ""
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr ""
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr ""
+
+#: src/exif.c:323
+#, fuzzy
+msgid "Metering mode"
+msgstr "íÅÔÏÄ ¦Í¦ÔÕ×ÁÎÎÑ ÎÁЦ×ËÏÌØÏÒ¦×:"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr ""
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr ""
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr ""
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr ""
+
+#: src/exif.c:337
+msgid "Height"
+msgstr ""
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr ""
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr ""
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr ""
+
+#: src/exif.c:1479
+#, fuzzy
+msgid "mode:"
+msgstr "æÁÊÌÉ"
+
+#: src/exif.c:1483 src/utilops.c:1234
+#, fuzzy
+msgid "on"
+msgstr "î¦ÞÏÇÏ"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr ""
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr ""
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr ""
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr ""
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr ""
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr ""
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "ÂÁÊÔ¦×: %d"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f K"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f MÂ"
+
+#: src/filelist.c:526
+#, fuzzy, c-format
+msgid "%.1f GB"
+msgstr "%.1f MÂ"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview Õ ÐÏ×ÎÉÊ ÅËÒÁÎ"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "æÁÊÌÉ"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "íÁÓÛÔÁÂÕ×ÁÔÉ ÄÏ ÒÏÚͦÒՠצËÎÁ"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+#, fuzzy
+msgid "Zoom _in"
+msgstr "ú¦ÌØÛÉÔÉ"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+#, fuzzy
+msgid "Zoom _out"
+msgstr "úÍÅÎÛÉÔÉ"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+#, fuzzy
+msgid "Zoom _1:1"
+msgstr "ïÒÉǦÎÁÌØÎÉÊ ÒÏÚͦÒ"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+#, fuzzy
+msgid "Fit image to _window"
+msgstr "íÁÓÛÔÁÂÕ×ÁÔÉ ÄÏ ÒÏÚͦÒՠצËÎÁ"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+#, fuzzy
+msgid "Set as _wallpaper"
+msgstr "÷ÓÔÁÎÏ×ÉÔÉ ÑË ÔÌÏ"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+#, fuzzy
+msgid "_Stop slideshow"
+msgstr "úÕÐÉÎÉÔÉ ÐÏËÁÚ ÓÌÁÊĦ×"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+#, fuzzy
+msgid "Continue slides_how"
+msgstr "ðÒÏÄÏ×ÖÉÔÉ ÐÏËÁÚ ÓÌÁÊĦ×"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+#, fuzzy
+msgid "Pause slides_how"
+msgstr "ðÒÉÚÕÐÉÎÉÔÉ ÐÏËÁÚ ÓÌÁÊĦ×"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+#, fuzzy
+msgid "_Start slideshow"
+msgstr "ðÏÞÁÔÉ ÐÏËÁÚ ÓÌÁÊĦ×"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+#, fuzzy
+msgid "Exit _full screen"
+msgstr "÷ÉÊÔÉ Ú ÐÏ×ÎÏÅËÒÁÎÎÏÇÏ ÒÅÖÉÍÕ"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+#, fuzzy
+msgid "_Full screen"
+msgstr "îÁ ÐÏ×ÎÉÊ ÅËÒÁÎ"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+#, fuzzy
+msgid "C_lose window"
+msgstr "úÁËÒÉÔɠצËÎÏ"
+
+#: src/info.c:361
+#, fuzzy
+msgid "File size:"
+msgstr "æÁÊÌÉ"
+
+#: src/info.c:363
+#, fuzzy
+msgid "Dimensions:"
+msgstr "òÏÚͦÒÉ"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr ""
+
+#: src/info.c:365 src/print.c:3371
+#, fuzzy
+msgid "Image size:"
+msgstr "úÏÂÒÁÖÅÎÎÑ"
+
+#: src/info.c:367
+#, fuzzy
+msgid "Compress ratio:"
+msgstr "ðÏÒ¦×ÎÑÔÉ Ú:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "æ¦ÌØÔÒ:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr ""
+
+#: src/info.c:371
+msgid "Group:"
+msgstr ""
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "úÁÇÁÌØÎÅ"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr ""
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr ""
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "îÁÒÏÓÔÁÀÞÉÊ"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " ðÏËÁÚ ÓÌÁÊĦ×"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " ðÒÉÚÕÐÉÎÅÎÏ"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d ÆÁÊ̦נ(%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d ÆÁÊ̦×%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d ÆÁÊ̦×%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr ""
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s ÂÁÊÔ"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s ÂÁÊÔ"
+
+#: src/layout.c:1104
+#, fuzzy
+msgid "GQview Tools"
+msgstr "GQview - ËÏЦÀ×ÁÎÎÑ"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "ðÁÎÅÌØ"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "æÁÊÌÉ"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "úÏÂÒÁÖÅÎÎÑ"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(ÐÅÒÅÔÑΦÔØ ÝÏ ÚͦÎÉÔÉ ÐÏÒÑÄÏË)"
+
+#: src/layout_image.c:770
+#, fuzzy
+msgid "Hide file _list"
+msgstr "(ðÏËÁÚÁÔÉ)ðÒÉÈÏ×ÁÔÉ ÓÐÉÓÏË ÆÁÊ̦×"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "× %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "× (ÎÅצÄÏÍÏ)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "ðÏÒÏÖÎØÏ"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/æÁÊÌ"
+
+#: src/layout_util.c:749 src/menu.c:91
+#, fuzzy
+msgid "_Edit"
+msgstr "/òÅÄÁÇÕ×ÁÎÎÑ"
+
+#: src/layout_util.c:750 src/menu.c:248
+#, fuzzy
+msgid "_Adjust"
+msgstr "ð¦ÄÐÒÁ×ÉÔÉ"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/äÏצÄËÁ"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/æÁÊÌ/îÏ×Á ËÏÌÅËæÑ"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "úÂÅÒÅÇÔÉ ËÏÌÅËæÀ"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "÷¦ÄËÒÉÔÉ ËÏÌÅËæÀ"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/æÁÊÌ/÷¦ÄËÒÉÔÉ ÎÅÄÁ×ΦÊ"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "ðÏÒ¦×ÎÑÎÎÑ..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/æÁÊÌ/ðÅÒÅÊÍÅÎÕ×ÁÔÉ..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "îÏ×ÉÊ ËÁÔÁÌÏÇ..."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "ñ˦ÓÔØ"
+
+#: src/layout_util.c:779 src/menu.c:194
+#, fuzzy
+msgid "_Rotate clockwise"
+msgstr "ðÏ×ÅÒÎÕÔÉ ÚÁ ÇÏÄÉÎÎÉËÏ×ÏÀ ÓÔÒ¦ÌËÏÀ"
+
+#: src/layout_util.c:780 src/menu.c:197
+#, fuzzy
+msgid "Rotate _counterclockwise"
+msgstr "ðÏ×ÅÒÎÕÔÉ ÐÒÏÔÉ ÇÏÄÉÎÎÉËÏ×ϧ ÓÔÒ¦ÌËÉ"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "ðÏ×ÅÒÎÕÔÉ ÎÁ 180"
+
+#: src/layout_util.c:782 src/menu.c:203
+#, fuzzy
+msgid "_Mirror"
+msgstr "÷¦ÄÚÅÒËÁÌÉÔÉ"
+
+#: src/layout_util.c:783 src/menu.c:206
+#, fuzzy
+msgid "_Flip"
+msgstr "ðÅÒÅ×ÅÒÎÕÔÉ"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "÷ÉĦÌÉÔÉ ×ÓÅ"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "úÎÑÔÉ ×ÉĦÌÅÎÎÑ"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/ïÐæ§..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/÷ÉÇÌÑÄ/äÏ ÒÏÚͦÒՠצËÎÁ"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "îÁ ÐÏ×ÎÉÊ ÅËÒÁÎ"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "(ðÏËÁÚÁÔÉ)ðÒÉÈÏ×ÁÔÉ ÓÐÉÓÏË ÆÁÊ̦×"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "úÕÐÉÎÉÔÉ ÐÏËÁÚ ÓÌÁÊĦ×"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "ïÎÏ×ÉÔÉ"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/äÏצÄËÁ/ðÒÏ"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/äÏצÄËÁ/çÁÒÑÞ¦ ËÌÁצۦ"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/äÏצÄËÁ/ðÏͦÔËÉ ÄϠ椧 ×ÅÒÓ¦§"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/äÏצÄËÁ/ðÒÏ"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "ð¦ËÔÏÇÒÁÍÉ"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/÷ÉÇÌÑÄ/sep3"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/÷ÉÇÌÑÄ/(ðÒÉ-)÷¦ÄÞÅÐÉÔÉ ÓÐÉÓÏË ÆÁÊ̦×"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/÷ÉÇÌÑÄ/tear1"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "ñˠЦËÔÏÇÒÁÍÉ"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/÷ÉÇÌÑÄ/ïÎÏ×ÉÔÉ ÓÐÉÓÏË"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "óÏÔÒÕ×ÁÔÉ ÚÁ ÎÁÚ×ÏÀ"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/÷ÉÇÌÑÄ/ïÎÏ×ÉÔÉ ÓÐÉÓÏË"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "ñˠЦËÔÏÇÒÁÍÉ"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "ðÏËÁÚÕ×ÁÔɠЦËÔÏÇÒÁÍÉ"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "úͦÎÉÔÉ ÎÁ ÄÏÍÁÛΦʠËÁÔÁÌÏÇ"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "ïÎÏ×ÉÔÉ ÓÐÉÓÏË ÆÁÊ̦×"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "ú¦ÌØÛÉÔÉ"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "úÍÅÎÛÉÔÉ"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "íÁÓÛÔÁÂÕ×ÁÔÉ ÄÏ ÒÏÚͦÒՠצËÎÁ"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "÷ÓÔÁÎÏ×ÉÔÉ ÏÒÉǦÎÁÌØÎÉÊ ÒÏÚͦÒ"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "úËÏÎƦÇÕÒÕ×ÁÔÉ ÏÐæ§"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "ðÌÁ×ÁÀÞ¦ ËÏÎÔÒÏÌÉ"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "äÏÐÏÍÏÇÁ - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "ëÏÍÁÎÄÁ ÓÔÒ¦ÞËÁ"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "úÁ×ÁÎÔÁÖÕ×ÁÔÉ ÎÁÐÅÒÅÄ ÎÁÓÔÕÐÎÅ ÚÏÂÒÁÖÅÎÎÑ"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "%d ÚÏÂÒÁÖÅÎØ"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "úÁ×ÁÎÔÁÖÕ×ÁÔÉ ÎÁÐÅÒÅÄ ÎÁÓÔÕÐÎÅ ÚÏÂÒÁÖÅÎÎÑ"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "÷ÉÊÔÉ Ú ÐÏ×ÎÏÅËÒÁÎÎÏÇÏ ÒÅÖÉÍÕ"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "÷ÉÊÔÉ Ú ÐÏ×ÎÏÅËÒÁÎÎÏÇÏ ÒÅÖÉÍÕ"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "÷ÉÊÔÉ Ú ÐÏ×ÎÏÅËÒÁÎÎÏÇÏ ÒÅÖÉÍÕ"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "úÕÐÉÎÉÔÉ ÐÏËÁÚ ÓÌÁÊĦ×"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "ðÏÞÁÔÉ ÐÏËÁÚ ÓÌÁÊĦ×"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "úÕÐÉÎÉÔÉ ÐÏËÁÚ ÓÌÁÊĦ×"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "ðÏÞÁÔÉ ÐÏËÁÚ ÓÌÁÊĦ×"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview - ËÏЦÀ×ÁÎÎÑ"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr ""
+"ðÅÒÅÊÍÅÎÕ×ÁÔÉ ÆÁÊÌ:\n"
+"%s\n"
+"×:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "ðÅÒÅÇÌÑÎÕÔÉ × ÎÏ×ÏÍՠצËΦ"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr "÷ÉËÏÒÉÓÔÁÎÎÑ: gqview [options] [path]\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "ÄÏÓÔÕÐΦ ÔÁ˦ ÏÐæ§:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools    ÆÏÒÓÕ×ÁÔÉ ÐÏËÁÚ ÐÁÎÅ̦ ¦ÎÓÔÒÕÍÅÎÔ¦×\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools ÆÏÒÓÕ×ÁÔÉ ÐÒÉÈÏ×Õ×ÁÎÎÑ ÐÁÎÅ̦ ¦ÎÓÔÒÕÍÅÎÔ¦×\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -t, --fullscreen    ÓÔÁÒÔÕ×ÁÔÉ × ÐÏ×ÎÏÅËÒÁÎÎÏÍÕ ÒÅÖÉͦ\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow     ÓÔÁÒÔÕ×ÁÔÉ × ÒÅÖÉͦ ÐÏËÁÚÕ ÓÌÁÊĦ×\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr ""
+"  -l, --list          ×¦ÄËÒÉÔɠצËÎÏ ËÏÌÅË槠ڦ ÓÐÉÓËÏÍ Ú ËÏÍÁÎÄÎϧ "
+"ÓÔÒ¦ÞËÉ\n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr ""
+"  -l, --list          ×¦ÄËÒÉÔɠצËÎÏ ËÏÌÅË槠ڦ ÓÐÉÓËÏÍ Ú ËÏÍÁÎÄÎϧ "
+"ÓÔÒ¦ÞËÉ\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug             ×צÍËÎÕÔÉ ×ÉצĠצÄÌÁÇÏÄÖÕ×ÁÌØÎϧ ¦ÎÆÏÒÍÁæ§\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version       ×É×ÅÓÔÉ ¦ÎÆÏÒÍÁæÀ ÐÒÏ ×ÅÒÓ¦À\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help          ÐÏËÁÚÁÔÉ ÃÅ ÐÏצÄÏÍÌÅÎÎÑ\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"ÎÅÐÒÁ×ÉÌØÎÁ ÞÉ ÐÒϦÇÎÏÒÏ×ÁÎÁ: %s\n"
+"÷ÖÉ×ÁÊÔÅ --help ÄÌÑ ÐÏËÁÚÕ ÓÐÉÓËÕ ÏÐæÊ\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "óÔ×ÏÒÅÎÎÑ ËÁÔÁÌÏÇÕ GQview: %s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "îÅ ÍÏÖÕ ÓÔ×ÏÒÉÔÉ ËÁÔÁÌÏÇ:%s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "äÏͦ×ËÁ"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+#, fuzzy
+msgid "Desktop"
+msgstr "×:"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - ×ÉȦÄ"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "äÏÐÏÍÏÇÁ - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"ëÏÌÅË槠ÂÕÌÉ ÚͦÎÅΦ.\n"
+"÷ÓÅÒ¦×ÎÏ ×ÉÊÔÉ?"
+
+#: src/menu.c:115
+#, fuzzy
+msgid "Sort by size"
+msgstr "óÏÒÔÕ×ÁÔÉ ÚÁ ÒÏÚͦÒÏÍ"
+
+#: src/menu.c:118
+#, fuzzy
+msgid "Sort by date"
+msgstr "óÏÒÔÕ×ÁÔÉ ÚÁ ÄÁÔÏÀ"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "îÅ ÓÏÒÔÕ×ÁÔÉ"
+
+#: src/menu.c:124
+#, fuzzy
+msgid "Sort by path"
+msgstr "óÏÒÔÕ×ÁÔÉ ÚÁ ÛÌÑÈÏÍ"
+
+#: src/menu.c:127
+#, fuzzy
+msgid "Sort by number"
+msgstr "óÏÔÒÕ×ÁÔÉ ÚÁ ÞÉÓÌÏÍ"
+
+#: src/menu.c:131
+#, fuzzy
+msgid "Sort by name"
+msgstr "óÏÔÒÕ×ÁÔÉ ÚÁ ÎÁÚ×ÏÀ"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "óÏÒÔÕ×ÁÔÉ"
+
+#: src/menu.c:200
+#, fuzzy
+msgid "Rotate _180"
+msgstr "ðÏ×ÅÒÎÕÔÉ ÎÁ 180"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "îÁÊÂÌÉÖÞÉÊ (ÓÔÒÁÛÎÉÊ, ÁÌÅ ÎÁÊÛ×ÉÄÛÉÊ)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "ëÁÆÅÌÅÍ"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "â¦Ì¦Î¦ÊÎÉÊ"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "ç¦ÐÅÒ (ÎÁÊËÒÁÝÉÊ ¦ ÎÁÊÐÏצÌØΦÛÉÊ)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "î¦ÞÏÇÏ"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "ú×ÉÞÁÊÎÉÊ"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "îÁÊËÒÁÝÉÊ"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr ""
+
+#: src/preferences.c:662 src/preferences.c:665
+#, fuzzy
+msgid "Reset filters"
+msgstr "÷ÉÄÁÌÉÔÉ ÆÁÊÌÉ"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:699 src/preferences.c:702
+#, fuzzy
+msgid "Reset editors"
+msgstr "÷ÉÄÁÌÉÔÉ ÆÁÊÌÉ"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:727 src/preferences.c:730
+#, fuzzy
+msgid "Clear trash"
+msgstr "ïÞÉÓÔÉÔÉ ËÅÛ"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr ""
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - ÐÅÒÅÊÍÅÎÕ×ÁÎÎÑ"
+
+#: src/preferences.c:824
+msgid "Startup"
+msgstr ""
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "úͦÎÉÔÉ ÎÁ ÄÏÍÁÛΦʠËÁÔÁÌÏÇ"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "÷ÖÉÔÉ ÐÏÔÏÞÎÉÊ "
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "òÏÚͦÒ:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "ñ˦ÓÔØ:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "ëÅÛÕ×ÁÔɠЦËÔÏÇÒÁÍÉ"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "ëÅÛÕ×ÁÔɠЦËÔÏÇÒÁÍÉ × .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "÷ÉËÏÒÉÓÔÏ×Õ×ÁÔɠЦËÔÏÇÒÁÍÉ xvpics ÑËÝÏ ÚÎÁÊÄÅÎÏ (ÌÉÛÅ ÞÉÔÁÎÎÑ)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "ðÏËÁÚ ÓÌÁÊĦ×"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "úÁÔÒÉÍËÁ Í¦Ö ÚͦÎÏÀ ÚÏÂÒÁÖÅÎØ (ÓÅËÕÎÄ):"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "äÏצÌØÎÏ"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "ðÏ×ÔÏÒ"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "ú¦ÌØÛÉÔÉ"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "íÅÔÏÄ ¦Í¦ÔÕ×ÁÎÎÑ ÎÁЦ×ËÏÌØÏÒ¦×:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr ""
+
+#: src/preferences.c:895
+#, fuzzy
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "ú¦ÌØÛÕ×ÁÔÉ ÚÏÂÒÁÖÅÎÎÑ ÄÏ ÒÏÚͦҦנצËÎÁ"
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "ðÒÉÒ¦ÓÔ ÍÁÓÛÔÁÂÕ×ÁÎÎÑ:"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "ëÏÌÉ ÎÏ×Å ÚÏÂÒÁÖÅÎÎÑ ×ÉÂÒÁÎÅ:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "íÁÓÛÔÁÂÕ×ÁÔÉ ÄÏ ÏÒÉǦÎÁÌØÎÏÇÏ ÒÏÚͦÒÕ"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "úÁÌÉÛÉÔÉ ×ÉÂÒÁÎÅ ÍÁÓÛÔÁÂÕ×ÁÎÎÑ"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "ðÒɤÄÎÁÔÉ"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr ""
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "ðÒÏÄÏ×ÖÉÔÉ"
+
+#: src/preferences.c:924
+#, fuzzy
+msgid "Refresh on file change"
+msgstr "ïÎÏ×ÉÔÉ ÓÐÉÓÏË ÆÁÊ̦×"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "úÁ×ÁÎÔÁÖÕ×ÁÔÉ ÎÁÐÅÒÅÄ ÎÁÓÔÕÐÎÅ ÚÏÂÒÁÖÅÎÎÑ"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr ""
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "÷¦ËÎÁ"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "äÁÔÁ"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "úÁÐÁÍ'ÑÔÏ×Õ×ÁÔÉ ÐÏÚÉæÀ ×¦ËÎÁ"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "úÁÐÁÍ'ÑÔÏ×Õ×ÁÔÉ ÓÔÁΠÐÁÎÅ̦ ¦ÎÓÔÒÕÍÅÎÔ¦×"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "òÏÚͦҠצËÎÁ ×¦ÄÐÏצÄÁ¤ ÚÏÂÒÁÖÅÎÎÀ ËÏÌÉ ¦ÎÓÔÒÕÍÅÎÔÉ ÐÒÉÈÏ×ÁΦ/ÐÌÁ×ÁÀÞ¦"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "ïÂÍÅÖÉÔÉ ÒÏÚͦҠÄÌÑ Á×ÔÏÚͦÎÉ ÒÏÚͦÒՠצËÎÁ (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "òÏÚÔÁÛÕ×ÎÎÑ"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "æ¦ÌØÔÒÕ×ÁÎÎÑ"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "ðÏËÁÚÕ×ÁÔÉ ÅÌÅÍÅÎÔÉ Ñ˦ ÐÏÞÉÎÁÀÔØÓÑ Ú ËÒÁÐËÉ"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr ""
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "úÁÂÏÒÏÎÉÔɠƦÌØÔÒÕ×ÁÎÎÑ ÆÁÊ̦×"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "æ¦ÌØÔÒ:"
+
+#: src/preferences.c:1008
+#, fuzzy
+msgid "Filter"
+msgstr "æ¦ÌØÔÒ:"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr ""
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "òÅÄÁËÔÏÒÉ"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "No"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "îÁÚ×Á ÍÅÎÀ"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr ""
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "îÁ ÐÏ×ÎÉÊ ÅËÒÁÎ"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "úÏÂÒÁÖÅÎÎÑ"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "÷ÉÄÁÌÉÔÉ"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "ð¦ÄÔ×ÅÒÄÖÕ×ÁÔÉ ×ÉÄÁÌÅÎÎÑ ÆÁÊÌÁ"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "äÏÚ×ÏÌÉÔÉ ËÌÁצÛÕ Delete"
+
+#: src/preferences.c:1158
+#, fuzzy
+msgid "Safe delete"
+msgstr "ð¦ÄÔ×ÅÒÄÖÕ×ÁÔÉ ×ÉÄÁÌÅÎÎÑ ÆÁÊÌÁ"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "æÁÊÌÉ"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "ðÅÒÅÇÌÑÎÕÔÉ"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "ðÒÑÍÏËÕÔÎÅ ×ÉĦÌÅÎÎÑ"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "ôÅËɠЦĠÆÁÊÁÍÉ ÐÒÉ ÐÅÒÅÇÌÑĦ ÄÅÒÅ×Á"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "ðÅÒÅÊÍÅÎÕ×ÁÎÎÑ ÎÁ Í¦Óæ"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr ""
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "ðÒÉÓËÏÒÅÎÎÑ ÓËÒÏÌÀ×ÁÎÎÑ Ú ËÌÁצÁÔÕÒÉ"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "ëÏÌÅÓÉËÏ ÍÉÛ¦ ÓËÒÏÌÀ¤ ÚÏÂÒÁÖÅÎÎÑ"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+#, fuzzy
+msgid "Custom similarity threshold:"
+msgstr "äÏÄÁÔËÏצ ÔÉÐÉ ÆÁ̦×:"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "òÏÚͦҠÐÏÚÁÅËÒÁÎÎÏÇÏ ÂÕÆÅÒÕ (í ÎÁ ÚÏÂÒÁÖÅÎÎÑ):"
+
+#: src/preferences.c:1291
+#, fuzzy
+msgid "About - GQview"
+msgstr "äÏÐÏÍÏÇÁ - GQview"
+
+#: src/preferences.c:1304
+#, fuzzy, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Copyright (c) 2003 by John Ellis\n"
+"http://gqview.sourceforge.net\n"
+"gqview@users.sourceforge.net\n"
+"\n"
+"Released under the GNU General Public License"
+
+#: src/preferences.c:1322
+#, fuzzy
+msgid "Credits..."
+msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/ïÐæ§..."
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "úÎÑÔÉ ×ÉĦÌÅÎÎÑ"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr ""
+
+#: src/print.c:138
+#, fuzzy
+msgid "Custom printer"
+msgstr "äÏÄÁÔËÏצ ÔÉÐÉ ÆÁ̦×:"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "úÏÂÒÁÖÅÎÎÑ"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr ""
+
+#: src/print.c:353
+msgid "inches"
+msgstr ""
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr ""
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr ""
+
+#: src/print.c:366
+msgid "Letter"
+msgstr ""
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, c-format
+msgid "page %d of %d"
+msgstr ""
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr ""
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, fuzzy, c-format
+msgid "A file with name %s already exists."
+msgstr "æÁÊÌ Ú ÎÁÚ×ÏÀ %s ×ÖÅ ¦ÓÎÕ¤."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "æ¦ÌØÔÒ:"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "÷ÉÄÁÌÉÔÉ ÆÁÊÌÉ"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "äÏÐÏÍÏÇÁ - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "ú×ÉÞÁÊÎÉÊ"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "òÏÚͦÒÉ"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "îÅצÒÎÁ Ã¦ÌØ"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "ðÅÒÅÊÍÅÎÕ×ÁÔÉ:"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "âÅÚ ¦ÍÅΦ"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "î¦ÞÏÇÏ"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "óÏÒÔÕ×ÁÔÉ"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "úÏÂÒÁÖÅÎÎÑ"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "æ¦ÌØÔÒ:"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr ""
+
+#: src/print.c:3432
+msgid "Top:"
+msgstr ""
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "×:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "æ¦ÌØÔÒ:"
+
+#: src/print.c:3450
+#, fuzzy
+msgid "Custom printer:"
+msgstr "äÏÄÁÔËÏצ ÔÉÐÉ ÆÁ̦×:"
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "æ¦ÌØÔÒ:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "æ¦ÌØÔÒ:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "úÁÐÁÍ'ÑÔÏ×Õ×ÁÔÉ ÐÏÚÉæÀ ×¦ËÎÁ"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "ÐÏÍÉÌËÁ ÐÒÉ ÚÂÅÒ¦ÇÁÎΦ ËÏÎƦÇÕÒÁæÊÎÏÇÏ ÆÁÊÌÕ: %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "æÁÊÌÉ"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "äÏÄÁÔÉ ×ͦÓÔ"
+
+#: src/search.c:202
+msgid "results"
+msgstr ""
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "ðÒÏÄÏ×ÖÉÔÉ"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+msgid "greater than"
+msgstr ""
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "æ¦ÌØÔÒ:"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d ÆÁÊ̦נ(%s, %d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%s, %d ÆÁÊ̦×%s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "ðÏÒ¦×ÎÑÎÎÑ..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "÷ÉÂÅÒ¦ÔØ ¦ÓÎÕÀÞÉÊ ËÁÔÁÌÏÇ"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "÷ÉÂÅÒ¦ÔØ ¦ÓÎÕÀÞÉÊ ËÁÔÁÌÏÇ"
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr ""
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "ðÏÒ¦×ÎÑÎÎÑ..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "ðÅÒÅÊÍÅÎÕ×ÁÔÉ:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "æÁÊÌÉ"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "äÏצÌØÎÏ"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "æ¦ÌØÔÒ:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "îÅצÒÎÁ Ã¦ÌØ"
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "äÏÄÁÔÉ ×ͦÓÔ"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "óÈÏÖ¦ÓÔØ"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "äÏצÌØÎÏ"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "îÅ ÍÏÖÕ ÚÁ×ÁÎÔÁÖÉÔɠЦËÔÏÇÒÁÍÕ Ú ËÅÛÁ, ÐÒÏÂÕÀ ÐÅÒÅÓÔ×ÏÒÉÔÉ.\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "îÅ ÍÏÖÕ ÚÁÐÉÓÁÔÉ ÆÁÊÌ ¦ÓÔÏÒ¦§ ×: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr ""
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+#, fuzzy
+msgid "Edit Bookmark"
+msgstr "òÅÄÁËÔÏÒÉ"
+
+#: src/ui_bookmark.c:612
+#, fuzzy
+msgid "Path:"
+msgstr "ûÌÑÈ"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr ""
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "úÎÑÔÉ ×ÉĦÌÅÎÎÑ"
+
+#: src/ui_bookmark.c:718
+#, fuzzy
+msgid "_Properties..."
+msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/ïÐæ§..."
+
+#: src/ui_bookmark.c:720
+#, fuzzy
+msgid "Move _up"
+msgstr "ðÅÒÅÎÅÓÔÉ"
+
+#: src/ui_bookmark.c:722
+#, fuzzy
+msgid "Move _down"
+msgstr "ðÅÒÅÎÅÓÔÉ"
+
+#: src/ui_bookmark.c:724
+#, fuzzy
+msgid "_Remove"
+msgstr "óÔÅÒÔÉ"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"îÅ ÍÏÖÕ ÚÁ×ÁÎÔÁÖÉÔÉ:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "îÅ ×ÄÁÌÏÓÑ ÐÅÒÊÍÅÎÕ×ÁÔÉ %s ÎÁ %s."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"îÅ ÍÏÖÕ ×ÉÄÁÌÉÔÉ ÆÁÊÌ:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "÷ÉÄÁÌÅÎÎÑ ÆÁÌÁ ÎÅ ×ÄÁÌÏÓÑ"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "÷ÉÄÁÌÉÔÉ ÆÁÊÌ"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"ðÒÏ ×ÉÄÁÌÅÎÎÑ ÆÁÊÌÁ:\n"
+" %s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+#, fuzzy
+msgid "_Rename"
+msgstr "ðÅÒÅÊÍÅÎÕ×ÁÔÉ"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+#, fuzzy
+msgid "Add _Bookmark"
+msgstr "òÅÄÁËÔÏÒÉ"
+
+#: src/ui_pathsel.c:636
+#, fuzzy
+msgid "_Delete"
+msgstr "÷ÉÄÁÌÉÔÉ"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "îÏ×ÉÊ ËÁÔÁÌÏÇ..."
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"îÅ ÍÏÖÕ ÓÔ×ÏÒÉÔÉ ËÁÔÁÌÏÇ:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "ðÏÍÉÌËÁ ÓÔ×ÏÒÅÎÎÑ ËÁÔÁÌÏÇÕ"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "÷Ó¦ ÆÁÊÌÉ"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "ðÏËÁÚÁÔÉ ÐÒÉÈÏ×ÁΦ"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "æ¦ÌØÔÒ:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "÷ÉĦÌÉÔÉ ×ÓÅ"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "÷Ó¦ ÆÁÊÌÉ"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "ðÅÒÅÐÉÓÁÔÉ ÆÁÊÌ"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "ðÅÒÅÐÉÓÁÔÉ ÆÁÊÌ"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "ðÅÒÅÐÉÓÁÔÉ ÆÁÊÌ"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "ðÒÏÐÕÓÔÉÔÉ"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "ðÒÏÐÕÓÔÉÔÉ"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "ðÏÍÉÌËÁ ÐÅÒÅÎÅÓÅÎÎÑ ÆÁÊÌÁ"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "îÏ×ÉÊ ËÁÔÁÌÏÇ..."
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+#, fuzzy
+msgid "Auto rename"
+msgstr "îÁÚ×Á ÍÅÎÀ"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "ðÅÒÅÊÍÅÎÕ×ÁÔÉ"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "äÖÅÒÅÌÏ ¦ Ã¦ÌØ ËÏЦÀ×ÁÎÎÑ ÓЦ×ÐÁÄÁÀÔØ"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"îÅ ÍÏÖÕ ÓËÏЦÀ×ÁÔÉ ÆÁÊÌ:\n"
+"%s\n"
+"× ÓÁÍÏÇÏ ÓÅÂÅ."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "äÖÅÒÅÌÏ ¦ Ã¦ÌØ ÐÒÅÎÅÓÅÎÎÑ ÓЦ×ÐÁÄÁÀÔØ"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"îÅ ÍÏÖÕ ÐÅÒÅÎÅÓÔÉ ÆÁÊÌ:\n"
+"%s\n"
+"× ÓÁÍÏÇÏ ÓÅÂÅ."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "ðÒÏÄÏ×ÖÉÔÉ"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "ðÏÍÉÌËÁ ÐÒÉ ËÏЦÀ×ÁÎΦ"
+
+#: src/utilops.c:631
+#, fuzzy, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"îÅ ÍÏÖÕ ÓËÏЦÀ×ÁÔÉ ÆÁÊÌ:\n"
+"%s\n"
+"×:\n"
+"%s\n"
+" Ð¦Ä ÞÁÓ ÂÁÇÁÔÏÅÌÅÍÅÎÔÎÏÇÏ ËÏЦÀ×ÁÎÎÑ."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "ðÏÍÉÌËÁ ÐÅÒÅÎÅÓÅÎÎÑ ÆÁÊÌÁ"
+
+#: src/utilops.c:636
+#, fuzzy, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"îÅ ÍÏÖÕ ÐÅÒÅÎÅÓÔÉ ÆÁÊÌ:\n"
+"%s\n"
+"×:\n"
+"%s\n"
+" Ð¦Ä ÞÁÓ ÂÁÇÁÔÏÅÌÅÍÅÎÔÎÏÇÏ ÐÅÒÅÎÅÓÅÎÎÑ."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "äÖÅÒÅÌÏ ¦ Ã¦ÌØ ÓЦ×ÐÁÄÁÀÔØ"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "äÖÅÒÅÌÏ ¦ Ã¦ÌØ ÃÅ ÏÄÎÅ ¦ ÔÅ Ö, ÏÐÅÒÁæѠÐÒÉÐÉÎÅÎÁ."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"îÅ ÍÏÖÕ ÚËÏЦÀ×ÁÔÉ ÆÁÊÌ:\n"
+"%s\n"
+"×:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"îÅ ÍÏÖÕ ÐÅÒÅÎÅÓÔÉ ÆÁÊÌ:\n"
+"%s\n"
+"×:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "îÅצÒÎÁ Ã¦ÌØ"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"ëÏÌÉ ÏÐÅÒÕ¤ÔÅ ÂÁÇÁÔØÍÁ ÆÁÊÌÁÍÉ, ×ÉÂÅÒ¦ÔØ \n"
+"ËÁÔÁÌÏÇ Á ÎÅ ÆÁÊÌ."
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "÷ÉÂÅÒ¦ÔØ ¦ÓÎÕÀÞÉÊ ËÁÔÁÌÏÇ"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "äÏÐÏÍÏÇÁ - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+#, fuzzy
+msgid "_Copy"
+msgstr "ëÏЦÀ×ÁÔÉ"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr ""
+"ðÅÒÅÊÍÅÎÕ×ÁÔÉ ÆÁÊÌ:\n"
+"%s\n"
+"×:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "úËÏЦÀ×ÁÔÉ ÄÅ˦ÌØËÁ ÆÁÊ̦נ×:"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "äÏÐÏÍÏÇÁ - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+#, fuzzy
+msgid "_Move"
+msgstr "ðÅÒÅÎÅÓÔÉ"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr ""
+"ðÅÒÅÊÍÅÎÕ×ÁÔÉ ÆÁÊÌ:\n"
+"%s\n"
+"×:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "ðÅÒÅÎÅÓÔÉ ÄÅ˦ÌØËÁ ÆÁÊ̦נ×:"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "ðÅÒÅÊÍÅÎÕ×ÁÔÉ:"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "äÖÅÒÅÌÏ ¦ Ã¦ÌØ ÓЦ×ÐÁÄÁÀÔØ"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "÷ÉÄÁÌÅÎÎÑ ÎÅ ×ÄÁÌÏÓÑ"
+
+#: src/utilops.c:1124
+#, fuzzy
+msgid "Unable to remove old file from trash folder"
+msgstr ""
+"îÅ ÍÏÖÕ ÐÅÒÅÎÅÓÔÉ ÆÁÊÌ:\n"
+"%s\n"
+"× ÓÁÍÏÇÏ ÓÅÂÅ."
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "îÅ ÍÏÖÕ ÓÔ×ÏÒÉÔÉ ËÁÔÁÌÏÇ"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr ""
+
+#: src/utilops.c:1212
+#, fuzzy, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"îÅ ÍÏÖÕ ÓÔ×ÏÒÉÔÉ ËÁÔÁÌÏÇ:\n"
+"%s"
+
+#: src/utilops.c:1216
+#, fuzzy
+msgid "Turn off safe delete"
+msgstr "ð¦ÄÔ×ÅÒÄÖÕ×ÁÔÉ ×ÉÄÁÌÅÎÎÑ ÆÁÊÌÁ"
+
+#: src/utilops.c:1234
+#, fuzzy, c-format
+msgid "Safe delete: %s"
+msgstr "ð¦ÄÔ×ÅÒÄÖÕ×ÁÔÉ ×ÉÄÁÌÅÎÎÑ ÆÁÊÌÁ"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"îÅ ÍÏÖÕ ×ÉÄÁÌÉÔÉ ÆÁÊÌ:\n"
+" %s\n"
+" ðÒÏÄÏ×ÖÉÔÉ ×ÉÄÁÌÅÎÎÑ ÆÁÊ̦×?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr ""
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "÷ÉÄÁÌÉÔÉ ÆÁÊÌÉ"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "ðÅÒÅÊÍÅÎÕ×ÁÔÉ ÄÅ˦ÌØËÁ ÆÁÊ̦×:"
+
+#: src/utilops.c:1438
+#, fuzzy, c-format
+msgid "Review %d files"
+msgstr "%d ÆÁÊ̦×"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "÷ÉÄÁÌÉÔÉ ÆÁÊÌ"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "÷ÉÄÁÌÉÔÉ ÆÁÊÌ"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"îÅ ÍÏÖÕ ÐÅÒÅÊÍÅÎÕ×ÁÔÉ ÆÁÊÌ:\n"
+"%s\n"
+"×\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "ðÏÍÉÌËÁ ÐÒÉ ÐÅÒÅÊÍÅÎÕ×ÁÎΦ ÆÁÊÌÁ"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+
+#: src/utilops.c:1809
+#, fuzzy, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr "îÅ ×ÄÁÌÏÓÑ ÐÅÒÊÍÅÎÕ×ÁÔÉ %s ÎÁ %s."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "äÏÐÏÍÏÇÁ - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "ðÅÒÅÊÍÅÎÕ×ÁÔÉ ÄÅ˦ÌØËÁ ÆÁÊ̦×:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr ""
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "ðÅÒÅÊÍÅÎÕ×ÁÔÉ:"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "ðÅÒÅÊÍÅÎÕ×ÁÔÉ:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr ""
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr ""
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr ""
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr ""
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"îÅ ÍÏÖÕ ÐÅÒÅÊÍÅÎÕ×ÁÔÉ ÆÁÊÌ:\n"
+"%s\n"
+"ÎÁ:\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr ""
+"ðÅÒÅÊÍÅÎÕ×ÁÔÉ ÆÁÊÌ:\n"
+"%s\n"
+"×:"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"ëÁÔÁÌÏÇ:\n"
+"%s\n"
+"×ÖÅ ¦ÓÎÕ¤."
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "æÁÊÌÉ"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"ûÌÑÈ:\n"
+"%s\n"
+"×ÖÅ ¦ÓÎÕ¤ ÑË ÆÁÊÌ."
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "äÏÐÏÍÏÇÁ - GQview"
+
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"óÔ×ÏÒÉÔÉ ËÁÔÁÌÏÇ ×:\n"
+"%s\n"
+"Ú ÎÁÚ×ÏÀ:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "ÎÏ×ÉÊ_ËÁÔÁÌÏÇ"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr ""
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+#, fuzzy
+msgid "_Slideshow"
+msgstr "ðÏËÁÚ ÓÌÁÊĦ×"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "òÅËÕÒÓÉ×ÎÏ ÐÏËÁÚÕ×ÁÔÉ ÓÌÁÊÄÉ"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+#, fuzzy
+msgid "Find _duplicates..."
+msgstr "úÎÁÊÔÉ ÄÕÂ̦ËÁÔÉ..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "òÅËÕÒÓÉ×ÎÏ ÚÎÁÊÔÉ ÄÕÂ̦ËÁÔÉ"
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+#, fuzzy
+msgid "_New folder..."
+msgstr "îÏ×ÉÊ ËÁÔÁÌÏÇ..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+#, fuzzy
+msgid "View as _tree"
+msgstr "ðÏËÁÚÁÔÉ ÄÅÒÅ×ÏÍ"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+#, fuzzy
+msgid "Re_fresh"
+msgstr "ïÎÏ×ÉÔÉ"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+#, fuzzy
+msgid "_Sort"
+msgstr "óÏÒÔÕ×ÁÔÉ"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+#, fuzzy
+msgid "View as _icons"
+msgstr "ñˠЦËÔÏÇÒÁÍÉ"
+
+#: src/view_file_list.c:421
+#, fuzzy
+msgid "Show _thumbnails"
+msgstr "ðÏËÁÚÕ×ÁÔɠЦËÔÏÇÒÁÍÉ"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"îÅצÒÎÅ ¦Í'Ñ ÆÁÊÌÕ:\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "÷ÉÔÅÒÔɠЦËÔÏÇÒÁÍÉ"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/æÁÊÌ/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/æÁÊÌ/îÏ×Á ËÏÌÅËæÑ"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/æÁÊÌ/÷¦ÄËÒÉÔÉ ËÏÌÅËæÀ..."
+
+#~ msgid "/File/sep1"
+#~ msgstr "/æÁÊÌ/sep1"
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/æÁÊÌ/ðÅÒÅÊÍÅÎÕ×ÁÔÉ..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/æÁÊÌ/úÎÁÊÔÉ ÄÕÂ̦ËÁÔÉ"
+
+#~ msgid "/File/sep2"
+#~ msgstr "/æÁÊÌ/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/æÁÊÌ/ðÅÒÅÊÍÅÎÕ×ÁÔÉ..."
+
+#, fuzzy
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "îÏ×ÉÊ ËÁÔÁÌÏÇ..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/æÁÊÌ/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/æÁÊÌ/ëÏЦÀ×ÁÔÉ..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/æÁÊÌ/ðÅÒÅÎÅÓÔÉ..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/æÁÊÌ/ðÅÒÅÊÍÅÎÕ×ÁÔÉ..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/æÁÊÌ/÷ÉÄÁÌÉÔÉ..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/æÁÊÌ/sep4"
+
+#, fuzzy
+#~ msgid "/File/C_lose window"
+#~ msgstr "úÁËÒÉÔɠצËÎÏ"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/æÁÊÌ/÷ÉÊÔÉ"
+
+#~ msgid "/_Edit"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/editor8"
+
+#, fuzzy
+#~ msgid "/Edit/editor9"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/editor1"
+
+#, fuzzy
+#~ msgid "/Edit/editor0"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/editor1"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/ð¦ÄÐÒÁ×ÉÔÉ"
+
+#, fuzzy
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/ïÐæ§..."
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/ð¦ÄÐÒÁ×ÉÔÉ/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/ð¦ÄÐÒÁ×ÉÔÉ/ðÏ×ÅÒÎÕÔÉ ÚÁ ÇÏÄÉÎÎÉËÏ×ÏÀ ÓÔÒ¦ÌËÏÀ"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/ð¦ÄÐÒÁ×ÉÔÉ/ðÏ×ÅÒÎÕÔÉ ÐÒÏÔÉ ÇÏÄÉÎÎÉËÏ×ϧ ÓÔÒ¦ÌËÉ"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/ð¦ÄÐÒÁ×ÉÔÉ/ðÏ×ÅÒÎÕÔÉ ÎÁ 180"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/ð¦ÄÐÒÁ×ÉÔÉ/÷¦ÄÚÅÒËÁÌÉÔÉ"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/ð¦ÄÐÒÁ×ÉÔÉ/ðÅÒÅ×ÅÒÎÕÔÉ"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/÷ÉÂÒÁÔÉ ×Ó¦È"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/úÎÑÔÉ ×ÉĦÌÅÎÎÑ"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/ïÐæ§..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/÷ÓÔÁÎÏ×ÉÔÉ ÑË ÔÌÏ"
+
+#~ msgid "/_View"
+#~ msgstr "/÷ÉÇÌÑÄ"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/÷ÉÇÌÑÄ/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/÷ÉÇÌÑÄ/ú¦ÌØÛÉÔÉ"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/÷ÉÇÌÑÄ/úÍÅÎØÛÉÔÉ"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/÷ÉÇÌÑÄ/ïÒÉǦÎÁÌØÎÉÊ ÒÏÚͦÒ"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/÷ÉÇÌÑÄ/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/÷ÉÇÌÑÄ/ð¦ËÔÏÇÒÁÍÉ"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/÷ÉÇÌÑÄ/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/÷ÉÇÌÑÄ/îÁ ×ÅÓØ ÅËÒÁÎ"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/÷ÉÇÌÑÄ/sep3"
+
+#, fuzzy
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/÷ÉÇÌÑÄ/(ðÏËÁÚÁÔÉ)ðÒÉÈÏ×ÁÔÉ ÓÐÉÓÏË ÆÁÊ̦×"
+
+#, fuzzy
+#~ msgid "/View/sep4"
+#~ msgstr "/÷ÉÇÌÑÄ/sep1"
+
+#, fuzzy
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/÷ÉÇÌÑÄ/ú¦ÌØÛÉÔÉ"
+
+#, fuzzy
+#~ msgid "/View/sep5"
+#~ msgstr "/÷ÉÇÌÑÄ/sep1"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/÷ÉÇÌÑÄ/ðÅÒÅÍËÎÕÔÉ ÐÏËÁÚ ÓÌÁÊĦ×"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/÷ÉÇÌÑÄ/ïÎÏ×ÉÔÉ ÓÐÉÓÏË"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/äÏצÄËÁ/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/äÏצÄËÁ/sep1"
+
+#~ msgid "GQview configuration"
+#~ msgstr "ëÏÎƦÇÕÒÁæѠGQview"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/òÅÄÁÇÕ×ÁÎÎÑ/÷ÉÄÁÌÉÔÉ ÓÔÁÒ¦ Ð¦ËÔÏÇÒÁÍÉ"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "ûÌÑÈ"
+
+#~ msgid "Save"
+#~ msgstr "úÁÐÉÓÁÔÉ"
+
+#~ msgid "Close"
+#~ msgstr "úÁËÒÉÔÉ"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "ðÅÒÅÐÉÓÁÔÉ ÆÁÊÌ ËÏÌÅËæ§:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "úÂÅÒÅÇÔÉ ËÏÌÅËæÀ ÑË:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "÷¦ÄËÒÉÔÉ ËÏÌÅËæÀ Ú:"
+
+#~ msgid "Open"
+#~ msgstr "÷¦ÄËÒÉÔÉ"
+
+#~ msgid "Append collection from:"
+#~ msgstr "ðÒɤÄÎÁÔÉ ËÏÌÅËæÀ Ú:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "÷ÉÊÔÉ"
+
+#~ msgid "Exit"
+#~ msgstr "÷ÉÊÔÉ"
+
+#~ msgid "Ok"
+#~ msgstr "çÁÒÁÚÄ"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "îÅצÒÎÅ ¦Í'Ñ ÆÁÊÌÕ"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "ðÒÉ ÓÔÁÒÔ¦ ÐÅÒÅÊÔÉ Õ ÃÅÊ ËÁÔÁÌÏÇ:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "íÁÓÛÔÁÂÕ×ÁÎÎÑ:"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "òÏÚͦÝÕ×ÁÔɠĦÌÏÇɠЦĠÍÉÛÏÀ"
+
+#~ msgid "Include files of type:"
+#~ msgstr "÷ËÌÀÞÁÔÉ ÆÁÌÉ ÔÉÐÕ:"
+
+#~ msgid "Remove"
+#~ msgstr "óÔÅÒÔÉ"
+
+#~ msgid "Command Line"
+#~ msgstr "ëÏÍÁÎÄÎÉÊ ÒÑÄÏË"
+
+#, fuzzy
+#~ msgid "Help"
+#~ msgstr "/äÏצÄËÁ"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "îÁ ÐÏ×ÎÉÊ ÅËÒÁÎ"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "æÁÊÌÉ"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "ðÅÒÅÐÉÓÔÁÉÉ ÆÁÊÌ:\n"
+#~ " %s\n"
+#~ " ÎÁ:\n"
+#~ " %s"
+
+#~ msgid "Yes"
+#~ msgstr "ôÁË"
+
+#~ msgid "Yes to all"
+#~ msgstr "ôÁË ÄÌÑ ×Ó¦È"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "ðÅÒÅÐÉÓÁÔÉ ÆÁÊÌ:\n"
+#~ "%s\n"
+#~ " ÎÁ:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "úËÏЦÀ×ÁÔÉ ÆÁÊÌ:\n"
+#~ "%s\n"
+#~ "×:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "ðÅÒÅÎÅÓÔÉ ÆÁÊÌ:\n"
+#~ "%s\n"
+#~ "×:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "ðÒÏ ×ÉÄÁÌÅÎÎÑ ÄÅ˦ÌØËÏÈ ÆÁÊ̦×..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "ðÅÒÅÐÉÓÁÔÉ ÆÁÊÌ:\n"
+#~ "%s\n"
+#~ "ÐÅÒÅÊÍÅÎÕ×Á×ÛÉ ×:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "×:"
+
+#~ msgid "Create"
+#~ msgstr "óÔ×ÏÒÉÔÉ"
+
+#~ msgid "Initial directory"
+#~ msgstr "ðÏÞÁÔËÏ×ÉÊ ËÁÔÁÌÏÇ"
+
+#~ msgid "New Directory"
+#~ msgstr "îÏ×ÉÊ ËÁÔÁÌÏÇ"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "îÅ ÍÏÖÕ ÓÔ×ÏÒÉÔÉ ËÁÔÁÌÏÇ:\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "ðÏÍÉÌËÁ ÓÔ×ÏÒÅÎÎÑ ËÁÔÁÌÏÇÕ"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "îÅצÒÎÁ Ã¦ÌØ"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/÷ÉÇÌÑÄ/ðÅÒÅÍËÎÕÔÉ ÐÏËÁÚ ÓÌÁÊĦ×"
+
+#~ msgid "Add contents"
+#~ msgstr "äÏÄÁÔÉ ×ͦÓÔ"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "òÅËÕÒÓÉ×ÎÏ ÄÏÄÁÔÉ ×ͦÓÔ"
+
+#~ msgid "Skip directories"
+#~ msgstr "ðÒÏÐÕÓÔÉÔÉ ËÁÔÁÌÏÇÉ"
+
+#~ msgid "Invalid directory"
+#~ msgstr "îÅצÒÎÉÊ ËÁÔÁÌÏÇ"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - ËÏЦÀ×ÁÎÎÑ"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - ÐÅÒÅÎÅÓÅÎÎÑ"
+
+#~ msgid "Directory exists"
+#~ msgstr "ëÁÔÁÌÏÇ ¦ÓÎÕ¤"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - ÎÏ×ÉÊ ËÁÔÁÌÏÇ"
+
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/æÁÊÌ/óÔ×ÏÒÉÔÉ ËÁÔÁÌÏÇ..."
+
+#~ msgid "Edit"
+#~ msgstr "òÅÄÁÇÕ×ÁÔÉ"
+
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "÷ÓÔÁ×ÌÑÔÉ ×ËÉÎÕÔÉÊ ÆÁÊÌ × ÐÏÚÉæÀ ËÕÒÓÏÒÁ"
+
+#~ msgid "File named %s already exists."
+#~ msgstr "æÁÊÌ Ú ÎÁÚ×ÏÀ %s ×ÖÅ ¦ÓÎÕ¤."
+
+#, fuzzy
+#~ msgid "Date:"
+#~ msgstr "äÁÔÁ"
+
+#, fuzzy
+#~ msgid "top"
+#~ msgstr "×:"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQView ÚÁÐÕÝÅÎÏ: %s\n"
+
+#~ msgid "Electric Eyes"
+#~ msgstr "Electric Eyes"
+
+#~ msgid "Apply"
+#~ msgstr "úÁÓÔÏÓÕ×ÁÔÉ"
+
+#~ msgid "format: [.foo;.bar]"
+#~ msgstr "ÆÏÒÍÁÔ: [.ext;.ext]"
diff --git a/po/vi.po b/po/vi.po
new file mode 100644 (file)
index 0000000..212e71e
--- /dev/null
+++ b/po/vi.po
@@ -0,0 +1,3646 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2002 Free Software Foundation, Inc.
+# pclouds <pclouds@vnlinux.org>, 2002.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2004-01-26 22:34+0700\n"
+"Last-Translator: pclouds <pclouds@vnlinux.org>\n"
+"Language-Team: GnomeVI <gnomevi-list@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "Công cụ"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "lỗ ống kính"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "Tên tập tin:"
+
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "Ngày:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "So sánh với:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "Lưu tập ảnh"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr "Thẻ"
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Tên"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "Giá trị"
+
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "Dạng thức"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr "Phần tử"
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "Mô tả"
+
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "Exif"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "Xem nâng cao"
+
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "Lỗi xóa"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Thư mục:\n"
+"%s\n"
+"đã có rồi."
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "Tập ảnh rỗng"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"Lỗi lưu tập ảnh:\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "Lỗi lưu"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "Thêm Đánh dấu"
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "Tập ảnh"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "Tên:"
+
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "Bộ quản lý Sắp xếp"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "Tập tin"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "Tập ảnh"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "Sao chép"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Di chuyển"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d ảnh"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Bỏ chọn"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "Phục hồi ảnh cuối"
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "xong"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "Đang đọc dữ liệu tương tự..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "Đang xóa ảnh mẫu..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "Đang xóa ảnh mẫu cũ..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "Tên tập tin không hợp lệ"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "Lưu lại ảnh mẫu"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "Số bắt đầu"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "Thư mục:"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Bỏ chọn"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "Tên tập tin không hợp lệ"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "đang chạy..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "Đang xóa ảnh mẫu..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Xóa cache"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Thao tác này sẽ xóa mọi ảnh mẫu đã được\n"
+"lưu. Bạn có muốn thực hiện không?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "Thuộc tính ảnh - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview toàn màn hình"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "hành động"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "Xóa"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "Lưu lại ảnh mẫu"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "Hiện ảnh mẫu"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "Đổi tên"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "Không tựa"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "Không tựa (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - Tập ảnh GQview"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "Đóng tập ảnh"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"Tập ảnh đã thay đổi.\n"
+"Lưu trước chứ?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Đường dẫn:\n"
+"%s\n"
+"là thư mục, tập ảnh phải là tập tin"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "Tên tập tin không hợp lệ"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "Ghi đè tập tin"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "Ghi đè tập tin"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "Ghi đè"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "Lưu tập ảnh"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "Mở tập ảnh"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "Thêm vào tập ảnh"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "Thêm vào"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "Tập tin tập ảnh"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "Tập ảnh rỗng"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "Tập ảnh hiện thời rỗng, ngừng lưu."
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "Rỗng"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d ảnh (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d ảnh"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "Đang nạp ảnh mẫu..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "_Xem"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "Xem trong cửa sổ mớ_i"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "_Loại bỏ"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "Thêm từ danh sách tập tin"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "Thêm từ tập ảnh..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "Chọn tất cả"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Bỏ chọn"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "_Thuộc tính"
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "_Sao chép..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "_Di chuyển..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "Đổi _tên..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "_Xóa..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "Hiện _tên tập tin"
+
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "Lư_u tập ảnh"
+
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "Lưu tập ảnh _là..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "_Tìm trùng lặp..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Tập tin/Đổi tê_n..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "Danh sách đã thả xuống có cả thư mục."
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "_Thêm nội dung"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "Thêm nội dung đệ _quy"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "_Bỏ qua thư mục"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "Hủy bỏ"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "Hãy thả tập tin vào để so sánh chúng."
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d tập tin"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "tìm thấy %d trùng lặp trong %d tập tin"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr "[tập 1]"
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "Đang đọc checksum..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "Đang đọc kích thước..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "Đang đọc dữ liệu tương tự..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "Đang so sánh..."
+
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "Đang sắp..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "Chọn nhóm lặp _1 "
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "Chọn nhóm lặp _2"
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Thêm vào tập ảnh mới"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "_Xóa"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "Đón_g cửa sổ"
+
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr "%d tập tin (tập 2)"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "Kích thước"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "Ngày"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "Cỡ"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "Checksum"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "Đường dẫn"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "Tương tự (cao)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "Tương tự"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "Tương tự (thấp)"
+
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "Tương tự (tự chọn)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Tìm trùng lặp - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "So sánh với:"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "So sánh theo:"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "Ảnh mẫu"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "So sánh hai nhóm tập tin"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "Quay jpeg chiều thuận"
+
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "Quay jpeg chiều nghịch"
+
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "đang dừng..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "Kết quả lệnh hiệu chỉnh"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "Kết quả của %s"
+
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"Không thể nạp:\n"
+"%s\n"
+
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "dừng bởi người dùng"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "không biết"
+
+#: src/exif.c:113
+msgid "top left"
+msgstr "đỉnh trái"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "đỉnh phải"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "đáy phải"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "đáy trái"
+
+#: src/exif.c:117
+msgid "left top"
+msgstr "trái đỉnh"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "phải đỉnh"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "phải đáy"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "trái đáy"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "inch"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "centimét"
+
+#: src/exif.c:140
+msgid "average"
+msgstr "trung bình"
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr "trung tâm"
+
+#: src/exif.c:142
+msgid "spot"
+msgstr "chấm"
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr "nhiều chấm"
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr "nhiều đoạn"
+
+#: src/exif.c:145
+msgid "partial"
+msgstr "một phần"
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "khác"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "chưa định nghĩa"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "thủ công"
+
+#: src/exif.c:153
+msgid "normal"
+msgstr "thường"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "lỗ ống kính"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "cửa sập"
+
+#: src/exif.c:156
+msgid "creative"
+msgstr "sáng tạo"
+
+#: src/exif.c:157
+msgid "action"
+msgstr "hành động"
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "ảnh đứng"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "ảnh ngang"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr "ánh sáng ngày"
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr "huỳnh quang"
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr "tungsten (nóng sáng)"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "flash"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "không"
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "có"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr ""
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr ""
+
+#: src/exif.c:289
+msgid "Image description"
+msgstr "Mô tả Ảnh"
+
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "Hướng"
+
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "Bản quyền"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr ""
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr "Nhạy cảm ISO"
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "Ngày gốc"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "Ngày số hóa"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "Tốc độ cửa sập"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "Lỗ ống kính"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr ""
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "Khoảng cách đối tượng"
+
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "Đơn vị đo"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "Nguồn sáng"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "Flash"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "Độ dài tiêu cự"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "Rộng"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "Cao"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "Camera"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "Độ phân giải"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "vô cực"
+
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "kiểu:"
+
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "bật"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "tắt"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "tự động"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr ""
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr ""
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr "giảm thiểu red-eye"
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "chấm"
+
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d byte"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f K"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview toàn màn hình"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "Kích thước tập tin:"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "Phóng vừa khít cửa sổ"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "Phóng _to"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "Thu _nhỏ"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "Phóng _1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "Phóng vừa _khít cửa sổ"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "Đặt làm ảnh _nền"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "_Dừng trình diễn"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "_Tiếp tục trình diễn"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "_Tạm dừng trình diễn"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "_Bắt đầu trình diễn"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "_Thoát chế độ toàn màn hình"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "_Toàn màn hình"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "Đón_g cửa sổ"
+
+#: src/info.c:361
+msgid "File size:"
+msgstr "Kích thước tập tin:"
+
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "Cỡ ảnh:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "Trong suốt:"
+
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "Kích thước ảnh:"
+
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "Tỷ lệ nén:"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "Ngày:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "Chủ sở hữu:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "Nhóm:"
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "Chung"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "Ảnh %d trên %d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "Thuộc tính ảnh - GQview"
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "Xuôi"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " Trình diễn"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " Tạm dừng"
+
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d tập tin (%s, %d)%s"
+
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d tập tin%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d tập tin%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(không có quyền đọc) %s byte"
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s byte"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s byte"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "Công cụ GQview"
+
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "Công cụ"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "Tập tin"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "Ảnh"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(kéo để đổi thứ tự)"
+
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "Ẩn _danh sách tập tin"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "bằng %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "bằng (không biết)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "Rỗng"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/_Tập tin"
+
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "_Hiệu chỉnh"
+
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "Điều _chỉnh"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/Trợ _giúp"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Tập tin/Tạo _cửa sổ mới"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "Lư_u tập ảnh"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "Mở tập ảnh"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Tập tin/Mở _gần đây"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "Đang sắp..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Tập tin/Đổi tê_n..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "Tạo _thư mục mới..."
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Chất lượng"
+
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "_Quay chiều thuận"
+
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "Quay chiều _nghịch"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Quay _180"
+
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "_Phản xạ"
+
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "_Lật"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "Chọn tất cả"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Bỏ chọn"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "_Thuộc tính..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/Xem/Phóng vừa _khít"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "_Toàn màn hình"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "Ẩn _danh sách tập tin"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "_Dừng trình diễn"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "_Cập nhật"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/Trợ giúp/_Giới thiệu"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/Trợ giúp/_Phím tắt"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/Trợ giúp/_Ghi chú về phiên bản này"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "Giới thiệu"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "Ảnh mẫu"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/Xem/_Cây"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/Xem/Danh sách tập tin _rời"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/Xem/Ẩn thanh _công cụ"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "/Xem/Ả_nh"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/Xem/Dữ liệu E_xif"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "Bộ quản lý Sắp xếp"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/Xem/_Danh sách"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "Biểu tượng:"
+
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "Hiện ảnh mẫu"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "Về thư mục home"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Cập nhật danh sách tập tin"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "Phóng to"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "Thu nhỏ"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "Phóng vừa khít cửa sổ"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "Đặt tỷ lệ phóng 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "Cấu hình tùy chọn"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "Điều khiển rời"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "Trợ giúp - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "Dòng lệnh"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Nạp trước ảnh kế"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "Phục hồi ảnh cuối"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Phục hồi ảnh cuối"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "_Thoát chế độ toàn màn hình"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "_Thoát chế độ toàn màn hình"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "_Thoát chế độ toàn màn hình"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "_Dừng trình diễn"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "_Bắt đầu trình diễn"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "_Dừng trình diễn"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "_Bắt đầu trình diễn"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "Công cụ GQview"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr "Đổi tên tập tin:"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "Xem trong cửa sổ mớ_i"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Cách dùng: gqview [tùy chọn] [đường dẫn]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "tùy chọn hợp lệ là:\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           buộc hiển thị công cụ\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        buộc ẩn công cụ\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           chạy trong chế độ toàn màn hình\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            chạy trong chế độ trình diễn\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr "  -l, --list                 mở cửa sổ tập ảnh ở chế độ dòng lệnh\n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr "  -l, --list                 mở cửa sổ tập ảnh ở chế độ dòng lệnh\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    xuất thông tin debug\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              in thông tin về phiên bản\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 hiện thông báo này\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"không hợp lệ hoặc bị bỏ qua: %s\n"
+"Dùng --help để biết các tùy chọn hợp lệ\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "Đang tạo thư mục GQview: %s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "Không thể tạo thư mục: %s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "Nhà"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "Desktop"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - thoát"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "Giới thiệu - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"Tập ảnh đã bị thay đổi mà chưa lưu.\n"
+"Vẫn thoát chứ?"
+
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "Sắp theo kích thước"
+
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "Sắp theo ngày"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "Không sắp"
+
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "Sắp theo đường dẫn"
+
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "Sắp theo số"
+
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "Sắp theo tên"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "Sắp xếp"
+
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "Quay _180"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "Gần nhất (xấu nhất, nhanh nhất)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "Lợp"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Song tuyến tính"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "Hyper (tốt nhất, chậm nhất)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "Không"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "Thường"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "Tốt nhất"
+
+#: src/preferences.c:498 src/print.c:365
+#, fuzzy
+msgid "Custom"
+msgstr "tự động"
+
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "Xóa bộ lọc"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"Hành động này sẽ đặt lại bộ lọc tập tin về mặc định.\n"
+"Bạn có muốn thực hiện không?"
+
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "Đặt lại trình soạn thảo"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"Hành động này sẽ đặt lại lệnh hiệu chỉnh về mặc định.\n"
+"Bạn có muốn thực hiện không?"
+
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "Đổ rác"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "Hành động này sẽ loại bỏ những thứ có trong sọt rác."
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - đổi tên"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "Số bắt đầu"
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "Về thư mục home"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "Thư mục hiện tại"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "Kích thước:"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Chất lượng:"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "Lưu lại ảnh mẫu"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "Lưu ảnh mẫu vào .thumbnails"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Dùng ảnh mẫu xvpics nếu có (chỉ đọc)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "Xem trình diễn"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "Khoảng chờ (giây) trước khi đổi ảnh:"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Ngẫu nhiên"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Lặp lại"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "Phóng to"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "Cách dither:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr "Phóng to/thu nhỏ 2 pha"
+
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "Cho phép phóng to ảnh để vừa khít"
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Độ phóng:"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "Khi ảnh mới được chọn:"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Phóng cỡ ảnh ban đầu"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "Dùng thiết lập sau trước đó"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "Thêm vào"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "Nền đen"
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "Tiếp tục"
+
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "Cập nhật khi tập tin thay đổi"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Nạp trước ảnh kế"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "Tự động quay ảnh dùng thông tin Exif"
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "Cửa sổ"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "Số bắt đầu"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "Nhớ vị trí cửa sổ"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "Nhớ trạng thái cửa sổ (trôi nổi/ẩn)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "Khít cửa sổ vừa ảnh khi ẩn/tách rời công cụ"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "Kích thước giới hạn khi tự chỉnh cỡ cửa sổ (%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "Bố trí"
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "Lọc"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "Hiện các tên bắt đầu bằng dấu chấm"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "Sắp phân biệt hoa/thường"
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "Tắt lọc tập tin"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "Ngày:"
+
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "Bộ lọc"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "Mặc định"
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "Bộ hiệu chỉnh"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "Tên menu"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "Nâng cao"
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "_Toàn màn hình"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "Kích thước ảnh:"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "Xóa"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "Xác nhận xóa tập tin"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "Dùng phím Delete"
+
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "Xóa an toàn"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "Kích thước tối đa (MB)"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "Xem"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Vùng chọn chữ nhật"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr "Thư mục con khi dùng cây"
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "Đổi tên tại chỗ"
+
+#: src/preferences.c:1200
+#, fuzzy
+msgid "Navigation"
+msgstr "hành động"
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "Cuộn bàn phím lũy tiến"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "Dùng mouse wheel cuộn ảnh"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "Ngưỡng tương tự (tự chọn):"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "Kích thước cache offscreen (Mb mỗi ảnh):"
+
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "Giới thiệu - GQview"
+
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"Bản quyền (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Phân phối theo giấy phép GNU GPL"
+
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "Công lao..."
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Bỏ chọn"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+#, fuzzy
+msgid "Default printer"
+msgstr "Mặc định"
+
+#: src/print.c:138
+#, fuzzy
+msgid "Custom printer"
+msgstr "Kiểu tập tin tự chọn:"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "Kích thước ảnh:"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+#, fuzzy
+msgid "centimeters"
+msgstr "centimét"
+
+#: src/print.c:353
+#, fuzzy
+msgid "inches"
+msgstr "inch"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+#, fuzzy
+msgid "Portrait"
+msgstr "ảnh đứng"
+
+#: src/print.c:360
+#, fuzzy
+msgid "Landscape"
+msgstr "ảnh ngang"
+
+#: src/print.c:366
+#, fuzzy
+msgid "Letter"
+msgstr "centimét"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, fuzzy, c-format
+msgid "page %d of %d"
+msgstr "Ảnh %d trên %d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "Xem trước"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "Tập tin tên %s đã có rồi."
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "Bộ lọc"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "Mặc định"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "Giới thiệu - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "Dạng thức"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "Hướng"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "Mô tả"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "Tên tập tin:"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "Không tựa"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "bật"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "Sắp xếp"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "Kích thước ảnh:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "lỗ ống kính"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+#, fuzzy
+msgid "Right:"
+msgstr "Cao"
+
+#: src/print.c:3432
+#, fuzzy
+msgid "Top:"
+msgstr "Nhóm:"
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "thành:"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "Bộ lọc"
+
+#: src/print.c:3450
+#, fuzzy
+msgid "Custom printer:"
+msgstr "Kiểu tập tin tự chọn:"
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "Bộ lọc:"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "Ngày:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "Nhớ vị trí cửa sổ"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "lỗi lưu tập tin cấu hình: %s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "Thư mục:"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Phần tử"
+
+#: src/search.c:202
+#, fuzzy
+msgid "results"
+msgstr "Mặc định"
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "Tiếp tục"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+#, fuzzy
+msgid "greater than"
+msgstr "Tạo ảnh mẫu"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "bộ lọc"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d tập tin (%s, %d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%s, %d tập tin%s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "Đang sắp..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "Vui lòng chọn một thư mục đã có"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "Vui lòng chọn một thư mục đã có"
+
+#: src/search.c:2570
+#, fuzzy
+msgid "Image search - GQview"
+msgstr "Thuộc tính ảnh - GQview"
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "Đang sắp..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "Tên tập tin:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "Kích thước tập tin:"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Ngẫu nhiên"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "Ngày:"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "Mô tả Ảnh"
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Thêm nội dung"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "Tương tự"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Ngẫu nhiên"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "Lỗi nạp ảnh mẫu trong cache, đang thử tạo lại...\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "Không thể lưu danh sách lượt sử vào: %s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "Đánh dấu mới"
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "Sửa đánh dấu"
+
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "Đường dẫn:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "Biểu tượng:"
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Bỏ chọn"
+
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "_Thuộc tính..."
+
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "Chuyển _lên"
+
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "Chuyển _xuống"
+
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "_Loại bỏ"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"Không thể nạp:\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "Lỗi đổi tên tập tin %s thành %s."
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"Không thể xóa tập tin:\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Lỗi xóa tập tin"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "Xóa tập tin"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"Về việc xóa tập tin:\n"
+" %s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "Đổi _tên"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "_Thêm Đánh dấu"
+
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "_Xóa"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "Tạo _thư mục mới..."
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"Không thể tạo thư mục:\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "Lỗi tạo thư mục"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "Mọi tập tin"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "Hiện tập tin ẩn"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "Bộ lọc:"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "Chọn tất cả"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "Mọi tập tin"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "Ghi đè tập tin"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "Ghi đè tập tin"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "Ghi đè tập tin"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Bỏ qua tất cả"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Bỏ qua"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Lỗi di chuyển tập tin"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "Tạo _thư mục mới..."
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "Tự động đổi tên"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "Đổi tên"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "Nguồn sao chép và đích trùng nhau"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Không thể chép tập tin:\n"
+"%s\n"
+"vào chính nó."
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Nguồn di duyển và đích trùng nhau"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"Không thể di chuyển tập tin:\n"
+"%s\n"
+"vào chính nó."
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "Tiếp tục"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "Lỗi sao chép tập tin"
+
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"Không thể chép tập tin:\n"
+"%s\n"
+"thành:\n"
+"%s\n"
+"trong lúc chép nhiều tập tin."
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Lỗi di chuyển tập tin"
+
+#: src/utilops.c:636
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"Không thể di chuyển tập tin:\n"
+"%s\n"
+"thành:\n"
+"%s\n"
+"trong lúc di chuyển nhiều tập tin."
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Nguồn trùng với đích"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Nguồn và đích trùng nhau, thao tác bị hủy bỏ."
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Không thể chép tập tin:\n"
+"%s\n"
+"tới:\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Không thể di chuyển tập tin:\n"
+"%s\n"
+"tới:\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "Đích không hợp lệ"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"Khi muốn thực hiện thao tác này trên nhiều tập tin, vui\n"
+"lòng chọn thư mục thay vì chọn tập tin."
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "Vui lòng chọn một thư mục đã có"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "Trợ giúp - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "_Sao chép"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr "Đổi tên tập tin:"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "Chép nhiều tập tin tới:"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "Trợ giúp - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "_Di chuyển"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr "Đổi tên tập tin:"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "Di chuyền nhiều tập tin tới:"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "Tên tập tin:"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Nguồn trùng với đích"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "Lỗi xóa"
+
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "Không thể di chuyển tập tin cũ vào thư mục Sọt rác"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "Không thể tạo thư mục"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr ""
+
+#: src/utilops.c:1212
+#, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"Không thể truy cập hoặc tạo thư mục Sọt rác.\n"
+"\"%s\""
+
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "Tắt Xóa an toàn"
+
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "Xóa an toàn: %s"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"Không thể xóa tập tin:\n"
+" %s\n"
+" Tiếp tục xóa tập tin khác chứ?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr "Tập tin %d trên %d"
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "Xóa tập tin"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "Đổi tên nhiều tập tin:"
+
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "Xem lại %d tập tin"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "Xóa tập tin"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "Xóa tập tin"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"Không thể đổi tên tập tin:\n"
+"%s\n"
+" thành:\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "Lỗi đổi tên tập tin"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"Không thể tự động đổi tên theo tập số được\n"
+"chọn, có vài tập tin trùng với tên trong\n"
+"danh sách tên sau cùng.\n"
+
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"Lỗi đổi tên\n"
+"%s\n"
+"Số là %d."
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "Trợ giúp - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "Đổi tên nhiều tập tin:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "Tên gốc"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "Tên gốc"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "Đổi tên:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "Chuỗi đầu"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "Số bắt đầu"
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "Chuỗi đuôi"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr "Đệm:"
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"Không thể đổi tên tập tin:\n"
+"%s\n"
+"thành:\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr "Đổi tên tập tin:"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Thư mục:\n"
+"%s\n"
+"đã có rồi."
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "Tập tin"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"Đường dẫn:\n"
+"%s\n"
+"là một tập tin."
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "Trợ giúp - GQview"
+
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"Tạo thư mục trong:\n"
+"%s\n"
+"với tên:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "new_folder"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "_Về thư mục cha"
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "_Trình diễn"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "Trình diễn đệ quy"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "_Tìm trùng lặp..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "Tìm lặp truy hồi..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "Tạo _thư mục mới..."
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "Xem dạng _cây"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "_Cập nhật"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "_Sắp xếp"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "Xem dạng ả_nh"
+
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "Hiện ảnh _mẫu"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"Tên tập tin không hợp lệ:\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "Xóa ảnh mẫu"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/Tập tin/tear1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/Tập tin/Tạo tập ảnh mớ_i"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Tập tin/_Mở tập ảnh..."
+
+#~ msgid "/File/sep1"
+#~ msgstr "/Tập tin/sep1"
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/Tập tin/Đổi tê_n..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Tập tin/Tìm trùng _lặp..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Tập tin/sep2"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Tập tin/Đổi tê_n..."
+
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Tập tin/Tạo thư mục mớ_i..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Tập tin/sep3"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Tập tin/_Sao chép..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Tập tin/_Di chuyển..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Tập tin/Đổi tê_n..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Tập tin/_Xóa..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Tập tin/sep4"
+
+#~ msgid "/File/C_lose window"
+#~ msgstr "/Tập tin/Đóng cửa sổ"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Tập tin/T_hoát"
+
+#~ msgid "/_Edit"
+#~ msgstr "/_Hiệu chỉnh"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/Hiệu chỉnh/tear1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/Hiệu chỉnh/editor1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/Hiệu chỉnh/editor2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/Hiệu chỉnh/editor3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/Hiệu chỉnh/editor4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/Hiệu chỉnh/editor5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/Hiệu chỉnh/editor6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/Hiệu chỉnh/editor7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/Hiệu chỉnh/editor8"
+
+#~ msgid "/Edit/editor9"
+#~ msgstr "/Hiệu chỉnh/editor9"
+
+#~ msgid "/Edit/editor0"
+#~ msgstr "/Hiệu chỉnh/editor0"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/Hiệu chỉnh/sep1"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/Hiệu chỉnh/_Chỉnh"
+
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/Hiệu chỉnh/T_huộc tính..."
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/Hiệu chỉnh/Chỉnh/tear1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/Hiệu chỉnh/Chỉnh/_Quay chiều thuận"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/Hiệu chỉnh/Chỉnh/Quay chiều n_ghịch"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/Hiệu chỉnh/Chỉnh/Quay 1_80"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/Hiệu chỉnh/Chỉnh/_Phản chiếu"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/Hiệu chỉnh/Chỉnh/_Lật"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/Hiệu chỉnh/sep2"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/Hiệu chỉnh/Chọn _tất cả"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/Hiệu chỉnh/_Bỏ chọn"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/Hiệu chỉnh/sep3"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/Hiệu chỉnh/Tù_y chọn..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/Hiệu chỉnh/sep4"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/Hiệu chỉnh/Đặt làm ảnh _nền"
+
+#~ msgid "/_View"
+#~ msgstr "/_Xem"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/Xem/tear1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/Xem/Phóng _to"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/Xem/Thu _nhỏ"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/Xem/Phóng _1:1"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/Xem/sep1"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/Xem/Ảnh mẫ_u"
+
+#~ msgid "/View/I_cons"
+#~ msgstr "/Xem/Ả_nh"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/Xem/sep2"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/Xem/Toàn _màn hình"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/Xem/sep3"
+
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/Xem/Ẩn _danh sách tập tin"
+
+#~ msgid "/View/sep4"
+#~ msgstr "/View/sep4"
+
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/Xem/Bộ quản lý _sắp xếp"
+
+#~ msgid "/View/sep5"
+#~ msgstr "/Xem/sẹp"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/Xem/Bật tắt trình _diễn"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/Xem/_Cập nhật danh sách"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/Trợ giúp/tear1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/Trợ giúp/sep1"
+
+#~ msgid "/Help/_About"
+#~ msgstr "/Trợ giúp/_Giới thiệu"
+
+#~ msgid "GQview configuration"
+#~ msgstr "Cấu hình GQview"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/Hiệu chỉnh/_Loại bỏ ảnh mẫu cũ"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "Đường dẫn"
+
+#~ msgid "Save"
+#~ msgstr "Lưu"
+
+#~ msgid "Close"
+#~ msgstr "Đóng"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Ghi đè tập ảnh:\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "Lưu tập ảnh là:"
+
+#~ msgid "Open collection from:"
+#~ msgstr "Mở tập ảnh từ:"
+
+#~ msgid "Open"
+#~ msgstr "Mở"
+
+#~ msgid "Append collection from:"
+#~ msgstr "Thêm vào tập ảnh từ:"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Thoát"
+
+#~ msgid "Exit"
+#~ msgstr "Thoát"
+
+#~ msgid "Ok"
+#~ msgstr "Ok"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "Tên tập tin không hợp lệ"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "Lúc khởi động, chuyển tới thư mục:"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Co dãn:"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "Đặt hộp thoại dưới con chuột"
+
+#~ msgid "Include files of type:"
+#~ msgstr "Bao gồm các tập tin loại:"
+
+#~ msgid "Remove"
+#~ msgstr "Loại bỏ"
+
+#~ msgid "Add"
+#~ msgstr "Thêm"
+
+#~ msgid "Command Line"
+#~ msgstr "Dòng lệnh"
+
+#~ msgid "Help"
+#~ msgstr "Trợ giúp"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "_Toàn màn hình"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "Kích thước tập tin:"
+
+#, fuzzy
+#~ msgid "Width:"
+#~ msgstr "Rộng"
+
+#, fuzzy
+#~ msgid "Height:"
+#~ msgstr "Cao"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "Ghi đè tập tin:\n"
+#~ " %s\n"
+#~ " bằng:\n"
+#~ " %s"
+
+#~ msgid "Yes"
+#~ msgstr "Có"
+
+#~ msgid "Yes to all"
+#~ msgstr "Có (toàn bộ)"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Ghi đè tập tin:\n"
+#~ "%s\n"
+#~ " bằng:\n"
+#~ "%s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Chép tập tin:\n"
+#~ "%s\n"
+#~ "tới:"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "Di chuyển tập tin:\n"
+#~ "%s\n"
+#~ "tới:"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "Về việc xóa nhiều tập tin..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Ghi đè tập tin:\n"
+#~ "%s\n"
+#~ "bằng cách đổi tên:\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "thành:"
+
+#~ msgid "Create"
+#~ msgstr "Tạo"
+
+#~ msgid "Initial directory"
+#~ msgstr "Thư mục ban đầu"
+
+#~ msgid "New Directory"
+#~ msgstr "Tạo thư mục mới"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Không thể tạo thư mục:\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "Lỗi tạo thư mục"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "Mô tả Ảnh"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/Xem/Bật tắt trình _diễn"
+
+#~ msgid "Add contents"
+#~ msgstr "Thêm nội dung"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "Thêm nội dung đệ quy"
+
+#~ msgid "Skip directories"
+#~ msgstr "Bỏ qua thư mục"
+
+#~ msgid "Invalid directory"
+#~ msgstr "Thư mục không hợp lệ"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - sao chép"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - di chuyển"
+
+#~ msgid "Directory exists"
+#~ msgstr "Thư mục đã có"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - thư mục mới"
+
+#~ msgid "Misc."
+#~ msgstr "Linh tinh."
+
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/Tập tin/Tạ_o thư mục..."
+
+#~ msgid "Edit"
+#~ msgstr "Sửa"
+
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "Chèn tập tin được thả tại vị trí con trỏ"
+
+#~ msgid "File named %s already exists."
+#~ msgstr "Tập tin tên %s đã có rồi."
+
+#~ msgid "Date:"
+#~ msgstr "Ngày:"
+
+#~ msgid "top"
+#~ msgstr "đỉnh"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview đang chạy: %s\n"
+
+#~ msgid "Electric Eyes"
+#~ msgstr "Electric Eyes"
+
+#~ msgid "Apply"
+#~ msgstr "Áp dụng"
+
+#~ msgid "format: [.foo;.bar]"
+#~ msgstr "định dạng: [.foo;.bar]"
+
+#~ msgid "create dir failed: %s\n"
+#~ msgstr "lỗi tạo thư mục: %s\n"
+
+#~ msgid "Unable to delete dir: %s\n"
+#~ msgstr "Không thể xóa tập tin: %s\n"
+
+#~ msgid "failed to delete:%s\n"
+#~ msgstr "lỗi xóa:%s\n"
+
+#~ msgid "External Editors"
+#~ msgstr "Bộ hiệu chỉnh ngoại"
+
+#~ msgid "     Ok     "
+#~ msgstr "     Ok     "
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Ghi đè tập tin:\n"
+#~ "%s\n"
+#~ "bằng:\n"
+#~ "%s"
diff --git a/po/zh_CN.GB2312.po b/po/zh_CN.GB2312.po
new file mode 100644 (file)
index 0000000..ee2d616
--- /dev/null
@@ -0,0 +1,3721 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview 0.9.5\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2001-02-21 17:46+0800\n"
+"Last-Translator: Wu Yulun <migr@operamail.com>\n"
+"Language-Team: Chinese <i18n-chinese@egroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=gb2312\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "ƽÆÌ"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "ÈÕÆÚ"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+#, fuzzy
+msgid "Filename:"
+msgstr "ÖØÃüÃû£º"
+
+#: src/bar_info.c:1007 src/info.c:360
+#, fuzzy
+msgid "File date:"
+msgstr "¹ýÂËÆ÷£º"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "ÓëÖ®±È½Ï£º"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "±£´æͼÏñ¼¯"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr ""
+
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "Ãû³Æ"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr ""
+
+#: src/bar_exif.c:426
+#, fuzzy
+msgid "Format"
+msgstr "ÆÕͨ"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr ""
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr ""
+
+#: src/bar_exif.c:549 src/info.c:105
+#, fuzzy
+msgid "Exif"
+msgstr "Í˳ö"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr ""
+
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "ɾ³ýʧ°Ü"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Ŀ¼£º\n"
+"%s\n"
+"ÒÑ´æÔÚ¡£"
+
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "ͼÏñ¼¯Îª¿Õ"
+
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"±£´æͼÏñ¼¯Ê§°Ü£º\n"
+"%s"
+
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "±£´æʧ°Ü"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr ""
+
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "ͼÏñ¼¯"
+
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+#, fuzzy
+msgid "Name:"
+msgstr "Ãû³Æ"
+
+#: src/bar_sort.c:569
+#, fuzzy
+msgid "Sort Manager"
+msgstr "°´Ãû³ÆÅÅÐò"
+
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+#, fuzzy
+msgid "Folders"
+msgstr "ƽÆÌ"
+
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "ͼÏñ¼¯"
+
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "¸´ÖÆ"
+
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "Òƶ¯"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d Í¼Ïñ"
+
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "Çå³ýËùÓÐÑ¡Ôñ"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr ""
+
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+#, fuzzy
+msgid "done"
+msgstr "ÎÞ"
+
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "ÕýÔÚ¶ÁÈ¡ÏàËÆÐÔÊý¾Ý..."
+
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "ÕýÔÚÇå³ýËõÂÔͼ..."
+
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "ÕýÔÚÇå³ý¾ÉµÄËõÂÔͼ..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "·Ç·¨ÎļþÃû"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "»º´æËõÂÔͼ"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "ÈÕÆÚ"
+
+#: src/cache_maint.c:842 src/preferences.c:1165
+#, fuzzy
+msgid "Folder:"
+msgstr "ƽÆÌ"
+
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "Çå³ýËùÓÐÑ¡Ôñ"
+
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "·Ç·¨ÎļþÃû"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+#: src/cache_maint.c:997 src/editors.c:549
+#, fuzzy
+msgid "running..."
+msgstr "ÕýÔڱȽÏ..."
+
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "ÕýÔÚÇå³ýËõÂÔͼ..."
+
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "Çå³ý»º³åÇø"
+
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr ""
+"Õ⽫ɾ³ý±£´æµ½´ÅÅÌÉϵÄ\n"
+"ËùÓÐËõÂÔͼ£¬¼ÌÐø£¿"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "ÇóÖú - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview È«ÆÁ"
+
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "ͼÏñ¼¯"
+
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "Çå³ý"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "»º´æËõÂÔͼ"
+
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "»º´æËõÂÔͼ"
+
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "ÖØÃüÃû"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "ÎÞ±êÌâ"
+
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "ÎÞ±êÌâ (%d)"
+
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - GQview Í¼Ïñ¼¯"
+
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "¹Ø±ÕͼÏñ¼¯"
+
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"ͼÏñ¼¯ÒÑÐ޸ġ£\n"
+"Ê×Ïȱ£´æËü£¿"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"Ö¸¶¨Â·¾¶£º\n"
+"%s\n"
+"ÊǸöĿ¼£¬µ«Í¼Ïñ¼¯ÊÇÎļþ"
+
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "·Ç·¨ÎļþÃû"
+
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "¸²¸ÇÎļþ"
+
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "¸²¸ÇÎļþ"
+
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "¸²¸Ç"
+
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "±£´æͼÏñ¼¯"
+
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "´ò¿ªÍ¼Ïñ¼¯"
+
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "×·¼ÓͼÏñ¼¯"
+
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "×·¼Ó"
+
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "ͼÏñ¼¯Îļþ"
+
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "ͼÏñ¼¯Îª¿Õ"
+
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "µ±Ç°Í¼Ïñ¼¯Îª¿Õ£¬·ÅÆú±£´æ¡£"
+
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "¿Õ"
+
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d Í¼Ïñ (%d)"
+
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d Í¼Ïñ"
+
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "ÕýÔÚ×°ÈëËõÂÔͼ..."
+
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+#, fuzzy
+msgid "_View"
+msgstr "/²é¿´(_V)"
+
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+#, fuzzy
+msgid "View in _new window"
+msgstr "ÔÚд°¿ÚÖв鿴"
+
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+#, fuzzy
+msgid "Rem_ove"
+msgstr "ɾ³ý"
+
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "´ÓÎļþÁбíÖÐ×·¼Ó"
+
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "´ÓͼÏñ¼¯ÖÐ×·¼Ó..."
+
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "ȫѡ"
+
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "Çå³ýËùÓÐÑ¡Ôñ"
+
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+#, fuzzy
+msgid "_Properties"
+msgstr "/±à¼­/Ñ¡Ïî(_O)..."
+
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+#, fuzzy
+msgid "_Copy..."
+msgstr "¸´ÖÆ..."
+
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+#, fuzzy
+msgid "_Move..."
+msgstr "Òƶ¯..."
+
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+#, fuzzy
+msgid "_Rename..."
+msgstr "ÖØÃüÃû..."
+
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+#, fuzzy
+msgid "_Delete..."
+msgstr "ɾ³ý..."
+
+#: src/collect-table.c:810 src/view_file_icon.c:309
+#, fuzzy
+msgid "Show filename _text"
+msgstr "ÏÔʾÒþ²ØÎļþ"
+
+#: src/collect-table.c:813
+#, fuzzy
+msgid "_Save collection"
+msgstr "±£´æͼÏñ¼¯"
+
+#: src/collect-table.c:815
+#, fuzzy
+msgid "Save collection _as..."
+msgstr "½«Í¼Ïñ¼¯Áí´æΪ..."
+
+#: src/collect-table.c:818 src/layout_util.c:759
+#, fuzzy
+msgid "_Find duplicates..."
+msgstr "Ñ°ÕÒ¸±±¾..."
+
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/Îļþ/ÖØÃüÃû(_R)..."
+
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "ÍÏ·ÅÁÐ±íº¬ÓÐĿ¼¡£"
+
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+#, fuzzy
+msgid "_Add contents"
+msgstr "Ìí¼ÓÄÚÈÝ"
+
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+#, fuzzy
+msgid "Add contents _recursive"
+msgstr "µÝ¹éÌí¼ÓÄÚÈÝ"
+
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "ºöÂÔĿ¼"
+
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "È¡Ïû"
+
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "ÍÏ·ÅÎļþÒԱȽÏËüÃÇ¡£"
+
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d Îļþ"
+
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "ÔÚ %2$d ¸öÎļþÖÐÕÒµ½ %1$d ¸öÆ¥Åä"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr ""
+
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "ÕýÔÚ¶ÁȡУÑéºÍ..."
+
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "ÕýÔÚ¶ÁÈ¡³ß´ç..."
+
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "ÕýÔÚ¶ÁÈ¡ÏàËÆÐÔÊý¾Ý..."
+
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "ÕýÔڱȽÏ..."
+
+#: src/dupe.c:1535
+#, fuzzy
+msgid "Sorting..."
+msgstr "ÕýÔڱȽÏ..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr ""
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr ""
+
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "Ìí¼Óµ½ÐÂͼÏñ¼¯"
+
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+#, fuzzy
+msgid "C_lear"
+msgstr "Çå³ý"
+
+#: src/dupe.c:2224 src/dupe.c:2512
+#, fuzzy
+msgid "Close _window"
+msgstr "¹Ø±Õ´°¿Ú"
+
+#: src/dupe.c:2382
+#, fuzzy, c-format
+msgid "%d files (set 2)"
+msgstr "%d Îļþ%s"
+
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "´óС"
+
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "ÈÕÆÚ"
+
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "³ß´ç"
+
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "УÑéºÍ"
+
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "·¾¶"
+
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "ÏàËÆÐÔ (¸ß)"
+
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "ÏàËÆÐÔ"
+
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "ÏàËÆÐÔ (µÍ)"
+
+#: src/dupe.c:2598
+#, fuzzy
+msgid "Similarity (custom)"
+msgstr "ÏàËÆÐÔ (µÍ)"
+
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "Îļþ¸´ÖÆ - GQview"
+
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "ÓëÖ®±È½Ï£º"
+
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "ÒÀ´Ë±È½Ï£º"
+
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "ËõÂÔͼ"
+
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "±È½ÏÁ½¸öÎļþ¼¯"
+
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "Gimp"
+
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+#: src/editors.c:58
+#, fuzzy
+msgid "Rotate jpeg clockwise"
+msgstr "˳ʱÕëÐýת"
+
+#: src/editors.c:59
+#, fuzzy
+msgid "Rotate jpeg counterclockwise"
+msgstr "ÄæʱÕëÐýת"
+
+#: src/editors.c:104
+#, fuzzy
+msgid "stopping..."
+msgstr "ÕýÔڱȽÏ..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr ""
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr ""
+
+#: src/editors.c:303
+#, fuzzy, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"ÎÞ·¨×°È룺\n"
+"%s"
+
+#: src/editors.c:414
+#, fuzzy
+msgid "stopped by user"
+msgstr "°´±àºÅÅÅÐò"
+
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+#, fuzzy
+msgid "unknown"
+msgstr "ÔÚ (δ֪)..."
+
+#: src/exif.c:113
+#, fuzzy
+msgid "top left"
+msgstr "ɾ³ý"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr ""
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr ""
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr ""
+
+#: src/exif.c:117
+#, fuzzy
+msgid "left top"
+msgstr "ɾ³ý"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr ""
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr ""
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr ""
+
+#: src/exif.c:127
+msgid "inch"
+msgstr ""
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr ""
+
+#: src/exif.c:140
+msgid "average"
+msgstr ""
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr ""
+
+#: src/exif.c:142
+msgid "spot"
+msgstr ""
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr ""
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr ""
+
+#: src/exif.c:145
+msgid "partial"
+msgstr ""
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr ""
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr ""
+
+#: src/exif.c:152
+msgid "manual"
+msgstr ""
+
+#: src/exif.c:153
+#, fuzzy
+msgid "normal"
+msgstr "ÆÕͨ"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr ""
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr ""
+
+#: src/exif.c:156
+#, fuzzy
+msgid "creative"
+msgstr "´´½¨"
+
+#: src/exif.c:157
+msgid "action"
+msgstr ""
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr ""
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr ""
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr ""
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr ""
+
+#: src/exif.c:167
+msgid "tungsten (incandescent)"
+msgstr ""
+
+#: src/exif.c:168
+msgid "flash"
+msgstr ""
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr ""
+
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+#, fuzzy
+msgid "yes"
+msgstr "ÊÇ"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr ""
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr ""
+
+#: src/exif.c:289
+#, fuzzy
+msgid "Image description"
+msgstr "ÎÞЧµÄÄ¿±ê"
+
+#: src/exif.c:292
+#, fuzzy
+msgid "Orientation"
+msgstr "³ß´ç"
+
+#: src/exif.c:303
+#, fuzzy
+msgid "Copyright"
+msgstr "¸´ÖÆ"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr ""
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr ""
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr ""
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr ""
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr ""
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr ""
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr ""
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr ""
+
+#: src/exif.c:323
+#, fuzzy
+msgid "Metering mode"
+msgstr "¶¶¶¯·½·¨£º"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr ""
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr ""
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr ""
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr ""
+
+#: src/exif.c:337
+msgid "Height"
+msgstr ""
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr ""
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr ""
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr ""
+
+#: src/exif.c:1479
+#, fuzzy
+msgid "mode:"
+msgstr "ƽÆÌ"
+
+#: src/exif.c:1483 src/utilops.c:1234
+#, fuzzy
+msgid "on"
+msgstr "ÎÞ"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr ""
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr ""
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr ""
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr ""
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr ""
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr ""
+
+#: src/filelist.c:513
+#, fuzzy, c-format
+msgid "%d bytes"
+msgstr "%d Îļþ"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr ""
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr ""
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr ""
+
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview È«ÆÁ"
+
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "ƽÆÌ"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "½«Í¼ÏñÌîÂú´°¿Ú"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+#, fuzzy
+msgid "Zoom _in"
+msgstr "·Å´ó"
+
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+#, fuzzy
+msgid "Zoom _out"
+msgstr "ËõС"
+
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+#, fuzzy
+msgid "Zoom _1:1"
+msgstr "Ëõ·Åµ½ 1:1"
+
+#: src/img-view.c:1176 src/layout_image.c:709
+#, fuzzy
+msgid "Fit image to _window"
+msgstr "½«Í¼ÏñÌîÂú´°¿Ú"
+
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+#, fuzzy
+msgid "Set as _wallpaper"
+msgstr "ÉèÖÃΪǽֽ"
+
+#: src/img-view.c:1199 src/layout_image.c:740
+#, fuzzy
+msgid "_Stop slideshow"
+msgstr "Í£Ö¹²¥·Å»ÃµÆƬ"
+
+#: src/img-view.c:1202 src/layout_image.c:743
+#, fuzzy
+msgid "Continue slides_how"
+msgstr "¼ÌÐø²¥·Å»ÃµÆƬ"
+
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+#, fuzzy
+msgid "Pause slides_how"
+msgstr "ÔÝÍ£²¥·Å»ÃµÆƬ"
+
+#: src/img-view.c:1213 src/layout_image.c:754
+#, fuzzy
+msgid "_Start slideshow"
+msgstr "¿ªÊ¼²¥·Å»ÃµÆƬ"
+
+#: src/img-view.c:1221 src/layout_image.c:765
+#, fuzzy
+msgid "Exit _full screen"
+msgstr "Í˳öÈ«ÆÁ"
+
+#: src/img-view.c:1225 src/layout_image.c:761
+#, fuzzy
+msgid "_Full screen"
+msgstr "È«ÆÁ"
+
+#: src/img-view.c:1229 src/layout_util.c:766
+#, fuzzy
+msgid "C_lose window"
+msgstr "¹Ø±Õ´°¿Ú"
+
+#: src/info.c:361
+#, fuzzy
+msgid "File size:"
+msgstr "ƽÆÌ"
+
+#: src/info.c:363
+#, fuzzy
+msgid "Dimensions:"
+msgstr "³ß´ç"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr ""
+
+#: src/info.c:365 src/print.c:3371
+#, fuzzy
+msgid "Image size:"
+msgstr "ͼÏñ"
+
+#: src/info.c:367
+#, fuzzy
+msgid "Compress ratio:"
+msgstr "ÓëÖ®±È½Ï£º"
+
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "¹ýÂËÆ÷£º"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr ""
+
+#: src/info.c:371
+msgid "Group:"
+msgstr ""
+
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "³£¹æ"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr ""
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr ""
+
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "ÉýÐò"
+
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " »ÃµÆƬ"
+
+#: src/layout.c:341
+msgid " Paused"
+msgstr " ÒÑÔÝÍ£"
+
+#: src/layout.c:358
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%d Îļþ (%d)%s"
+
+#: src/layout.c:365
+#, fuzzy, c-format
+msgid "%s, %d files%s"
+msgstr "%d Îļþ%s"
+
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d Îļþ%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr ""
+
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s ×Ö½Ú"
+
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s ×Ö½Ú"
+
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview ¹¤¾ßÀ¸"
+
+#: src/layout_config.c:57
+#, fuzzy
+msgid "Tools"
+msgstr "ƽÆÌ"
+
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+#, fuzzy
+msgid "Files"
+msgstr "ƽÆÌ"
+
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "ͼÏñ"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr ""
+
+#: src/layout_image.c:770
+#, fuzzy
+msgid "Hide file _list"
+msgstr "(²»)Òþ²ØÎļþÁбí"
+
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "ÔÚ %s..."
+
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "ÔÚ (δ֪)..."
+
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "¿Õ"
+
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/Îļþ(_F)"
+
+#: src/layout_util.c:749 src/menu.c:91
+#, fuzzy
+msgid "_Edit"
+msgstr "/±à¼­(_E)"
+
+#: src/layout_util.c:750 src/menu.c:248
+#, fuzzy
+msgid "_Adjust"
+msgstr "µ÷Õû"
+
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/ÇóÖú(_H)"
+
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/Îļþ/ÐÂͼÏñ¼¯"
+
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "±£´æͼÏñ¼¯"
+
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "´ò¿ªÍ¼Ïñ¼¯"
+
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/Îļþ/´ò¿ª½üÆÚ·ÃÎÊÄÚÈÝ(_R)"
+
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "ÕýÔڱȽÏ..."
+
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/Îļþ/ÖØÃüÃû(_R)..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "ÇóÖú - GQview"
+
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "Æ·ÖÊ"
+
+#: src/layout_util.c:779 src/menu.c:194
+#, fuzzy
+msgid "_Rotate clockwise"
+msgstr "˳ʱÕëÐýת"
+
+#: src/layout_util.c:780 src/menu.c:197
+#, fuzzy
+msgid "Rotate _counterclockwise"
+msgstr "ÄæʱÕëÐýת"
+
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "Ðýת 180 ¶È"
+
+#: src/layout_util.c:782 src/menu.c:203
+#, fuzzy
+msgid "_Mirror"
+msgstr "¾µÏñ"
+
+#: src/layout_util.c:783 src/menu.c:206
+#, fuzzy
+msgid "_Flip"
+msgstr "·­×ª"
+
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "ȫѡ"
+
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "Çå³ýËùÓÐÑ¡Ôñ"
+
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "/±à¼­/Ñ¡Ïî(_O)..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/²é¿´/Ëõ·Åµ½Êʵ±´óС(_Z)"
+
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "È«ÆÁ"
+
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "(²»)Òþ²ØÎļþÁбí"
+
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "Í£Ö¹²¥·Å»ÃµÆƬ"
+
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "Ë¢ÐÂ"
+
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/ÇóÖú/¹ØÓÚ(_A)"
+
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/ÇóÖú/¼üÅÌ¿ì½Ý¼ü(_K)"
+
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/ÇóÖú/·¢ÐÐ˵Ã÷(_R)"
+
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "¹ØÓÚ"
+
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "ËõÂÔͼ"
+
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/²é¿´/µÚÈý¶Î"
+
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/²é¿´/(²»)¸¡¶¯ÎļþÁбí(_F)"
+
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/²é¿´/Ƭ¶Î1"
+
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "³ß´ç"
+
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/²é¿´/¸üÐÂÁбí(_R)"
+
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "°´Ãû³ÆÅÅÐò"
+
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/²é¿´/¸üÐÂÁбí(_R)"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "³ß´ç"
+
+#: src/layout_util.c:1083
+#, fuzzy
+msgid "Show thumbnails"
+msgstr "»º´æËõÂÔͼ"
+
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "»Øµ½¼ÒĿ¼"
+
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "Ë¢ÐÂÎļþÁбí"
+
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "·Å´ó"
+
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "ËõС"
+
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "½«Í¼ÏñÌîÂú´°¿Ú"
+
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "ÉèÖñÈÀý 1:1"
+
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "ÅäÖÃÑ¡Ïî"
+
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "¸¡¶¯¿ØÖÆ"
+
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "ÇóÖú - GQview"
+
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "ÃüÁîÐÐ"
+
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "Ô¤ÏÈ×°ÈëÏÂÒ»ÕÅͼ"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "%d Í¼Ïñ"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "Ô¤ÏÈ×°ÈëÏÂÒ»ÕÅͼ"
+
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "Í˳öÈ«ÆÁ"
+
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "Í˳öÈ«ÆÁ"
+
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "Í˳öÈ«ÆÁ"
+
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "Í£Ö¹²¥·Å»ÃµÆƬ"
+
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "¿ªÊ¼²¥·Å»ÃµÆƬ"
+
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "Í£Ö¹²¥·Å»ÃµÆƬ"
+
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "¿ªÊ¼²¥·Å»ÃµÆƬ"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview ¹¤¾ßÀ¸"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr ""
+"½«Îļþ£º\n"
+"%s\n"
+"ÖØÃüÃûΪ£º"
+
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "ÔÚд°¿ÚÖв鿴"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"Ó÷¨: gqview [Ñ¡Ïî] [·¾¶]\n"
+"\n"
+
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "ÓÐЧµÄÑ¡ÏîΪ£º\n"
+
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           Ç¿ÐÐÏÔʾ¹¤¾ß\n"
+
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        Ç¿ÐÐÒþ²Ø¹¤¾ß\n"
+
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           ÒÔÈ«ÆÁģʽÆô¶¯\n"
+
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slidehosw            ÒԻõÆģʽÆô¶¯\n"
+
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr "  -l, --list                 ÎªÃüÁîÐпªÆôͼÏñ¼¯´°¿Ú\n"
+
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr "  -l, --list                 ÎªÃüÁîÐпªÆôͼÏñ¼¯´°¿Ú\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    ´ò¿ªµ÷ÊÔÐÅÏ¢Êä³ö\n"
+
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              ´òÓ¡°æ±¾ÐÅÏ¢\n"
+
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 ÏÔʾ¸ÃÏûÏ¢\n"
+"\n"
+
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"ÎÞЧ»òºöÂÔ£º%s\n"
+"ʹÓà--help ²é¿´Ñ¡Ïî\n"
+
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "ÕýÔÚ´´½¨ GQview Ä¿Â¼£º%s\n"
+
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "ÎÞ·¨´´½¨Ä¿Â¼£º%s\n"
+
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "¼Ò"
+
+#: src/main.c:1063 src/ui_bookmark.c:865
+#, fuzzy
+msgid "Desktop"
+msgstr "µ½£º"
+
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - Í˳ö"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "ÇóÖú - GQview"
+
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"ͼÏñ¼¯ÒѾ­±»¸Ä±ä¡£\n"
+"Ç¿ÐÐÍ˳ö£¿"
+
+#: src/menu.c:115
+#, fuzzy
+msgid "Sort by size"
+msgstr "°´´óСÅÅÐò"
+
+#: src/menu.c:118
+#, fuzzy
+msgid "Sort by date"
+msgstr "°´ÈÕÆÚÅÅÐò"
+
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "δÅÅÐò"
+
+#: src/menu.c:124
+#, fuzzy
+msgid "Sort by path"
+msgstr "°´Â·¾¶ÅÅÐò"
+
+#: src/menu.c:127
+#, fuzzy
+msgid "Sort by number"
+msgstr "°´±àºÅÅÅÐò"
+
+#: src/menu.c:131
+#, fuzzy
+msgid "Sort by name"
+msgstr "°´Ãû³ÆÅÅÐò"
+
+#: src/menu.c:175
+msgid "Sort"
+msgstr "ÅÅÐò"
+
+#: src/menu.c:200
+#, fuzzy
+msgid "Rotate _180"
+msgstr "Ðýת 180 ¶È"
+
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "×î½ü (×îÔ㣬µ«×î¿ì)"
+
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "ƽÆÌ"
+
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "Ë«ÏßÐÔ"
+
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "³¬¼¶ (×îºÃ£¬µ«×îÂý)"
+
+#: src/preferences.c:418
+msgid "None"
+msgstr "ÎÞ"
+
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "ÆÕͨ"
+
+#: src/preferences.c:420
+msgid "Best"
+msgstr "×î¼Ñ"
+
+#: src/preferences.c:498 src/print.c:365
+msgid "Custom"
+msgstr ""
+
+#: src/preferences.c:662 src/preferences.c:665
+#, fuzzy
+msgid "Reset filters"
+msgstr "ɾ³ýÎļþ"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:699 src/preferences.c:702
+#, fuzzy
+msgid "Reset editors"
+msgstr "ɾ³ýÎļþ"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+
+#: src/preferences.c:727 src/preferences.c:730
+#, fuzzy
+msgid "Clear trash"
+msgstr "Çå³ý»º³åÇø"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr ""
+
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - ÖØÃüÃû"
+
+#: src/preferences.c:824
+msgid "Startup"
+msgstr ""
+
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "»Øµ½¼ÒĿ¼"
+
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "ʹÓõ±Ç°Ä¿Â¼"
+
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "´óС£º"
+
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "Æ·ÖÊ£º"
+
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "»º´æËõÂÔͼ"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "½«ËõÂÔͼ»º´æµ½ .thumbnails ÖÐ"
+
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "Èç¹ûÕÒµ½xvpicsËõÂÔͼ¼´Ê¹ÓÃ(Ö»¶Á)"
+
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "չʾ»ÃµÆƬ"
+
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "ͼÏñ¸Ä±äʱ¼ä¼ä¸ô(Ãë)£º"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+#: src/preferences.c:873
+msgid "Random"
+msgstr "Ëæ»ú"
+
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "Öظ´"
+
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "·Å´ó"
+
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "¶¶¶¯·½·¨£º"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr ""
+
+#: src/preferences.c:895
+#, fuzzy
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "ΪËõ·ÅÀ©Õ¹Í¼ÏñÒÔ±ãÆ¥Åä¡£"
+
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "Ëõ·ÅÔöÁ¿£º"
+
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "µ±Ñ¡ÔñÐÂͼÏñʱ£º"
+
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "Ëõ·Åµ½Ô­³ß´ç"
+
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "±£ÁôÉÏÒ»´ÎµÄËõ·ÅÉèÖÃ"
+
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "×·¼Ó"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr ""
+
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "¼ÌÐø"
+
+#: src/preferences.c:924
+#, fuzzy
+msgid "Refresh on file change"
+msgstr "Ë¢ÐÂÎļþÁбí"
+
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "Ô¤ÏÈ×°ÈëÏÂÒ»ÕÅͼ"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr ""
+
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "´°¿Ú"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "ÈÕÆÚ"
+
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "¼Çס´°¿ÚλÖÃ"
+
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "¼Çס¹¤¾ßÀ¸×´Ì¬(¸¡¶¯/Òþ²Ø)"
+
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "µ±¹¤¾ßµµÒþ²Ø/¸¡¶¯Ê±,ʹ´°¿ÚÊÊӦͼÏñ"
+
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "×Ô¶¯¸Ä±ä´°¿Ú´óСʱÏÞÖƳߴç (%)£º"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr ""
+
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "¹ýÂË"
+
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "ÏÔʾÒþ²ØÎļþ"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr ""
+
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "½ûÖ¹Îļþ¹ýÂË"
+
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "¹ýÂËÆ÷£º"
+
+#: src/preferences.c:1008
+#, fuzzy
+msgid "Filter"
+msgstr "¹ýÂËÆ÷£º"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr ""
+
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "±à¼­Æ÷"
+
+#: src/preferences.c:1072
+msgid "#"
+msgstr "#"
+
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "²Ëµ¥Ãû"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr ""
+
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "È«ÆÁ"
+
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "ͼÏñ"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "ɾ³ý"
+
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "È·ÈÏɾ³ýÎļþ"
+
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "ÆôÓÃɾ³ý¼ü"
+
+#: src/preferences.c:1158
+#, fuzzy
+msgid "Safe delete"
+msgstr "È·ÈÏɾ³ýÎļþ"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "ƽÆÌ"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+#: src/preferences.c:1179
+msgid "View"
+msgstr "²é¿´"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "Õý·½ÐÎÑ¡Ôñ"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr ""
+
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "¼´Ê±ÖØÃüÃû"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr ""
+
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "ÀÛ½ø¼üÅ̹ö¶¯"
+
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "ÓÃÊó±êÂÖ¹ö¶¯Í¼Ïñ"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+#: src/preferences.c:1212
+#, fuzzy
+msgid "Custom similarity threshold:"
+msgstr "¶¨ÖÆÎļþÀàÐÍ£º"
+
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "·ÇÆÁÄ»»º³åÇø´óС (ÿ¸öͼÏñµÄ Mb Êý)£º"
+
+#: src/preferences.c:1291
+#, fuzzy
+msgid "About - GQview"
+msgstr "ÇóÖú - GQview"
+
+#: src/preferences.c:1304
+#, fuzzy, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"°æȨËùÓР(c) 2003 John Ellis\n"
+"http://gqview.sourceforge.net\n"
+"gqview@users.sourceforge.net\n"
+"\n"
+"°´Í¨Óù«¹²Ðí¿ÉÖ¤·¢ÐÐ"
+
+#: src/preferences.c:1322
+#, fuzzy
+msgid "Credits..."
+msgstr "/±à¼­/Ñ¡Ïî(_O)..."
+
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "Çå³ýËùÓÐÑ¡Ôñ"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+msgid "Default printer"
+msgstr ""
+
+#: src/print.c:138
+#, fuzzy
+msgid "Custom printer"
+msgstr "¶¨ÖÆÎļþÀàÐÍ£º"
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "ͼÏñ"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+msgid "centimeters"
+msgstr ""
+
+#: src/print.c:353
+msgid "inches"
+msgstr ""
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+msgid "Portrait"
+msgstr ""
+
+#: src/print.c:360
+msgid "Landscape"
+msgstr ""
+
+#: src/print.c:366
+msgid "Letter"
+msgstr ""
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, c-format
+msgid "page %d of %d"
+msgstr ""
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr ""
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, fuzzy, c-format
+msgid "A file with name %s already exists."
+msgstr "ÎļþÃû %s ÒÑ´æÔÚ¡£"
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "¹ýÂËÆ÷£º"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "ɾ³ýÎļþ"
+
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "ÇóÖú - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "ÆÕͨ"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "³ß´ç"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "ÎÞЧµÄÄ¿±ê"
+
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "ÖØÃüÃû£º"
+
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "ÎÞ±êÌâ"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "ÎÞ"
+
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "ÅÅÐò"
+
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "ͼÏñ"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "¹ýÂËÆ÷£º"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+msgid "Right:"
+msgstr ""
+
+#: src/print.c:3432
+msgid "Top:"
+msgstr ""
+
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "µ½£º"
+
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "¹ýÂËÆ÷£º"
+
+#: src/print.c:3450
+#, fuzzy
+msgid "Custom printer:"
+msgstr "¶¨ÖÆÎļþÀàÐÍ£º"
+
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "¹ýÂËÆ÷£º"
+
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "¹ýÂËÆ÷£º"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "¼Çס´°¿ÚλÖÃ"
+
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "±£´æÅäÖÃÎļþ³ö´í£º%s\n"
+
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "ƽÆÌ"
+
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "Ìí¼ÓÄÚÈÝ"
+
+#: src/search.c:202
+msgid "results"
+msgstr ""
+
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "¼ÌÐø"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+#, fuzzy
+msgid "greater than"
+msgstr "´´½¨ËõÂÔͼ"
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "¹ýÂËÆ÷£º"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%d Îļþ (%d)%s"
+
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%d Îļþ%s"
+
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "ÕýÔڱȽÏ..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "ÇëÑ¡ÔñÒ»¸öÒÑ´æÔÚµÄĿ¼"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "ÇëÑ¡ÔñÒ»¸öÒÑ´æÔÚµÄĿ¼"
+
+#: src/search.c:2570
+msgid "Image search - GQview"
+msgstr ""
+
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "ÕýÔڱȽÏ..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "ÖØÃüÃû£º"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "ƽÆÌ"
+
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "Ëæ»ú"
+
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "¹ýÂËÆ÷£º"
+
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "ÎÞЧµÄÄ¿±ê"
+
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "Ìí¼ÓÄÚÈÝ"
+
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "ÏàËÆÐÔ"
+
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "Ëæ»ú"
+
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "×°È뻺³åµÄËõÂÔͼʧ°Ü£¬ÕýÊÔͼÖؽ¨¡£\n"
+
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "ÎÞ·¨½«ÀúÊ·ÁбíдÈ룺%s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr ""
+
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+#, fuzzy
+msgid "Edit Bookmark"
+msgstr "±à¼­Æ÷"
+
+#: src/ui_bookmark.c:612
+#, fuzzy
+msgid "Path:"
+msgstr "·¾¶"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr ""
+
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "Çå³ýËùÓÐÑ¡Ôñ"
+
+#: src/ui_bookmark.c:718
+#, fuzzy
+msgid "_Properties..."
+msgstr "/±à¼­/Ñ¡Ïî(_O)..."
+
+#: src/ui_bookmark.c:720
+#, fuzzy
+msgid "Move _up"
+msgstr "Òƶ¯"
+
+#: src/ui_bookmark.c:722
+#, fuzzy
+msgid "Move _down"
+msgstr "Òƶ¯"
+
+#: src/ui_bookmark.c:724
+#, fuzzy
+msgid "_Remove"
+msgstr "ɾ³ý"
+
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"ÎÞ·¨×°È룺\n"
+"%s"
+
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "½« %s ÖØÃüÃûΪ %s Ê§°Ü¡£"
+
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"ÎÞ·¨É¾³ýÎļþ£º\n"
+"%s"
+
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "Îļþɾ³ýʧ°Ü"
+
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "ɾ³ýÎļþ"
+
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"½«ÒªÉ¾³ýÎļþ£º\n"
+" %s"
+
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+#, fuzzy
+msgid "_Rename"
+msgstr "ÖØÃüÃû"
+
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+#, fuzzy
+msgid "Add _Bookmark"
+msgstr "±à¼­Æ÷"
+
+#: src/ui_pathsel.c:636
+#, fuzzy
+msgid "_Delete"
+msgstr "ɾ³ý"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "ÇóÖú - GQview"
+
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"ÎÞ·¨´´½¨Ä¿Â¼£º\n"
+"%s"
+
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "´´½¨Ä¿Â¼´íÎó"
+
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "ËùÓÐÎļþ"
+
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "ÏÔʾÒþ²ØÎļþ"
+
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "¹ýÂËÆ÷£º"
+
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "ȫѡ"
+
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "ËùÓÐÎļþ"
+
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "¸²¸ÇÎļþ"
+
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "¸²¸ÇÎļþ"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "¸²¸ÇÎļþ"
+
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "Ìø¹ý"
+
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "Ìø¹ý"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "Òƶ¯Îļþ´íÎó"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "ÇóÖú - GQview"
+
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+#, fuzzy
+msgid "Auto rename"
+msgstr "²Ëµ¥Ãû"
+
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "ÖØÃüÃû"
+
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "¸´ÖƵÄÔ´ÓëÄ¿±êÏàͬ"
+
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"ÎÞ·¨½«Îļþ£º\n"
+"%s\n"
+"¸´ÖƵ½×ÔÉí¡£"
+
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "Òƶ¯µÄÔ´ÓëÄ¿±êÏàͬ"
+
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"ÎÞ·¨½«Îļþ£º\n"
+"%s\n"
+"Òƶ¯µ½×ÔÉí¡£"
+
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "¼ÌÐø"
+
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "¸´ÖÆÎļþ´íÎó"
+
+#: src/utilops.c:631
+#, fuzzy, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"ÔÚ¶àÎļþ¸´ÖÆʱ£¬ÎÞ·¨½«£º\n"
+"%s ¸´ÖƵ½£º\n"
+"%s\n"
+"¡£"
+
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "Òƶ¯Îļþ´íÎó"
+
+#: src/utilops.c:636
+#, fuzzy, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"ÔÚ¶àÎļþÒƶ¯Ê±£¬ÎÞ·¨½«\n"
+"%s Òƶ¯µ½£º\n"
+"%s\n"
+"¡£"
+
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "Ô´ÓëÄ¿±êÏàͬ"
+
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "Ô´ºÍÄ¿±êÏàͬ£¬²Ù×÷·ÅÆú¡£"
+
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"ÎÞ·¨½«Îļþ£º\n"
+"%s\n"
+"¸´ÖƵ½£º\n"
+"%s"
+
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"ÎÞ·¨½«Îļþ£º\n"
+"%s\n"
+"Òƶ¯µ½£º\n"
+"%s"
+
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "ÎÞЧµÄÄ¿±ê"
+
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"¶ÔÓÚ¶àÎļþ²Ù×÷£¬ÇëÑ¡ÔñĿ¼£¬\n"
+"¶ø²»ÊÇÎļþ¡£"
+
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "ÇëÑ¡ÔñÒ»¸öÒÑ´æÔÚµÄĿ¼"
+
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "ÇóÖú - GQview"
+
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+#, fuzzy
+msgid "_Copy"
+msgstr "¸´ÖÆ"
+
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr ""
+"½«Îļþ£º\n"
+"%s\n"
+"ÖØÃüÃûΪ£º"
+
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "½«¶à¸öÎļþ¸´ÖƵ½£º"
+
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "ÇóÖú - GQview"
+
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+#, fuzzy
+msgid "_Move"
+msgstr "Òƶ¯"
+
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr ""
+"½«Îļþ£º\n"
+"%s\n"
+"ÖØÃüÃûΪ£º"
+
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "½«¶à¸öÎļþÒƶ¯µ½£º"
+
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "ÖØÃüÃû£º"
+
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "Ô´ÓëÄ¿±êÏàͬ"
+
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "ɾ³ýʧ°Ü"
+
+#: src/utilops.c:1124
+#, fuzzy
+msgid "Unable to remove old file from trash folder"
+msgstr ""
+"ÎÞ·¨½«Îļþ£º\n"
+"%s\n"
+"Òƶ¯µ½×ÔÉí¡£"
+
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "ÎÞ·¨´´½¨Ä¿Â¼"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr ""
+
+#: src/utilops.c:1212
+#, fuzzy, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"ÎÞ·¨´´½¨Ä¿Â¼£º\n"
+"%s"
+
+#: src/utilops.c:1216
+#, fuzzy
+msgid "Turn off safe delete"
+msgstr "È·ÈÏɾ³ýÎļþ"
+
+#: src/utilops.c:1234
+#, fuzzy, c-format
+msgid "Safe delete: %s"
+msgstr "È·ÈÏɾ³ýÎļþ"
+
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"ÎÞ·¨É¾³ýÎļþ£º\n"
+" %s\n"
+" ¼ÌÐø½øÐжàÎļþɾ³ý²Ù×÷£¿"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr ""
+
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "ɾ³ýÎļþ"
+
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "ÖØÃüÃû¶à¸öÎļþ£º"
+
+#: src/utilops.c:1438
+#, fuzzy, c-format
+msgid "Review %d files"
+msgstr "%d Îļþ"
+
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "ɾ³ýÎļþ"
+
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "ɾ³ýÎļþ"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"ÎÞ·¨½«Îļþ£º\n"
+"%s\n"
+" ÖØÃüÃûΪ£º\n"
+"%s"
+
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "ÖØÃüÃûÎļþ´íÎó"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+
+#: src/utilops.c:1809
+#, fuzzy, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr "½« %s ÖØÃüÃûΪ %s Ê§°Ü¡£"
+
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "ÇóÖú - GQview"
+
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "ÖØÃüÃû¶à¸öÎļþ£º"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr ""
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "ÖØÃüÃû£º"
+
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "ÖØÃüÃû£º"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr ""
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr ""
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr ""
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr ""
+
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"ÎÞ·¨½«Îļþ£º\n"
+"%s\n"
+"ÖØÃüÃûΪ£º\n"
+"%s"
+
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr ""
+"½«Îļþ£º\n"
+"%s\n"
+"ÖØÃüÃûΪ£º"
+
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"Ŀ¼£º\n"
+"%s\n"
+"ÒÑ´æÔÚ¡£"
+
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "ƽÆÌ"
+
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"·¾¶£º\n"
+"%s\n"
+"ÊÇÒ»¸öÒÑ´æÔÚµÄÎļþ¡£"
+
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "ÇóÖú - GQview"
+
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"ÔÚ\n"
+"%s\n"
+"´´½¨Ä¿Â¼£¬²¢ÃüÃûΪ£º"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr ""
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr ""
+
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+#, fuzzy
+msgid "_Slideshow"
+msgstr "»ÃµÆƬ"
+
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "µÝ¹é»ÃµÆƬ"
+
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+#, fuzzy
+msgid "Find _duplicates..."
+msgstr "Ñ°ÕÒ¸±±¾..."
+
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "µÝ¹éÑ°ÕÒ¸±±¾..."
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr ""
+
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+#, fuzzy
+msgid "View as _tree"
+msgstr "/²é¿´/È«ÆÁ(_U)"
+
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+#, fuzzy
+msgid "Re_fresh"
+msgstr "Ë¢ÐÂ"
+
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+#, fuzzy
+msgid "_Sort"
+msgstr "ÅÅÐò"
+
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+#, fuzzy
+msgid "View as _icons"
+msgstr "³ß´ç"
+
+#: src/view_file_list.c:421
+#, fuzzy
+msgid "Show _thumbnails"
+msgstr "»º´æËõÂÔͼ"
+
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"·Ç·¨ÎļþÃû£º\n"
+"%s"
+
+#~ msgid "Purge thumbnails"
+#~ msgstr "Çå³ýËõÂÔͼ"
+
+#~ msgid "/File/tear1"
+#~ msgstr "/Îļþ/Ƭ¶Î1"
+
+#~ msgid "/File/_New collection"
+#~ msgstr "/Îļþ/ÐÂͼÏñ¼¯"
+
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/Îļþ/´ò¿ªÍ¼Ïñ¼¯(_O)..."
+
+#~ msgid "/File/sep1"
+#~ msgstr "/Îļþ/µÚÒ»¶Î"
+
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/Îļþ/ÖØÃüÃû(_R)..."
+
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/Îļþ/Ñ°ÕÒ¸±±¾(_F)..."
+
+#~ msgid "/File/sep2"
+#~ msgstr "/Îļþ/µÚ¶þ¶Î"
+
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/Îļþ/ÖØÃüÃû(_R)..."
+
+#, fuzzy
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/Îļþ/ɾ³ý(_D)..."
+
+#~ msgid "/File/sep3"
+#~ msgstr "/Îļþ/µÚÈý¶Î"
+
+#~ msgid "/File/_Copy..."
+#~ msgstr "/Îļþ/¸´ÖÆ(_C)..."
+
+#~ msgid "/File/_Move..."
+#~ msgstr "/Îļþ/Òƶ¯(_M)..."
+
+#~ msgid "/File/_Rename..."
+#~ msgstr "/Îļþ/ÖØÃüÃû(_R)..."
+
+#~ msgid "/File/_Delete..."
+#~ msgstr "/Îļþ/ɾ³ý(_D)..."
+
+#~ msgid "/File/sep4"
+#~ msgstr "/Îļþ/µÚËĶÎ"
+
+#, fuzzy
+#~ msgid "/File/C_lose window"
+#~ msgstr "¹Ø±Õ´°¿Ú"
+
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/Îļþ/Í˳ö(_X)"
+
+#~ msgid "/_Edit"
+#~ msgstr "/±à¼­(_E)"
+
+#~ msgid "/Edit/tear1"
+#~ msgstr "/±à¼­/Ƭ¶Î1"
+
+#~ msgid "/Edit/editor1"
+#~ msgstr "/±à¼­/±à¼­Æ÷1"
+
+#~ msgid "/Edit/editor2"
+#~ msgstr "/±à¼­/±à¼­Æ÷2"
+
+#~ msgid "/Edit/editor3"
+#~ msgstr "/±à¼­/±à¼­Æ÷3"
+
+#~ msgid "/Edit/editor4"
+#~ msgstr "/±à¼­/±à¼­Æ÷4"
+
+#~ msgid "/Edit/editor5"
+#~ msgstr "/±à¼­/±à¼­Æ÷5"
+
+#~ msgid "/Edit/editor6"
+#~ msgstr "/±à¼­/±à¼­Æ÷6"
+
+#~ msgid "/Edit/editor7"
+#~ msgstr "/±à¼­/±à¼­Æ÷7"
+
+#~ msgid "/Edit/editor8"
+#~ msgstr "/±à¼­/±à¼­Æ÷8"
+
+#, fuzzy
+#~ msgid "/Edit/editor9"
+#~ msgstr "/±à¼­/±à¼­Æ÷1"
+
+#, fuzzy
+#~ msgid "/Edit/editor0"
+#~ msgstr "/±à¼­/±à¼­Æ÷1"
+
+#~ msgid "/Edit/sep1"
+#~ msgstr "/±à¼­/µÚÒ»¶Î"
+
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/±à¼­/µ÷Õû(_A)"
+
+#, fuzzy
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/±à¼­/Ñ¡Ïî(_O)..."
+
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/±à¼­/µ÷Õû/Ƭ¶Î1"
+
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/±à¼­/µ÷Õû/˳ʱÕëÐýת(_R)"
+
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/±à¼­/µ÷Õû/ÄæʱÕëÐýת(_C)"
+
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/±à¼­/µ÷Õû/Ðýת 180 ¶È"
+
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/±à¼­/µ÷Õû/¾µÏñ(_M)"
+
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/±à¼­/µ÷Õû/·­×ª(_F)"
+
+#~ msgid "/Edit/sep2"
+#~ msgstr "/±à¼­/µÚ¶þ¶Î"
+
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/±à¼­/È«Ñ¡(_A)"
+
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/±à¼­/Çå³ýËùÓÐÑ¡Ôñ(_N)"
+
+#~ msgid "/Edit/sep3"
+#~ msgstr "/±à¼­/µÚÈý¶Î"
+
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/±à¼­/Ñ¡Ïî(_O)..."
+
+#~ msgid "/Edit/sep4"
+#~ msgstr "/±à¼­/µÚËĶÎ"
+
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/±à¼­/ÉèÖÃΪǽֽ(_W)"
+
+#~ msgid "/_View"
+#~ msgstr "/²é¿´(_V)"
+
+#~ msgid "/View/tear1"
+#~ msgstr "/²é¿´/Ƭ¶Î1"
+
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/²é¿´/·Å´ó(_I)"
+
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/²é¿´/ËõС(_O)"
+
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/²é¿´/Ëõ·Åµ½ 1:1(_1)"
+
+#~ msgid "/View/sep1"
+#~ msgstr "/²é¿´/µÚÒ»¶Î"
+
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/²é¿´/ËõÂÔͼ(_T)"
+
+#~ msgid "/View/sep2"
+#~ msgstr "/²é¿´/µÚ¶þ¶Î"
+
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/²é¿´/È«ÆÁ(_U)"
+
+#~ msgid "/View/sep3"
+#~ msgstr "/²é¿´/µÚÈý¶Î"
+
+#, fuzzy
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/²é¿´/(²»)Òþ²ØÎļþÁбí(_H)"
+
+#, fuzzy
+#~ msgid "/View/sep4"
+#~ msgstr "/²é¿´/µÚÒ»¶Î"
+
+#, fuzzy
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/²é¿´/·Å´ó(_I)"
+
+#, fuzzy
+#~ msgid "/View/sep5"
+#~ msgstr "/²é¿´/µÚÒ»¶Î"
+
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/²é¿´/Çл»»ÃµÆÏÔʾ(_S)"
+
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/²é¿´/¸üÐÂÁбí(_R)"
+
+#~ msgid "/Help/tear1"
+#~ msgstr "/ÇóÖú/Ƭ¶Î1"
+
+#~ msgid "/Help/sep1"
+#~ msgstr "/ÇóÖú/µÚÒ»¶Î"
+
+#~ msgid "/Help/_About"
+#~ msgstr "/ÇóÖú/¹ØÓÚ(_A)"
+
+#~ msgid "GQview configuration"
+#~ msgstr "GQview ÅäÖÃ"
+
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/±à¼­/ɾ³ýÔ­À´µÄËõÂÔͼ(_R)"
+
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "·¾¶"
+
+#~ msgid "Save"
+#~ msgstr "±£´æ"
+
+#~ msgid "Close"
+#~ msgstr "¹Ø±Õ"
+
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "¸²¸ÇͼÏñ¼¯Îļþ£º\n"
+#~ "%s"
+
+#~ msgid "Save collection as:"
+#~ msgstr "½«Í¼Ïñ¼¯Áí´æΪ£º"
+
+#~ msgid "Open collection from:"
+#~ msgstr "´Ó´Ë´¦´ò¿ªÍ¼Ïñ¼¯£º"
+
+#~ msgid "Open"
+#~ msgstr "´ò¿ª"
+
+#~ msgid "Append collection from:"
+#~ msgstr "´Ó´Ë´¦×·¼ÓͼÏñ¼¯£º"
+
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "Í˳ö"
+
+#~ msgid "Exit"
+#~ msgstr "Í˳ö"
+
+#~ msgid "Ok"
+#~ msgstr "È·¶¨"
+
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "·Ç·¨ÎļþÃû"
+
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "µ±Æô¶¯Ê±¸Ä±äµ½´ËĿ¼£º"
+
+#~ msgid "Zoom (scaling):"
+#~ msgstr "Ëõ·Å£º"
+
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "½«¶Ô»°¿òÖÃÓÚÊó±êλÖÃ"
+
+#~ msgid "Include files of type:"
+#~ msgstr "°üº¬ÎļþÀàÐÍ£º"
+
+#~ msgid "Remove"
+#~ msgstr "ɾ³ý"
+
+#~ msgid "Command Line"
+#~ msgstr "ÃüÁîÐÐ"
+
+#, fuzzy
+#~ msgid "Help"
+#~ msgstr "/ÇóÖú(_H)"
+
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "È«ÆÁ"
+
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "ƽÆÌ"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "¸²¸ÇÎļþ£º\n"
+#~ " %s\n"
+#~ " ÒÔ£º\n"
+#~ " %s"
+
+#~ msgid "Yes"
+#~ msgstr "ÊÇ"
+
+#~ msgid "Yes to all"
+#~ msgstr "È«¶¼ÊÇ"
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "¸²¸ÇÎļþ£º\n"
+#~ " %s\n"
+#~ " ÒÔ£º\n"
+#~ " %s"
+
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "½«Îļþ£º\n"
+#~ "%s\n"
+#~ "µ½£º"
+
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "½«Îļþ£º\n"
+#~ "%s\n"
+#~ "Òƶ¯µ½£º"
+
+#~ msgid "About to delete multiple files..."
+#~ msgstr "½«ÒªÉ¾³ý¶à¸öÎļþ..."
+
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "¸²¸ÇÎļþ£º\n"
+#~ "%s\n"
+#~ "¸üÃûΪ£º\n"
+#~ "%s"
+
+#~ msgid "to:"
+#~ msgstr "µ½£º"
+
+#~ msgid "Create"
+#~ msgstr "´´½¨"
+
+#~ msgid "Initial directory"
+#~ msgstr "³õʼĿ¼"
+
+#~ msgid "New Directory"
+#~ msgstr "н¨Ä¿Â¼"
+
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "ÎÞ·¨´´½¨Ä¿Â¼£º\n"
+#~ "%s"
+
+#~ msgid "Error creating directory"
+#~ msgstr "´´½¨Ä¿Â¼´íÎó"
+
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "ÎÞЧµÄÄ¿±ê"
+
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/²é¿´/Çл»»ÃµÆÏÔʾ(_S)"
+
+#~ msgid "Add contents"
+#~ msgstr "Ìí¼ÓÄÚÈÝ"
+
+#~ msgid "Add contents recursive"
+#~ msgstr "µÝ¹éÌí¼ÓÄÚÈÝ"
+
+#~ msgid "Skip directories"
+#~ msgstr "ºöÂÔĿ¼"
+
+#~ msgid "Invalid directory"
+#~ msgstr "ÎÞЧµÄĿ¼"
+
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - ¸´ÖÆ"
+
+#~ msgid "GQview - move"
+#~ msgstr "GQview - Òƶ¯"
+
+#~ msgid "Directory exists"
+#~ msgstr "Ŀ¼ÒÑ´æÔÚ"
+
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - Ð½¨Ä¿Â¼"
+
+#~ msgid "/File/Create _Dir..."
+#~ msgstr "/Îļþ/´´½¨Ä¿Â¼(_D)..."
+
+#~ msgid "Edit"
+#~ msgstr "±à¼­"
+
+#~ msgid "Insert file drops at pointer location"
+#~ msgstr "ÔÚÊó±ê¹â±êλÖòåÈëÍÏ·ÅÎļþ"
+
+#~ msgid "File named %s already exists."
+#~ msgstr "ÃûΪ %s µÄÎļþÒÑ´æÔÚ¡£"
+
+#, fuzzy
+#~ msgid "Date:"
+#~ msgstr "ÈÕÆÚ"
+
+#, fuzzy
+#~ msgid "top"
+#~ msgstr "µ½£º"
+
+#~ msgid "GQview running: %s\n"
+#~ msgstr "GQview ÔËÐУº%s\n"
+
+#~ msgid "Electric Eyes"
+#~ msgstr "µçÑÛ"
+
+#~ msgid "Apply"
+#~ msgstr "Ó¦ÓÃ"
+
+#~ msgid "format: [.foo;.bar]"
+#~ msgstr "¸ñʽ£º[.foo;.bar]"
+
+#~ msgid "Unable to delete dir: %s\n"
+#~ msgstr "ÎÞ·¨É¾³ýĿ¼: %s\n"
+
+#~ msgid "create dir failed: %s\n"
+#~ msgstr "´´½¨Ä¿Â¼Ê§°Ü: %s\n"
+
+#~ msgid "     Ok     "
+#~ msgstr "    È·¶¨    "
+
+#~ msgid "External Editors"
+#~ msgstr "ÄÚ²¿±à¼­Æ÷"
diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644 (file)
index 0000000..392a0e5
--- /dev/null
@@ -0,0 +1,4444 @@
+# GQview Triditional Chinese (Big5) translation.
+# Copyright (C) 2000-2001 Free Software Foundation, Inc.
+# Kam Tik <kamtik@hongkong.com>, 2000.
+# Abel Cheung <deaddog@deaddog.ws>, 2001.
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: gqview 1.3.9\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-02-15 08:13-0500\n"
+"PO-Revision-Date: 2004-02-09 22:08+0800\n"
+"Last-Translator: S.J. Luo <crystal@mickey.ee.nctu.edu.tw>\n"
+"Language-Team: traditional Chinese <zh-l10n@linux.org.tw>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: src/bar_info.c:30
+msgid "Favorite"
+msgstr ""
+
+# src/preferences.c:368
+#: src/bar_info.c:31
+#, fuzzy
+msgid "Todo"
+msgstr "工具"
+
+#: src/bar_info.c:32
+msgid "People"
+msgstr ""
+
+#: src/bar_info.c:33
+msgid "Places"
+msgstr ""
+
+#: src/bar_info.c:34
+msgid "Art"
+msgstr ""
+
+#: src/bar_info.c:35
+#, fuzzy
+msgid "Nature"
+msgstr "光圈"
+
+#: src/bar_info.c:36
+msgid "Possessions"
+msgstr ""
+
+#: src/bar_info.c:505
+msgid "Keyword Presets"
+msgstr ""
+
+#: src/bar_info.c:508
+msgid "Favorite keywords list"
+msgstr ""
+
+#: src/bar_info.c:992 src/info.c:166 src/search.c:2692
+msgid "Keywords"
+msgstr ""
+
+# src/utilops.c:980
+#: src/bar_info.c:1006 src/info.c:716 src/print.c:2599
+msgid "Filename:"
+msgstr "檔案名稱:"
+
+# src/ui_pathsel.c:799
+#: src/bar_info.c:1007 src/info.c:360
+msgid "File date:"
+msgstr "檔案日期:"
+
+#: src/bar_info.c:1027
+msgid "Keywords:"
+msgstr ""
+
+# 
+# src/dupe.c:1948
+#: src/bar_info.c:1095
+#, fuzzy
+msgid "Comment:"
+msgstr "和以下檔案比較:"
+
+#: src/bar_info.c:1119
+msgid "Edit favorite keywords list."
+msgstr ""
+
+#: src/bar_info.c:1123
+msgid "Add keywords to selected files"
+msgstr ""
+
+#: src/bar_info.c:1126
+msgid "Add keywords to selected files, replacing the existing ones."
+msgstr ""
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/bar_info.c:1130
+#, fuzzy
+msgid "Save comment now"
+msgstr "儲存圖像集"
+
+#: src/bar_exif.c:423
+msgid "Tag"
+msgstr ""
+
+# src/dupe.c:1652 src/dupe.c:1941
+#: src/bar_exif.c:424 src/dupe.c:2589 src/dupe.c:3116 src/print.c:3190
+#: src/search.c:2753 src/view_file_list.c:1555
+msgid "Name"
+msgstr "名稱"
+
+#: src/bar_exif.c:425
+msgid "Value"
+msgstr "值"
+
+# src/preferences.c:401
+#: src/bar_exif.c:426
+msgid "Format"
+msgstr "格式"
+
+#: src/bar_exif.c:427
+msgid "Elements"
+msgstr ""
+
+#: src/bar_exif.c:428 src/preferences.c:1028
+msgid "Description"
+msgstr "描述"
+
+# src/main.c:622
+#: src/bar_exif.c:549 src/info.c:105
+msgid "Exif"
+msgstr "Exif"
+
+#: src/bar_exif.c:622
+msgid "Advanced view"
+msgstr "進階檢視"
+
+# 
+# src/utilops.c:664 src/utilops.c:676
+#: src/bar_sort.c:218
+#, fuzzy
+msgid "Unlink failed"
+msgstr "刪除失敗"
+
+#: src/bar_sort.c:298
+msgid "Link failed"
+msgstr ""
+
+# 
+# src/utilops.c:1144
+#: src/bar_sort.c:435
+#, fuzzy, c-format
+msgid ""
+"The collection:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"下列目錄:\n"
+"%s\n"
+"已經存在。"
+
+# src/collect-dlg.c:206
+#: src/bar_sort.c:436
+#, fuzzy
+msgid "Collection exists"
+msgstr "圖像集沒有圖像"
+
+# 
+# src/collect-dlg.c:82 src/collect.c:1011
+#: src/bar_sort.c:450 src/collect.c:1061 src/collect-dlg.c:84
+#, c-format
+msgid ""
+"Failed to save the collection:\n"
+"%s"
+msgstr ""
+"無法儲存圖像集:\n"
+"%s"
+
+# 
+# src/collect-dlg.c:83 src/collect.c:1012
+#: src/bar_sort.c:451 src/collect.c:1062 src/collect-dlg.c:85
+msgid "Save Failed"
+msgstr "儲存失敗"
+
+#: src/bar_sort.c:485 src/bar_sort.c:631
+msgid "Add Bookmark"
+msgstr "新增書籤"
+
+# 
+# src/preferences.c:897
+#: src/bar_sort.c:489
+#, fuzzy
+msgid "Add Collection"
+msgstr "圖像集"
+
+# src/dupe.c:1652 src/dupe.c:1941
+#: src/bar_sort.c:506 src/ui_bookmark.c:603
+msgid "Name:"
+msgstr "名稱:"
+
+# src/menu.c:526
+#: src/bar_sort.c:569
+msgid "Sort Manager"
+msgstr "排列管理員"
+
+# src/preferences.c:368
+#: src/bar_sort.c:578 src/ui_pathsel.c:1095
+msgid "Folders"
+msgstr "資料夾"
+
+# 
+# src/preferences.c:897
+#: src/bar_sort.c:579 src/main.c:1066
+msgid "Collections"
+msgstr "圖像集"
+
+# src/utilops.c:592
+#: src/bar_sort.c:586
+msgid "Copy"
+msgstr "複製"
+
+# src/utilops.c:601
+#: src/bar_sort.c:593
+msgid "Move"
+msgstr "移動"
+
+#: src/bar_sort.c:600
+msgid "Link"
+msgstr ""
+
+# src/collect-table.c:86
+#: src/bar_sort.c:610
+#, fuzzy
+msgid "Add image"
+msgstr "%d 個圖像"
+
+# 
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/bar_sort.c:617
+#, fuzzy
+msgid "Add selection"
+msgstr "全部不選"
+
+#: src/bar_sort.c:634
+msgid "Undo last image"
+msgstr "回復最後影像"
+
+# src/preferences.c:400
+#: src/cache_maint.c:127 src/cache_maint.c:681 src/cache_maint.c:894
+#: src/editors.c:410
+msgid "done"
+msgstr "完成"
+
+# 
+# src/dupe.c:841
+#: src/cache_maint.c:304
+#, fuzzy
+msgid "Removing old metadata..."
+msgstr "正在讀取類似度資料..."
+
+# src/cache_maint.c:245
+#: src/cache_maint.c:308
+#, fuzzy
+msgid "Clearing cached thumbnails..."
+msgstr "正在清除縮圖..."
+
+# src/cache_maint.c:249
+#: src/cache_maint.c:312 src/cache_maint.c:1048
+#, fuzzy
+msgid "Removing old thumbnails..."
+msgstr "正在清除舊的縮圖..."
+
+#: src/cache_maint.c:315 src/cache_maint.c:1051
+msgid "Maintenance"
+msgstr ""
+
+# 
+# src/collect-dlg.c:59
+#: src/cache_maint.c:792 src/utilops.c:904
+#, fuzzy
+msgid "Invalid folder"
+msgstr "檔案名稱無效"
+
+#: src/cache_maint.c:793
+msgid "The specified folder can not be found."
+msgstr ""
+
+# src/preferences.c:603
+#: src/cache_maint.c:821 src/cache_maint.c:835 src/cache_maint.c:1216
+#, fuzzy
+msgid "Create thumbnails"
+msgstr "將縮圖儲存在緩衝區"
+
+#: src/cache_maint.c:829 src/cache_maint.c:1058
+#, fuzzy
+msgid "S_tart"
+msgstr "開始 #"
+
+# src/preferences.c:368
+#: src/cache_maint.c:842 src/preferences.c:1165
+msgid "Folder:"
+msgstr "資料夾:"
+
+# 
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/cache_maint.c:845
+#, fuzzy
+msgid "Select folder"
+msgstr "全部不選"
+
+# 
+# src/collect-dlg.c:59
+#: src/cache_maint.c:849
+#, fuzzy
+msgid "Include subfolders"
+msgstr "檔案名稱無效"
+
+#: src/cache_maint.c:850
+msgid "Store thumbnails local to source images"
+msgstr ""
+
+#: src/cache_maint.c:859 src/cache_maint.c:1067
+msgid "click start to begin"
+msgstr ""
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/cache_maint.c:997 src/editors.c:549
+msgid "running..."
+msgstr "執行中..."
+
+# src/cache_maint.c:245
+#: src/cache_maint.c:1043
+msgid "Clearing thumbnails..."
+msgstr "正在清除縮圖..."
+
+# 
+# src/preferences.c:163 src/preferences.c:604
+#: src/cache_maint.c:1109 src/cache_maint.c:1112 src/cache_maint.c:1191
+#: src/cache_maint.c:1211
+msgid "Clear cache"
+msgstr "清除暫存記憶"
+
+# 
+# src/preferences.c:163
+#: src/cache_maint.c:1113
+msgid ""
+"This will remove all thumbnails that have\n"
+"been saved to disk, continue?"
+msgstr "所有儲存了的縮圖將會被清除,是否繼續?"
+
+#: src/cache_maint.c:1163
+#, fuzzy
+msgid "Cache Maintenance - GQview"
+msgstr "影像內容 - GQview"
+
+#: src/cache_maint.c:1173
+msgid "Cache and Data Maintenance"
+msgstr ""
+
+# 
+# src/fullscreen.c:117
+#: src/cache_maint.c:1177
+#, fuzzy
+msgid "GQview thumbnail cache"
+msgstr "GQview 全螢幕"
+
+# 
+# src/preferences.c:897
+#: src/cache_maint.c:1179 src/cache_maint.c:1199 src/cache_maint.c:1227
+#: src/preferences.c:1142 src/utilops.c:1505
+#, fuzzy
+msgid "Location:"
+msgstr "圖像集"
+
+# 
+# src/dupe.c:1412 src/dupe.c:1570
+#: src/cache_maint.c:1186 src/cache_maint.c:1206 src/cache_maint.c:1234
+#, fuzzy
+msgid "Clean up"
+msgstr "清除"
+
+#: src/cache_maint.c:1189 src/cache_maint.c:1209
+msgid "Remove orphaned or outdated thumbnails."
+msgstr ""
+
+# src/preferences.c:603
+#: src/cache_maint.c:1194 src/cache_maint.c:1214
+#, fuzzy
+msgid "Delete all cached thumbnails."
+msgstr "將縮圖儲存在緩衝區"
+
+# src/preferences.c:603
+#: src/cache_maint.c:1197
+#, fuzzy
+msgid "Shared thumbnail cache"
+msgstr "顯示縮圖"
+
+# 
+# src/ui_pathsel.c:437 src/ui_pathsel.c:460 src/utilops.c:944
+# src/utilops.c:1095
+#: src/cache_maint.c:1220
+#, fuzzy
+msgid "Render"
+msgstr "更改名稱"
+
+#: src/cache_maint.c:1223
+msgid "Render thumbnails for a specific folder."
+msgstr ""
+
+#: src/cache_maint.c:1225
+msgid "Metadata"
+msgstr ""
+
+#: src/cache_maint.c:1237
+msgid "Remove orphaned keywords and comments."
+msgstr ""
+
+# 
+# src/collect.c:329 src/image.c:1058
+#: src/collect.c:349 src/image.c:1160 src/image-overlay.c:74
+#: src/image-overlay.c:115
+msgid "Untitled"
+msgstr "無標題"
+
+# src/collect.c:333
+#: src/collect.c:353
+#, c-format
+msgid "Untitled (%d)"
+msgstr "無標題(%d)"
+
+# 
+# src/collect.c:930
+#: src/collect.c:980
+#, c-format
+msgid "%s - GQview Collection"
+msgstr "%s - GQview 圖像集"
+
+# 
+# src/collect.c:1048
+#: src/collect.c:1098 src/collect.c:1102
+msgid "Close collection"
+msgstr "關閉圖像集"
+
+# src/collect.c:1048
+#: src/collect.c:1103
+msgid ""
+"Collection has been modified.\n"
+"Save first?"
+msgstr ""
+"圖像集已被修改。\n"
+"是否先儲存?"
+
+#: src/collect.c:1106
+msgid "_Discard"
+msgstr ""
+
+# 
+# src/collect-dlg.c:58
+#: src/collect-dlg.c:58
+#, fuzzy, c-format
+msgid ""
+"Specified path:\n"
+"%s\n"
+"is a folder, collections are files"
+msgstr ""
+"指定的路徑:\n"
+"%s\n"
+"是一個目錄,但圖像集是檔案"
+
+# 
+# src/collect-dlg.c:59
+#: src/collect-dlg.c:59
+msgid "Invalid filename"
+msgstr "檔案名稱無效"
+
+# 
+# src/collect-dlg.c:69
+#: src/collect-dlg.c:68
+msgid "Overwrite File"
+msgstr "覆寫檔案"
+
+# 
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/collect-dlg.c:73
+#, fuzzy
+msgid "Overwrite existing file?"
+msgstr "覆寫檔案"
+
+# 
+# src/collect-dlg.c:73 src/utilops.c:463 src/utilops.c:830 src/utilops.c:1036
+#: src/collect-dlg.c:75 src/utilops.c:479 src/utilops.c:792 src/utilops.c:1649
+#: src/utilops.c:2196
+#, fuzzy
+msgid "_Overwrite"
+msgstr "覆寫"
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/collect-dlg.c:169
+msgid "Save collection"
+msgstr "儲存圖像集"
+
+# 
+# src/collect-dlg.c:172
+#: src/collect-dlg.c:176
+msgid "Open collection"
+msgstr "開啟圖像集"
+
+# 
+# src/collect-dlg.c:180
+#: src/collect-dlg.c:184
+msgid "Append collection"
+msgstr "加入圖像集"
+
+# 
+# src/collect-dlg.c:182
+#: src/collect-dlg.c:185
+#, fuzzy
+msgid "_Append"
+msgstr "加入"
+
+# 
+# src/collect-dlg.c:194
+#: src/collect-dlg.c:203
+msgid "Collection Files"
+msgstr "圖像集檔案"
+
+# src/collect-dlg.c:206
+#: src/collect-dlg.c:221
+msgid "Collection empty"
+msgstr "圖像集沒有圖像"
+
+# 
+# src/collect-dlg.c:206
+#: src/collect-dlg.c:222
+msgid "The current collection is empty, save aborted."
+msgstr "現時的圖像集沒有圖像,不會儲存。"
+
+# src/collect-table.c:78 src/menu.c:684
+#: src/collect-table.c:164 src/layout_util.c:708
+msgid "Empty"
+msgstr "空白"
+
+# src/collect-table.c:82
+#: src/collect-table.c:168
+#, c-format
+msgid "%d images (%d)"
+msgstr "%d 個圖像(%d)"
+
+# src/collect-table.c:86
+#: src/collect-table.c:172
+#, c-format
+msgid "%d images"
+msgstr "%d 個圖像"
+
+# src/collect-table.c:100 src/dupe.c:668 src/filelist.c:1811
+#: src/collect-table.c:186 src/dupe.c:1296 src/search.c:303
+#: src/view_file_icon.c:1772 src/view_file_icon.c:1887
+#: src/view_file_list.c:816 src/view_file_list.c:921
+msgid "Loading thumbs..."
+msgstr "正在載入縮圖..."
+
+# src/menu.c:753
+#: src/collect-table.c:773 src/dupe.c:2187 src/dupe.c:2497
+#: src/layout_util.c:751 src/search.c:969
+msgid "_View"
+msgstr "檢視(_V)"
+
+# src/collect-table.c:620 src/dupe.c:1388 src/dupe.c:1560 src/img-view.c:801
+# src/menu.c:906 src/menu.c:964
+#: src/collect-table.c:775 src/dupe.c:2189 src/dupe.c:2499 src/img-view.c:1187
+#: src/layout_image.c:722 src/search.c:971 src/view_file_icon.c:283
+#: src/view_file_list.c:395
+msgid "View in _new window"
+msgstr "在新視窗中檢視(_N)"
+
+# src/collect-table.c:622 src/dupe.c:1410 src/dupe.c:1568
+#: src/collect-table.c:778 src/dupe.c:2219 src/dupe.c:2507 src/search.c:997
+msgid "Rem_ove"
+msgstr "移除(_O)"
+
+# src/collect-table.c:624
+#: src/collect-table.c:781
+msgid "Append from file list"
+msgstr "由檔案列表加入"
+
+# 
+# src/collect-table.c:625
+#: src/collect-table.c:783
+msgid "Append from collection..."
+msgstr "由圖像集加入..."
+
+# src/collect-table.c:627 src/dupe.c:1391 src/dupe.c:1563
+#: src/collect-table.c:786 src/dupe.c:2192 src/dupe.c:2502 src/search.c:974
+msgid "Select all"
+msgstr "全部選取"
+
+# 
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/collect-table.c:788 src/dupe.c:2194 src/dupe.c:2504 src/search.c:976
+msgid "Select none"
+msgstr "全部不選"
+
+# src/menu.c:748
+#: src/collect-table.c:796 src/dupe.c:2203 src/img-view.c:1185
+#: src/layout_image.c:719 src/layout_util.c:784 src/search.c:981
+#: src/view_file_icon.c:280 src/view_file_list.c:393
+msgid "_Properties"
+msgstr "選項(_)..."
+
+# src/collect-table.c:633 src/dupe.c:1401 src/img-view.c:804 src/menu.c:910
+# src/menu.c:969
+#: src/collect-table.c:799 src/dupe.c:2210 src/img-view.c:1190
+#: src/layout_image.c:727 src/layout_util.c:762 src/search.c:988
+#: src/view_file_icon.c:287 src/view_file_list.c:399
+msgid "_Copy..."
+msgstr "複製(_C)..."
+
+# src/collect-table.c:634 src/dupe.c:1403 src/img-view.c:805 src/menu.c:912
+# src/menu.c:971
+#: src/collect-table.c:801 src/dupe.c:2212 src/img-view.c:1191
+#: src/layout_image.c:729 src/layout_util.c:763 src/search.c:990
+#: src/view_file_icon.c:289 src/view_file_list.c:401
+msgid "_Move..."
+msgstr "移動(_M)..."
+
+# src/collect-table.c:635 src/dupe.c:1405 src/img-view.c:806 src/menu.c:914
+# src/menu.c:973
+#: src/collect-table.c:803 src/dupe.c:2214 src/img-view.c:1192
+#: src/layout_image.c:731 src/layout_util.c:764 src/search.c:992
+#: src/view_dir_list.c:415 src/view_dir_tree.c:505 src/view_file_icon.c:291
+#: src/view_file_list.c:403
+msgid "_Rename..."
+msgstr "更改名稱(_R)..."
+
+# src/collect-table.c:636 src/dupe.c:1407 src/img-view.c:807 src/menu.c:916
+# src/menu.c:975
+#: src/collect-table.c:805 src/dupe.c:2216 src/img-view.c:1193
+#: src/layout_image.c:733 src/layout_util.c:765 src/search.c:994
+#: src/view_file_icon.c:293 src/view_file_list.c:405
+msgid "_Delete..."
+msgstr "刪除(_D)..."
+
+# src/ui_pathsel.c:764
+#: src/collect-table.c:810 src/view_file_icon.c:309
+msgid "Show filename _text"
+msgstr "顯示檔案名稱(_T)"
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/collect-table.c:813
+msgid "_Save collection"
+msgstr "儲存圖像集(_S)"
+
+# src/collect-table.c:642
+#: src/collect-table.c:815
+msgid "Save collection _as..."
+msgstr "另存圖像集為(_A)..."
+
+# src/collect-table.c:644 src/menu.c:885
+#: src/collect-table.c:818 src/layout_util.c:759
+msgid "_Find duplicates..."
+msgstr "尋找重複檔案(_F)..."
+
+# 
+# src/menu.c:721
+#: src/collect-table.c:820 src/dupe.c:2207 src/search.c:985
+#, fuzzy
+msgid "Print..."
+msgstr "/檔案/更改名稱(_R)..."
+
+# 
+# src/collect-table.c:1818 src/dupe.c:2170
+#: src/collect-table.c:1978 src/dupe.c:3304 src/img-view.c:1347
+#, fuzzy
+msgid "Dropped list includes folders."
+msgstr "拖到這裡的檔案包括目錄。"
+
+# src/collect-table.c:1820 src/dupe.c:2172
+#: src/collect-table.c:1980 src/dupe.c:3306 src/img-view.c:1349
+msgid "_Add contents"
+msgstr "加入內容(_A)"
+
+# src/collect-table.c:1821 src/dupe.c:2173
+#: src/collect-table.c:1982 src/dupe.c:3307 src/img-view.c:1350
+msgid "Add contents _recursive"
+msgstr "加入內容包含子目錄(_R)"
+
+# src/collect-table.c:1822 src/dupe.c:2174
+#: src/collect-table.c:1984 src/dupe.c:3308 src/img-view.c:1351
+#, fuzzy
+msgid "_Skip folders"
+msgstr "跳過目錄(_S)"
+
+# src/collect-table.c:1824 src/dupe.c:2176 src/preferences.c:536
+# src/ui_utildlg.c:105
+#: src/collect-table.c:1987 src/dupe.c:3310 src/img-view.c:1353
+#: src/view_dir_list.c:222 src/view_dir_tree.c:314
+msgid "Cancel"
+msgstr "取消"
+
+# 
+# src/dupe.c:61
+#: src/dupe.c:96
+msgid "Drop files to compare them."
+msgstr "拖放檔案到這裡比較。"
+
+# 
+# src/dupe.c:67 src/dupe.c:1449
+#: src/dupe.c:100
+#, c-format
+msgid "%d files"
+msgstr "%d 個檔案"
+
+# 
+# src/dupe.c:71
+#: src/dupe.c:104
+#, c-format
+msgid "%d matches found in %d files"
+msgstr "找到 %d 個符合的檔案(在 %d 個檔案中)"
+
+#: src/dupe.c:109
+msgid "[set 1]"
+msgstr ""
+
+# 
+# src/dupe.c:775
+#: src/dupe.c:1422
+msgid "Reading checksums..."
+msgstr "正在讀取加總值..."
+
+# src/dupe.c:807
+#: src/dupe.c:1455
+msgid "Reading dimensions..."
+msgstr "正在讀取圖像尺寸..."
+
+# 
+# src/dupe.c:841
+#: src/dupe.c:1489
+msgid "Reading similarity data..."
+msgstr "正在讀取類似度資料..."
+
+# 
+# src/dupe.c:871 src/dupe.c:892
+#: src/dupe.c:1524 src/dupe.c:1555
+msgid "Comparing..."
+msgstr "比較中..."
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/dupe.c:1535
+msgid "Sorting..."
+msgstr "排序中..."
+
+#: src/dupe.c:2196
+msgid "Select group _1 duplicates"
+msgstr "選擇第 1 群為重複"
+
+#: src/dupe.c:2198
+msgid "Select group _2 duplicates"
+msgstr "選擇第 2 群為重複"
+
+# 
+# src/dupe.c:1398
+#: src/dupe.c:2205 src/search.c:983
+msgid "Add to new collection"
+msgstr "加入至新的圖像集"
+
+# src/dupe.c:1412 src/dupe.c:1570
+#: src/dupe.c:2221 src/dupe.c:2509 src/search.c:999
+msgid "C_lear"
+msgstr "清除(_L)"
+
+# src/dupe.c:1415 src/dupe.c:1573 src/img-view.c:841
+#: src/dupe.c:2224 src/dupe.c:2512
+msgid "Close _window"
+msgstr "關閉視窗(_W)"
+
+# src/filelist.c:88
+#: src/dupe.c:2382
+#, c-format
+msgid "%d files (set 2)"
+msgstr ""
+
+# 
+# src/dupe.c:1653 src/dupe.c:1942
+#: src/dupe.c:2590 src/dupe.c:3117 src/preferences.c:947 src/print.c:3194
+#: src/search.c:2754 src/view_file_list.c:1556
+msgid "Size"
+msgstr "檔案大小"
+
+# src/dupe.c:1654 src/dupe.c:1943
+#: src/dupe.c:2591 src/dupe.c:3118 src/exif.c:297 src/exif.c:419
+#: src/print.c:3192 src/search.c:2755 src/view_file_list.c:1557
+msgid "Date"
+msgstr "日期"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/dupe.c:2592 src/dupe.c:3119 src/print.c:3196 src/search.c:2756
+msgid "Dimensions"
+msgstr "圖像尺寸"
+
+# 
+# src/dupe.c:1656
+#: src/dupe.c:2593
+msgid "Checksum"
+msgstr "加總值(Checksum)"
+
+# 
+# src/dupe.c:1657 src/dupe.c:1945
+#: src/dupe.c:2594 src/dupe.c:3120 src/search.c:2757 src/ui_pathsel.c:1107
+msgid "Path"
+msgstr "路徑"
+
+# 
+# src/dupe.c:1658
+#: src/dupe.c:2595
+msgid "Similarity (high)"
+msgstr "類似度(高)"
+
+# 
+# src/dupe.c:1659
+#: src/dupe.c:2596
+msgid "Similarity"
+msgstr "類似度"
+
+# 
+# src/dupe.c:1660
+#: src/dupe.c:2597
+msgid "Similarity (low)"
+msgstr "類似度(低)"
+
+# src/dupe.c:1660
+#: src/dupe.c:2598
+msgid "Similarity (custom)"
+msgstr "類似度(自訂)"
+
+# 
+# src/dupe.c:1968
+#: src/dupe.c:3080
+msgid "Find duplicates - GQview"
+msgstr "尋找重複檔案 - GQview"
+
+# 
+# src/dupe.c:1948
+#: src/dupe.c:3152
+msgid "Compare to:"
+msgstr "和以下檔案比較:"
+
+# 
+# src/dupe.c:2045
+#: src/dupe.c:3165
+msgid "Compare by:"
+msgstr "以下列方式比較:"
+
+# 
+# src/dupe.c:2054 src/preferences.c:586
+#: src/dupe.c:3173 src/preferences.c:840 src/search.c:2770
+msgid "Thumbnails"
+msgstr "縮圖"
+
+# src/dupe.c:2060
+#: src/dupe.c:3180
+msgid "Compare two file sets"
+msgstr "比較兩組檔案"
+
+# 
+# src/main.c:552
+#: src/editors.c:50
+msgid "The Gimp"
+msgstr "The Gimp"
+
+# 
+# src/main.c:558
+#: src/editors.c:51
+msgid "XV"
+msgstr "XV"
+
+# 
+# src/main.c:561
+#: src/editors.c:52
+msgid "Xpaint"
+msgstr "Xpaint"
+
+# src/menu.c:572
+#: src/editors.c:58
+msgid "Rotate jpeg clockwise"
+msgstr "順時針旋轉 jpeg 檔"
+
+# src/menu.c:575
+#: src/editors.c:59
+msgid "Rotate jpeg counterclockwise"
+msgstr "逆時針旋轉 jpeg 檔"
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/editors.c:104
+msgid "stopping..."
+msgstr "停止中..."
+
+#: src/editors.c:131
+msgid "Edit command results"
+msgstr "編輯命令結果"
+
+#: src/editors.c:134
+#, c-format
+msgid "Output of %s"
+msgstr "%s 的輸出"
+
+# src/ui_help.c:191
+#: src/editors.c:303
+#, c-format
+msgid ""
+"Failed to run command:\n"
+"%s\n"
+msgstr ""
+"無法執行檔案:\n"
+"%s\n"
+
+# src/menu.c:522
+#: src/editors.c:414
+msgid "stopped by user"
+msgstr "由使用者停止"
+
+# src/menu.c:432 src/menu.c:461
+#: src/exif.c:112 src/exif.c:125 src/exif.c:139 src/exif.c:164 src/exif.c:606
+#: src/exif.c:1452 src/exif.c:1455 src/exif.c:1520
+msgid "unknown"
+msgstr "未知"
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/exif.c:113
+msgid "top left"
+msgstr "上左"
+
+#: src/exif.c:114
+msgid "top right"
+msgstr "上右"
+
+#: src/exif.c:115
+msgid "bottom right"
+msgstr "下右"
+
+#: src/exif.c:116
+msgid "bottom left"
+msgstr "下左"
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/exif.c:117
+msgid "left top"
+msgstr "左上"
+
+#: src/exif.c:118
+msgid "right top"
+msgstr "右上"
+
+#: src/exif.c:119
+msgid "right bottom"
+msgstr "右下"
+
+#: src/exif.c:120
+msgid "left bottom"
+msgstr "左下"
+
+#: src/exif.c:127
+msgid "inch"
+msgstr "英吋"
+
+#: src/exif.c:128
+msgid "centimeter"
+msgstr "公分"
+
+#: src/exif.c:140
+msgid "average"
+msgstr ""
+
+#: src/exif.c:141
+msgid "center weighted"
+msgstr ""
+
+#: src/exif.c:142
+msgid "spot"
+msgstr ""
+
+#: src/exif.c:143
+msgid "multi-spot"
+msgstr ""
+
+#: src/exif.c:144
+msgid "multi-segment"
+msgstr ""
+
+#: src/exif.c:145
+msgid "partial"
+msgstr ""
+
+#: src/exif.c:146 src/exif.c:184
+msgid "other"
+msgstr "其它"
+
+#: src/exif.c:151
+msgid "not defined"
+msgstr "未定義"
+
+#: src/exif.c:152
+msgid "manual"
+msgstr "手動"
+
+# src/preferences.c:401
+#: src/exif.c:153
+msgid "normal"
+msgstr "標準"
+
+#: src/exif.c:154
+msgid "aperture"
+msgstr "光圈"
+
+#: src/exif.c:155
+msgid "shutter"
+msgstr "快門"
+
+# src/utilops.c:1216
+#: src/exif.c:156
+msgid "creative"
+msgstr "建立"
+
+#: src/exif.c:157
+msgid "action"
+msgstr ""
+
+#: src/exif.c:158
+msgid "portrait"
+msgstr "縱向"
+
+#: src/exif.c:159
+msgid "landscape"
+msgstr "橫向"
+
+#: src/exif.c:165
+msgid "daylight"
+msgstr ""
+
+#: src/exif.c:166
+msgid "fluorescent"
+msgstr ""
+
+#: src/exif.c:167
+#, fuzzy
+msgid "tungsten (incandescent)"
+msgstr "鎢 (incandescent)"
+
+#: src/exif.c:168
+msgid "flash"
+msgstr "閃光"
+
+#: src/exif.c:189 src/exif.c:1475 src/info.c:226
+msgid "no"
+msgstr "否"
+
+# src/utilops.c:343
+#. flash fired (bit 0)
+#: src/exif.c:190 src/exif.c:1475 src/info.c:226
+msgid "yes"
+msgstr "是"
+
+#: src/exif.c:191
+msgid "yes, not detected by strobe"
+msgstr "是,閃光燈未偵測到"
+
+#: src/exif.c:192
+msgid "yes, detected by strobe"
+msgstr "是,閃光燈有偵測到"
+
+# src/utilops.c:539
+#: src/exif.c:289
+msgid "Image description"
+msgstr "影像描述"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/exif.c:292
+msgid "Orientation"
+msgstr "方位"
+
+# src/utilops.c:592
+#: src/exif.c:303
+msgid "Copyright"
+msgstr "版權"
+
+#: src/exif.c:308
+msgid "Exposure program"
+msgstr "曝光程式"
+
+#: src/exif.c:310 src/exif.c:346 src/exif.c:423
+msgid "ISO sensitivity"
+msgstr ""
+
+#: src/exif.c:313
+msgid "Date original"
+msgstr "原日期"
+
+#: src/exif.c:314
+msgid "Date digitized"
+msgstr "數位化日期"
+
+#: src/exif.c:317 src/exif.c:420
+msgid "Shutter speed"
+msgstr "快門速度"
+
+#: src/exif.c:318 src/exif.c:421
+msgid "Aperture"
+msgstr "光圈"
+
+#: src/exif.c:320 src/exif.c:422
+msgid "Exposure bias"
+msgstr "曝光偏移量"
+
+#: src/exif.c:322 src/exif.c:425
+msgid "Subject distance"
+msgstr "物距"
+
+# src/preferences.c:693
+#: src/exif.c:323
+msgid "Metering mode"
+msgstr "測量方式"
+
+#: src/exif.c:324
+msgid "Light source"
+msgstr "光源"
+
+#: src/exif.c:325 src/exif.c:426
+msgid "Flash"
+msgstr "閃光"
+
+#: src/exif.c:326 src/exif.c:424
+msgid "Focal length"
+msgstr "焦距"
+
+#. ExifImageWidth, ExifImageHeight can also be unsigned short
+#: src/exif.c:336
+msgid "Width"
+msgstr "寬度"
+
+#: src/exif.c:337
+msgid "Height"
+msgstr "高度"
+
+#: src/exif.c:418
+msgid "Camera"
+msgstr "相機"
+
+#: src/exif.c:427
+msgid "Resolution"
+msgstr "解析度"
+
+#: src/exif.c:1451
+msgid "infinity"
+msgstr "無限"
+
+# src/preferences.c:368
+#: src/exif.c:1479
+msgid "mode:"
+msgstr "模式"
+
+# src/preferences.c:400
+#: src/exif.c:1483 src/utilops.c:1234
+msgid "on"
+msgstr "開啟"
+
+#: src/exif.c:1486 src/utilops.c:1234
+msgid "off"
+msgstr "關閉"
+
+#: src/exif.c:1489
+msgid "auto"
+msgstr "自動"
+
+#: src/exif.c:1495
+msgid "not detected by strobe"
+msgstr "閃光燈未偵測出"
+
+#: src/exif.c:1496
+msgid "detected by strobe"
+msgstr "閃光燈已偵測出"
+
+#. we ignore flash function (bit 5)
+#. red-eye (bit 6)
+#: src/exif.c:1501
+msgid "red-eye reduction"
+msgstr ""
+
+#: src/exif.c:1520
+msgid "dot"
+msgstr "點"
+
+# src/dupe.c:67 src/dupe.c:1449
+#: src/filelist.c:513
+#, c-format
+msgid "%d bytes"
+msgstr "%d bytes"
+
+#: src/filelist.c:517
+#, c-format
+msgid "%.1f K"
+msgstr "%.1f K"
+
+#: src/filelist.c:521
+#, c-format
+msgid "%.1f MB"
+msgstr "%.1f MB"
+
+#: src/filelist.c:526
+#, c-format
+msgid "%.1f GB"
+msgstr "%.1f GB"
+
+# 
+# src/fullscreen.c:117
+#: src/fullscreen.c:267
+msgid "GQview full screen"
+msgstr "GQview 全螢幕"
+
+# src/preferences.c:368
+#: src/fullscreen.c:397
+#, fuzzy
+msgid "Full size"
+msgstr "檔案大小:"
+
+#: src/fullscreen.c:402
+msgid "Monitor"
+msgstr ""
+
+#: src/fullscreen.c:407
+msgid "Screen"
+msgstr ""
+
+# 
+# src/img-view.c:792 src/menu.c:947 src/menu.c:1083 src/preferences.c:716
+#: src/fullscreen.c:644
+#, fuzzy
+msgid "Stay above other windows"
+msgstr "圖像符合視窗尺寸"
+
+#: src/fullscreen.c:651
+msgid "Determined by Window Manager"
+msgstr ""
+
+#: src/fullscreen.c:652
+msgid "Active screen"
+msgstr ""
+
+#: src/fullscreen.c:654
+msgid "Active monitor"
+msgstr ""
+
+# src/img-view.c:789 src/menu.c:944 src/menu.c:1079
+#: src/img-view.c:1173 src/layout_image.c:706 src/layout_util.c:791
+msgid "Zoom _in"
+msgstr "拉近(_I)"
+
+# src/img-view.c:790 src/menu.c:945 src/menu.c:1081
+#: src/img-view.c:1174 src/layout_image.c:707 src/layout_util.c:792
+msgid "Zoom _out"
+msgstr "拉遠(_O)"
+
+# src/img-view.c:791 src/menu.c:946
+#: src/img-view.c:1175 src/layout_image.c:708 src/layout_util.c:793
+msgid "Zoom _1:1"
+msgstr "原來尺寸(_1)"
+
+# src/img-view.c:792 src/menu.c:947 src/menu.c:1083 src/preferences.c:716
+#: src/img-view.c:1176 src/layout_image.c:709
+msgid "Fit image to _window"
+msgstr "影像符合視窗尺寸(_W)"
+
+# src/img-view.c:797 src/menu.c:960
+#: src/img-view.c:1181 src/layout_image.c:715 src/layout_util.c:789
+msgid "Set as _wallpaper"
+msgstr "設定為桌布(W)"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/img-view.c:1199 src/layout_image.c:740
+msgid "_Stop slideshow"
+msgstr "關閉投影片(_S)"
+
+# src/img-view.c:816 src/menu.c:985
+#: src/img-view.c:1202 src/layout_image.c:743
+msgid "Continue slides_how"
+msgstr "繼續投影片(_H)"
+
+# src/img-view.c:820 src/img-view.c:827 src/menu.c:989 src/menu.c:995
+#: src/img-view.c:1207 src/img-view.c:1215 src/layout_image.c:748
+#: src/layout_image.c:755
+msgid "Pause slides_how"
+msgstr "暫停投影片(_H)"
+
+# src/img-view.c:825 src/menu.c:994
+#: src/img-view.c:1213 src/layout_image.c:754
+msgid "_Start slideshow"
+msgstr "啟動投影片(_S)"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/img-view.c:1221 src/layout_image.c:765
+msgid "Exit _full screen"
+msgstr "離開全螢幕模式(_F)"
+
+# src/img-view.c:837 src/menu.c:1001
+#: src/img-view.c:1225 src/layout_image.c:761
+msgid "_Full screen"
+msgstr "全螢幕(_F)"
+
+# src/dupe.c:1415 src/dupe.c:1573 src/img-view.c:841
+#: src/img-view.c:1229 src/layout_util.c:766
+msgid "C_lose window"
+msgstr "關閉視窗(_L)"
+
+# src/preferences.c:368
+#: src/info.c:361
+msgid "File size:"
+msgstr "檔案大小:"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/info.c:363
+msgid "Dimensions:"
+msgstr "圖像尺寸:"
+
+#: src/info.c:364
+msgid "Transparent:"
+msgstr "透明背景:"
+
+# src/preferences.c:676
+#: src/info.c:365 src/print.c:3371
+msgid "Image size:"
+msgstr "圖像大小:"
+
+# src/dupe.c:1948
+#: src/info.c:367
+msgid "Compress ratio:"
+msgstr "壓縮比例:"
+
+# src/ui_pathsel.c:799
+#: src/info.c:368
+#, fuzzy
+msgid "File type:"
+msgstr "檔案日期:"
+
+#: src/info.c:370
+msgid "Owner:"
+msgstr "擁有者:"
+
+#: src/info.c:371
+msgid "Group:"
+msgstr "群組:"
+
+# 
+# src/preferences.c:551
+#: src/info.c:374 src/preferences.c:821
+msgid "General"
+msgstr "一般"
+
+#: src/info.c:455
+#, c-format
+msgid "Image %d of %d"
+msgstr "影像 %d/%d"
+
+#: src/info.c:678
+msgid "Image properties - GQview"
+msgstr "影像內容 - GQview"
+
+# src/window.c:87
+#: src/layout.c:271 src/view_file_icon.c:301 src/view_file_list.c:413
+msgid "Ascending"
+msgstr "遞增"
+
+# 
+# src/filelist.c:76
+#: src/layout.c:337
+msgid " Slideshow"
+msgstr " 投影片"
+
+# 
+# src/filelist.c:80
+#: src/layout.c:341
+msgid " Paused"
+msgstr " 暫停"
+
+# src/filelist.c:86
+#: src/layout.c:358
+#, c-format
+msgid "%s, %d files (%s, %d)%s"
+msgstr "%s, %d 個檔案 (%s, %d)%s"
+
+# src/filelist.c:88
+#: src/layout.c:365
+#, c-format
+msgid "%s, %d files%s"
+msgstr "%s, %d 個檔案 %s"
+
+# src/filelist.c:88
+#: src/layout.c:370
+#, c-format
+msgid "%d files%s"
+msgstr "%d 個檔案%s"
+
+#: src/layout.c:399
+#, c-format
+msgid "(no read permission) %s bytes"
+msgstr "(無讀取權限) %s bytes"
+
+# 
+# src/window.c:379
+#: src/layout.c:403
+#, c-format
+msgid "( ? x ? ) %s bytes"
+msgstr "( ? x ? ) %s 位元組"
+
+# src/window.c:383
+#: src/layout.c:408
+#, c-format
+msgid "( %d x %d ) %s bytes"
+msgstr "( %d x %d ) %s 位元組"
+
+# src/window.c:234
+#: src/layout.c:1104
+msgid "GQview Tools"
+msgstr "GQview 工具"
+
+# src/preferences.c:368
+#: src/layout_config.c:57
+msgid "Tools"
+msgstr "工具"
+
+# src/preferences.c:368
+#: src/layout_config.c:57 src/ui_pathsel.c:1175
+msgid "Files"
+msgstr "檔案"
+
+# 
+# src/preferences.c:676
+#: src/layout_config.c:57 src/preferences.c:881 src/print.c:110
+msgid "Image"
+msgstr "圖像"
+
+#: src/layout_config.c:363
+msgid "(drag to change order)"
+msgstr "(以拖曳方式改變順序)"
+
+# src/menu.c:1010
+#: src/layout_image.c:770
+msgid "Hide file _list"
+msgstr "隱藏檔案列表(_L)"
+
+# 
+# src/menu.c:430 src/menu.c:457
+#: src/layout_util.c:625 src/menu.c:74
+#, c-format
+msgid "in %s..."
+msgstr "使用 %s..."
+
+# src/menu.c:432 src/menu.c:461
+#: src/layout_util.c:629 src/menu.c:76
+msgid "in (unknown)..."
+msgstr "使用(未知)..."
+
+# src/collect-table.c:78 src/menu.c:684
+#: src/layout_util.c:637
+#, fuzzy
+msgid "empty"
+msgstr "空白"
+
+# src/menu.c:709
+#: src/layout_util.c:748
+#, fuzzy
+msgid "_File"
+msgstr "/檔案(_F)"
+
+# src/menu.c:726
+#: src/layout_util.c:749 src/menu.c:91
+msgid "_Edit"
+msgstr "編輯(_E)"
+
+# src/menu.c:626
+#: src/layout_util.c:750 src/menu.c:248
+msgid "_Adjust"
+msgstr "調整圖像(_A)"
+
+# 
+# src/menu.c:771
+#: src/layout_util.c:752
+#, fuzzy
+msgid "_Help"
+msgstr "/求助(_H)"
+
+# src/menu.c:711
+#: src/layout_util.c:754
+#, fuzzy
+msgid "New _window"
+msgstr "/檔案/新視窗(_W)"
+
+# src/collect-dlg.c:165 src/collect-table.c:641
+#: src/layout_util.c:755
+#, fuzzy
+msgid "_New collection"
+msgstr "儲存圖像集(_S)"
+
+# 
+# src/collect-dlg.c:172
+#: src/layout_util.c:756
+#, fuzzy
+msgid "_Open collection..."
+msgstr "開啟圖像集"
+
+# 
+# src/menu.c:713
+#: src/layout_util.c:757
+#, fuzzy
+msgid "Open _recent"
+msgstr "/檔案/開啟最近的檔案(_R)"
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/layout_util.c:758
+#, fuzzy
+msgid "_Search..."
+msgstr "排序中..."
+
+# 
+# src/menu.c:721
+#: src/layout_util.c:760
+#, fuzzy
+msgid "_Print..."
+msgstr "/檔案/更改名稱(_R)..."
+
+#: src/layout_util.c:761
+#, fuzzy
+msgid "N_ew folder..."
+msgstr "新資料夾(_N)..."
+
+# 
+# src/preferences.c:684
+#: src/layout_util.c:767
+#, fuzzy
+msgid "_Quit"
+msgstr "品質"
+
+# src/menu.c:572
+#: src/layout_util.c:779 src/menu.c:194
+msgid "_Rotate clockwise"
+msgstr "順時針旋轉(_R)"
+
+# src/menu.c:575
+#: src/layout_util.c:780 src/menu.c:197
+msgid "Rotate _counterclockwise"
+msgstr "逆時針旋轉(_C)"
+
+# src/menu.c:578
+#: src/layout_util.c:781
+#, fuzzy
+msgid "Rotate 1_80"
+msgstr "旋轉 180 度(_1)"
+
+# src/menu.c:581
+#: src/layout_util.c:782 src/menu.c:203
+msgid "_Mirror"
+msgstr "左右反轉(_M)"
+
+# src/menu.c:584
+#: src/layout_util.c:783 src/menu.c:206
+msgid "_Flip"
+msgstr "上下反轉(_F)"
+
+# src/collect-table.c:627 src/dupe.c:1391 src/dupe.c:1563
+#: src/layout_util.c:785
+#, fuzzy
+msgid "Select _all"
+msgstr "全部選取"
+
+# 
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/layout_util.c:786
+#, fuzzy
+msgid "Select _none"
+msgstr "全部不選"
+
+# src/menu.c:748
+#: src/layout_util.c:787
+#, fuzzy
+msgid "P_references..."
+msgstr "內容(_P)..."
+
+#: src/layout_util.c:788
+msgid "_Thumbnail maintenance..."
+msgstr ""
+
+# 
+# src/menu.c:758
+#: src/layout_util.c:794
+#, fuzzy
+msgid "_Zoom to fit"
+msgstr "/檢視/圖像符合視窗尺寸(_Z)"
+
+# src/img-view.c:837 src/menu.c:1001
+#: src/layout_util.c:795
+#, fuzzy
+msgid "F_ull screen"
+msgstr "全螢幕(_F)"
+
+# src/menu.c:1010
+#: src/layout_util.c:796
+#, fuzzy
+msgid "_Hide file list"
+msgstr "隱藏檔案列表(_L)"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/layout_util.c:797
+#, fuzzy
+msgid "Toggle _slideshow"
+msgstr "關閉投影片(_S)"
+
+# src/menu.c:891 src/menu.c:920
+#: src/layout_util.c:798
+#, fuzzy
+msgid "_Refresh"
+msgstr "重新整理(_F)"
+
+# 
+# src/menu.c:776
+#: src/layout_util.c:800
+#, fuzzy
+msgid "_Contents"
+msgstr "/求助/關於(_A)"
+
+# src/menu.c:773
+#: src/layout_util.c:801
+#, fuzzy
+msgid "_Keyboard shortcuts"
+msgstr "/求助/捷徑鍵(_K)"
+
+# src/menu.c:774
+#: src/layout_util.c:802
+#, fuzzy
+msgid "_Release notes"
+msgstr "/求助/發行須知(_R)"
+
+# 
+# src/menu.c:776
+#: src/layout_util.c:803
+#, fuzzy
+msgid "_About"
+msgstr "/求助/關於(_A)"
+
+# 
+# src/dupe.c:2054 src/preferences.c:586
+#: src/layout_util.c:807
+#, fuzzy
+msgid "_Thumbnails"
+msgstr "縮圖"
+
+# src/menu.c:768
+#: src/layout_util.c:808
+#, fuzzy
+msgid "Tr_ee"
+msgstr "/檢視/樹狀目錄(_E)"
+
+# src/menu.c:766
+#: src/layout_util.c:809
+#, fuzzy
+msgid "_Float file list"
+msgstr "/檢視/浮動檔案列表(_F)"
+
+# src/menu.c:754
+#: src/layout_util.c:810
+#, fuzzy
+msgid "Hide tool_bar"
+msgstr "/檢視/隱藏工具列(_B)"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/layout_util.c:811
+#, fuzzy
+msgid "_Keywords"
+msgstr "/檢視/圖示模式(_C)"
+
+# src/menu.c:765
+#: src/layout_util.c:812
+#, fuzzy
+msgid "E_xif data"
+msgstr "/檢視/Exif資料(_X)"
+
+# src/menu.c:526
+#: src/layout_util.c:813
+#, fuzzy
+msgid "Sort _manager"
+msgstr "排列管理員"
+
+# src/menu.c:765
+#: src/layout_util.c:817
+#, fuzzy
+msgid "_List"
+msgstr "/檢視/清單模式(_L)"
+
+#: src/layout_util.c:818
+#, fuzzy
+msgid "I_cons"
+msgstr "圖像:"
+
+# src/preferences.c:603
+#: src/layout_util.c:1083
+msgid "Show thumbnails"
+msgstr "顯示縮圖"
+
+# 
+# src/menu.c:1075
+#: src/layout_util.c:1085
+#, fuzzy
+msgid "Change to home folder"
+msgstr "回到主目錄"
+
+# 
+# src/menu.c:1077
+#: src/layout_util.c:1087
+msgid "Refresh file list"
+msgstr "重新整理檔案列表"
+
+# src/img-view.c:789 src/menu.c:944 src/menu.c:1079
+#: src/layout_util.c:1089
+msgid "Zoom in"
+msgstr "拉近"
+
+# 
+# src/img-view.c:790 src/menu.c:945 src/menu.c:1081
+#: src/layout_util.c:1091
+msgid "Zoom out"
+msgstr "拉遠"
+
+# 
+# src/img-view.c:792 src/menu.c:947 src/menu.c:1083 src/preferences.c:716
+#: src/layout_util.c:1093 src/preferences.c:910
+msgid "Fit image to window"
+msgstr "圖像符合視窗尺寸"
+
+# 
+# src/menu.c:1085
+#: src/layout_util.c:1095
+msgid "Set zoom 1:1"
+msgstr "設為原來尺寸"
+
+# 
+# src/menu.c:1087
+#: src/layout_util.c:1097
+msgid "Configure options"
+msgstr "設定選項"
+
+# 
+# src/menu.c:1089
+#: src/layout_util.c:1099
+msgid "Float Controls"
+msgstr "浮動控制視窗"
+
+# src/main.c:129
+#: src/main.c:266
+msgid "Help - GQview"
+msgstr "求助 - GQview"
+
+# 
+# src/main.c:743
+#: src/main.c:489 src/main.c:1305
+msgid "Command line"
+msgstr "指令列"
+
+# 
+# src/preferences.c:660
+#. short, long                  callback,               extra, prefer,description
+#: src/main.c:527
+#, fuzzy
+msgid "next image"
+msgstr "預先載入下個圖像"
+
+#: src/main.c:528
+msgid "previous image"
+msgstr ""
+
+#: src/main.c:529
+#, fuzzy
+msgid "first image"
+msgstr "回復最後影像"
+
+#: src/main.c:530
+#, fuzzy
+msgid "last image"
+msgstr "回復最後影像"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/main.c:531
+#, fuzzy
+msgid "toggle full screen"
+msgstr "離開全螢幕模式(_F)"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/main.c:532
+#, fuzzy
+msgid "start full screen"
+msgstr "離開全螢幕模式(_F)"
+
+# src/img-view.c:833 src/menu.c:1005
+#: src/main.c:533
+#, fuzzy
+msgid "stop full screen"
+msgstr "離開全螢幕模式(_F)"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/main.c:534
+#, fuzzy
+msgid "toggle slide show"
+msgstr "關閉投影片(_S)"
+
+# src/img-view.c:825 src/menu.c:994
+#: src/main.c:535
+#, fuzzy
+msgid "start slide show"
+msgstr "啟動投影片(_S)"
+
+# src/img-view.c:813 src/menu.c:982
+#: src/main.c:536
+#, fuzzy
+msgid "stop slide show"
+msgstr "關閉投影片(_S)"
+
+# src/img-view.c:825 src/menu.c:994
+#: src/main.c:537
+#, fuzzy
+msgid "start recursive slide show"
+msgstr "啟動投影片(_S)"
+
+#: src/main.c:538
+msgid "set slide show delay in seconds"
+msgstr ""
+
+#: src/main.c:539
+msgid "show tools"
+msgstr ""
+
+# src/window.c:234
+#: src/main.c:540
+#, fuzzy
+msgid "hide tools"
+msgstr "GQview 工具"
+
+#: src/main.c:541
+msgid "quit"
+msgstr ""
+
+# src/utilops.c:1090
+#: src/main.c:542
+#, fuzzy
+msgid "open file"
+msgstr "更改檔案名稱:"
+
+# src/collect-table.c:620 src/dupe.c:1388 src/dupe.c:1560 src/img-view.c:801
+# src/menu.c:906 src/menu.c:964
+#: src/main.c:543
+#, fuzzy
+msgid "open file in new window"
+msgstr "在新視窗中檢視(_N)"
+
+#: src/main.c:609
+msgid "Remote command list:\n"
+msgstr ""
+
+#: src/main.c:667
+msgid "Remote GQview not running, starting..."
+msgstr ""
+
+#: src/main.c:802
+msgid "Remote not available\n"
+msgstr ""
+
+# 
+# src/main.c:457
+#: src/main.c:944
+msgid ""
+"Usage: gqview [options] [path]\n"
+"\n"
+msgstr ""
+"用法:gqview [選項] [路俓]\n"
+"\n"
+
+# 
+# src/main.c:458
+#: src/main.c:945
+msgid "valid options are:\n"
+msgstr "有效之選項為:\n"
+
+# 
+# src/main.c:459
+#: src/main.c:946
+msgid "  +t, --with-tools           force show of tools\n"
+msgstr "  +t, --with-tools           強行顯示工具\n"
+
+# src/main.c:460
+#: src/main.c:947
+msgid "  -t, --without-tools        force hide of tools\n"
+msgstr "  -t, --without-tools        強行隱藏工具\n"
+
+# 
+# src/main.c:461
+#: src/main.c:948
+msgid "  -f, --fullscreen           start in full screen mode\n"
+msgstr "  -f, --fullscreen           啟始時進入全螢幕模式\n"
+
+# 
+# src/main.c:462
+#: src/main.c:949
+msgid "  -s, --slideshow            start in slideshow mode\n"
+msgstr "  -s, --slideshow            啟始時進入投影片模式\n"
+
+# 
+# src/main.c:463
+#: src/main.c:950
+msgid "  -l, --list                 open collection window for command line\n"
+msgstr "  -l, --list                 在指令列開啟圖像集視窗\n"
+
+# 
+# src/main.c:463
+#: src/main.c:951
+#, fuzzy
+msgid "  -r, --remote               send following commands to open window\n"
+msgstr "  -l, --list                 在指令列開啟圖像集視窗\n"
+
+#: src/main.c:952
+msgid "  -rh,--remote-help          print remote command list\n"
+msgstr ""
+
+# 
+# src/main.c:464
+#: src/main.c:953
+msgid "  --debug                    turn on debug output\n"
+msgstr "  --debug                    啟動偵錯輸出\n"
+
+# 
+# src/main.c:465
+#: src/main.c:954
+msgid "  -v, --version              print version info\n"
+msgstr "  -v, --version              列印版本資訊\n"
+
+# 
+# src/main.c:466
+#: src/main.c:955
+msgid ""
+"  -h, --help                 show this message\n"
+"\n"
+msgstr ""
+"  -h, --help                 顯示此信息\n"
+"\n"
+
+# 
+# src/main.c:471
+#: src/main.c:969
+#, c-format
+msgid ""
+"invalid or ignored: %s\n"
+"Use --help for options\n"
+msgstr ""
+"選項 %s 無效或已被忽略\n"
+"請用 --help 查看選項\n"
+
+# 
+# src/main.c:533
+#: src/main.c:1034
+#, c-format
+msgid "Creating GQview dir:%s\n"
+msgstr "正在建立 GQview 目錄:%s\n"
+
+# 
+# src/main.c:536
+#: src/main.c:1040
+#, c-format
+msgid "Could not create dir:%s\n"
+msgstr "不能建立目錄:%s\n"
+
+# src/ui_pathsel.c:754
+#: src/main.c:1061 src/ui_bookmark.c:858 src/ui_pathsel.c:1043
+msgid "Home"
+msgstr "主目錄"
+
+# src/utilops.c:989
+#: src/main.c:1063 src/ui_bookmark.c:865
+msgid "Desktop"
+msgstr "桌面:"
+
+# 
+# src/main.c:619
+#: src/main.c:1152
+msgid "GQview - exit"
+msgstr "GQview - 離開"
+
+# src/img-view.c:559 src/window.c:533
+#: src/main.c:1156
+#, fuzzy
+msgid "Quit GQview"
+msgstr "關於 - GQview"
+
+# src/main.c:619
+#: src/main.c:1156
+#, fuzzy
+msgid "Collections have been modified. Quit anyway?"
+msgstr ""
+"圖像集已被修改。\n"
+"仍然要離開?"
+
+# src/menu.c:510
+#: src/menu.c:115
+msgid "Sort by size"
+msgstr "根據檔案大小排列"
+
+# src/menu.c:513
+#: src/menu.c:118
+msgid "Sort by date"
+msgstr "根據日期排列"
+
+# src/menu.c:516
+#: src/menu.c:121
+msgid "Unsorted"
+msgstr "不依次序排列"
+
+# src/menu.c:519
+#: src/menu.c:124
+msgid "Sort by path"
+msgstr "根據目錄排列"
+
+# src/menu.c:522
+#: src/menu.c:127
+msgid "Sort by number"
+msgstr "根據數字排列"
+
+# src/menu.c:526
+#: src/menu.c:131
+msgid "Sort by name"
+msgstr "根據名稱排列"
+
+# 
+# src/menu.c:559
+#: src/menu.c:175
+msgid "Sort"
+msgstr "排列"
+
+# src/menu.c:578
+#: src/menu.c:200
+msgid "Rotate _180"
+msgstr "旋轉 180 度(_1)"
+
+# 
+# src/preferences.c:367
+#: src/preferences.c:384
+msgid "Nearest (worst, but fastest)"
+msgstr "最近點(品質最差但最快)"
+
+# 
+# src/preferences.c:368
+#: src/preferences.c:386
+msgid "Tiles"
+msgstr "區域"
+
+# 
+# src/preferences.c:369
+#: src/preferences.c:388
+msgid "Bilinear"
+msgstr "雙線性"
+
+# 
+# src/preferences.c:370
+#: src/preferences.c:390
+msgid "Hyper (best, but slowest)"
+msgstr "雙曲線(品質最好但最慢)"
+
+# 
+# src/preferences.c:400
+#: src/preferences.c:418
+msgid "None"
+msgstr "沒有"
+
+# 
+# src/preferences.c:401
+#: src/preferences.c:419
+msgid "Normal"
+msgstr "正常"
+
+# src/preferences.c:402
+#: src/preferences.c:420
+msgid "Best"
+msgstr "最好"
+
+#: src/preferences.c:498 src/print.c:365
+#, fuzzy
+msgid "Custom"
+msgstr "自動"
+
+# src/utilops.c:707
+#: src/preferences.c:662 src/preferences.c:665
+msgid "Reset filters"
+msgstr "重設過濾器"
+
+#: src/preferences.c:666
+msgid ""
+"This will reset the file filters to the defaults.\n"
+"Continue?"
+msgstr ""
+"這樣將會重設檔案過濾器成預設值。\n"
+"是否繼續?"
+
+# src/utilops.c:707
+#: src/preferences.c:699 src/preferences.c:702
+msgid "Reset editors"
+msgstr "重設編輯器"
+
+#: src/preferences.c:703
+msgid ""
+"This will reset the edit commands to the defaults.\n"
+"Continue?"
+msgstr ""
+"這樣將會重設所有編輯命令成為預設值。\n"
+"是否繼續?"
+
+# src/preferences.c:163 src/preferences.c:604
+#: src/preferences.c:727 src/preferences.c:730
+msgid "Clear trash"
+msgstr "清除垃圾桶"
+
+#: src/preferences.c:731
+msgid "This will remove the trash contents."
+msgstr "這樣將會移除垃圾桶中的內容。"
+
+# 
+# src/utilops.c:942 src/utilops.c:1091
+#: src/preferences.c:770
+#, fuzzy
+msgid "GQview Preferences"
+msgstr "GQview - 更改名稱"
+
+#: src/preferences.c:824
+#, fuzzy
+msgid "Startup"
+msgstr "開始 #"
+
+# 
+# src/menu.c:1075
+#: src/preferences.c:826
+#, fuzzy
+msgid "Change to folder:"
+msgstr "回到主目錄"
+
+# 
+# src/preferences.c:581
+#: src/preferences.c:837
+msgid "Use current"
+msgstr "用這個目錄"
+
+# 
+# src/preferences.c:595
+#: src/preferences.c:843 src/print.c:3201 src/print.c:3408
+msgid "Size:"
+msgstr "大小:"
+
+# 
+# src/preferences.c:597
+#: src/preferences.c:844 src/preferences.c:890
+msgid "Quality:"
+msgstr "品質:"
+
+# src/preferences.c:603
+#: src/preferences.c:846
+msgid "Cache thumbnails"
+msgstr "將縮圖儲存在緩衝區"
+
+#: src/preferences.c:852
+msgid "Use shared thumbnail cache"
+msgstr ""
+
+# 
+# src/preferences.c:610
+#: src/preferences.c:858
+msgid "Cache thumbnails into .thumbnails"
+msgstr "將縮圖儲存在 .thumbnails"
+
+# 
+# src/preferences.c:613
+#: src/preferences.c:861
+msgid "Use xvpics thumbnails when found (read only)"
+msgstr "當找到 xvpics 縮圖時使用它(唯讀)"
+
+# 
+# src/preferences.c:615
+#: src/preferences.c:864
+msgid "Slide show"
+msgstr "投影片"
+
+# 
+# src/preferences.c:628
+#: src/preferences.c:867
+#, fuzzy
+msgid "Delay between image change:"
+msgstr "每次變換圖像前的停頓秒數:"
+
+#: src/preferences.c:867
+msgid "seconds"
+msgstr ""
+
+# 
+# src/preferences.c:645
+#: src/preferences.c:873
+msgid "Random"
+msgstr "隨機"
+
+# 
+# src/preferences.c:647
+#: src/preferences.c:874
+msgid "Repeat"
+msgstr "重複"
+
+# src/img-view.c:789 src/menu.c:944 src/menu.c:1079
+#: src/preferences.c:884
+#, fuzzy
+msgid "Zoom"
+msgstr "拉近"
+
+# 
+# src/preferences.c:693
+#: src/preferences.c:887
+msgid "Dithering method:"
+msgstr "擬色(Dither)方法:"
+
+#: src/preferences.c:892
+msgid "Two pass zooming"
+msgstr ""
+
+# src/preferences.c:729
+#: src/preferences.c:895
+msgid "Allow enlargement of image for zoom to fit."
+msgstr "選用「圖像符合視窗尺寸」時,圖像可超過原來尺寸"
+
+# 
+# src/preferences.c:751
+#: src/preferences.c:899
+msgid "Zoom increment:"
+msgstr "每步縮放比例:"
+
+# 
+# src/preferences.c:700
+#: src/preferences.c:904
+msgid "When new image is selected:"
+msgstr "當選擇新圖像時:"
+
+# 
+# src/preferences.c:710
+#: src/preferences.c:907
+msgid "Zoom to original size"
+msgstr "圖像變回原來尺寸"
+
+# 
+# src/preferences.c:722
+#: src/preferences.c:913
+msgid "Leave Zoom at previous setting"
+msgstr "保留已儲存的縮放設定"
+
+# 
+# src/collect-dlg.c:182
+#: src/preferences.c:917
+#, fuzzy
+msgid "Appearance"
+msgstr "加入"
+
+#: src/preferences.c:919
+msgid "Black background"
+msgstr "黑色背景"
+
+# 
+# src/utilops.c:328 src/utilops.c:394 src/utilops.c:668
+#: src/preferences.c:922
+#, fuzzy
+msgid "Convenience"
+msgstr "繼續"
+
+# src/menu.c:1077
+#: src/preferences.c:924
+msgid "Refresh on file change"
+msgstr "檔案改變時,重新整理檔案列表"
+
+# 
+# src/preferences.c:660
+#: src/preferences.c:926
+msgid "Preload next image"
+msgstr "預先載入下個圖像"
+
+#: src/preferences.c:928
+msgid "Auto rotate image using Exif information"
+msgstr "以 Exif 資訊決定自動旋轉"
+
+# src/preferences.c:773
+#: src/preferences.c:937
+msgid "Windows"
+msgstr "視窗"
+
+#: src/preferences.c:940
+#, fuzzy
+msgid "State"
+msgstr "開始 #"
+
+# 
+# src/preferences.c:782
+#: src/preferences.c:942
+msgid "Remember window positions"
+msgstr "記下視窗位置"
+
+# 
+# src/preferences.c:784
+#: src/preferences.c:944
+msgid "Remember tool state (float/hidden)"
+msgstr "記下工具狀態(浮動/隱藏)"
+
+# 
+# src/preferences.c:787
+#: src/preferences.c:949
+msgid "Fit window to image when tools are hidden/floating"
+msgstr "當工具隱藏/浮動時令圖像符合視窗尺寸"
+
+# 
+# src/preferences.c:794
+#: src/preferences.c:953
+msgid "Limit size when auto-sizing window (%):"
+msgstr "自動改變視窗尺寸時限制圖像尺寸為(%):"
+
+#: src/preferences.c:960 src/print.c:3356 src/print.c:3363
+msgid "Layout"
+msgstr "佈置"
+
+# 
+# src/preferences.c:812
+#: src/preferences.c:973
+msgid "Filtering"
+msgstr "檔案過濾"
+
+# 
+# src/preferences.c:821
+#: src/preferences.c:978
+msgid "Show entries that begin with a dot"
+msgstr "顯示以 '.' 開始的檔案"
+
+#: src/preferences.c:980
+msgid "Case sensitive sort"
+msgstr "排序時考慮大小寫"
+
+# 
+# src/preferences.c:823
+#: src/preferences.c:983
+msgid "Disable File Filtering"
+msgstr "關閉檔案過濾器"
+
+# src/ui_pathsel.c:799
+#: src/preferences.c:986
+#, fuzzy
+msgid "File types"
+msgstr "檔案日期:"
+
+# src/ui_pathsel.c:799
+#: src/preferences.c:1008
+msgid "Filter"
+msgstr "過濾器:"
+
+#: src/preferences.c:1045 src/preferences.c:1109
+msgid "Defaults"
+msgstr "還原預設值"
+
+# 
+# src/preferences.c:915
+#: src/preferences.c:1066
+msgid "Editors"
+msgstr "編輯器"
+
+# 
+# src/preferences.c:927
+#: src/preferences.c:1072
+msgid "#"
+msgstr "數目"
+
+# 
+# src/preferences.c:930
+#: src/preferences.c:1075
+msgid "Menu name"
+msgstr "名稱"
+
+#: src/preferences.c:1125
+msgid "Advanced"
+msgstr "進階選項"
+
+# src/img-view.c:837 src/menu.c:1001
+#: src/preferences.c:1138
+#, fuzzy
+msgid "Full screen"
+msgstr "全螢幕(_F)"
+
+# src/preferences.c:676
+#: src/preferences.c:1146
+#, fuzzy
+msgid "Smooth image flip"
+msgstr "圖像大小:"
+
+#: src/preferences.c:1148
+msgid "Disable screen saver"
+msgstr ""
+
+# 
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/preferences.c:1151
+msgid "Delete"
+msgstr "刪除"
+
+# 
+# src/preferences.c:667
+#: src/preferences.c:1153
+msgid "Confirm file delete"
+msgstr "確認刪除檔案"
+
+# 
+# src/preferences.c:669
+#: src/preferences.c:1155
+msgid "Enable Delete key"
+msgstr "可使用刪除鍵"
+
+# src/preferences.c:667
+#: src/preferences.c:1158
+msgid "Safe delete"
+msgstr "安全刪除"
+
+#: src/preferences.c:1176
+#, fuzzy
+msgid "Maximum size:"
+msgstr "最大容量(MB)"
+
+#: src/preferences.c:1176
+msgid "MB"
+msgstr ""
+
+# 
+# src/collect-table.c:619 src/dupe.c:1386 src/dupe.c:1558
+#: src/preferences.c:1179
+msgid "View"
+msgstr "檢視"
+
+#: src/preferences.c:1189
+msgid "Behavior"
+msgstr ""
+
+# 
+# src/preferences.c:906
+#: src/preferences.c:1191
+#, fuzzy
+msgid "Rectangular selection in icon view"
+msgstr "以方框方式選擇圖像"
+
+#: src/preferences.c:1194
+msgid "Descend folders in tree view"
+msgstr ""
+
+# 
+# src/preferences.c:658
+#: src/preferences.c:1197
+msgid "In place renaming"
+msgstr "即時更改名稱"
+
+#: src/preferences.c:1200
+msgid "Navigation"
+msgstr ""
+
+# 
+# src/preferences.c:764
+#: src/preferences.c:1202
+msgid "Progressive keyboard scrolling"
+msgstr "鍵盤連續捲動圖像"
+
+# 
+# src/preferences.c:766
+#: src/preferences.c:1204
+msgid "Mouse wheel scrolls image"
+msgstr "滑鼠滾軸可捲動圖像"
+
+#: src/preferences.c:1207
+msgid "Miscellaneous"
+msgstr ""
+
+#: src/preferences.c:1209
+msgid "Store keywords and comments local to source images"
+msgstr ""
+
+# src/preferences.c:875
+#: src/preferences.c:1212
+msgid "Custom similarity threshold:"
+msgstr "自訂相似度臨界值:"
+
+# 
+# src/preferences.c:735
+#: src/preferences.c:1215
+msgid "Offscreen cache size (Mb per image):"
+msgstr "緩衝區大小(每個圖像佔多少 Mb):"
+
+# src/img-view.c:559 src/window.c:533
+#: src/preferences.c:1291
+msgid "About - GQview"
+msgstr "關於 - GQview"
+
+# src/preferences.c:1041
+#: src/preferences.c:1304
+#, c-format
+msgid ""
+"GQview %s\n"
+"\n"
+"Copyright (c) %s John Ellis\n"
+"website: %s\n"
+"email: %s\n"
+"\n"
+"Released under the GNU General Public License"
+msgstr ""
+"GQview %s\n"
+"\n"
+"版權所有 (c) %s John Ellis\n"
+"網站: %s\n"
+"電子郵件: %s\n"
+"\n"
+"以 GPL 使用條款發佈"
+
+# src/menu.c:748
+#: src/preferences.c:1322
+msgid "Credits..."
+msgstr "鳴謝..."
+
+# 
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/print.c:111
+#, fuzzy
+msgid "Selection"
+msgstr "全部不選"
+
+#: src/print.c:112
+msgid "All"
+msgstr ""
+
+#: src/print.c:123
+msgid "One image per page"
+msgstr ""
+
+#: src/print.c:124
+msgid "Proof sheet"
+msgstr ""
+
+#: src/print.c:137
+#, fuzzy
+msgid "Default printer"
+msgstr "還原預設值"
+
+#: src/print.c:138
+msgid "Custom printer"
+msgstr ""
+
+#: src/print.c:139
+msgid "PostScript file"
+msgstr ""
+
+# src/preferences.c:676
+#: src/print.c:140
+#, fuzzy
+msgid "Image file"
+msgstr "圖像大小:"
+
+#: src/print.c:154
+msgid "jpeg, low quality"
+msgstr ""
+
+#: src/print.c:155
+msgid "jpeg, normal quality"
+msgstr ""
+
+#: src/print.c:156
+msgid "jpeg, high quality"
+msgstr ""
+
+# 
+# src/main.c:561
+#: src/print.c:350 src/print.c:3201
+#, fuzzy
+msgid "points"
+msgstr "Xpaint"
+
+#: src/print.c:351
+msgid "millimeters"
+msgstr ""
+
+#: src/print.c:352
+#, fuzzy
+msgid "centimeters"
+msgstr "公分"
+
+#: src/print.c:353
+#, fuzzy
+msgid "inches"
+msgstr "英吋"
+
+#: src/print.c:354
+msgid "picas"
+msgstr ""
+
+#: src/print.c:359
+#, fuzzy
+msgid "Portrait"
+msgstr "縱向"
+
+#: src/print.c:360
+#, fuzzy
+msgid "Landscape"
+msgstr "橫向"
+
+#: src/print.c:366
+#, fuzzy
+msgid "Letter"
+msgstr "公分"
+
+#. in 8.5 x 11
+#: src/print.c:367
+msgid "Legal"
+msgstr ""
+
+#. in 8.5 x 14
+#: src/print.c:368
+msgid "Executive"
+msgstr ""
+
+#. in 7.25x 10.5
+#. mm 841 x 1189
+#. mm 594 x 841
+#. mm 420 x 594
+#. mm 297 x 420
+#. mm 210 x 297
+#. mm 148 x 210
+#. mm 105 x 148
+#. mm 353 x 500
+#. mm 250 x 353
+#. mm 176 x 250
+#. mm 125 x 176
+#: src/print.c:380
+msgid "Envelope #10"
+msgstr ""
+
+#. in 4.125 x 9.5
+#: src/print.c:381
+msgid "Envelope #9"
+msgstr ""
+
+#. in 3.875 x 8.875
+#: src/print.c:382
+msgid "Envelope C4"
+msgstr ""
+
+#. mm 229 x 324
+#: src/print.c:383
+msgid "Envelope C5"
+msgstr ""
+
+#. mm 162 x 229
+#: src/print.c:384
+msgid "Envelope C6"
+msgstr ""
+
+#. mm 114 x 162
+#: src/print.c:385
+msgid "Photo 6x4"
+msgstr ""
+
+#. in 6   x 4
+#: src/print.c:386
+msgid "Photo 8x10"
+msgstr ""
+
+#. in 8   x 10
+#: src/print.c:387
+msgid "Postcard"
+msgstr ""
+
+#. mm 100 x 148
+#: src/print.c:388
+msgid "Tabloid"
+msgstr ""
+
+#: src/print.c:544
+#, fuzzy, c-format
+msgid "page %d of %d"
+msgstr "影像 %d/%d"
+
+#: src/print.c:736 src/utilops.c:2067
+msgid "Preview"
+msgstr "預覽"
+
+#: src/print.c:1044
+#, c-format
+msgid ""
+"Unable to open pipe for writing.\n"
+"\"%s\""
+msgstr ""
+
+# src/ui_pathsel.c:307
+#: src/print.c:1059 src/print.c:1488 src/ui_pathsel.c:424
+#: src/view_file_list.c:453
+#, c-format
+msgid "A file with name %s already exists."
+msgstr "檔案名稱 %s 已經存在。"
+
+#: src/print.c:1074 src/print.c:1543
+#, c-format
+msgid "Failure writing to file %s"
+msgstr ""
+
+#: src/print.c:1128 src/print.c:1165 src/print.c:1201 src/print.c:1307
+#: src/print.c:1398 src/print.c:1429
+msgid "SIGPIPE error writing to printer."
+msgstr ""
+
+#: src/print.c:1964
+#, c-format
+msgid "Page %d"
+msgstr ""
+
+# src/ui_pathsel.c:799
+#: src/print.c:1986 src/print.c:1991
+#, fuzzy
+msgid "Printing error"
+msgstr "過濾器:"
+
+#: src/print.c:1990
+#, c-format
+msgid "An error occured printing to %s."
+msgstr ""
+
+#: src/print.c:1994
+#, fuzzy
+msgid "Details"
+msgstr "還原預設值"
+
+# src/img-view.c:559 src/window.c:533
+#: src/print.c:2587 src/print.c:3332
+#, fuzzy
+msgid "Print - GQview"
+msgstr "關於 - GQview"
+
+#: src/print.c:2591
+#, c-format
+msgid "Printing %d pages to %s."
+msgstr ""
+
+# src/preferences.c:401
+#: src/print.c:2691
+#, fuzzy
+msgid "Format:"
+msgstr "格式"
+
+#: src/print.c:2766
+msgid "Units:"
+msgstr ""
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/print.c:2810
+#, fuzzy
+msgid "Orientation:"
+msgstr "方位"
+
+#: src/print.c:2942
+#, fuzzy
+msgid "Destination:"
+msgstr "描述"
+
+# src/utilops.c:980
+#: src/print.c:2990
+#, fuzzy
+msgid "<printer name>"
+msgstr "檔案名稱:"
+
+# 
+# src/collect.c:329 src/image.c:1058
+#: src/print.c:3079
+#, fuzzy
+msgid "Unlimited"
+msgstr "無標題"
+
+#: src/print.c:3188
+msgid "Show"
+msgstr ""
+
+# src/preferences.c:400
+#: src/print.c:3199
+#, fuzzy
+msgid "Font"
+msgstr "開啟"
+
+# 
+# src/menu.c:559
+#: src/print.c:3359
+#, fuzzy
+msgid "Source"
+msgstr "排列"
+
+# src/preferences.c:676
+#: src/print.c:3375
+#, fuzzy
+msgid "Proof size:"
+msgstr "圖像大小:"
+
+#: src/print.c:3391
+msgid "Text"
+msgstr ""
+
+#: src/print.c:3401
+#, fuzzy
+msgid "Paper"
+msgstr "光圈"
+
+#: src/print.c:3424
+msgid "Margins"
+msgstr ""
+
+#: src/print.c:3426
+msgid "Left:"
+msgstr ""
+
+#: src/print.c:3429
+#, fuzzy
+msgid "Right:"
+msgstr "高度"
+
+#: src/print.c:3432
+#, fuzzy
+msgid "Top:"
+msgstr "群組:"
+
+# 
+# src/utilops.c:989
+#: src/print.c:3435
+#, fuzzy
+msgid "Bottom:"
+msgstr "為:"
+
+# src/ui_pathsel.c:799
+#: src/print.c:3444
+#, fuzzy
+msgid "Printer"
+msgstr "過濾器:"
+
+#: src/print.c:3450
+msgid "Custom printer:"
+msgstr ""
+
+# 
+# src/ui_pathsel.c:799
+#: src/print.c:3459
+#, fuzzy
+msgid "File:"
+msgstr "過濾器:"
+
+# src/ui_pathsel.c:799
+#: src/print.c:3468
+#, fuzzy
+msgid "File format:"
+msgstr "檔案日期:"
+
+#: src/print.c:3473
+msgid "DPI:"
+msgstr ""
+
+# 
+# src/preferences.c:782
+#: src/print.c:3481
+#, fuzzy
+msgid "Remember print settings"
+msgstr "記下視窗位置"
+
+# 
+# src/rcfile.c:132
+#: src/rcfile.c:185
+#, c-format
+msgid "error saving config file: %s\n"
+msgstr "儲存設定檔錯誤:%s\n"
+
+# src/preferences.c:368
+#: src/search.c:200
+#, fuzzy
+msgid "folder"
+msgstr "資料夾:"
+
+# 
+# src/collect-table.c:1820 src/dupe.c:2172
+#: src/search.c:201
+#, fuzzy
+msgid "comments"
+msgstr "加入內容"
+
+#: src/search.c:202
+#, fuzzy
+msgid "results"
+msgstr "還原預設值"
+
+# 
+# src/utilops.c:328 src/utilops.c:394 src/utilops.c:668
+#: src/search.c:206
+#, fuzzy
+msgid "contains"
+msgstr "繼續"
+
+#: src/search.c:207
+msgid "is"
+msgstr ""
+
+#: src/search.c:211 src/search.c:218
+msgid "equal to"
+msgstr ""
+
+#: src/search.c:212
+msgid "less than"
+msgstr ""
+
+#: src/search.c:213
+msgid "greater than"
+msgstr ""
+
+#: src/search.c:214 src/search.c:221
+msgid "between"
+msgstr ""
+
+#: src/search.c:219
+msgid "before"
+msgstr ""
+
+# src/dupe.c:1654 src/dupe.c:1943
+#: src/search.c:220
+#, fuzzy
+msgid "after"
+msgstr "日期"
+
+#: src/search.c:225
+msgid "match all"
+msgstr ""
+
+#: src/search.c:226
+msgid "match any"
+msgstr ""
+
+#: src/search.c:227
+msgid "exclude"
+msgstr ""
+
+# src/filelist.c:86
+#: src/search.c:277
+#, fuzzy, c-format
+msgid "%s, %d files (%s, %d)"
+msgstr "%s, %d 個檔案 (%s, %d)%s"
+
+# src/filelist.c:88
+#: src/search.c:284
+#, fuzzy, c-format
+msgid "%s, %d files"
+msgstr "%s, %d 個檔案 %s"
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/search.c:301
+#, fuzzy
+msgid "Searching..."
+msgstr "排序中..."
+
+#: src/search.c:2093
+msgid "File not found"
+msgstr ""
+
+# 
+# src/utilops.c:544
+#: src/search.c:2094
+#, fuzzy
+msgid "Please enter an existing file for image content."
+msgstr "請選擇一個存在的目錄"
+
+#: src/search.c:2140
+msgid "Folder not found"
+msgstr ""
+
+# 
+# src/utilops.c:544
+#: src/search.c:2141
+#, fuzzy
+msgid "Please enter an existing folder to search."
+msgstr "請選擇一個存在的目錄"
+
+#: src/search.c:2570
+#, fuzzy
+msgid "Image search - GQview"
+msgstr "影像內容 - GQview"
+
+# src/dupe.c:871 src/dupe.c:892
+#: src/search.c:2599
+#, fuzzy
+msgid "Search:"
+msgstr "排序中..."
+
+#: src/search.c:2613
+msgid "Recurse"
+msgstr ""
+
+# src/utilops.c:980
+#: src/search.c:2617
+#, fuzzy
+msgid "File name"
+msgstr "檔案名稱:"
+
+#: src/search.c:2623
+msgid "Match case"
+msgstr ""
+
+# src/preferences.c:368
+#: src/search.c:2627
+#, fuzzy
+msgid "File size is"
+msgstr "檔案大小:"
+
+# 
+# src/preferences.c:645
+#: src/search.c:2634 src/search.c:2649 src/search.c:2667
+#, fuzzy
+msgid "and"
+msgstr "隨機"
+
+# src/ui_pathsel.c:799
+#: src/search.c:2639
+#, fuzzy
+msgid "File date is"
+msgstr "檔案日期:"
+
+# src/utilops.c:539
+#: src/search.c:2656
+#, fuzzy
+msgid "Image dimensions are"
+msgstr "影像描述"
+
+# 
+# src/collect-table.c:1820 src/dupe.c:2172
+#: src/search.c:2676
+#, fuzzy
+msgid "Image content is"
+msgstr "加入內容"
+
+# 
+# src/dupe.c:1659
+#: src/search.c:2682
+#, fuzzy, no-c-format
+msgid "% similar to"
+msgstr "類似度"
+
+# 
+# src/preferences.c:645
+#: src/search.c:2751
+#, fuzzy
+msgid "Rank"
+msgstr "隨機"
+
+# src/thumb.c:268
+#: src/thumb.c:378
+msgid "Thumbnail image in cache failed to load, trying to recreate.\n"
+msgstr "無法載入緩衝區裡的縮圖,嘗試重新建立縮圖。\n"
+
+# 
+# src/ui_tabcomp.c:171
+#: src/ui_bookmark.c:148
+#, c-format
+msgid "Unable to write history lists to: %s\n"
+msgstr "不能將紀錄列表寫入:%s\n"
+
+#: src/ui_bookmark.c:445 src/ui_bookmark.c:508
+msgid "New Bookmark"
+msgstr "新增書籤"
+
+# src/preferences.c:915
+#: src/ui_bookmark.c:591 src/ui_bookmark.c:597
+msgid "Edit Bookmark"
+msgstr "編輯書籤"
+
+# src/dupe.c:1657 src/dupe.c:1945
+#: src/ui_bookmark.c:612
+msgid "Path:"
+msgstr "路徑:"
+
+#: src/ui_bookmark.c:621
+msgid "Icon:"
+msgstr "圖像:"
+
+# 
+# src/collect-table.c:628 src/dupe.c:1393 src/dupe.c:1565
+#: src/ui_bookmark.c:627
+#, fuzzy
+msgid "Select icon"
+msgstr "全部不選"
+
+# src/menu.c:748
+#: src/ui_bookmark.c:718
+msgid "_Properties..."
+msgstr "內容(_P)..."
+
+# src/utilops.c:601
+#: src/ui_bookmark.c:720
+msgid "Move _up"
+msgstr "往上移動(_U)"
+
+# src/utilops.c:601
+#: src/ui_bookmark.c:722
+msgid "Move _down"
+msgstr "往下移動(_D)"
+
+# src/collect-table.c:622 src/dupe.c:1410 src/dupe.c:1568
+#: src/ui_bookmark.c:724
+msgid "_Remove"
+msgstr "移除(_R)"
+
+# 
+# src/ui_help.c:191
+#: src/ui_help.c:111
+#, c-format
+msgid ""
+"Unable to load:\n"
+"%s"
+msgstr ""
+"無法載入:\n"
+"%s"
+
+# 
+# src/ui_pathsel.c:313
+#: src/ui_pathsel.c:430 src/view_dir_list.c:97 src/view_dir_tree.c:204
+#, c-format
+msgid "Failed to rename %s to %s."
+msgstr "不能更改檔案名稱 %s 至 %s。"
+
+# 
+# src/ui_pathsel.c:343 src/utilops.c:675 src/utilops.c:727
+#: src/ui_pathsel.c:486 src/utilops.c:1288 src/utilops.c:1461
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+"%s"
+msgstr ""
+"無法刪除檔案:\n"
+"%s"
+
+# 
+# src/ui_pathsel.c:344 src/utilops.c:728
+#: src/ui_pathsel.c:487 src/utilops.c:1462
+msgid "File deletion failed"
+msgstr "刪除檔案失敗"
+
+# 
+# src/ui_pathsel.c:398 src/utilops.c:760
+#: src/ui_pathsel.c:529 src/ui_pathsel.c:537
+msgid "Delete file"
+msgstr "刪除檔案"
+
+# 
+# src/ui_pathsel.c:397 src/utilops.c:759
+#: src/ui_pathsel.c:535
+#, c-format
+msgid ""
+"About to delete the file:\n"
+" %s"
+msgstr ""
+"將會刪除檔案:\n"
+" %s"
+
+# src/ui_pathsel.c:437 src/ui_pathsel.c:460 src/utilops.c:944
+# src/utilops.c:1095
+#: src/ui_pathsel.c:626 src/ui_pathsel.c:634 src/utilops.c:2035
+#: src/utilops.c:2255
+msgid "_Rename"
+msgstr "更改名稱(_R)"
+
+# src/preferences.c:915
+#: src/ui_pathsel.c:628 src/ui_pathsel.c:638
+msgid "Add _Bookmark"
+msgstr "新增書籤(_B)"
+
+# src/ui_pathsel.c:402 src/ui_pathsel.c:461 src/utilops.c:711
+# src/utilops.c:764
+#: src/ui_pathsel.c:636
+msgid "_Delete"
+msgstr "刪除(_D)"
+
+#: src/ui_pathsel.c:740 src/ui_pathsel.c:1045
+#, fuzzy
+msgid "New folder"
+msgstr "新資料夾(_N)..."
+
+# 
+# src/ui_pathsel.c:517 src/utilops.c:1158
+#: src/ui_pathsel.c:750 src/utilops.c:2325 src/view_dir_list.c:338
+#: src/view_dir_tree.c:434
+#, fuzzy, c-format
+msgid ""
+"Unable to create folder:\n"
+"%s"
+msgstr ""
+"無法建立目錄:\n"
+"%s"
+
+# 
+# src/ui_pathsel.c:518 src/utilops.c:1159
+#: src/ui_pathsel.c:751 src/utilops.c:2326 src/view_dir_list.c:339
+#: src/view_dir_tree.c:435
+#, fuzzy
+msgid "Error creating folder"
+msgstr "建立目錄發生錯誤"
+
+# 
+# src/ui_pathsel.c:697
+#: src/ui_pathsel.c:972
+msgid "All Files"
+msgstr "所有檔案"
+
+# 
+# src/ui_pathsel.c:764
+#: src/ui_pathsel.c:1048
+msgid "Show hidden"
+msgstr "顯示隱藏檔案"
+
+# 
+# src/ui_pathsel.c:799
+#: src/ui_pathsel.c:1132
+msgid "Filter:"
+msgstr "過濾器:"
+
+# src/collect-table.c:627 src/dupe.c:1391 src/dupe.c:1563
+#: src/ui_tabcomp.c:840
+#, fuzzy
+msgid "Select path"
+msgstr "全部選取"
+
+# 
+# src/ui_pathsel.c:697
+#: src/ui_tabcomp.c:856
+#, fuzzy
+msgid "All files"
+msgstr "所有檔案"
+
+# 
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/utilops.c:470 src/utilops.c:783 src/utilops.c:1640 src/utilops.c:2187
+msgid "Overwrite file"
+msgstr "覆寫檔案"
+
+# 
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/utilops.c:475 src/utilops.c:788 src/utilops.c:1645 src/utilops.c:2192
+#, fuzzy
+msgid "Overwrite file?"
+msgstr "覆寫檔案"
+
+#: src/utilops.c:476 src/utilops.c:789
+msgid "Replace existing file with new file."
+msgstr ""
+
+# 
+# src/utilops.c:339 src/utilops.c:459 src/utilops.c:826 src/utilops.c:1032
+#: src/utilops.c:480
+#, fuzzy
+msgid "Overwrite _all"
+msgstr "覆寫檔案"
+
+# src/utilops.c:345
+#: src/utilops.c:482
+#, fuzzy
+msgid "S_kip all"
+msgstr "全部略過"
+
+# 
+# src/utilops.c:345
+#: src/utilops.c:483
+#, fuzzy
+msgid "_Skip"
+msgstr "略過"
+
+# 
+# src/utilops.c:387 src/utilops.c:495
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "Existing file"
+msgstr "移動檔案發生錯誤"
+
+#: src/utilops.c:484 src/utilops.c:793 src/utilops.c:1650 src/utilops.c:2197
+#, fuzzy
+msgid "New file"
+msgstr "新資料夾(_N)..."
+
+# src/preferences.c:930
+#: src/utilops.c:494 src/utilops.c:802 src/utilops.c:1746 src/utilops.c:1810
+#: src/utilops.c:2101
+msgid "Auto rename"
+msgstr "自動更改名稱"
+
+# 
+# src/ui_pathsel.c:437 src/ui_pathsel.c:460 src/utilops.c:944
+# src/utilops.c:1095
+#: src/utilops.c:502 src/utilops.c:810
+msgid "Rename"
+msgstr "更改名稱"
+
+# 
+# src/utilops.c:316
+#: src/utilops.c:543
+msgid "Source to copy matches destination"
+msgstr "將要複製的來源地檔案和目的地檔案一樣"
+
+# src/utilops.c:317
+#: src/utilops.c:544
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"無法複製以下檔案:\n"
+"%s\n"
+"到原來的地方。"
+
+# 
+# src/utilops.c:321
+#: src/utilops.c:548
+msgid "Source to move matches destination"
+msgstr "將要移動的來源地檔案和目的地檔案一樣"
+
+# 
+# src/utilops.c:322
+#: src/utilops.c:549
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to itself."
+msgstr ""
+"無法移動以下檔案:\n"
+"%s\n"
+"到原來的地方。"
+
+# 
+# src/utilops.c:328 src/utilops.c:394 src/utilops.c:668
+#: src/utilops.c:557 src/utilops.c:644 src/utilops.c:1280
+#, fuzzy
+msgid "Co_ntinue"
+msgstr "繼續"
+
+# src/utilops.c:382 src/utilops.c:490
+#: src/utilops.c:630 src/utilops.c:850
+msgid "Error copying file"
+msgstr "複製檔案發生錯誤"
+
+# src/utilops.c:383
+#: src/utilops.c:631
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file copy."
+msgstr ""
+"當嘗試複製多個檔案時,無法複製檔案:\n"
+"%s\n"
+"至:\n"
+"%s"
+
+# 
+# src/utilops.c:387 src/utilops.c:495
+#: src/utilops.c:635 src/utilops.c:855
+msgid "Error moving file"
+msgstr "移動檔案發生錯誤"
+
+# src/utilops.c:388
+#: src/utilops.c:636
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s\n"
+"during multiple file move."
+msgstr ""
+"當嘗試移動多個檔案時,無法移動檔案:\n"
+"%s\n"
+"至:\n"
+"%s"
+
+# 
+# src/utilops.c:450
+#: src/utilops.c:774
+msgid "Source matches destination"
+msgstr "來源地和目的地一樣"
+
+# 
+# src/utilops.c:451
+#: src/utilops.c:775
+msgid "Source and destination are the same, operation cancelled."
+msgstr "來源地和目的地一樣,取消操作。"
+
+# 
+# src/utilops.c:491
+#: src/utilops.c:851
+#, c-format
+msgid ""
+"Unable to copy file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"無法複製檔案:\n"
+"%s\n"
+"到:\n"
+"%s"
+
+# 
+# src/utilops.c:496
+#: src/utilops.c:856
+#, c-format
+msgid ""
+"Unable to move file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"無法移動以下檔案:\n"
+"%s\n"
+"至:\n"
+"%s"
+
+# 
+# src/utilops.c:539
+#: src/utilops.c:899
+msgid "Invalid destination"
+msgstr "無效的目的地"
+
+# src/utilops.c:540
+#: src/utilops.c:900
+#, fuzzy
+msgid ""
+"When operating with multiple files, please select\n"
+"a folder, not a file."
+msgstr ""
+"當處理多個檔案時,請選擇\n"
+"一個目錄而不是檔案。"
+
+# 
+# src/utilops.c:544
+#: src/utilops.c:905
+#, fuzzy
+msgid "Please select an existing folder."
+msgstr "請選擇一個存在的目錄"
+
+# src/main.c:129
+#: src/utilops.c:956
+#, fuzzy
+msgid "Copy - GQview"
+msgstr "求助 - GQview"
+
+# src/utilops.c:592
+#: src/utilops.c:957 src/view_dir_list.c:217 src/view_dir_tree.c:309
+msgid "_Copy"
+msgstr "複製(_C)"
+
+# src/utilops.c:1090
+#: src/utilops.c:960
+#, fuzzy
+msgid "Copy file"
+msgstr "更改檔案名稱:"
+
+# 
+# src/utilops.c:596
+#: src/utilops.c:964
+#, fuzzy
+msgid "Copy multiple files"
+msgstr "複製多個檔案到:"
+
+# src/main.c:129
+#: src/utilops.c:970
+#, fuzzy
+msgid "Move - GQview"
+msgstr "求助 - GQview"
+
+# src/utilops.c:601
+#: src/utilops.c:971 src/view_dir_list.c:219 src/view_dir_tree.c:311
+msgid "_Move"
+msgstr "移動(_M)"
+
+# src/utilops.c:1090
+#: src/utilops.c:974
+#, fuzzy
+msgid "Move file"
+msgstr "更改檔案名稱:"
+
+# 
+# src/utilops.c:605
+#: src/utilops.c:978
+#, fuzzy
+msgid "Move multiple files"
+msgstr "移動多個檔案到:"
+
+# src/utilops.c:980
+#: src/utilops.c:992 src/utilops.c:1502
+#, fuzzy
+msgid "File name:"
+msgstr "檔案名稱:"
+
+# 
+# src/utilops.c:450
+#: src/utilops.c:996
+#, fuzzy
+msgid "Choose the destination folder."
+msgstr "來源地和目的地一樣"
+
+# 
+# src/utilops.c:664 src/utilops.c:676
+#: src/utilops.c:1123 src/utilops.c:1272 src/utilops.c:1289
+msgid "Delete failed"
+msgstr "刪除失敗"
+
+# src/utilops.c:322
+#: src/utilops.c:1124
+msgid "Unable to remove old file from trash folder"
+msgstr "無法從資源回收筒中移除舊檔"
+
+# 
+# src/utilops.c:1151
+#: src/utilops.c:1180 src/utilops.c:2318
+#, fuzzy
+msgid "Could not create folder"
+msgstr "無法建立目錄"
+
+#: src/utilops.c:1202
+msgid "Permission denied"
+msgstr "權限不足遭拒決"
+
+# src/ui_pathsel.c:517 src/utilops.c:1158
+#: src/utilops.c:1212
+#, c-format
+msgid ""
+"Unable to access or create the trash folder.\n"
+"\"%s\""
+msgstr ""
+"無法存取或建立垃圾桶資料夾\n"
+"\"%s\""
+
+# src/preferences.c:667
+#: src/utilops.c:1216
+msgid "Turn off safe delete"
+msgstr "不使用安全刪除"
+
+# src/preferences.c:667
+#: src/utilops.c:1234
+#, c-format
+msgid "Safe delete: %s"
+msgstr "安全刪除: %s"
+
+# 
+# src/utilops.c:663
+#: src/utilops.c:1276
+#, c-format
+msgid ""
+"Unable to delete file:\n"
+" %s\n"
+" Continue multiple delete operation?"
+msgstr ""
+"無法刪除檔案:\n"
+" %s\n"
+"要繼續刪除其它檔案?"
+
+#: src/utilops.c:1347
+#, c-format
+msgid "File %d of %d"
+msgstr "檔案 %d/%d"
+
+# 
+# src/utilops.c:707
+#: src/utilops.c:1416
+#, fuzzy
+msgid "Delete files - GQview"
+msgstr "刪除檔案"
+
+# 
+# src/utilops.c:942
+#: src/utilops.c:1420
+#, fuzzy
+msgid "Delete multiple files"
+msgstr "更改多個檔案的名稱:"
+
+# src/dupe.c:67 src/dupe.c:1449
+#: src/utilops.c:1438
+#, c-format
+msgid "Review %d files"
+msgstr "回顧 %d 個檔案"
+
+# 
+# src/ui_pathsel.c:398 src/utilops.c:760
+#: src/utilops.c:1494
+#, fuzzy
+msgid "Delete file - GQview"
+msgstr "刪除檔案"
+
+# 
+# src/ui_pathsel.c:398 src/utilops.c:760
+#: src/utilops.c:1498
+#, fuzzy
+msgid "Delete file?"
+msgstr "刪除檔案"
+
+#: src/utilops.c:1646 src/utilops.c:2193
+msgid "Replace existing file by renaming new file."
+msgstr ""
+
+# src/utilops.c:842
+#: src/utilops.c:1661
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+" to:\n"
+"%s"
+msgstr ""
+"無法將檔案名稱:\n"
+"%s\n"
+"改為:\n"
+"%s"
+
+# 
+# src/filelist.c:809 src/filelist.c:815 src/filelist.c:821 src/utilops.c:845
+# src/utilops.c:1048
+#: src/utilops.c:1664 src/utilops.c:2208 src/view_file_list.c:448
+#: src/view_file_list.c:454 src/view_file_list.c:460
+msgid "Error renaming file"
+msgstr "更改檔案名稱發生錯誤"
+
+#: src/utilops.c:1747
+msgid ""
+"Can not auto rename with the selected\n"
+"number set, one or more files exist that\n"
+"match the resulting name list.\n"
+msgstr ""
+"無法由所選的數字自動更改檔案名稱,\n"
+"至少有一個命名結果與已存在檔名衝突。\n"
+
+# src/ui_pathsel.c:313
+#: src/utilops.c:1809
+#, c-format
+msgid ""
+"Failed to rename\n"
+"%s\n"
+"The number was %d."
+msgstr ""
+"不能更改檔案名稱\n"
+"%s\n"
+"編號為 %d。"
+
+# src/main.c:129
+#: src/utilops.c:2031 src/utilops.c:2249
+#, fuzzy
+msgid "Rename - GQview"
+msgstr "求助 - GQview"
+
+# 
+# src/utilops.c:942
+#: src/utilops.c:2034
+#, fuzzy
+msgid "Rename multiple files"
+msgstr "更改多個檔案的名稱:"
+
+#: src/utilops.c:2066
+msgid "Original Name"
+msgstr "原檔名"
+
+#: src/utilops.c:2110 src/utilops.c:2262
+#, fuzzy
+msgid "Original name:"
+msgstr "原檔名"
+
+# 
+# src/utilops.c:980
+#: src/utilops.c:2113 src/utilops.c:2265
+#, fuzzy
+msgid "New name:"
+msgstr "更改名稱:"
+
+#: src/utilops.c:2128
+msgid "Begin text"
+msgstr "文字開頭"
+
+#: src/utilops.c:2136
+msgid "Start #"
+msgstr "開始 #"
+
+#: src/utilops.c:2142
+msgid "End text"
+msgstr "文字結尾"
+
+#: src/utilops.c:2150
+msgid "Padding:"
+msgstr ""
+
+# src/filelist.c:820 src/utilops.c:1047
+#: src/utilops.c:2207 src/view_file_list.c:459
+#, c-format
+msgid ""
+"Unable to rename file:\n"
+"%s\n"
+"to:\n"
+"%s"
+msgstr ""
+"無法更改檔案名稱:\n"
+"%s\n"
+"至:\n"
+"%s"
+
+# src/utilops.c:1090
+#: src/utilops.c:2252
+#, fuzzy
+msgid "Rename file"
+msgstr "更改檔案名稱:"
+
+# 
+# src/utilops.c:1144
+#: src/utilops.c:2311
+#, fuzzy, c-format
+msgid ""
+"The folder:\n"
+"%s\n"
+"already exists."
+msgstr ""
+"下列目錄:\n"
+"%s\n"
+"已經存在。"
+
+# src/preferences.c:368
+#: src/utilops.c:2312
+#, fuzzy
+msgid "Folder exists"
+msgstr "資料夾"
+
+# 
+# src/utilops.c:1150
+#: src/utilops.c:2317
+#, c-format
+msgid ""
+"The path:\n"
+"%s\n"
+"already exists as a file."
+msgstr ""
+"以下路徑:\n"
+"%s\n"
+"已經是一個檔案。"
+
+# src/main.c:129
+#: src/utilops.c:2369
+#, fuzzy
+msgid "New folder - GQview"
+msgstr "求助 - GQview"
+
+# 
+# src/utilops.c:1211
+#: src/utilops.c:2372
+#, fuzzy, c-format
+msgid ""
+"Create folder in:\n"
+"%s\n"
+"named:"
+msgstr ""
+"建立目錄於:\n"
+"%s\n"
+"名為:"
+
+#: src/view_dir_list.c:329 src/view_dir_tree.c:425
+msgid "new_folder"
+msgstr "新資料夾"
+
+#: src/view_dir_list.c:387 src/view_dir_tree.c:482
+msgid "_Up to parent"
+msgstr "至上層資料夾(_U)"
+
+# src/menu.c:879
+#: src/view_dir_list.c:392 src/view_dir_tree.c:487
+msgid "_Slideshow"
+msgstr "投影片(_S)"
+
+# 
+# src/menu.c:881
+#: src/view_dir_list.c:394 src/view_dir_tree.c:489
+msgid "Slideshow recursive"
+msgstr "投影片(搜尋所有副目錄)"
+
+# src/collect-table.c:644 src/menu.c:885
+#: src/view_dir_list.c:398 src/view_dir_tree.c:493
+msgid "Find _duplicates..."
+msgstr "尋找重複檔案(_D)..."
+
+# src/menu.c:887
+#: src/view_dir_list.c:400 src/view_dir_tree.c:495
+msgid "Find duplicates recursive..."
+msgstr "尋找重覆檔案(搜尋所有副目錄)"
+
+#: src/view_dir_list.c:407 src/view_dir_tree.c:502
+msgid "_New folder..."
+msgstr "新資料夾(_N)..."
+
+# src/menu.c:761
+#: src/view_dir_list.c:419 src/view_dir_tree.c:509
+msgid "View as _tree"
+msgstr "樹狀檢視(_T)"
+
+# src/menu.c:891 src/menu.c:920
+#: src/view_dir_list.c:421 src/view_dir_tree.c:511 src/view_file_icon.c:311
+#: src/view_file_list.c:423
+msgid "Re_fresh"
+msgstr "重新整理(_F)"
+
+# src/menu.c:559
+#: src/view_file_icon.c:304 src/view_file_list.c:416
+msgid "_Sort"
+msgstr "排列(_S)"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#: src/view_file_icon.c:307 src/view_file_list.c:419
+msgid "View as _icons"
+msgstr "圖像尺寸(I)"
+
+# src/preferences.c:603
+#: src/view_file_list.c:421
+msgid "Show _thumbnails"
+msgstr "將縮圖儲存在緩衝區(_T)"
+
+# src/filelist.c:808
+#: src/view_file_list.c:447
+#, c-format
+msgid ""
+"Invalid file name:\n"
+"%s"
+msgstr ""
+"無效的檔案名稱:\n"
+"%s"
+
+# 
+# src/cache_maint.c:252
+#~ msgid "Purge thumbnails"
+#~ msgstr "清除縮圖"
+
+# src/menu.c:710
+#~ msgid "/File/tear1"
+#~ msgstr "/檔案/tear1"
+
+# 
+# src/menu.c:711
+#~ msgid "/File/_New collection"
+#~ msgstr "/檔案/新增圖像集(_N)"
+
+# 
+# src/menu.c:712
+#~ msgid "/File/_Open collection..."
+#~ msgstr "/檔案/開啟圖像集(_O)..."
+
+# 
+# src/menu.c:714
+#~ msgid "/File/sep1"
+#~ msgstr "/檔案/sep1"
+
+# 
+# src/menu.c:721
+#, fuzzy
+#~ msgid "/File/_Search..."
+#~ msgstr "/檔案/更改名稱(_R)..."
+
+# 
+# src/menu.c:715
+#~ msgid "/File/_Find duplicates..."
+#~ msgstr "/檔案/尋找重覆檔案(_F)..."
+
+# 
+# src/menu.c:716
+#~ msgid "/File/sep2"
+#~ msgstr "/檔案/sep2"
+
+# 
+# src/menu.c:721
+#, fuzzy
+#~ msgid "/File/_Print..."
+#~ msgstr "/檔案/更改名稱(_R)..."
+
+# src/menu.c:722
+#~ msgid "/File/N_ew folder..."
+#~ msgstr "/檔案/新資料夾(_E)..."
+
+# 
+# src/menu.c:718
+#~ msgid "/File/sep3"
+#~ msgstr "/檔案/sep3"
+
+# 
+# src/menu.c:719
+#~ msgid "/File/_Copy..."
+#~ msgstr "/檔案/複製(_C)..."
+
+# 
+# src/menu.c:720
+#~ msgid "/File/_Move..."
+#~ msgstr "/檔案/移動(_M)..."
+
+# 
+# src/menu.c:721
+#~ msgid "/File/_Rename..."
+#~ msgstr "/檔案/更改名稱(_R)..."
+
+# 
+# src/menu.c:722
+#~ msgid "/File/_Delete..."
+#~ msgstr "/檔案/刪除(_D)..."
+
+# 
+# src/menu.c:723
+#~ msgid "/File/sep4"
+#~ msgstr "/檔案/sep4"
+
+# src/dupe.c:1415 src/dupe.c:1573 src/img-view.c:841
+#~ msgid "/File/C_lose window"
+#~ msgstr "/檔案/關閉視窗(_L)"
+
+# 
+# src/menu.c:724
+#, fuzzy
+#~ msgid "/File/_Quit"
+#~ msgstr "/檔案/離開(_X)"
+
+# 
+# src/menu.c:726
+#~ msgid "/_Edit"
+#~ msgstr "/編輯(_E)"
+
+# src/menu.c:727
+#~ msgid "/Edit/tear1"
+#~ msgstr "/編輯/tear1"
+
+# 
+# src/menu.c:728
+#~ msgid "/Edit/editor1"
+#~ msgstr "/編輯/editor1"
+
+# 
+# src/menu.c:729
+#~ msgid "/Edit/editor2"
+#~ msgstr "/編輯/editor2"
+
+# 
+# src/menu.c:730
+#~ msgid "/Edit/editor3"
+#~ msgstr "/編輯/editor3"
+
+# 
+# src/menu.c:731
+#~ msgid "/Edit/editor4"
+#~ msgstr "/編輯/editor4"
+
+# 
+# src/menu.c:732
+#~ msgid "/Edit/editor5"
+#~ msgstr "/編輯/editor5"
+
+# 
+# src/menu.c:733
+#~ msgid "/Edit/editor6"
+#~ msgstr "/編輯/editor6"
+
+# 
+# src/menu.c:734
+#~ msgid "/Edit/editor7"
+#~ msgstr "/編輯/editor7"
+
+# 
+# src/menu.c:735
+#~ msgid "/Edit/editor8"
+#~ msgstr "/編輯/editor8"
+
+# src/menu.c:728
+#~ msgid "/Edit/editor9"
+#~ msgstr "/編輯/editor9"
+
+# src/menu.c:728
+#~ msgid "/Edit/editor0"
+#~ msgstr "/編輯/editor0"
+
+# 
+# src/menu.c:736
+#~ msgid "/Edit/sep1"
+#~ msgstr "/編輯/sep1"
+
+# 
+# src/menu.c:737
+#~ msgid "/Edit/_Adjust"
+#~ msgstr "/編輯/調整(_A)"
+
+# src/menu.c:748
+#~ msgid "/Edit/_Properties"
+#~ msgstr "/編輯/內容(_P)"
+
+# 
+# src/menu.c:738
+#~ msgid "/Edit/Adjust/tear1"
+#~ msgstr "/編輯/調整/tear1"
+
+# 
+# src/menu.c:739
+#~ msgid "/Edit/Adjust/_Rotate clockwise"
+#~ msgstr "/編輯/調整/順時針轉 90 度(_R)"
+
+# 
+# src/menu.c:740
+#~ msgid "/Edit/Adjust/Rotate _counterclockwise"
+#~ msgstr "/編輯/調整/逆時針轉 90 度(_C)"
+
+# 
+# src/menu.c:741
+#~ msgid "/Edit/Adjust/Rotate 1_80"
+#~ msgstr "/編輯/調整/旋轉 180 度(_8)"
+
+# 
+# src/menu.c:742
+#~ msgid "/Edit/Adjust/_Mirror"
+#~ msgstr "/編輯/調整/左右反轉(_M)"
+
+# 
+# src/menu.c:743
+#~ msgid "/Edit/Adjust/_Flip"
+#~ msgstr "/編輯/調整/上下反轉(_F)"
+
+# src/menu.c:744
+#~ msgid "/Edit/sep2"
+#~ msgstr "/編輯/sep2"
+
+# 
+# src/menu.c:745
+#~ msgid "/Edit/Select _all"
+#~ msgstr "/編輯/選擇全部(_A)"
+
+# 
+# src/menu.c:746
+#~ msgid "/Edit/Select _none"
+#~ msgstr "/編輯/全部不選(_N)"
+
+# 
+# src/menu.c:747
+#~ msgid "/Edit/sep3"
+#~ msgstr "/編輯/sep3"
+
+# 
+# src/menu.c:748
+#~ msgid "/Edit/_Options..."
+#~ msgstr "/編輯/選項(_O)..."
+
+# 
+# src/menu.c:750
+#~ msgid "/Edit/sep4"
+#~ msgstr "/編輯/sep4"
+
+# 
+# src/menu.c:751
+#~ msgid "/Edit/Set as _wallpaper"
+#~ msgstr "/編輯/設定為桌布(_W)"
+
+# 
+# src/menu.c:753
+#~ msgid "/_View"
+#~ msgstr "/檢視(_V)"
+
+# 
+# src/menu.c:754
+#~ msgid "/View/tear1"
+#~ msgstr "/檢視/tear1"
+
+# src/menu.c:755
+#~ msgid "/View/Zoom _in"
+#~ msgstr "/檢視/拉近(_I)"
+
+# 
+# src/menu.c:756
+#~ msgid "/View/Zoom _out"
+#~ msgstr "/檢視/拉遠(_O)"
+
+# 
+# src/menu.c:757
+#~ msgid "/View/Zoom _1:1"
+#~ msgstr "/檢視/原來尺寸(_1)"
+
+# 
+# src/menu.c:759
+#~ msgid "/View/sep1"
+#~ msgstr "/檢視/sep1"
+
+# 
+# src/menu.c:762
+#~ msgid "/View/_Thumbnails"
+#~ msgstr "/檢視/縮圖(_T)"
+
+# src/dupe.c:1655 src/dupe.c:1944
+#~ msgid "/View/I_cons"
+#~ msgstr "/檢視/圖示模式(_C)"
+
+# 
+# src/menu.c:764
+#~ msgid "/View/sep2"
+#~ msgstr "/檢視/sep2"
+
+# src/menu.c:761
+#~ msgid "/View/F_ull screen"
+#~ msgstr "/檢視/全螢幕(_U)"
+
+# 
+# src/menu.c:768
+#~ msgid "/View/sep3"
+#~ msgstr "/檢視/sep3"
+
+# src/menu.c:767
+#~ msgid "/View/_Hide file list"
+#~ msgstr "/檢視/隱藏檔案列表(_H)"
+
+# src/menu.c:759
+#~ msgid "/View/sep4"
+#~ msgstr "/檢視/sep4"
+
+# src/menu.c:755
+#~ msgid "/View/Sort _manager"
+#~ msgstr "/檢視/分類管理(_M)"
+
+# src/menu.c:759
+#~ msgid "/View/sep5"
+#~ msgstr "/檢視/sep5"
+
+# 
+# src/menu.c:769
+#~ msgid "/View/Toggle _slideshow"
+#~ msgstr "/檢視/切換投影片模式(_S)"
+
+# src/menu.c:765
+#~ msgid "/View/_Refresh Lists"
+#~ msgstr "/檢視/重新整理列表(_R)"
+
+# 
+# src/menu.c:772
+#~ msgid "/Help/tear1"
+#~ msgstr "/求助/tear1"
+
+# 
+# src/menu.c:775
+#~ msgid "/Help/sep1"
+#~ msgstr "/求助/sep1"
+
+# 
+# src/preferences.c:507
+#~ msgid "GQview configuration"
+#~ msgstr "GQview 設定"
+
+# 
+# src/menu.c:749
+#~ msgid "/Edit/_Remove old thumbnails"
+#~ msgstr "/編輯/移除舊縮圖(_R)"
+
+# 
+# src/dupe.c:1657 src/dupe.c:1945
+#, fuzzy
+#~ msgid "path"
+#~ msgstr "路徑"
+
+# src/collect-dlg.c:167 src/collect.c:1052
+#~ msgid "Save"
+#~ msgstr "儲存"
+
+# 
+# src/collect.c:1053 src/ui_help.c:302
+#~ msgid "Close"
+#~ msgstr "關閉"
+
+# 
+# src/collect-dlg.c:68
+#~ msgid ""
+#~ "Overwrite collection file:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "覆寫圖像集檔案:\n"
+#~ "%s"
+
+# 
+# src/collect-dlg.c:166
+#~ msgid "Save collection as:"
+#~ msgstr "另存圖像集為:"
+
+# src/collect-dlg.c:173
+#~ msgid "Open collection from:"
+#~ msgstr "由以下檔案開啟圖像集:"
+
+# src/collect-dlg.c:174
+#~ msgid "Open"
+#~ msgstr "開啟"
+
+# 
+# src/collect-dlg.c:181
+#~ msgid "Append collection from:"
+#~ msgstr "加入至圖像集:"
+
+# 
+# src/main.c:622
+#, fuzzy
+#~ msgid "exit"
+#~ msgstr "離開"
+
+# 
+# src/main.c:622
+#~ msgid "Exit"
+#~ msgstr "離開"
+
+# 
+# src/preferences.c:165 src/preferences.c:523 src/ui_utildlg.c:208
+# src/utilops.c:220
+#~ msgid "Ok"
+#~ msgstr "確定"
+
+# 
+# src/collect-dlg.c:59
+#, fuzzy
+#~ msgid "Initial folder"
+#~ msgstr "檔案名稱無效"
+
+# 
+# src/preferences.c:569
+#, fuzzy
+#~ msgid "On startup, change to this folder:"
+#~ msgstr "當程式啟動時進入這個目錄:"
+
+# src/preferences.c:695 src/preferences.c:697
+#~ msgid "Zoom (scaling):"
+#~ msgstr "縮放(依比例):"
+
+# 
+# src/preferences.c:805
+#~ msgid "Place dialogs under mouse"
+#~ msgstr "將對話窗顯示於鼠標下"
+
+# 
+# src/preferences.c:825
+#~ msgid "Include files of type:"
+#~ msgstr "包括檔案種類:"
+
+# 
+# src/collect-table.c:622 src/dupe.c:1410 src/dupe.c:1568
+#~ msgid "Remove"
+#~ msgstr "移除"
+
+#~ msgid "Add"
+#~ msgstr "新增"
+
+# 
+# src/preferences.c:933
+#~ msgid "Command Line"
+#~ msgstr "指令"
+
+# src/menu.c:771
+#~ msgid "Help"
+#~ msgstr "求助"
+
+# src/img-view.c:837 src/menu.c:1001
+#, fuzzy
+#~ msgid "Full screen size:"
+#~ msgstr "全螢幕(_F)"
+
+# src/preferences.c:368
+#, fuzzy
+#~ msgid "Point size:"
+#~ msgstr "檔案大小:"
+
+#, fuzzy
+#~ msgid "Width:"
+#~ msgstr "寬度"
+
+#, fuzzy
+#~ msgid "Height:"
+#~ msgstr "高度"
+
+# 
+# src/utilops.c:338
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ " %s\n"
+#~ " with:\n"
+#~ " %s"
+#~ msgstr ""
+#~ "此檔案:\n"
+#~ " %s\n"
+#~ " 將被以下檔案覆寫:\n"
+#~ " %s"
+
+# 
+# src/utilops.c:343
+#~ msgid "Yes"
+#~ msgstr "是"
+
+# src/utilops.c:344
+#~ msgid "Yes to all"
+#~ msgstr "全部皆是"
+
+# 
+# src/utilops.c:458
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ " with:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "此檔案:\n"
+#~ "%s\n"
+#~ "將被以下檔案覆寫:\n"
+#~ "%s"
+
+# 
+# src/utilops.c:594
+#~ msgid ""
+#~ "Copy file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "複製檔案:\n"
+#~ "%s\n"
+#~ "到:"
+
+# 
+# src/utilops.c:603
+#~ msgid ""
+#~ "Move file:\n"
+#~ "%s\n"
+#~ "to:"
+#~ msgstr ""
+#~ "移動檔案:\n"
+#~ "%s\n"
+#~ "到:"
+
+# 
+# src/utilops.c:707
+#~ msgid "About to delete multiple files..."
+#~ msgstr "將會刪除多個檔案..."
+
+# 
+# src/utilops.c:825 src/utilops.c:1031
+#~ msgid ""
+#~ "Overwrite file:\n"
+#~ "%s\n"
+#~ "by renaming:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "覆寫檔案:\n"
+#~ "%s\n"
+#~ "因為改變了以下檔案的名稱:\n"
+#~ "%s"
+
+# 
+# src/utilops.c:989
+#~ msgid "to:"
+#~ msgstr "為:"
+
+# 
+# src/utilops.c:1216
+#~ msgid "Create"
+#~ msgstr "建立"
+
+# 
+# src/preferences.c:559
+#~ msgid "Initial directory"
+#~ msgstr "初始目錄"
+
+# src/ui_pathsel.c:507 src/ui_pathsel.c:759
+#~ msgid "New Directory"
+#~ msgstr "新增目錄"
+
+# 
+# src/ui_pathsel.c:517 src/utilops.c:1158
+#~ msgid ""
+#~ "Unable to create directory:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "無法建立目錄:\n"
+#~ "%s"
+
+# 
+# src/ui_pathsel.c:518 src/utilops.c:1159
+#~ msgid "Error creating directory"
+#~ msgstr "建立目錄發生錯誤"
+
+# src/utilops.c:539
+#, fuzzy
+#~ msgid "Image details"
+#~ msgstr "影像描述"
+
+# 
+# src/menu.c:769
+#, fuzzy
+#~ msgid "/View/Image _details"
+#~ msgstr "/檢視/切換投影片模式(_S)"
+
+# 
+# src/collect-table.c:1820 src/dupe.c:2172
+#~ msgid "Add contents"
+#~ msgstr "加入內容"
+
+# 
+# src/collect-table.c:1821 src/dupe.c:2173
+#~ msgid "Add contents recursive"
+#~ msgstr "重覆加入內容"
+
+# 
+# src/collect-table.c:1822 src/dupe.c:2174
+#~ msgid "Skip directories"
+#~ msgstr "跳過目錄"
+
+# 
+# src/utilops.c:543
+#~ msgid "Invalid directory"
+#~ msgstr "無效的目錄"
+
+# 
+# src/utilops.c:591
+#~ msgid "GQview - copy"
+#~ msgstr "GQview - 複製"
+
+# 
+# src/utilops.c:600
+#~ msgid "GQview - move"
+#~ msgstr "GQview - 移動"
+
+# src/utilops.c:1145
+#~ msgid "Directory exists"
+#~ msgstr "目錄已存在"
+
+# 
+# src/utilops.c:1212
+#~ msgid "GQview - new directory"
+#~ msgstr "GQview - 新增目錄"
+
+#~ msgid "Misc."
+#~ msgstr "雜項"
index 7cf5d43..d691d01 100644 (file)
@@ -4,36 +4,146 @@ DIST_SUBDIRS = icons
 INCLUDES = -I$(srcdir) -I$(builddir)    \
        -I$(top_srcdir) -I$(top_builddir)       \
        -DLOCALEDIR=\""$(localedir)"\"          \
-       -I$(includedir) $(GTK_CFLAGS) $(GDK_IMLIB_CFLAGS)
+       -I$(includedir) $(GTK_CFLAGS)
+
+module_SLIK = \
+       intl.h          \
+       ui_bookmark.c   \
+       ui_bookmark.h   \
+       ui_fileops.c    \
+       ui_fileops.h    \
+       ui_help.c       \
+       ui_help.h       \
+       ui_menu.c       \
+       ui_menu.h       \
+       ui_misc.c       \
+       ui_misc.h       \
+       ui_pathsel.c    \
+       ui_pathsel.h    \
+       ui_spinner.c    \
+       ui_spinner.h    \
+       ui_tabcomp.c    \
+       ui_tabcomp.h    \
+       ui_tree_edit.c  \
+       ui_tree_edit.h  \
+       ui_utildlg.c    \
+       ui_utildlg.h
+
+extra_ICONS = \
+       ui_spinner.png  \
+       ui_tabcomp.png
+
+ICON_PAIRS = \
+       icon_spinner            $(srcdir)/ui_spinner.png        \
+       icon_tabcomp            $(srcdir)/ui_tabcomp.png
+
+ui_icons.h: $(extra_ICONS)
+       gdk-pixbuf-csource --raw --extern --build-list $(ICON_PAIRS) > ui_icons.h
+
+ui_spinner.o: ui_icons.h
+
+
+noinst_DATA = ui_icons.h
+CLEANFILES = $(noinst_DATA)
+                                                                                                                     
+extra_SLIK = \
+       $(extra_ICONS)
 
 bin_PROGRAMS = gqview
 
 gqview_SOURCES = \
-       config.c        \
+       $(module_SLIK)  \
+       bar_info.c      \
+       bar_info.h      \
+       bar_exif.c      \
+       bar_exif.h      \
+       bar_sort.c      \
+       bar_sort.h      \
+       cache.c         \
+       cache.h         \
+       cache_maint.c   \
+       cache_maint.h   \
+       cellrenderericon.c      \
+       cellrenderericon.h      \
+       collect.c       \
+       collect.h       \
+       collect-dlg.c   \
+       collect-dlg.h   \
+       collect-io.c    \
+       collect-io.h    \
+       collect-table.c \
+       collect-table.h \
        dnd.c           \
+       dnd.h           \
+       dupe.c          \
+       dupe.h          \
+       editors.c       \
+       editors.h       \
+       exif.c          \
+       exif.h          \
        filelist.c      \
-       fileops.c       \
+       filelist.h      \
+       fullscreen.c    \
+       fullscreen.h    \
        globals.c       \
        gqview.h        \
        image.c         \
        image.h         \
-       img-main.c      \
+       image-load.c    \
+       image-load.h    \
+       image-overlay.c \
+       image-overlay.h \
        img-view.c      \
-       intl.h          \
-       logo.h          \
+       img-view.h      \
+       info.c          \
+       info.h          \
+       layout.c        \
+       layout.h        \
+       layout_config.c \
+       layout_config.h \
+       layout_image.c  \
+       layout_image.h  \
+       layout_util.c   \
+       layout_util.h   \
        main.c          \
+       md5-util.c      \
+       md5-util.h      \
        menu.c          \
-       pathsel.c       \
+       menu.h          \
+       pixbuf_util.c   \
+       pixbuf_util.h   \
+       preferences.c   \
+       preferences.h   \
+       print.c         \
+       print.h         \
+       remote.c        \
+       remote.h        \
        rcfile.c        \
+       rcfile.h        \
+       search.c        \
+       search.h        \
+       similar.c       \
+       similar.h       \
        slideshow.c     \
-       tabcomp.c       \
+       slideshow.h     \
+       typedefs.h      \
        thumb.c         \
-       utildlg.c       \
-       utildlg.h       \
+       thumb.h         \
+       thumb_standard.c        \
+       thumb_standard.h        \
        utilops.c       \
-       window.c
+       utilops.h       \
+       view_dir_list.c \
+       view_dir_list.h \
+       view_dir_tree.c \
+       view_dir_tree.h \
+       view_file_list.c        \
+       view_file_list.h        \
+       view_file_icon.c        \
+       view_file_icon.h
 
-gqview_LDADD = $(GTK_LIBS) $(GDK_IMLIB_LIBS)
+gqview_LDADD = $(GTK_LIBS) $(INTLLIBS)
 
-EXTRA_DIST = tabcomp.xpm
+EXTRA_DIST = \
+       $(extra_SLIK)
 
diff --git a/src/bar_exif.c b/src/bar_exif.c
new file mode 100644 (file)
index 0000000..1064be1
--- /dev/null
@@ -0,0 +1,647 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "bar_exif.h"
+
+#include "exif.h"
+#include "ui_bookmark.h"
+#include "ui_misc.h"
+
+#include <math.h>
+
+#define EXIF_BAR_SIZE_INCREMENT 48
+#define EXIF_BAR_ARROW_SIZE 7
+
+#define EXIF_BAR_CUSTOM_COUNT 20
+
+static const gchar *bar_exif_key_list[] = {
+       "fCamera",
+       "fDateTime",
+       "fShutterSpeed",
+       "fAperture",
+       "ExposureProgram",
+       "fExposureBias",
+       "fISOSpeedRating",
+       "fFocalLength",
+       "fSubjectDistance",
+       "MeteringMode",
+       "fFlash",
+       "LightSource",
+       "fResolution",
+       "Orientation",
+       "ImageDescription",
+       "Copyright"
+};
+
+#define bar_exif_key_count (sizeof(bar_exif_key_list) / sizeof(gchar *))
+
+
+/*
+ *-------------------------------------------------------------------
+ * table util
+ *-------------------------------------------------------------------
+ */
+
+static void table_add_line_custom(GtkWidget *table, gint x, gint y,
+                                  const gchar *text1, const gchar *text2,
+                                  GtkWidget **label1, GtkWidget **label2)
+{
+       GtkWidget *label;
+       gchar *buf;
+
+       buf = g_strconcat((text1) ? text1 : "fixme", ":", NULL);
+       if (!text2) text2 = "";
+
+       label = gtk_label_new(buf);
+       gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.0);
+       pref_label_bold(label, TRUE, FALSE);
+       gtk_table_attach(GTK_TABLE(table), label,
+                        x, x + 1, y, y + 1,
+                        GTK_FILL, GTK_FILL,
+                        2, 2);
+       *label1 = label;
+
+       label = gtk_label_new(text2);
+       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
+       gtk_table_attach(GTK_TABLE(table), label,
+                        x + 1, x + 2, y, y + 1,
+                        GTK_FILL, GTK_FILL,
+                        2, 2);
+       *label2 = label;
+
+       g_free(buf);
+}
+
+static GtkWidget *table_add_line(GtkWidget *table, gint x, gint y,
+                                const gchar *description, const gchar *text)
+{
+       GtkWidget *key;
+       GtkWidget *label;
+
+       table_add_line_custom(table, x, y, description, text, &key, &label);
+       gtk_widget_show(key);
+       gtk_widget_show(label);
+
+       return label;
+}
+
+
+/*
+ *-------------------------------------------------------------------
+ * EXIF bar
+ *-------------------------------------------------------------------
+ */
+
+typedef struct _ExifBar ExifBar;
+struct _ExifBar
+{
+       GtkWidget *vbox;
+       GtkWidget *scrolled;
+       GtkWidget *table;
+       GtkWidget *advanced_scrolled;
+       GtkWidget *listview;
+       GtkWidget **labels;
+
+       GtkWidget *custom_sep;
+       GtkWidget *custom_name[EXIF_BAR_CUSTOM_COUNT];
+       GtkWidget *custom_value[EXIF_BAR_CUSTOM_COUNT];
+
+       gchar *path;
+
+       gint allow_search;
+};
+
+enum {
+       EXIF_ADVCOL_ENABLED = 0,
+       EXIF_ADVCOL_TAG,
+       EXIF_ADVCOL_NAME,
+       EXIF_ADVCOL_VALUE,
+       EXIF_ADVCOL_FORMAT,
+       EXIF_ADVCOL_ELEMENTS,
+       EXIF_ADVCOL_DESCRIPTION,
+       EXIF_ADVCOL_COUNT
+};
+
+static gchar *bar_exif_validate_text(gchar *text)
+{
+       if (text && !g_utf8_validate(text, strlen(text), NULL))
+               {
+               gchar *tmp = text;
+               text = g_convert(tmp, strlen(tmp), "UTF-8", "ISO-8859-1", NULL, NULL, NULL);
+               g_free(tmp);
+               }
+       return text;
+}
+
+static void bar_exif_sensitive(ExifBar *eb, gint enable)
+{
+       gtk_widget_set_sensitive(eb->table, enable);
+       if (eb->advanced_scrolled) gtk_widget_set_sensitive(eb->advanced_scrolled, enable);
+}
+
+static gint bar_exif_row_enabled(const gchar *name)
+{
+       GList *list;
+
+       list = history_list_get_by_key("exif_extras");
+       while (list)
+               {
+               if (name && strcmp(name, (gchar *)(list->data)) == 0) return TRUE;
+               list = list->next;
+       }
+
+       return FALSE;
+}
+
+static void bar_exif_update(ExifBar *eb)
+{
+       ExifData *exif;
+       gint len, i;
+
+       exif = exif_read(eb->path);
+
+       if (!exif)
+               {
+               bar_exif_sensitive(eb, FALSE);
+               return;
+               }
+
+       bar_exif_sensitive(eb, TRUE);
+
+       if (GTK_WIDGET_VISIBLE(eb->scrolled))
+               {
+               GList *list;
+               len = bar_exif_key_count;
+               for (i = 0; i < len; i++)
+                       {
+                       gchar *text;
+                       text = exif_get_data_as_text(exif, bar_exif_key_list[i]);
+                       text = bar_exif_validate_text(text);
+                       gtk_label_set_text(GTK_LABEL(eb->labels[i]), text);
+                       g_free(text);
+                       }
+
+               list = g_list_last(history_list_get_by_key("exif_extras"));
+               if (list)
+                       {
+                       gtk_widget_show(eb->custom_sep);
+                       }
+               else
+                       {
+                       gtk_widget_hide(eb->custom_sep);
+                       }
+               i = 0;
+               while (list && i < EXIF_BAR_CUSTOM_COUNT)
+                       {
+                       gchar *text;
+                       gchar *name;
+                       gchar *buf;
+
+                       name = list->data;
+                       list = list->prev;
+
+                       text = exif_get_data_as_text(exif, name);
+                       text = bar_exif_validate_text(text);
+
+                       buf = g_strconcat(name, ":", NULL);
+                       gtk_label_set_text(GTK_LABEL(eb->custom_name[i]), buf);
+                       g_free(buf);
+                       gtk_label_set_text(GTK_LABEL(eb->custom_value[i]), text);
+                       g_free(text);
+
+                       gtk_widget_show(eb->custom_name[i]);
+                       gtk_widget_show(eb->custom_value[i]);
+
+                       i++;
+                       }
+               while (i < EXIF_BAR_CUSTOM_COUNT)
+                       {
+                       gtk_widget_hide(eb->custom_name[i]);
+                       gtk_widget_hide(eb->custom_value[i]);
+                       i++;
+                       }
+               }
+
+       if (eb->advanced_scrolled && GTK_WIDGET_VISIBLE(eb->advanced_scrolled))
+               {
+               GtkListStore *store;
+               GtkTreeIter iter;
+               GList *work;
+               
+               store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(eb->listview)));
+               gtk_list_store_clear(store);
+
+               work = exif->items;
+               while (work)
+                       {
+                       ExifItem *item;
+                       gchar *tag;
+                       const gchar *tag_name;
+                       gchar *text;
+                       const gchar *format;
+                       gchar *elements;
+                       const gchar *description;
+
+                       item = work->data;
+                       work = work->next;
+
+                       tag = g_strdup_printf("0x%04x", item->tag);
+                       tag_name = exif_item_get_tag_name(item);
+                       format = exif_item_get_format_name(item, TRUE);
+                       text = exif_item_get_data_as_text(item);
+                       text = bar_exif_validate_text(text);
+                       elements = g_strdup_printf("%d", item->elements);
+                       description = exif_item_get_description(item);
+                       if (!description) description = "";
+                       gtk_list_store_append(store, &iter);
+                       gtk_list_store_set(store, &iter,
+                                       EXIF_ADVCOL_ENABLED, bar_exif_row_enabled(tag_name),
+                                       EXIF_ADVCOL_TAG, tag,
+                                       EXIF_ADVCOL_NAME, tag_name,
+                                       EXIF_ADVCOL_VALUE, text,
+                                       EXIF_ADVCOL_FORMAT, format,
+                                       EXIF_ADVCOL_ELEMENTS, elements,
+                                       EXIF_ADVCOL_DESCRIPTION, description, -1);
+                       g_free(tag);
+                       g_free(text);
+                       g_free(elements);
+                       }
+               }
+
+       exif_free(exif);
+}
+
+static void bar_exif_clear(ExifBar *eb)
+{
+       gint len;
+       gint i;
+
+       if (!GTK_WIDGET_SENSITIVE(eb->labels[0])) return;
+
+       len = bar_exif_key_count;
+       for (i = 0; i < len; i++)
+               {
+               gtk_label_set_text(GTK_LABEL(eb->labels[i]), "");
+               }
+       for (i = 0; i < EXIF_BAR_CUSTOM_COUNT; i++)
+               {
+               gtk_label_set_text(GTK_LABEL(eb->custom_value[i]), "");
+               }
+
+       if (eb->listview)
+               {
+               GtkListStore *store;
+
+               store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(eb->listview)));
+               gtk_list_store_clear(store);
+               }
+}
+
+void bar_exif_set(GtkWidget *bar, const gchar *path)
+{
+       ExifBar *eb;
+
+       eb = g_object_get_data(G_OBJECT(bar), "bar_exif_data");
+       if (!eb) return;
+
+       /* store this, advanced view toggle needs to reload data */
+       g_free(eb->path);
+       eb->path = g_strdup(path);
+
+       bar_exif_clear(eb);
+       bar_exif_update(eb);
+}
+
+static void bar_exif_row_toggled_cb(GtkCellRendererToggle *toggle, const gchar *path, gpointer data)
+{
+       GtkWidget *listview = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       GtkTreePath *tpath;
+       gchar *name = NULL;
+       gboolean active;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(listview));
+
+       tpath = gtk_tree_path_new_from_string(path);
+       gtk_tree_model_get_iter(store, &iter, tpath);
+       gtk_tree_path_free(tpath);
+
+       gtk_tree_model_get(store, &iter, EXIF_ADVCOL_ENABLED, &active,
+                                        EXIF_ADVCOL_NAME, &name, -1);
+       active = (!active);
+
+       if (active &&
+           g_list_length(history_list_get_by_key("exif_extras")) >= EXIF_BAR_CUSTOM_COUNT)
+               {
+               active = FALSE;
+               }
+
+       gtk_list_store_set(GTK_LIST_STORE(store), &iter, EXIF_ADVCOL_ENABLED, active, -1);
+
+       if (active)
+               {
+               history_list_add_to_key("exif_extras", name, EXIF_BAR_CUSTOM_COUNT);
+               }
+       else
+               {
+               history_list_item_change("exif_extras", name, NULL);
+               }
+
+       g_free(name);
+}
+
+static void bar_exif_add_column_check(GtkWidget *listview, const gchar *title, gint n)
+{
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_title(column, title);
+       gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+
+       renderer = gtk_cell_renderer_toggle_new();
+       gtk_tree_view_column_pack_start(column, renderer, TRUE);
+       gtk_tree_view_column_add_attribute(column, renderer, "active", n);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(listview), column);
+
+       g_signal_connect(G_OBJECT(renderer), "toggled",
+                        G_CALLBACK(bar_exif_row_toggled_cb), listview);
+}
+
+static void bar_exif_add_column(GtkWidget *listview, const gchar *title, gint n)
+{
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_title(column, title);
+       gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+
+       renderer = gtk_cell_renderer_text_new();
+       gtk_tree_view_column_pack_start(column, renderer, TRUE);
+       gtk_tree_view_column_add_attribute(column, renderer, "text", n);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(listview), column);
+}
+
+static void bar_exif_advanced_build_view(ExifBar *eb)
+{
+       GtkListStore *store;
+
+       if (eb->listview) return;
+
+       store = gtk_list_store_new(7, G_TYPE_BOOLEAN,
+                                     G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+                                     G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+       eb->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(eb->listview), TRUE);
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(eb->listview), TRUE);
+
+       if (eb->allow_search)
+               {
+               gtk_tree_view_set_search_column(GTK_TREE_VIEW(eb->listview), EXIF_ADVCOL_NAME);
+               }
+       else
+               {
+               gtk_tree_view_set_enable_search(GTK_TREE_VIEW(eb->listview), FALSE);
+               }
+
+       bar_exif_add_column_check(eb->listview, "", EXIF_ADVCOL_ENABLED);
+
+       bar_exif_add_column(eb->listview, _("Tag"), EXIF_ADVCOL_TAG);
+       bar_exif_add_column(eb->listview, _("Name"), EXIF_ADVCOL_NAME);
+       bar_exif_add_column(eb->listview, _("Value"), EXIF_ADVCOL_VALUE);
+       bar_exif_add_column(eb->listview, _("Format"), EXIF_ADVCOL_FORMAT);
+       bar_exif_add_column(eb->listview, _("Elements"), EXIF_ADVCOL_ELEMENTS);
+       bar_exif_add_column(eb->listview, _("Description"), EXIF_ADVCOL_DESCRIPTION);
+
+       eb->advanced_scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(eb->advanced_scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(eb->advanced_scrolled),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+       gtk_box_pack_start(GTK_BOX(eb->vbox), eb->advanced_scrolled, TRUE, TRUE, 0);
+       gtk_container_add(GTK_CONTAINER(eb->advanced_scrolled), eb->listview);
+       gtk_widget_show(eb->listview);
+}
+
+static void bar_exif_advanced_cb(GtkWidget *widget, gpointer data)
+{
+       ExifBar *eb = data;
+       gint advanced;
+
+       advanced = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+
+       if (advanced)
+               {
+               gtk_widget_hide(eb->scrolled);
+               bar_exif_advanced_build_view(eb);
+               gtk_widget_show(eb->advanced_scrolled);
+               }
+       else
+               {
+               gtk_widget_hide(eb->advanced_scrolled);
+               gtk_widget_show(eb->scrolled);
+               }
+
+       bar_exif_update(eb);
+}
+
+gint bar_exif_is_advanced(GtkWidget *bar)
+{
+       ExifBar *eb;
+
+       eb = g_object_get_data(G_OBJECT(bar), "bar_exif_data");
+       if (!eb) return FALSE;
+
+       return (eb->advanced_scrolled && GTK_WIDGET_VISIBLE(eb->advanced_scrolled));
+}
+
+void bar_exif_close(GtkWidget *bar)
+{
+       ExifBar *eb;
+
+       eb = g_object_get_data(G_OBJECT(bar), "bar_exif_data");
+       if (!eb) return;
+
+       gtk_widget_destroy(eb->vbox);
+}
+
+static void bar_exif_size(ExifBar *eb, gint val)
+{
+       gint size;
+
+       size = eb->vbox->allocation.width;
+       size = CLAMP(size + val, EXIF_BAR_SIZE_INCREMENT * 2, EXIF_BAR_SIZE_INCREMENT * 16);
+
+       gtk_widget_set_size_request(eb->vbox, size, -1);
+}
+
+static void bar_exif_larger(GtkWidget *widget, gpointer data)
+{
+       ExifBar *eb = data;
+
+       bar_exif_size(eb, EXIF_BAR_SIZE_INCREMENT);
+}
+
+static void bar_exif_smaller(GtkWidget *widget, gpointer data)
+{
+       ExifBar *eb = data;
+
+       bar_exif_size(eb, -EXIF_BAR_SIZE_INCREMENT);
+}
+
+static void bar_exif_destroy(GtkWidget *widget, gpointer data)
+{
+       ExifBar *eb = data;
+
+       g_free(eb->labels);
+       g_free(eb->path);
+       g_free(eb);
+}
+
+GtkWidget *bar_exif_new(gint show_title, const gchar *path, gint advanced, GtkWidget *bounding_widget)
+{
+       ExifBar *eb;
+       GtkWidget *table;
+       GtkWidget *viewport;
+       GtkWidget *hbox;
+       GtkWidget *button;
+       gint len;
+       gint i;
+
+       eb = g_new0(ExifBar, 1);
+
+       eb->labels = g_new0(GtkWidget *, bar_exif_key_count);
+
+       eb->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+       g_object_set_data(G_OBJECT(eb->vbox), "bar_exif_data", eb);
+       g_signal_connect_after(G_OBJECT(eb->vbox), "destroy",
+                              G_CALLBACK(bar_exif_destroy), eb);
+
+       eb->allow_search = !show_title;
+
+       if (show_title)
+               {
+               GtkWidget *box;
+               GtkWidget *label;
+               GtkWidget *button;
+               GtkWidget *arrow;
+
+               box = gtk_hbox_new(FALSE, 0);
+
+               label = sizer_new(eb->vbox, bounding_widget, SIZER_POS_LEFT);
+               sizer_set_limits(label, EXIF_BAR_SIZE_INCREMENT * 2, -1, -1 , -1);
+               gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
+               gtk_widget_show(label);
+
+               label = gtk_label_new(_("Exif"));
+               pref_label_bold(label, TRUE, FALSE);
+               gtk_box_pack_start(GTK_BOX(box), label, TRUE, TRUE, 0);
+               gtk_widget_show(label);
+
+               button = gtk_button_new();
+               gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
+               g_signal_connect(G_OBJECT(button), "clicked",
+                                G_CALLBACK(bar_exif_smaller), eb);
+               gtk_box_pack_end(GTK_BOX(box), button, FALSE, FALSE, 0);
+               arrow = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_NONE);
+               gtk_widget_set_size_request(arrow, EXIF_BAR_ARROW_SIZE, EXIF_BAR_ARROW_SIZE);
+               gtk_container_add(GTK_CONTAINER(button), arrow);
+               gtk_widget_show(arrow);
+               gtk_widget_show(button);
+
+               button = gtk_button_new();
+               gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
+               g_signal_connect(G_OBJECT(button), "clicked",
+                                G_CALLBACK(bar_exif_larger), eb);
+               gtk_box_pack_end(GTK_BOX(box), button, FALSE, FALSE, 0);
+               arrow = gtk_arrow_new(GTK_ARROW_LEFT, GTK_SHADOW_NONE);
+               gtk_widget_set_size_request(arrow, EXIF_BAR_ARROW_SIZE, EXIF_BAR_ARROW_SIZE);
+               gtk_container_add(GTK_CONTAINER(button), arrow);
+               gtk_widget_show(arrow);
+               gtk_widget_show(button);
+
+               gtk_box_pack_start(GTK_BOX(eb->vbox), box, FALSE, FALSE, 0);
+               gtk_widget_show(box);
+               }
+
+       table = gtk_table_new(2, bar_exif_key_count + 1 + EXIF_BAR_CUSTOM_COUNT, FALSE);
+
+       eb->table = table;
+
+       len = bar_exif_key_count;
+       for (i = 0; i < len; i++)
+               {
+               const gchar *text;
+
+               text = exif_get_description_by_key(bar_exif_key_list[i]);
+               eb->labels[i] = table_add_line(table, 0, i, text, NULL);
+               }
+
+       eb->custom_sep = gtk_hseparator_new();
+       gtk_table_attach(GTK_TABLE(table), eb->custom_sep, 0, 1,
+                                          bar_exif_key_count, bar_exif_key_count + 1,
+                                          GTK_FILL, GTK_FILL, 2, 2);
+
+       for (i = 0; i < EXIF_BAR_CUSTOM_COUNT; i++)
+               {
+               table_add_line_custom(table, 0, bar_exif_key_count + 1 + i,
+                                     "", "",  &eb->custom_name[i], &eb->custom_value[i]);
+               }
+
+       eb->scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(eb->scrolled),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+       viewport = gtk_viewport_new(NULL, NULL);
+       gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
+       gtk_container_add(GTK_CONTAINER(eb->scrolled), viewport);
+       gtk_widget_show(viewport);
+
+       gtk_container_add(GTK_CONTAINER(viewport), table);
+       gtk_widget_show(table);
+
+       gtk_box_pack_start(GTK_BOX(eb->vbox), eb->scrolled, TRUE, TRUE, 0);
+
+       hbox = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
+       gtk_box_pack_end(GTK_BOX(eb->vbox), hbox, FALSE, FALSE, 0);
+       gtk_widget_show(hbox);
+
+       button = gtk_check_button_new_with_label(_("Advanced view"));
+       if (advanced) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+       g_signal_connect(G_OBJECT(button), "toggled",
+                        G_CALLBACK(bar_exif_advanced_cb), eb);
+       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       eb->advanced_scrolled = NULL;
+       eb->listview = NULL;
+
+       if (advanced)
+               {
+               bar_exif_advanced_build_view(eb);
+               gtk_widget_show(eb->advanced_scrolled);
+               }
+       else
+               {
+               gtk_widget_show(eb->scrolled);
+               }
+
+       eb->path = g_strdup(path);
+       bar_exif_update(eb);
+
+       return eb->vbox;
+}
+
diff --git a/src/bar_exif.h b/src/bar_exif.h
new file mode 100644 (file)
index 0000000..9d2ee66
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef BAR_EXIF_H
+#define BAR_EXIF_H
+
+
+GtkWidget *bar_exif_new(gint show_title, const gchar *path, gint advanced, GtkWidget *bounding_widget);
+void bar_exif_close(GtkWidget *bar);
+
+void bar_exif_set(GtkWidget *bar, const gchar *path);
+
+gint bar_exif_is_advanced(GtkWidget *bar);
+
+
+#endif
+
diff --git a/src/bar_info.c b/src/bar_info.c
new file mode 100644 (file)
index 0000000..d07a97e
--- /dev/null
@@ -0,0 +1,1182 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "bar_info.h"
+
+#include "cache.h"
+#include "filelist.h"
+#include "info.h"
+#include "utilops.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_misc.h"
+#include "ui_utildlg.h"
+
+
+#define BAR_KEYWORD_AUTOSAVE_TIME 10000
+
+
+static const gchar *keyword_favorite_defaults[] = {
+       N_("Favorite"),
+       N_("Todo"),
+       N_("People"),
+       N_("Places"),
+       N_("Art"),
+       N_("Nature"),
+       N_("Possessions"),
+       NULL
+};
+
+
+static void bar_info_keyword_update_all(void);
+
+
+/*
+ *-------------------------------------------------------------------
+ * keyword / comment utils
+ *-------------------------------------------------------------------
+ */
+
+gint comment_write(const gchar *path, GList *keywords, const gchar *comment)
+{
+       FILE *f;
+
+       f = fopen(path, "w");
+       if (!f) return FALSE;
+
+       fprintf(f, "#GQview comment (%s)\n\n", VERSION);
+
+       fprintf(f, "[keywords]\n");
+       while (keywords)
+               {
+               const gchar *word = keywords->data;
+               keywords = keywords->next;
+
+               fprintf(f, "%s\n", word);
+               }
+       fprintf(f, "\n");
+
+       fprintf(f, "[comment]\n");
+       fprintf(f, "%s\n", (comment) ? comment : "");
+
+       fprintf(f, "#end\n");
+
+       fclose(f);
+
+       return TRUE;
+}
+
+gint comment_cache_write(const gchar *path, GList *keywords, const gchar *comment)
+{
+       gchar *comment_path;
+       gint success = FALSE;
+
+       /* If an existing metadata file exists, we will try writing to
+        * it's location regardless of the user's preference.
+        */
+       comment_path = cache_find_location(CACHE_TYPE_METADATA, path);
+       if (comment_path && !access_file(comment_path, W_OK))
+               {
+               g_free(comment_path);
+               comment_path = NULL;
+               }
+
+       if (!comment_path)
+               {
+               gchar *comment_dir;
+               mode_t mode = 0755;
+
+               comment_dir = cache_get_location(CACHE_TYPE_METADATA, path, FALSE, &mode);
+               if (cache_ensure_dir_exists(comment_dir, mode))
+                       {
+                       comment_path = g_strconcat(comment_dir, "/", filename_from_path(path),
+                                                  GQVIEW_CACHE_EXT_METADATA, NULL);
+                       }
+               g_free(comment_dir);
+               }
+
+       if (comment_path)
+               {
+               gchar *comment_pathl;
+
+               if (debug) printf("Saving comment: %s\n", comment_path);
+
+               comment_pathl = path_from_utf8(comment_path);
+
+               success = comment_write(comment_pathl, keywords, comment);
+
+               g_free(comment_pathl);
+               g_free(comment_path);
+               }
+
+       return success;
+}
+
+gint comment_read(const gchar *path, GList **keywords, gchar **comment)
+{
+       FILE *f;
+       gchar s_buf[1024];
+       gchar *key = NULL;
+       GList *list = NULL;
+       GString *comment_build = NULL;
+
+       f = fopen(path, "r");
+       if (!f) return FALSE;
+
+       while (fgets(s_buf,sizeof(s_buf), f))
+               {
+               if (s_buf[0]=='#') continue;
+               if (s_buf[0]=='[')
+                       {
+                       gint c = 0;
+                       gchar *ptr = s_buf + 1;
+
+                       while(ptr[c] != ']' && ptr[c] != '\n' && ptr[c] != '\0') c++;
+
+                       g_free(key);
+                       key = g_strndup(ptr, c);
+                       }
+               else if (key)
+                       {
+                       gint newline = FALSE;
+                       gchar *ptr = s_buf;
+
+                       while (*ptr != '\n' && *ptr != '\0') ptr++;
+                       if (*ptr == '\n')
+                               {
+                               *ptr = '\0';
+                               newline = TRUE;
+                               }
+
+                       if (strcasecmp(key, "keywords") == 0)
+                               {
+                               if (strlen(s_buf) > 0) list = g_list_prepend(list, g_strdup(s_buf));
+                               }
+                       else if (strcasecmp(key, "comment") == 0)
+                               {
+                               if (!comment_build) comment_build = g_string_new("");
+                               g_string_append(comment_build, s_buf);
+                               if (strlen(s_buf) > 0 && newline) g_string_append_c(comment_build, '\n');
+                               }
+                       }
+               }
+
+       fclose(f);
+       g_free(key);
+
+       *keywords = g_list_reverse(list);
+       if (comment_build)
+               {
+               if (comment) *comment = g_strdup(comment_build->str);
+               g_string_free(comment_build, TRUE);
+               }
+
+       return TRUE;
+}
+
+gint comment_cache_read(const gchar *path, GList **keywords, gchar **comment)
+{
+       gchar *comment_path;
+       gchar *comment_pathl;
+       gint success = FALSE;
+
+       comment_path = cache_find_location(CACHE_TYPE_METADATA, path);
+       if (!comment_path) return FALSE;
+
+       comment_pathl = path_from_utf8(comment_path);
+
+       success = comment_read(comment_pathl, keywords, comment);
+
+       g_free(comment_pathl);
+       g_free(comment_path);
+
+       return success;
+}
+
+static gchar *comment_pull(GtkWidget *textview)
+{
+       GtkTextBuffer *buffer;
+       GtkTextIter start, end;
+                                                                                                                    
+       buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
+       gtk_text_buffer_get_bounds(buffer, &start, &end);
+                                                                                                                    
+       return gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
+}
+
+GList *keyword_list_pull(GtkWidget *text_widget)
+{
+       GList *list = NULL;
+       gchar *text;
+       gchar *ptr;
+
+       if (GTK_IS_TEXT_VIEW(text_widget))
+               {
+               text = comment_pull(text_widget);
+               }
+       else if (GTK_IS_ENTRY(text_widget))
+               {
+               text = g_strdup(gtk_entry_get_text(GTK_ENTRY(text_widget)));
+               }
+       else
+               {
+               return NULL;
+               }
+
+       ptr = text;
+       while (*ptr != '\0')
+               {
+               gchar *begin;
+               gint l = 0;
+
+               while (*ptr == ' ' || *ptr == ',' || *ptr == '\n' || *ptr == '\r' || *ptr == '\b') ptr++;
+               begin = ptr;
+               if (*ptr != '\0')
+                       {
+                       while (*ptr != ' ' && *ptr != ',' &&
+                              *ptr != '\n' && *ptr != '\r' && *ptr != '\b' &&
+                              *ptr != '\0')
+                               {
+                               ptr++;
+                               l++;
+                               }
+                       }
+
+               if (l > 0) list = g_list_append(list, g_strndup(begin, l));
+               }
+
+       g_free(text);
+
+       return list;
+}
+
+void keyword_list_push(GtkWidget *textview, GList *list)
+{
+       GtkTextBuffer *buffer;
+       GtkTextIter start, end;
+
+       buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
+       gtk_text_buffer_get_bounds(buffer, &start, &end);
+       gtk_text_buffer_delete (buffer, &start, &end);
+
+       while (list)
+               {
+               const gchar *word = list->data;
+               GtkTextIter iter;
+
+               gtk_text_buffer_get_end_iter(buffer, &iter);
+               if (word) gtk_text_buffer_insert(buffer, &iter, word, -1);
+               gtk_text_buffer_get_end_iter(buffer, &iter);
+               gtk_text_buffer_insert(buffer, &iter, "\n", -1);
+
+               list = list->next;
+               }
+}
+
+static void metadata_set_keywords(const gchar *path, GList *list, gint add)
+{
+       gchar *comment = NULL;
+       GList *keywords = NULL;
+       GList *save_list = NULL;
+
+       comment_cache_read(path, &keywords, &comment);
+
+       if (add)
+               {
+               GList *work;
+
+               work = list;
+               while (work)
+                       {
+                       gchar *key;
+                       GList *p;
+
+                       key = work->data;
+                       work = work->next;
+
+                       p = keywords;
+                       while (p && key)
+                               {
+                               gchar *needle = p->data;
+                               p = p->next;
+
+                               if (strcmp(needle, key) == 0) key = NULL;
+                               }
+
+                       if (key) keywords = g_list_append(keywords, g_strdup(key));
+                       }
+               save_list = keywords;
+               }
+       else
+               {
+               save_list = list;
+               }
+
+       comment_cache_write(path, save_list, comment);
+
+       path_list_free(keywords);
+       g_free(comment);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * keyword list dialog
+ *-------------------------------------------------------------------
+ */
+
+#define KEYWORD_DIALOG_WIDTH  200
+#define KEYWORD_DIALOG_HEIGHT 250
+
+typedef struct _KeywordDlg KeywordDlg;
+struct _KeywordDlg
+{
+       GenericDialog *gd;
+       GtkWidget *treeview;
+};
+
+static KeywordDlg *keyword_dialog = NULL;
+
+
+static void keyword_dialog_cancel_cb(GenericDialog *gd, gpointer data)
+{
+       g_free(keyword_dialog);
+       keyword_dialog = NULL;
+}
+
+static void keyword_dialog_ok_cb(GenericDialog *gd, gpointer data)
+{
+       KeywordDlg *kd = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gint valid;
+
+       history_list_free_key("keywords");
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(kd->treeview));
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+       while (valid)
+               {
+               gchar *key;
+
+               gtk_tree_model_get(store, &iter, 0, &key, -1);
+               valid = gtk_tree_model_iter_next(store, &iter);
+
+               history_list_add_to_key("keywords", key, 0);
+               }
+
+       keyword_dialog_cancel_cb(gd, data);
+
+       bar_info_keyword_update_all();
+}
+
+static void keyword_dialog_add_cb(GtkWidget *button, gpointer data)
+{
+       KeywordDlg *kd = data;
+       GtkTreeSelection *selection;
+       GtkTreeModel *store;
+       GtkTreeIter sibling;
+       GtkTreeIter iter;
+       GtkTreePath *tpath;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(kd->treeview));
+       if (gtk_tree_selection_get_selected(selection, &store, &sibling))
+               {
+               gtk_list_store_insert_before(GTK_LIST_STORE(store), &iter, &sibling);
+               }
+       else
+               {
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(kd->treeview));
+               gtk_list_store_append(GTK_LIST_STORE(store), &iter);
+               }
+
+       gtk_list_store_set(GTK_LIST_STORE(store), &iter, 1, TRUE, -1);
+
+       tpath = gtk_tree_model_get_path(store, &iter);
+       gtk_tree_view_set_cursor(GTK_TREE_VIEW(kd->treeview), tpath,
+                                gtk_tree_view_get_column(GTK_TREE_VIEW(kd->treeview), 0), TRUE);
+       gtk_tree_path_free(tpath);
+}
+
+static void keyword_dialog_remove_cb(GtkWidget *button, gpointer data)
+{
+       KeywordDlg *kd = data;
+       GtkTreeSelection *selection;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       GtkTreeIter next;
+       GtkTreePath *tpath;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(kd->treeview));
+       if (!gtk_tree_selection_get_selected(selection, &store, &iter)) return;
+
+       tpath = NULL;
+       next = iter;
+       if (gtk_tree_model_iter_next(store, &next))
+               {
+               tpath = gtk_tree_model_get_path(store, &next);
+               }
+       else
+               {
+               tpath = gtk_tree_model_get_path(store, &iter);
+               if (!gtk_tree_path_prev(tpath))
+                       {
+                       gtk_tree_path_free(tpath);
+                       tpath = NULL;
+                       }
+               }
+       if (tpath)
+               {
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(kd->treeview), tpath,
+                                        gtk_tree_view_get_column(GTK_TREE_VIEW(kd->treeview), 0), FALSE);
+               gtk_tree_path_free(tpath);
+               }
+
+       gtk_list_store_remove(GTK_LIST_STORE(store), &iter);
+}
+
+static void keyword_dialog_edit_cb(GtkCellRendererText *renderer, const gchar *path,
+                                  const gchar *new_text, gpointer data)
+{
+       KeywordDlg *kd = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       GtkTreePath *tpath;
+
+       if (!new_text || strlen(new_text) == 0) return;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(kd->treeview));
+
+       tpath = gtk_tree_path_new_from_string(path);
+       gtk_tree_model_get_iter(store, &iter, tpath);
+       gtk_tree_path_free(tpath);
+
+       gtk_list_store_set(GTK_LIST_STORE(store), &iter, 0, new_text, -1);
+}
+
+static void keyword_dialog_populate(KeywordDlg *kd)
+{
+       GtkListStore *store;
+       GList *list;
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(kd->treeview)));
+       gtk_list_store_clear(store);
+
+       list = history_list_get_by_key("keywords");
+       list = g_list_last(list);
+       while (list)
+               {
+               GtkTreeIter iter;
+
+               gtk_list_store_append(store, &iter);
+               gtk_list_store_set(store, &iter, 0, list->data,
+                                                1, TRUE, -1);
+
+               list = list->prev;
+               }
+}
+
+static void keyword_dialog_show(void)
+{
+       GtkWidget *scrolled;
+       GtkListStore *store;
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+       GtkWidget *hbox;
+       GtkWidget *button;
+
+       if (keyword_dialog)
+               {
+               gtk_window_present(GTK_WINDOW(keyword_dialog->gd->dialog));
+               return;
+               }
+
+       keyword_dialog = g_new0(KeywordDlg, 1);
+
+       keyword_dialog->gd = generic_dialog_new(_("Keyword Presets"),
+                                               "GQview", "keyword_presets", NULL, TRUE,
+                                               keyword_dialog_cancel_cb, keyword_dialog);
+       generic_dialog_add_message(keyword_dialog->gd, NULL, _("Favorite keywords list"), NULL);
+
+       generic_dialog_add_button(keyword_dialog->gd, GTK_STOCK_OK, NULL,
+                                keyword_dialog_ok_cb, TRUE);
+
+       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_widget_set_size_request(scrolled, KEYWORD_DIALOG_WIDTH, KEYWORD_DIALOG_HEIGHT);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+       gtk_box_pack_start(GTK_BOX(keyword_dialog->gd->vbox), scrolled, TRUE, TRUE, 5);
+       gtk_widget_show(scrolled);
+
+       store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_BOOLEAN);
+       keyword_dialog->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(keyword_dialog->treeview), FALSE);
+       gtk_tree_view_set_search_column(GTK_TREE_VIEW(keyword_dialog->treeview), 0);
+       gtk_tree_view_set_reorderable(GTK_TREE_VIEW(keyword_dialog->treeview), TRUE);
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+       renderer = gtk_cell_renderer_text_new();
+       g_signal_connect(G_OBJECT(renderer), "edited",
+                        G_CALLBACK(keyword_dialog_edit_cb), keyword_dialog);
+       gtk_tree_view_column_pack_start(column, renderer, TRUE);
+       gtk_tree_view_column_add_attribute(column, renderer, "text", 0);
+       gtk_tree_view_column_add_attribute(column, renderer, "editable", 1);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(keyword_dialog->treeview), column);
+
+       gtk_container_add(GTK_CONTAINER(scrolled), keyword_dialog->treeview);
+       gtk_widget_show(keyword_dialog->treeview);
+
+       hbox = gtk_hbox_new(FALSE, 5);
+       gtk_box_pack_start(GTK_BOX(keyword_dialog->gd->vbox), hbox, FALSE, FALSE, 0);
+       gtk_widget_show(hbox);
+
+       button = gtk_button_new_from_stock(GTK_STOCK_ADD);
+       g_signal_connect(G_OBJECT(button), "clicked",
+                        G_CALLBACK(keyword_dialog_add_cb), keyword_dialog);
+       gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       button = gtk_button_new_from_stock(GTK_STOCK_REMOVE);
+       g_signal_connect(G_OBJECT(button), "clicked",
+                        G_CALLBACK(keyword_dialog_remove_cb), keyword_dialog);
+       gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       keyword_dialog_populate(keyword_dialog);
+
+       gtk_widget_show(keyword_dialog->gd->dialog);
+}
+
+
+static void bar_keyword_edit_cb(GtkWidget *button, gpointer data)
+{
+       keyword_dialog_show();
+}
+
+
+/*
+ *-------------------------------------------------------------------
+ * info bar
+ *-------------------------------------------------------------------
+ */
+
+typedef enum {
+       BAR_SORT_COPY,
+       BAR_SORT_MOVE,
+       BAR_SORT_LINK
+} SortActionType;
+
+enum {
+       KEYWORD_COLUMN_TOGGLE = 0,
+       KEYWORD_COLUMN_TEXT
+};
+
+typedef struct _BarInfoData BarInfoData;
+struct _BarInfoData
+{
+       GtkWidget *vbox;
+       GtkWidget *group_box;
+       GtkWidget *label_file_name;
+       GtkWidget *label_file_time;
+
+       GtkWidget *keyword_view;
+       GtkWidget *keyword_treeview;
+
+       GtkWidget *comment_view;
+
+       GtkWidget *button_save;
+       GtkWidget *button_set_add;
+       GtkWidget *button_set_replace;
+
+       gchar *path;
+
+       gint changed;
+       gint save_timeout_id;
+
+       GList *(*list_func)(gpointer);
+       gpointer list_data;
+};
+
+
+static GList *bar_list = NULL;
+
+
+static void bar_info_write(BarInfoData *bd)
+{
+       GList *list;
+       gchar *comment;
+
+       if (!bd->path) return;
+
+       list = keyword_list_pull(bd->keyword_view);
+       comment = comment_pull(bd->comment_view);
+
+       comment_cache_write(bd->path, list, comment);
+
+       path_list_free(list);
+       g_free(comment);
+
+       bd->changed = FALSE;
+       gtk_widget_set_sensitive(bd->button_save, FALSE);
+}
+
+static gint bar_info_autosave(gpointer data)
+{
+       BarInfoData *bd = data;
+
+       bar_info_write(bd);
+
+       bd->save_timeout_id = -1;
+
+       return FALSE;
+}
+
+static void bar_info_save_update(BarInfoData *bd, gint enable)
+{
+       if (bd->save_timeout_id != -1)
+               {
+               g_source_remove(bd->save_timeout_id);
+               bd->save_timeout_id = -1;
+               }
+       if (enable)
+               {
+               bd->save_timeout_id = g_timeout_add(BAR_KEYWORD_AUTOSAVE_TIME, bar_info_autosave, bd);
+               }
+}
+
+static gint bar_keyword_list_find(GList *list, const gchar *keyword)
+{
+       while (list)
+               {
+               gchar *haystack = list->data;
+
+               if (haystack && keyword && strcmp(haystack, keyword) == 0) return TRUE;
+
+               list = list->next;
+               }
+
+       return FALSE;
+}
+
+static void bar_keyword_list_sync(BarInfoData *bd, GList *keywords)
+{
+       GList *list;
+       GtkListStore *store;
+       GtkTreeIter iter;
+
+       list = history_list_get_by_key("keywords");
+       if (!list)
+               {
+               /* blank? set up a few example defaults */
+
+               gint i = 0;
+
+               while (keyword_favorite_defaults[i] != NULL)
+                       {
+                       history_list_add_to_key("keywords", _(keyword_favorite_defaults[i]), 0);
+                       i++;
+                       }
+
+               list = history_list_get_by_key("keywords");
+               }
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(bd->keyword_treeview)));
+
+       gtk_list_store_clear(store);
+
+       list = g_list_last(list);
+       while (list)
+               {
+               gchar *key = list->data;
+
+               gtk_list_store_append(store, &iter);
+               gtk_list_store_set(store, &iter, KEYWORD_COLUMN_TOGGLE, bar_keyword_list_find(keywords, key),
+                                                KEYWORD_COLUMN_TEXT, key, -1);
+
+               list = list->prev;
+               }
+}
+
+static void bar_info_keyword_update_all(void)
+{
+       GList *work;
+
+       work = bar_list;
+       while (work)
+               {
+               BarInfoData *bd;
+               GList *keywords;
+
+               bd = work->data;
+               work = work->next;
+
+               keywords = keyword_list_pull(bd->keyword_view);
+               bar_keyword_list_sync(bd, keywords);
+               path_list_free(keywords);
+               }
+}
+
+static void bar_info_update(BarInfoData *bd)
+{
+       GList *keywords = NULL;
+       gchar *comment = NULL;
+
+       if (bd->label_file_name)
+               {
+               gtk_label_set_text(GTK_LABEL(bd->label_file_name), (bd->path) ? filename_from_path(bd->path) : "");
+               }
+       if (bd->label_file_time)
+               {
+               gtk_label_set_text(GTK_LABEL(bd->label_file_time), (bd->path) ? text_from_time(filetime(bd->path)) : "");
+               }
+
+       if (comment_cache_read(bd->path, &keywords, &comment))
+               {
+               keyword_list_push(bd->keyword_view, keywords);
+               gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(bd->comment_view)),
+                                        (comment) ? comment : "", -1);
+
+               bar_keyword_list_sync(bd, keywords);
+
+               path_list_free(keywords);
+               g_free(comment);
+               }
+       else
+               {
+               gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(bd->keyword_view)), "", -1);
+               gtk_text_buffer_set_text(gtk_text_view_get_buffer(GTK_TEXT_VIEW(bd->comment_view)), "", -1);
+
+               bar_keyword_list_sync(bd, NULL);
+               }
+
+       bar_info_save_update(bd, FALSE);
+       bd->changed = FALSE;
+       gtk_widget_set_sensitive(bd->button_save, FALSE);
+
+       gtk_widget_set_sensitive(bd->group_box, (bd->path != NULL));
+}
+
+void bar_info_set(GtkWidget *bar, const gchar *path)
+{
+       BarInfoData *bd;
+
+       bd = g_object_get_data(G_OBJECT(bar), "bar_info_data");
+       if (!bd) return;
+
+       if (bd->changed) bar_info_write(bd);
+
+       g_free(bd->path);
+       bd->path = g_strdup(path);
+
+       bar_info_update(bd);
+}
+
+void bar_info_maint_renamed(GtkWidget *bar, const gchar *path)
+{
+       BarInfoData *bd;
+
+       bd = g_object_get_data(G_OBJECT(bar), "bar_info_data");
+       if (!bd) return;
+
+       g_free(bd->path);
+       bd->path = g_strdup(path);
+
+       if (bd->label_file_name)
+               {
+               gtk_label_set_text(GTK_LABEL(bd->label_file_name), (bd->path) ? filename_from_path(bd->path) : "");
+               }
+}
+
+gint bar_info_event(GtkWidget *bar, GdkEvent *event)
+{
+       BarInfoData *bd;
+
+       bd = g_object_get_data(G_OBJECT(bar), "bar_info_data");
+       if (!bd) return FALSE;
+
+       if (GTK_WIDGET_HAS_FOCUS(bd->keyword_view)) return gtk_widget_event(bd->keyword_view, event);
+       if (GTK_WIDGET_HAS_FOCUS(bd->comment_view)) return gtk_widget_event(bd->comment_view, event);
+
+       return FALSE;
+}
+
+static void bar_info_keyword_set(BarInfoData *bd, const gchar *keyword, gint active)
+{
+       GList *list;
+       gint found;
+
+       if (!keyword) return;
+
+       list = keyword_list_pull(bd->keyword_view);
+       found = bar_keyword_list_find(list, keyword);
+
+       if (active != found)
+               {
+               if (found)
+                       {
+                       GList *work = list;
+
+                       while (work)
+                               {
+                               gchar *key = work->data;
+                               work = work->next;
+
+                               if (key && keyword && strcmp(key, keyword) == 0)
+                                       {
+                                       list = g_list_remove(list, key);
+                                       g_free(key);
+                                       }
+                               }
+                       }
+               else
+                       {
+                       list = g_list_append(list, g_strdup(keyword));
+                       }
+
+               keyword_list_push(bd->keyword_view, list);
+               }
+
+       path_list_free(list);
+}
+
+static void bar_info_keyword_toggle(GtkCellRendererToggle *toggle, const gchar *path, gpointer data)
+{
+       BarInfoData *bd = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       GtkTreePath *tpath;
+       gchar *key = NULL;
+       gboolean active;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(bd->keyword_treeview));
+
+       tpath = gtk_tree_path_new_from_string(path);
+       gtk_tree_model_get_iter(store, &iter, tpath);
+       gtk_tree_path_free(tpath);
+
+       gtk_tree_model_get(store, &iter, KEYWORD_COLUMN_TOGGLE, &active,
+                                        KEYWORD_COLUMN_TEXT, &key, -1);
+       active = (!active);
+       gtk_list_store_set(GTK_LIST_STORE(store), &iter, KEYWORD_COLUMN_TOGGLE, active, -1);
+
+       bar_info_keyword_set(bd, key, active);
+       g_free(key);
+}
+
+static void bar_info_save(GtkWidget *button, gpointer data)
+{
+       BarInfoData *bd = data;
+
+       bar_info_save_update(bd, FALSE);
+       bar_info_write(bd);
+}
+
+static void bar_info_set_selection(BarInfoData *bd, gint add)
+{
+       GList *keywords;
+       GList *list = NULL;
+       GList *work;
+
+       if (!bd->list_func) return;
+
+       keywords = keyword_list_pull(bd->keyword_view);
+       if (!keywords && add) return;
+
+       list = bd->list_func(bd->list_data);
+       work = list;
+       while (work)
+               {
+               const gchar *path = work->data;
+               work = work->next;
+
+               metadata_set_keywords(path, keywords, add);
+               }
+
+       path_list_free(list);
+       path_list_free(keywords);
+}
+
+static void bar_info_set_add(GtkWidget *button, gpointer data)
+{
+       BarInfoData *bd = data;
+
+       bar_info_set_selection(bd, TRUE);
+}
+
+static void bar_info_set_replace(GtkWidget *button, gpointer data)
+{
+       BarInfoData *bd = data;
+
+       bar_info_set_selection(bd, FALSE);
+}
+
+static void bar_info_changed(GtkTextBuffer *buffer, gpointer data)
+{
+       BarInfoData *bd = data;
+
+       bd->changed = TRUE;
+       gtk_widget_set_sensitive(bd->button_save, TRUE);
+
+       bar_info_save_update(bd, TRUE);
+}
+
+void bar_info_close(GtkWidget *bar)
+{
+       BarInfoData *bd;
+
+       bd = g_object_get_data(G_OBJECT(bar), "bar_info_data");
+       if (!bd) return;
+
+       gtk_widget_destroy(bd->vbox);
+}
+
+static void bar_info_destroy(GtkWidget *widget, gpointer data)
+{
+       BarInfoData *bd = data;
+
+       if (bd->changed) bar_info_write(bd);
+       bar_info_save_update(bd, FALSE);
+
+       bar_list = g_list_remove(bar_list, bd);
+
+       g_free(bd->path);
+
+       g_free(bd);
+}
+
+GtkWidget *bar_info_new(const gchar *path, gint metadata_only, GtkWidget *bounding_widget)
+{
+       BarInfoData *bd;
+       GtkWidget *box;
+       GtkWidget *hbox;
+       GtkWidget *table;
+       GtkWidget *scrolled;
+       GtkTextBuffer *buffer;
+       GtkWidget *label;
+       GtkWidget *tbar;
+       GtkListStore *store;
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+
+       bd = g_new0(BarInfoData, 1);
+
+       bd->list_func = NULL;
+       bd->list_data = NULL;
+
+       bd->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+       g_object_set_data(G_OBJECT(bd->vbox), "bar_info_data", bd);
+       g_signal_connect(G_OBJECT(bd->vbox), "destroy",
+                        G_CALLBACK(bar_info_destroy), bd);
+
+       if (!metadata_only)
+               {
+               hbox = pref_box_new(bd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+
+               label = sizer_new(bd->vbox, bounding_widget, SIZER_POS_LEFT);
+               gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+               gtk_widget_show(label);
+
+               label = gtk_label_new(_("Keywords"));
+               pref_label_bold(label, TRUE, FALSE);
+               gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
+               gtk_widget_show(label);
+               }
+
+       bd->group_box = pref_box_new(bd->vbox, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
+
+       if (!metadata_only)
+               {
+               GtkWidget *table;
+
+               table = pref_table_new(bd->group_box, 2, 2, FALSE, FALSE);
+
+               bd->label_file_name = table_add_line(table, 0, 0, _("Filename:"), NULL);
+               bd->label_file_time = table_add_line(table, 0, 1, _("File date:"), NULL);
+               }
+       else
+               {
+               bd->label_file_name = NULL;
+               bd->label_file_time = NULL;
+               }
+
+       table = gtk_table_new(3, 1, TRUE);
+       gtk_table_set_row_spacings(GTK_TABLE(table), PREF_PAD_GAP);
+       gtk_box_pack_start(GTK_BOX(bd->group_box), table, TRUE, TRUE, 0);
+       gtk_widget_show(table);
+
+       /* keyword entry */
+
+       box = gtk_vbox_new(FALSE, 0);
+       gtk_table_attach(GTK_TABLE(table), box, 0, 1, 0, 2,
+                        GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+       gtk_widget_show(box);
+
+       label = pref_label_new(box, _("Keywords:"));
+       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+       pref_label_bold(label, TRUE, FALSE);
+
+       hbox = pref_box_new(box, TRUE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+
+       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+       gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0);
+       gtk_widget_show(scrolled);
+
+       bd->keyword_view = gtk_text_view_new();
+       gtk_container_add(GTK_CONTAINER(scrolled), bd->keyword_view);
+       gtk_widget_show(bd->keyword_view);
+
+       buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bd->keyword_view));
+       g_signal_connect(G_OBJECT(buffer), "changed",
+                        G_CALLBACK(bar_info_changed), bd);
+
+       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+       gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0);
+       gtk_widget_show(scrolled);
+
+       store = gtk_list_store_new(2, G_TYPE_BOOLEAN, G_TYPE_STRING);
+       bd->keyword_treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(bd->keyword_treeview), FALSE);
+
+       if (metadata_only)
+               {
+               gtk_tree_view_set_search_column(GTK_TREE_VIEW(bd->keyword_treeview), KEYWORD_COLUMN_TEXT);
+               }
+       else
+               {
+               gtk_tree_view_set_enable_search(GTK_TREE_VIEW(bd->keyword_treeview), FALSE);
+               }
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+
+       renderer = gtk_cell_renderer_toggle_new();
+       gtk_tree_view_column_pack_start(column, renderer, FALSE);
+       gtk_tree_view_column_add_attribute(column, renderer, "active", KEYWORD_COLUMN_TOGGLE);
+       g_signal_connect(G_OBJECT(renderer), "toggled",
+                        G_CALLBACK(bar_info_keyword_toggle), bd);
+
+       renderer = gtk_cell_renderer_text_new();
+       gtk_tree_view_column_pack_start(column, renderer, TRUE);
+       gtk_tree_view_column_add_attribute(column, renderer, "text", KEYWORD_COLUMN_TEXT);
+
+       gtk_tree_view_append_column(GTK_TREE_VIEW(bd->keyword_treeview), column);
+
+       gtk_container_add(GTK_CONTAINER(scrolled), bd->keyword_treeview);
+       gtk_widget_show(bd->keyword_treeview);
+
+       /* comment entry */
+
+       box = gtk_vbox_new(FALSE, 0);
+       gtk_table_attach(GTK_TABLE(table), box, 0, 1, 2, 3,
+                        GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+       gtk_widget_show(box);
+
+       label = pref_label_new(box, _("Comment:"));
+       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+       pref_label_bold(label, TRUE, FALSE);
+
+       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+       gtk_box_pack_start(GTK_BOX(box), scrolled, TRUE, TRUE, 0);
+       gtk_widget_show(scrolled);
+
+       bd->comment_view = gtk_text_view_new();
+       gtk_container_add(GTK_CONTAINER(scrolled), bd->comment_view);
+       gtk_widget_show(bd->comment_view);
+
+       buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(bd->comment_view));
+       g_signal_connect(G_OBJECT(buffer), "changed",
+                        G_CALLBACK(bar_info_changed), bd);
+
+       /* toolbar */
+
+       tbar = pref_toolbar_new(bd->group_box, GTK_TOOLBAR_ICONS);
+
+       pref_toolbar_button(tbar, GTK_STOCK_INDEX, NULL,
+                       _("Edit favorite keywords list."),
+                       G_CALLBACK(bar_keyword_edit_cb), bd);
+       pref_toolbar_spacer(tbar);
+       bd->button_set_add = pref_toolbar_button(tbar, GTK_STOCK_ADD, NULL,
+                       _("Add keywords to selected files"),
+                       G_CALLBACK(bar_info_set_add), bd);
+       bd->button_set_replace = pref_toolbar_button(tbar, GTK_STOCK_CONVERT, NULL,
+                       _("Add keywords to selected files, replacing the existing ones."),
+                       G_CALLBACK(bar_info_set_replace), bd);
+       pref_toolbar_spacer(tbar);
+       bd->button_save = pref_toolbar_button(tbar, GTK_STOCK_SAVE, NULL,
+                       _("Save comment now"),
+                       G_CALLBACK(bar_info_save), bd);
+
+       bd->save_timeout_id = -1;
+
+       bd->path = g_strdup(path);
+       bar_info_update(bd);
+
+       bar_info_selection(bd->vbox, 0);
+
+       bar_list = g_list_append(bar_list, bd);
+       
+       return bd->vbox;
+}
+
+void bar_info_set_selection_func(GtkWidget *bar, GList *(*list_func)(gpointer data), gpointer data)
+{
+       BarInfoData *bd;
+
+       bd = g_object_get_data(G_OBJECT(bar), "bar_info_data");
+       if (!bd) return;
+
+       bd->list_func = list_func;
+       bd->list_data = data;
+}
+
+void bar_info_selection(GtkWidget *bar, gint count)
+{
+       BarInfoData *bd;
+       gint enable;
+
+       bd = g_object_get_data(G_OBJECT(bar), "bar_info_data");
+       if (!bd) return;
+
+       enable = (count > 0 && bd->list_func != NULL);
+
+       gtk_widget_set_sensitive(bd->button_set_add, enable);
+       gtk_widget_set_sensitive(bd->button_set_replace, enable);
+}
+
+void bar_info_size_request(GtkWidget *bar, gint width)
+{
+       BarInfoData *bd;
+
+       bd = g_object_get_data(G_OBJECT(bar), "bar_info_data");
+       if (!bd) return;
+
+       if (bd->label_file_name)
+               {
+               gtk_widget_set_size_request(bd->vbox, width, -1);
+               }
+}
+
diff --git a/src/bar_info.h b/src/bar_info.h
new file mode 100644 (file)
index 0000000..bf9671d
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef BAR_INFO_H
+#define BAR_INFO_H
+
+
+GtkWidget *bar_info_new(const gchar *path, gint metadata_only, GtkWidget *bounding_widget);
+void bar_info_close(GtkWidget *bar);
+
+void bar_info_set(GtkWidget *bar, const gchar *path);
+gint bar_info_event(GtkWidget *bar, GdkEvent *event);
+
+void bar_info_set_selection_func(GtkWidget *bar, GList *(*list_func)(gpointer data), gpointer data);
+void bar_info_selection(GtkWidget *bar, gint count);
+
+void bar_info_size_request(GtkWidget *bar, gint width);
+
+void bar_info_maint_renamed(GtkWidget *bar, const gchar *path);
+
+gint comment_write(const gchar *path, GList *keywords, const gchar *comment);
+gint comment_cache_write(const gchar *path, GList *keywords, const gchar *comment);
+
+gint comment_read(const gchar *path, GList **keywords, gchar **comment);
+gint comment_cache_read(const gchar *path, GList **keywords, gchar **comment);
+
+GList *keyword_list_pull(GtkWidget *text_widget);
+void keyword_list_push(GtkWidget *textview, GList *list);
+
+
+#endif
diff --git a/src/bar_sort.c b/src/bar_sort.c
new file mode 100644 (file)
index 0000000..81caa48
--- /dev/null
@@ -0,0 +1,643 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "bar_sort.h"
+
+#include "collect.h"
+#include "collect-io.h"
+#include "filelist.h"
+#include "layout.h"
+#include "layout_image.h"
+#include "utilops.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_misc.h"
+
+
+/*
+  *-------------------------------------------------------------------
+  * sort bar
+  *-------------------------------------------------------------------
+  */
+
+typedef enum {
+       BAR_SORT_MODE_FOLDER = 0,
+       BAR_SORT_MODE_COLLECTION
+} SortModeType;
+
+typedef enum {
+       BAR_SORT_COPY,
+       BAR_SORT_MOVE,
+       BAR_SORT_LINK
+} SortActionType;
+
+typedef enum {
+       BAR_SORT_SELECTION_IMAGE,
+       BAR_SORT_SELECTION_SELECTED
+} SortSelectionType;
+
+typedef struct _SortData SortData;
+struct _SortData
+{
+       GtkWidget *vbox;
+       GtkWidget *bookmarks;
+       LayoutWindow *lw;
+
+       FileDialog *dialog;
+       GtkWidget *dialog_name_entry;
+
+       SortModeType mode;
+       SortActionType action;
+       SortSelectionType selection;
+
+       GtkWidget *folder_group;
+       GtkWidget *collection_group;
+
+       GtkWidget *add_button;
+       GtkWidget *undo_button;
+       SortActionType undo_action;
+       GList *undo_src_list;
+       gchar *undo_src;
+       gchar *undo_dest;
+};
+
+
+#define SORT_KEY_FOLDERS     "sort_manager"
+#define SORT_KEY_COLLECTIONS "sort_manager_collections"
+
+
+static gint bar_sort_mode_state = BAR_SORT_MODE_FOLDER;
+static gint bar_sort_action_state = BAR_SORT_COPY;
+static gint bar_sort_selection_state = BAR_SORT_SELECTION_IMAGE;
+
+
+static void bar_sort_undo_set(SortData *sd, GList *src_list, const gchar *src, const gchar *dest);
+static void bar_sort_add_close(SortData *sd);
+
+
+static void bar_sort_collection_list_build(GtkWidget *bookmarks)
+{
+       gchar *collect_path;
+       GList *list = NULL;
+       GList *work;
+
+       history_list_free_key(SORT_KEY_COLLECTIONS);
+       bookmark_list_set_key(bookmarks, SORT_KEY_COLLECTIONS);
+
+       collect_path = g_strconcat(homedir(), "/", GQVIEW_RC_DIR_COLLECTIONS, NULL);
+       path_list(collect_path, &list, NULL);
+       g_free(collect_path);
+
+       list = path_list_sort(list);
+
+       work = list;
+       while (work)
+               {
+               const gchar *path;
+               gchar *name;
+
+               path = work->data;
+               work = work->next;
+
+               if (file_extension_match(path, ".gqv"))
+                       {
+                       name = remove_extension_from_path(filename_from_path(path));
+                       }
+               else
+                       {
+                       name = g_strdup(filename_from_path(path));
+                       }
+               bookmark_list_add(bookmarks, name, path);
+               g_free(name);
+               }
+
+       path_list_free(list);
+}
+
+static void bar_sort_mode_sync(SortData *sd, SortModeType mode)
+{
+       gint folder_mode;
+
+       if (sd->mode == mode) return;
+       sd->mode = mode;
+
+       folder_mode = (sd->mode == BAR_SORT_MODE_FOLDER);
+
+       bookmark_list_set_no_defaults(sd->bookmarks, !folder_mode);
+       bookmark_list_set_editable(sd->bookmarks, folder_mode);
+
+       if (folder_mode)
+               {
+               gtk_widget_hide(sd->collection_group);
+               gtk_widget_show(sd->folder_group);
+               bookmark_list_set_key(sd->bookmarks, SORT_KEY_FOLDERS );
+               }
+       else
+               {
+               gtk_widget_hide(sd->folder_group);
+               gtk_widget_show(sd->collection_group);
+               bar_sort_collection_list_build(sd->bookmarks);
+               }
+
+       bar_sort_add_close(sd);
+
+       bar_sort_undo_set(sd, NULL, NULL, NULL);
+}
+
+static void bar_sort_mode_cb(GtkWidget *combo, gpointer data)
+{
+       SortData *sd = data;
+
+       if (gtk_combo_box_get_active(GTK_COMBO_BOX(combo)) == BAR_SORT_MODE_FOLDER)
+               {
+               bar_sort_mode_sync(sd, BAR_SORT_MODE_FOLDER);
+               }
+       else
+               {
+               bar_sort_mode_sync(sd, BAR_SORT_MODE_COLLECTION);
+               }
+}
+
+/* this takes control of src_list */
+static void bar_sort_undo_set(SortData *sd, GList *src_list, const gchar *src, const gchar *dest)
+{
+       path_list_free(sd->undo_src_list);
+       sd->undo_src_list = src_list;
+
+       g_free(sd->undo_src);
+       sd->undo_src = g_strdup(src);
+       g_free(sd->undo_dest);
+       sd->undo_dest = g_strdup(dest);
+
+       sd->undo_action = sd->action;
+
+       if (sd->undo_button)
+               {
+               gtk_widget_set_sensitive(sd->undo_button,
+                                        ((sd->undo_src_list || sd->undo_src) && sd->undo_dest) );
+               }
+}
+
+static void bar_sort_undo_folder(SortData *sd, GtkWidget *button)
+{
+       if (!sd->undo_src || !sd->undo_dest) return;
+
+       switch (sd->undo_action)
+               {
+               case BAR_SORT_MOVE:
+                       {
+                       GList *list;
+                       gchar *src_dir;
+
+                       list = g_list_append(NULL, g_strdup(sd->undo_dest));
+                       src_dir = remove_level_from_path(sd->undo_src);
+                       file_util_move_simple(list, src_dir);
+                       g_free(src_dir);
+                       }
+                       break;
+               case BAR_SORT_COPY:
+                       file_util_delete(sd->undo_dest, NULL, button);
+                       break;
+               case BAR_SORT_LINK:
+                       if (!unlink_file(sd->undo_dest))
+                               {
+                               gchar *buf;
+
+                               buf = g_strdup_printf("Unable to remove symbolic link:\n%s", sd->undo_dest);
+                               file_util_warning_dialog(_("Unlink failed"), buf, GTK_STOCK_DIALOG_ERROR, button);
+                               g_free(buf);
+                               }
+                       break;
+               }
+
+       layout_refresh(sd->lw);
+
+       if (isfile(sd->undo_src))
+               {
+               layout_image_set_path(sd->lw, sd->undo_src);
+               }
+
+       bar_sort_undo_set(sd, NULL, NULL, NULL);
+}
+
+static void bar_sort_undo_collection(SortData *sd)
+{
+       GList *work;
+
+       work = sd->undo_src_list;
+       while (work)
+               {
+               gchar *source;
+
+               source = work->data;
+               work = work->next;
+               collect_manager_remove(source, sd->undo_dest);
+               }
+
+       bar_sort_undo_set(sd, NULL, NULL, NULL);
+}
+
+static void bar_sort_undo_cb(GtkWidget *button, gpointer data)
+{
+       SortData *sd = data;
+
+       if (sd->mode == BAR_SORT_MODE_FOLDER)
+               {
+               bar_sort_undo_folder(sd, button);
+               }
+       else
+               {
+               bar_sort_undo_collection(sd);
+               }
+}
+
+static void bar_sort_bookmark_select_folder(SortData *sd, const gchar *source, const gchar *path)
+{
+       GList *list;
+       gchar *dest_path;
+
+       if (!isdir(path)) return;
+
+       dest_path = concat_dir_and_file(path, filename_from_path(source));
+       bar_sort_undo_set(sd, NULL, source, dest_path);
+
+       list = g_list_append(NULL, g_strdup(source));
+
+       switch (sd->action)
+               {
+               case BAR_SORT_COPY:
+                       file_util_copy_simple(list, path);
+                       list = NULL;
+                       layout_image_next(sd->lw);
+                       break;
+               case BAR_SORT_MOVE:
+                       file_util_move_simple(list, path);
+                       list = NULL;
+                       break;
+               case BAR_SORT_LINK:
+                       if (symlink_utf8(source, dest_path))
+                               {
+                               layout_image_next(sd->lw);
+                               }
+                       else
+                               {
+                               gchar *buf;
+
+                               buf = g_strdup_printf("Unable to create symbolic link:\n%s", dest_path);
+                               file_util_warning_dialog(_("Link failed"), buf, GTK_STOCK_DIALOG_ERROR, sd->bookmarks);
+
+                               g_free(buf);
+                               }
+                       break;
+               }
+
+       g_list_free(list);
+       g_free(dest_path);
+}
+
+static void bar_sort_bookmark_select_collection(SortData *sd, const gchar *source, const gchar *path)
+{
+       GList *list = NULL;
+
+       switch (sd->selection)
+               {
+               case BAR_SORT_SELECTION_IMAGE:
+                       list = g_list_append(NULL, g_strdup(source));
+                       break;
+               case BAR_SORT_SELECTION_SELECTED:
+                       list = layout_selection_list(sd->lw);
+                       break;
+               }
+
+       if (!list)
+               {
+               bar_sort_undo_set(sd, NULL, NULL, NULL);
+               return;
+               }
+
+       bar_sort_undo_set(sd, list, NULL, path);
+
+       while (list)
+               {
+               gchar *image_path;
+
+               image_path = list->data;
+               list = list->next;
+               collect_manager_add(image_path, path);
+               }
+}
+
+static void bar_sort_bookmark_select(const gchar *path, gpointer data)
+{
+       SortData *sd = data;
+       const gchar *source;
+
+       source = layout_image_get_path(sd->lw);
+       if (!path || !source) return;
+
+       if (sd->mode == BAR_SORT_MODE_FOLDER)
+               {
+               bar_sort_bookmark_select_folder(sd, source, path);
+               }
+       else
+               {
+               bar_sort_bookmark_select_collection(sd, source, path);
+               }
+}
+
+static void bar_sort_set_copy_cb(GtkWidget *button, gpointer data)
+{
+       SortData *sd = data;
+       if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) return;
+       sd->action = BAR_SORT_COPY;
+}
+
+static void bar_sort_set_move_cb(GtkWidget *button, gpointer data)
+{
+       SortData *sd = data;
+       if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) return;
+       sd->action = BAR_SORT_MOVE;
+}
+
+static void bar_sort_set_link_cb(GtkWidget *button, gpointer data)
+{
+       SortData *sd = data;
+       if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) return;
+       sd->action = BAR_SORT_LINK;
+}
+
+static void bar_sort_set_selection_image_cb(GtkWidget *button, gpointer data)
+{
+       SortData *sd = data;
+       if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) return;
+       sd->selection = BAR_SORT_SELECTION_IMAGE;
+}
+
+static void bar_sort_set_selection_selected_cb(GtkWidget *button, gpointer data)
+{
+       SortData *sd = data;
+       if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) return;
+       sd->selection = BAR_SORT_SELECTION_SELECTED;
+}
+
+static void bar_sort_add_close(SortData *sd)
+{
+       if (sd->dialog) file_dialog_close(sd->dialog);
+       sd->dialog_name_entry = NULL;
+       sd->dialog = NULL;
+}
+
+static void bar_sort_add_ok_cb(FileDialog *fd, gpointer data)
+{
+       SortData *sd = data;
+       const gchar *name;
+
+       name = gtk_entry_get_text(GTK_ENTRY(sd->dialog_name_entry));
+       if (sd->mode == BAR_SORT_MODE_FOLDER)
+               {
+               if (strlen(name) == 0)
+                       {
+                       name = filename_from_path(fd->dest_path);
+                       }
+
+               bookmark_list_add(sd->bookmarks, name, fd->dest_path);
+               }
+       else
+               {
+               gchar *path;
+               gchar *ext;
+
+               if (strlen(name) == 0) return;
+
+               if (file_extension_match(name, ".gqv"))
+                       {
+                       ext = NULL;
+                       }
+               else
+                       {
+                       ext = ".gqv";
+                       }
+
+               path = g_strconcat(homedir(), "/", GQVIEW_RC_DIR_COLLECTIONS, "/", name, ext, NULL);
+               if (isfile(path))
+                       {
+                       gchar *text = g_strdup_printf(_("The collection:\n%s\nalready exists."), name);
+                       file_util_warning_dialog(_("Collection exists"), text, GTK_STOCK_DIALOG_INFO, NULL);
+                       g_free(text);
+                       }
+               else
+                       {
+                       CollectionData *cd;
+
+                       cd = collection_new(path);
+                       if (collection_save(cd, path))
+                               {
+                               bar_sort_collection_list_build(sd->bookmarks);
+                               }
+                       else
+                               {
+                               gchar *text = g_strdup_printf(_("Failed to save the collection:\n%s"), path);
+                               file_util_warning_dialog(_("Save Failed"), text,
+                                                        GTK_STOCK_DIALOG_ERROR, GENERIC_DIALOG(fd)->dialog);
+                               g_free(text);
+                               }
+                       collection_unref(cd);
+                       }
+
+               g_free(path);
+               }
+
+       bar_sort_add_close(sd);
+}
+
+static void bar_sort_add_cancel_cb(FileDialog *fd, gpointer data)
+{
+       SortData *sd = data;
+
+       bar_sort_add_close(sd);
+}
+
+static void bar_sort_add_cb(GtkWidget *button, gpointer data)
+{
+       SortData *sd = data;
+       GtkWidget *hbox;
+       const gchar *title;
+
+       if (sd->dialog)
+               {
+               gtk_window_present(GTK_WINDOW(GENERIC_DIALOG(sd->dialog)->dialog));
+               return;
+               }
+
+       if (sd->mode == BAR_SORT_MODE_FOLDER)
+               {
+               title = _("Add Bookmark");
+               }
+       else
+               {
+               title = _("Add Collection");
+               }
+
+       sd->dialog = file_util_file_dlg(title,
+                                      "gqview", "add_bookmark", button,
+                                      bar_sort_add_cancel_cb, sd);
+       file_dialog_add_button(sd->dialog, GTK_STOCK_OK, NULL, bar_sort_add_ok_cb, TRUE);
+
+       generic_dialog_add_message(GENERIC_DIALOG(sd->dialog), NULL, title, NULL);
+
+       if (sd->mode == BAR_SORT_MODE_FOLDER)
+               {
+               file_dialog_add_path_widgets(sd->dialog, NULL, NULL, "add_bookmark", NULL, NULL);
+               }
+
+       hbox = pref_box_new(GENERIC_DIALOG(sd->dialog)->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+
+       pref_label_new(hbox, _("Name:"));
+
+       sd->dialog_name_entry = gtk_entry_new();
+       gtk_box_pack_start(GTK_BOX(hbox), sd->dialog_name_entry, TRUE, TRUE, 0);
+       generic_dialog_attach_default(GENERIC_DIALOG(sd->dialog), sd->dialog_name_entry);
+       gtk_widget_show(sd->dialog_name_entry);
+
+       if (sd->mode == BAR_SORT_MODE_COLLECTION)
+               {
+               gtk_widget_grab_focus(sd->dialog_name_entry);
+               }
+
+       gtk_widget_show(GENERIC_DIALOG(sd->dialog)->dialog);
+}
+
+void bar_sort_close(GtkWidget *bar)
+{
+       SortData *sd;
+
+       sd = g_object_get_data(G_OBJECT(bar), "bar_sort_data");
+       if (!sd) return;
+
+       gtk_widget_destroy(sd->vbox);
+}
+
+static void bar_sort_destroy(GtkWidget *widget, gpointer data)
+{
+       SortData *sd = data;
+
+       bar_sort_add_close(sd);
+       bar_sort_mode_state = sd->mode;
+       bar_sort_action_state = sd->action;
+       bar_sort_selection_state = sd->selection;
+
+       g_free(sd->undo_src);
+       g_free(sd->undo_dest);
+       g_free(sd);
+}
+
+GtkWidget *bar_sort_new(LayoutWindow *lw)
+{
+       SortData *sd;
+       GtkWidget *button;
+       GtkWidget *buttongrp;
+       GtkWidget *label;
+       GtkWidget *tbar;
+       GtkWidget *combo;
+
+       if (!lw) return NULL;
+
+       sd = g_new0(SortData, 1);
+
+       sd->lw = lw;
+       sd->action = bar_sort_action_state;
+       sd->selection = bar_sort_selection_state;
+       sd->undo_src = NULL;
+       sd->undo_dest = NULL;
+
+       sd->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+       g_object_set_data(G_OBJECT(sd->vbox), "bar_sort_data", sd);
+       g_signal_connect(G_OBJECT(sd->vbox), "destroy",
+                        G_CALLBACK(bar_sort_destroy), sd);
+
+       label = gtk_label_new(_("Sort Manager"));
+       pref_label_bold(label, TRUE, FALSE);
+       gtk_box_pack_start(GTK_BOX(sd->vbox), label, FALSE, FALSE, 0);
+       gtk_widget_show(label);
+
+       combo = gtk_combo_box_new_text();
+       gtk_box_pack_start(GTK_BOX(sd->vbox), combo, FALSE, FALSE, 0);
+       gtk_widget_show(combo);
+
+       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Folders"));
+       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Collections"));
+
+       g_signal_connect(G_OBJECT(combo), "changed",
+                        G_CALLBACK(bar_sort_mode_cb), sd);
+
+       sd->folder_group = pref_box_new(sd->vbox, FALSE, GTK_ORIENTATION_VERTICAL, 0);
+
+       buttongrp = gtk_radio_button_new_with_label(NULL, _("Copy"));
+       if (sd->action == BAR_SORT_COPY) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttongrp), TRUE);
+       g_signal_connect(G_OBJECT(buttongrp), "clicked",
+                        G_CALLBACK(bar_sort_set_copy_cb), sd);
+       gtk_box_pack_start(GTK_BOX(sd->folder_group), buttongrp, FALSE, FALSE, 0);
+       gtk_widget_show(buttongrp);
+
+       button = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(buttongrp)), _("Move"));
+       if (sd->action == BAR_SORT_MOVE) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+       g_signal_connect(G_OBJECT(button), "clicked",
+                        G_CALLBACK(bar_sort_set_move_cb), sd);
+       gtk_box_pack_start(GTK_BOX(sd->folder_group), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       button = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(buttongrp)), _("Link"));
+
+       if (sd->action == BAR_SORT_LINK) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+       g_signal_connect(G_OBJECT(button), "clicked",
+                        G_CALLBACK(bar_sort_set_link_cb), sd);
+       gtk_box_pack_start(GTK_BOX(sd->folder_group), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       sd->collection_group = pref_box_new(sd->vbox, FALSE, GTK_ORIENTATION_VERTICAL, 0);
+
+       buttongrp = gtk_radio_button_new_with_label(NULL, _("Add image"));
+       if (sd->selection == BAR_SORT_SELECTION_IMAGE) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttongrp), TRUE);
+       g_signal_connect(G_OBJECT(buttongrp), "clicked",
+                        G_CALLBACK(bar_sort_set_selection_image_cb), sd);
+       gtk_box_pack_start(GTK_BOX(sd->collection_group), buttongrp, FALSE, FALSE, 0);
+       gtk_widget_show(buttongrp);
+
+       button = gtk_radio_button_new_with_label(gtk_radio_button_get_group(GTK_RADIO_BUTTON(buttongrp)), _("Add selection"));
+       if (sd->selection == BAR_SORT_SELECTION_SELECTED) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+       g_signal_connect(G_OBJECT(button), "clicked",
+                        G_CALLBACK(bar_sort_set_selection_selected_cb), sd);
+       gtk_box_pack_start(GTK_BOX(sd->collection_group), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       sd->bookmarks = bookmark_list_new(SORT_KEY_FOLDERS, bar_sort_bookmark_select, sd);
+       gtk_box_pack_start(GTK_BOX(sd->vbox), sd->bookmarks, TRUE, TRUE, 0);
+       gtk_widget_show(sd->bookmarks);
+
+       tbar = pref_toolbar_new(sd->vbox, GTK_TOOLBAR_ICONS);
+
+       sd->add_button = pref_toolbar_button(tbar, GTK_STOCK_ADD, NULL,
+                                            _("Add Bookmark"),
+                                            G_CALLBACK(bar_sort_add_cb), sd);
+       sd->undo_button = pref_toolbar_button(tbar, GTK_STOCK_UNDO, NULL,
+                                             _("Undo last image"),
+                                             G_CALLBACK(bar_sort_undo_cb), sd);
+
+       sd->mode = -1;
+       bar_sort_mode_sync(sd, bar_sort_mode_state);
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), sd->mode);
+       
+       return sd->vbox;
+}
+
diff --git a/src/bar_sort.h b/src/bar_sort.h
new file mode 100644 (file)
index 0000000..33936cc
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef BAR_SORT_H
+#define BAR_SORT_H
+
+
+GtkWidget *bar_sort_new(LayoutWindow *lw);
+void bar_sort_close(GtkWidget *bar);
+
+
+#endif
diff --git a/src/cache.c b/src/cache.c
new file mode 100644 (file)
index 0000000..ef983ab
--- /dev/null
@@ -0,0 +1,700 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#include "gqview.h"
+#include "cache.h"
+
+#include "md5-util.h"
+#include "ui_fileops.h"
+
+#include <utime.h>
+#include <errno.h>
+
+
+/*
+ *-------------------------------------------------------------------
+ * Cache data file format:
+ *-------------------------------------------------------------------
+ * 
+ * SIMcache
+ * #coment
+ * Dimensions=[<width> x <height>]
+ * Checksum=[<value>]
+ * MD5sum=[<32 character ascii text digest>]
+ * SimilarityGrid[32 x 32]=<3072 bytes of data (1024 pixels in RGB format, 1 pixel is 24bits)>
+ * 
+ * 
+ * The first line (9 bytes) indicates it is a SIMcache format file. (new line char must exist)
+ * Comment lines starting with a # are ignored up to a new line.
+ * All data lines should end with a new line char.
+ * Format is very strict, data must begin with the char immediately following '='.
+ * Currently SimilarityGrid is always assumed to be 32 x 32 RGB.
+ */
+
+
+/*
+ *-------------------------------------------------------------------
+ * sim cache data
+ *-------------------------------------------------------------------
+ */
+
+CacheData *cache_sim_data_new(void)
+{
+       CacheData *cd;
+
+       cd = g_new0(CacheData, 1);
+       cd->dimensions = FALSE;
+       cd->similarity = FALSE;
+
+       return cd;
+}
+
+void cache_sim_data_free(CacheData *cd)
+{
+       if (!cd) return;
+
+       g_free(cd->path);
+       image_sim_free(cd->sim);
+       g_free(cd);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * sim cache write
+ *-------------------------------------------------------------------
+ */
+
+static gint cache_sim_write_dimensions(FILE *f, CacheData *cd)
+{
+       if (!f || !cd || !cd->dimensions) return FALSE;
+
+       fprintf(f, "Dimensions=[%d x %d]\n", cd->width, cd->height);
+
+       return TRUE;
+}
+
+static gint cache_sim_write_checksum(FILE *f, CacheData *cd)
+{
+       if (!f || !cd || !cd->have_checksum) return FALSE;
+
+       fprintf(f, "Checksum=[%ld]\n", cd->checksum);
+
+       return TRUE;
+}
+
+static gint cache_sim_write_md5sum(FILE *f, CacheData *cd)
+{
+       gchar *text;
+
+       if (!f || !cd || !cd->have_md5sum) return FALSE;
+
+       text = md5_digest_to_text(cd->md5sum);
+       fprintf(f, "MD5sum=[%s]\n", text);
+       g_free(text);
+
+       return TRUE;
+}
+
+static gint cache_sim_write_similarity(FILE *f, CacheData *cd)
+{
+       gint success = FALSE;
+
+       if (!f || !cd || !cd->similarity) return FALSE;
+
+       if (cd->sim && cd->sim->filled)
+               {
+               gint x, y;
+               guint8 buf[96];
+
+               fprintf(f, "SimilarityGrid[32 x 32]=");
+               for (y = 0; y < 32; y++)
+                       {
+                       gint s;
+                       guint8 *p;
+
+                       s = y * 32;
+                       p = buf;
+                       for(x = 0; x < 32; x++)
+                               {
+                               *p = cd->sim->avg_r[s + x]; p++;
+                               *p = cd->sim->avg_g[s + x]; p++;
+                               *p = cd->sim->avg_b[s + x]; p++;
+                               }
+                       fwrite(buf, sizeof(buf), 1, f);
+                       }
+
+               fprintf(f, "\n");
+               success = TRUE;
+               }
+
+       return success;
+}
+
+gint cache_sim_data_save(CacheData *cd)
+{
+       FILE *f;
+       gchar *pathl;
+
+       if (!cd || !cd->path) return FALSE;
+
+       pathl = path_from_utf8(cd->path);
+       f = fopen(pathl, "w");
+       g_free(pathl);
+
+       if (!f)
+               {
+               printf("Unable to save sim cache data: %s\n", cd->path);
+               return FALSE;
+               }
+
+       fprintf(f, "SIMcache\n#%s %s\n", PACKAGE, VERSION);
+       cache_sim_write_dimensions(f, cd);
+       cache_sim_write_checksum(f, cd);
+       cache_sim_write_md5sum(f, cd);
+       cache_sim_write_similarity(f, cd);
+
+       fclose (f);
+
+       return TRUE;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * sim cache read
+ *-------------------------------------------------------------------
+ */
+
+static gint cache_sim_read_comment(FILE *f, char *buf, int s, CacheData *cd)
+{
+       if (!f || !buf || !cd) return FALSE;
+
+       if (buf[0] != '#') return FALSE;
+
+       if (fseek(f, 0 - (s - 1), SEEK_CUR) == 0)
+               {
+               char b;
+               while(fread(&b, sizeof(b), 1, f) == 1)
+                       {
+                       if (b == '\n') return TRUE;
+                       }
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+static gint cache_sim_read_dimensions(FILE *f, char *buf, int s, CacheData *cd)
+{
+       if (!f || !buf || !cd) return FALSE;
+
+       if (s < 10 || strncmp("Dimensions", buf, 10) != 0) return FALSE;
+
+       if (fseek(f, - s, SEEK_CUR) == 0)
+               {
+               char b;
+               char buf[1024];
+               gint p = 0;
+               gint w, h;
+
+               b = 'X';
+               while (b != '[')
+                       {
+                       if (fread(&b, sizeof(b), 1, f) != 1) return FALSE;
+                       }
+               while (b != ']' && p < 1023)
+                       {
+                       if (fread(&b, sizeof(b), 1, f) != 1) return FALSE;
+                       buf[p] = b;
+                       p++;
+                       }
+
+               while (b != '\n')
+                       {
+                       if (fread(&b, sizeof(b), 1, f) != 1) break;
+                       }
+
+               buf[p] = '\0';
+               if (sscanf(buf, "%d x %d", &w, &h) != 2) return FALSE;
+
+               cd->width = w;
+               cd->height = h;
+               cd->dimensions = TRUE;
+
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+static gint cache_sim_read_checksum(FILE *f, char *buf, int s, CacheData *cd)
+{
+       if (!f || !buf || !cd) return FALSE;
+
+       if (s < 8 || strncmp("Checksum", buf, 8) != 0) return FALSE;
+
+       if (fseek(f, - s, SEEK_CUR) == 0)
+               {
+               char b;
+               char buf[1024];
+               gint p = 0;
+
+               b = 'X';
+               while (b != '[')
+                       {
+                       if (fread(&b, sizeof(b), 1, f) != 1) return FALSE;
+                       }
+               while (b != ']' && p < 1023)
+                       {
+                       if (fread(&b, sizeof(b), 1, f) != 1) return FALSE;
+                       buf[p] = b;
+                       p++;
+                       }
+
+               while (b != '\n')
+                       {
+                       if (fread(&b, sizeof(b), 1, f) != 1) break;
+                       }
+
+               buf[p] = '\0';
+               cd->checksum = strtol(buf, NULL, 10);
+
+               cd->have_checksum = TRUE;
+
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+static gint cache_sim_read_md5sum(FILE *f, char *buf, int s, CacheData *cd)
+{
+       if (!f || !buf || !cd) return FALSE;
+
+       if (s < 8 || strncmp("MD5sum", buf, 6) != 0) return FALSE;
+
+       if (fseek(f, - s, SEEK_CUR) == 0)
+               {
+               char b;
+               char buf[64];
+               gint p = 0;
+
+               b = 'X';
+               while (b != '[')
+                       {
+                       if (fread(&b, sizeof(b), 1, f) != 1) return FALSE;
+                       }
+               while (b != ']' && p < 63)
+                       {
+                       if (fread(&b, sizeof(b), 1, f) != 1) return FALSE;
+                       buf[p] = b;
+                       p++;
+                       }
+               while (b != '\n')
+                       {
+                       if (fread(&b, sizeof(b), 1, f) != 1) break;
+                       }
+
+               buf[p] = '\0';
+               cd->have_md5sum = md5_digest_from_text(buf, cd->md5sum);
+
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+static gint cache_sim_read_similarity(FILE *f, char *buf, int s, CacheData *cd)
+{
+       if (!f || !buf || !cd) return FALSE;
+
+       if (s < 11 || strncmp("Similarity", buf, 10) != 0) return FALSE;
+
+       if (strncmp("Grid[32 x 32]", buf + 10, 13) != 0) return FALSE;
+
+       if (fseek(f, - s, SEEK_CUR) == 0)
+               {
+               char b;
+               guint8 pixel_buf[3];
+               ImageSimilarityData *sd;
+               gint x, y;
+
+               b = 'X';
+               while (b != '=')
+                       {
+                       if (fread(&b, sizeof(b), 1, f) != 1) return FALSE;
+                       }
+
+               if (cd->sim)
+                       {
+                       /* use current sim that may already contain data we will not touch here */
+                       sd = cd->sim;
+                       cd->sim = NULL;
+                       cd->similarity = FALSE;
+                       }
+               else
+                       {
+                       sd = image_sim_new();
+                       }
+
+               for (y = 0; y < 32; y++)
+                       {
+                       gint s = y * 32;
+                       for (x = 0; x < 32; x++)
+                               {
+                               if (fread(&pixel_buf, sizeof(pixel_buf), 1, f) != 1)
+                                       {
+                                       image_sim_free(sd);
+                                       return FALSE;
+                                       }
+                               sd->avg_r[s + x] = pixel_buf[0];
+                               sd->avg_g[s + x] = pixel_buf[1];
+                               sd->avg_b[s + x] = pixel_buf[2];
+                               }
+                       }
+
+               if (fread(&b, sizeof(b), 1, f) == 1)
+                       {
+                       if (b != '\n') fseek(f, -1, SEEK_CUR);
+                       }
+
+               cd->sim = sd;
+               cd->sim->filled = TRUE;
+               cd->similarity = TRUE;
+
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+CacheData *cache_sim_data_load(const gchar *path)
+{
+       FILE *f;
+       CacheData *cd = NULL;
+       char buf[32];
+       gint success = TRUE;
+       gchar *pathl;
+
+       if (!path) return NULL;
+
+       pathl = path_from_utf8(path);
+       f = fopen(pathl, "r");
+       g_free(pathl);
+
+       if (!f) return NULL;
+
+       cd = cache_sim_data_new();
+       cd->path = g_strdup(path);
+
+       if (fread(&buf, sizeof(char), 9, f) != 9 ||
+           strncmp(buf, "SIMcache", 8) != 0)
+               {
+               if (debug) printf("%s is not a cache file\n", cd->path);
+               success = FALSE;
+               }
+
+       while (success)
+               {
+               int s;
+               s = fread(&buf, sizeof(char), sizeof(buf), f);
+
+               if (s < 1)
+                       {
+                       success = FALSE;
+                       }
+               else
+                       {
+                       if (!cache_sim_read_comment(f, buf, s, cd) &&
+                           !cache_sim_read_dimensions(f, buf, s, cd) &&
+                           !cache_sim_read_checksum(f, buf, s, cd) &&
+                           !cache_sim_read_md5sum(f, buf, s, cd) &&
+                           !cache_sim_read_similarity(f, buf, s, cd))
+                               {
+                               success = FALSE;
+                               }
+                       }
+               }
+
+       fclose(f);
+
+       if (!cd->dimensions && !cd->similarity)
+               {
+               cache_sim_data_free(cd);
+               cd = NULL;
+               }
+
+       return cd;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * sim cache setting
+ *-------------------------------------------------------------------
+ */
+
+void cache_sim_data_set_dimensions(CacheData *cd, gint w, gint h)
+{
+       if (!cd) return;
+
+       cd->width = w;
+       cd->height = h;
+       cd->dimensions = TRUE;
+}
+
+void cache_sim_data_set_checksum(CacheData *cd, long checksum)
+{
+       if (!cd) return;
+
+       cd->checksum = checksum;
+       cd->have_checksum = TRUE;
+}
+
+void cache_sim_data_set_md5sum(CacheData *cd, guchar digest[16])
+{
+       gint i;
+
+       if (!cd) return;
+
+       for (i = 0; i < 16; i++)
+               {
+               cd->md5sum[i] = digest[i];
+               }
+       cd->have_md5sum = TRUE;
+}
+
+void cache_sim_data_set_similarity(CacheData *cd, ImageSimilarityData *sd)
+{
+       if (!cd || !sd || !sd->filled) return;
+
+       if (!cd->sim) cd->sim = image_sim_new();
+
+       memcpy(cd->sim->avg_r, sd->avg_r, 1024);
+       memcpy(cd->sim->avg_g, sd->avg_g, 1024);
+       memcpy(cd->sim->avg_b, sd->avg_b, 1024);
+       cd->sim->filled = TRUE;
+
+       cd->similarity = TRUE;
+}
+
+gint cache_sim_data_filled(ImageSimilarityData *sd)
+{
+       if (!sd) return FALSE;
+       return sd->filled;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * cache path location utils
+ *-------------------------------------------------------------------
+ */
+
+/* warning: this func modifies path string contents!, on fail it is set to fail point */
+gint cache_ensure_dir_exists(gchar *path, mode_t mode)
+{
+       if (!path) return FALSE;
+
+       if (!isdir(path))
+               {
+               gchar *p = path;
+               while (p[0] != '\0')
+                       {
+                       p++;
+                       if (p[0] == '/' || p[0] == '\0')
+                               {
+                               gint end = TRUE;
+                               if (p[0] != '\0')
+                                       {
+                                       p[0] = '\0';
+                                       end = FALSE;
+                                       }
+                               if (!isdir(path))
+                                       {
+                                       if (debug) printf("creating sub dir:%s\n", path);
+                                       if (!mkdir_utf8(path, mode))
+                                               {
+                                               printf("create dir failed: %s\n", path);
+                                               return FALSE;
+                                               }
+                                       }
+                               if (!end) p[0] = '/';
+                               }
+                       }
+               }
+       return TRUE;
+}
+
+static void cache_path_parts(CacheType type,
+                            const gchar **cache_rc, const gchar **cache_local, const gchar **cache_ext)
+{
+       switch (type)
+               {
+               case CACHE_TYPE_THUMB:
+                       *cache_rc = GQVIEW_CACHE_RC_THUMB;
+                       *cache_local = GQVIEW_CACHE_LOCAL_THUMB;
+                       *cache_ext = GQVIEW_CACHE_EXT_THUMB;
+                       break;
+               case CACHE_TYPE_SIM:
+                       *cache_rc = GQVIEW_CACHE_RC_THUMB;
+                       *cache_local = GQVIEW_CACHE_LOCAL_THUMB;
+                       *cache_ext = GQVIEW_CACHE_EXT_SIM;
+                       break;
+               case CACHE_TYPE_METADATA:
+                       *cache_rc = GQVIEW_CACHE_RC_METADATA;
+                       *cache_local = GQVIEW_CACHE_LOCAL_METADATA;
+                       *cache_ext = GQVIEW_CACHE_EXT_METADATA;
+                       break;
+               }
+}
+
+gchar *cache_get_location(CacheType type, const gchar *source, gint include_name, mode_t *mode)
+{
+       gchar *path = NULL;
+       gchar *base;
+       gchar *name = NULL;
+       const gchar *cache_rc;
+       const gchar *cache_local;
+       const gchar *cache_ext;
+
+       if (!source) return NULL;
+
+       cache_path_parts(type, &cache_rc, &cache_local, &cache_ext);
+
+       base = remove_level_from_path(source);
+       if (include_name)
+               {
+               name = g_strconcat("/", filename_from_path(source), NULL);
+               }
+       else
+               {
+               cache_ext = NULL;
+               }
+
+       if (((type != CACHE_TYPE_METADATA && enable_thumb_dirs) ||
+            (type == CACHE_TYPE_METADATA && enable_metadata_dirs)) &&
+           access_file(base, W_OK))
+               {
+               path = g_strconcat(base, "/", cache_local, name, cache_ext, NULL);
+               if (mode) *mode = 0775;
+               }
+
+       if (!path)
+               {
+               path = g_strconcat(homedir(), "/", cache_rc, base, name, cache_ext, NULL);
+               if (mode) *mode = 0755;
+               }
+
+       g_free(base);
+       if (name) g_free(name);
+
+       return path;
+}
+
+gchar *cache_find_location(CacheType type, const gchar *source)
+{
+       gchar *path;
+       const gchar *name;
+       gchar *base;
+       const gchar *cache_rc;
+       const gchar *cache_local;
+       const gchar *cache_ext;
+       gint prefer_local;
+
+       if (!source) return NULL;
+
+       cache_path_parts(type, &cache_rc, &cache_local, &cache_ext);
+
+       name = filename_from_path(source);
+       base = remove_level_from_path(source);
+
+       if (type == CACHE_TYPE_METADATA)
+               {
+               prefer_local = enable_metadata_dirs;
+               }
+       else
+               {
+               prefer_local = enable_thumb_dirs;
+               }
+
+       if (prefer_local)
+               {
+               path = g_strconcat(base, "/", cache_local, "/", name, cache_ext, NULL);
+               }
+       else
+               {
+               path = g_strconcat(homedir(), "/", cache_rc, source, cache_ext, NULL);
+               }
+
+       if (!isfile(path))
+               {
+               g_free(path);
+
+               /* try the opposite method if not found */
+               if (!prefer_local)
+                       {
+                       path = g_strconcat(base, "/", cache_local, "/", name, cache_ext, NULL);
+                       }
+               else
+                       {
+                       path = g_strconcat(homedir(), "/", cache_rc, source, cache_ext, NULL);
+                       }
+
+               if (!isfile(path))
+                       {
+                       g_free(path);
+                       path = NULL;
+                       }
+               }
+
+       g_free(base);
+
+       return path;
+}
+
+gint cache_time_valid(const gchar *cache, const gchar *path)
+{
+       struct stat cache_st;
+       struct stat path_st;
+       gchar *cachel;
+       gchar *pathl;
+       gint ret = FALSE;
+
+       if (!cache || !path) return FALSE;
+
+       cachel = path_from_utf8(cache);
+       pathl = path_from_utf8(path);
+
+       if (stat(cachel, &cache_st) == 0 &&
+           stat(pathl, &path_st) == 0)
+               {
+               if (cache_st.st_mtime == path_st.st_mtime)
+                       {
+                       ret = TRUE;
+                       }
+               else if (cache_st.st_mtime > path_st.st_mtime)
+                       {
+                       struct utimbuf ut;
+
+                       ut.actime = ut.modtime = cache_st.st_mtime;
+                       if (utime(cachel, &ut) < 0 &&
+                           errno == EPERM)
+                               {
+                               if (debug) printf("cache permission workaround: %s\n", cachel);
+                               ret = TRUE;
+                               }
+                       }
+               }
+
+       g_free(pathl);
+       g_free(cachel);
+
+       return ret;
+}
+
diff --git a/src/cache.h b/src/cache.h
new file mode 100644 (file)
index 0000000..ce7afc0
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef CACHE_H
+#define CACHE_H
+
+
+#include "similar.h"
+
+
+#define GQVIEW_CACHE_RC_THUMB       GQVIEW_RC_DIR"/thumbnails"
+#define GQVIEW_CACHE_RC_METADATA    GQVIEW_RC_DIR"/metadata"
+
+#define GQVIEW_CACHE_LOCAL_THUMB    ".thumbnails"
+#define GQVIEW_CACHE_LOCAL_METADATA ".metadata"
+
+#define GQVIEW_CACHE_EXT_THUMB      ".png"
+#define GQVIEW_CACHE_EXT_SIM        ".sim"
+#define GQVIEW_CACHE_EXT_METADATA   ".meta"
+
+
+typedef enum {
+       CACHE_TYPE_THUMB,
+       CACHE_TYPE_SIM,
+       CACHE_TYPE_METADATA
+} CacheType;
+
+typedef struct _CacheData CacheData;
+struct _CacheData
+{
+       gchar *path;
+       gint width;
+       gint height;
+       long checksum;
+       guchar md5sum[16];
+       ImageSimilarityData *sim;
+
+       gint dimensions;
+       gint have_checksum;
+       gint have_md5sum;
+       gint similarity;
+};
+
+gint cache_time_valid(const gchar *cache, const gchar *path);
+
+
+CacheData *cache_sim_data_new(void);
+void cache_sim_data_free(CacheData *cd);
+
+gint cache_sim_data_save(CacheData *cd);
+CacheData *cache_sim_data_load(const gchar *path);
+
+void cache_sim_data_set_dimensions(CacheData *cd, gint w, gint h);
+void cache_sim_data_set_checksum(CacheData *cd, long checksum);
+void cache_sim_data_set_md5sum(CacheData *cd, guchar digest[16]);
+void cache_sim_data_set_similarity(CacheData *cd, ImageSimilarityData *sd);
+gint cache_sim_data_filled(ImageSimilarityData *sd);
+
+
+gint cache_ensure_dir_exists(gchar *path, mode_t mode);
+gchar *cache_get_location(CacheType type, const gchar *source, gint include_name, mode_t *mode);
+gchar *cache_find_location(CacheType type, const gchar *source);
+
+
+#endif
+
+
diff --git a/src/cache_maint.c b/src/cache_maint.c
new file mode 100644 (file)
index 0000000..9d4c481
--- /dev/null
@@ -0,0 +1,1241 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#include "gqview.h"
+#include "cache_maint.h"
+
+#include "cache.h"
+#include "filelist.h"
+#include "thumb.h"
+#include "thumb_standard.h"
+#include "ui_fileops.h"
+#include "ui_misc.h"
+#include "ui_spinner.h"
+#include "ui_tabcomp.h"
+#include "ui_utildlg.h"
+
+
+typedef struct _CMData CMData;
+struct _CMData
+{
+       GList *list;
+       GList *done_list;
+       gint idle_id;
+       GenericDialog *gd;
+       GtkWidget *entry;
+       GtkWidget *spinner;
+       GtkWidget *button_stop;
+       GtkWidget *button_close;
+       gint clear;
+       gint metadata;
+};
+
+#define PURGE_DIALOG_WIDTH 400
+
+
+/*
+ *-------------------------------------------------------------------
+ * cache maintenance
+ *-------------------------------------------------------------------
+ */
+
+static gint extension_truncate(gchar *path, const gchar *ext)
+{
+       gint l;
+       gint el;
+
+       if (!path || !ext) return FALSE;
+
+       l = strlen(path);
+       el = strlen(ext);
+
+       if (l < el || strcmp(path + (l - el), ext) != 0) return FALSE;
+
+       path[l - el] = '\0';
+
+       return TRUE;
+}
+
+static gchar *extension_find_dot(gchar *path)
+{
+       gchar *ptr;
+
+       if (!path || *path == '\0') return NULL;
+
+       ptr = path;
+       while (*ptr != '\0') ptr++;
+
+       while (ptr > path && *ptr != '.') ptr--;
+
+       if (ptr == path) return NULL;
+
+       return ptr;
+}
+
+static gint isempty(const gchar *path)
+{
+       DIR *dp;
+       struct dirent *dir;
+       gchar *pathl;
+
+       pathl = path_from_utf8(path);
+       dp = opendir(pathl);
+       g_free(pathl);
+       if (!dp) return FALSE;
+
+       while ((dir = readdir(dp)) != NULL)
+               {
+               gchar *name = dir->d_name;
+
+               if (dir->d_ino > 0 &&
+                   !(name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) )
+                       {
+                       closedir(dp);
+                       return FALSE;
+                       }
+               }
+
+       closedir(dp);
+       return TRUE;
+}
+
+static void cache_maintain_home_close(CMData *cm)
+{
+       if (cm->idle_id != -1) g_source_remove(cm->idle_id);
+       if (cm->gd) generic_dialog_close(cm->gd);
+       path_list_free(cm->list);
+       g_list_free(cm->done_list);
+       g_free(cm);
+}
+
+static void cache_maintain_home_stop(CMData *cm)
+{
+       if (cm->idle_id != -1)
+               {
+               g_source_remove(cm->idle_id);
+               cm->idle_id = -1;
+               }
+
+       gtk_entry_set_text(GTK_ENTRY(cm->entry), _("done"));
+       spinner_set_interval(cm->spinner, -1);
+
+       gtk_widget_set_sensitive(cm->button_stop, FALSE);
+       gtk_widget_set_sensitive(cm->button_close, TRUE);
+}
+
+static gint cache_maintain_home_cb(gpointer data)
+{
+       CMData *cm = data;
+       GList *dlist = NULL;
+       GList *list = NULL;
+       gchar *path;
+       gint just_done = FALSE;
+       gint still_have_a_file = TRUE;
+       gint base_length;
+       const gchar *cache_folder;
+
+       if (cm->metadata)
+               {
+               cache_folder = GQVIEW_CACHE_RC_METADATA;
+               }
+       else
+               {
+               cache_folder = GQVIEW_CACHE_RC_THUMB;
+               }
+
+       base_length = strlen(homedir()) + strlen("/") + strlen(cache_folder);
+
+       if (!cm->list)
+               {
+               if (debug) printf("purge chk done.\n");
+               cm->idle_id = -1;
+               cache_maintain_home_stop(cm);
+               return FALSE;
+               }
+
+       path = cm->list->data;
+
+       if (debug) printf("purge chk (%d) \"%s\"\n", (cm->clear && !cm->metadata), path);
+
+       if (g_list_find(cm->done_list, path) == NULL)
+               {
+               cm->done_list = g_list_prepend(cm->done_list, path);
+
+               if (path_list(path, &list, &dlist))
+                       {
+                       GList *work;
+
+                       just_done = TRUE;
+                       still_have_a_file = FALSE;
+       
+                       work = list;
+                       while (work)
+                               {
+                               gchar *path_buf = work->data;
+                               gchar *dot;
+       
+                               dot = extension_find_dot(path_buf);
+       
+                               if (dot) *dot = '\0';
+                               if ((!cm->metadata && cm->clear) ||
+                                   (strlen(path_buf) > base_length && !isfile(path_buf + base_length)) )
+                                       {
+                                       if (dot) *dot = '.';
+                                       if (!unlink_file(path_buf)) printf("failed to delete:%s\n", path_buf);
+                                       }
+                               else
+                                       {
+                                       still_have_a_file = TRUE;
+                                       }
+                               work = work->next;
+                               }
+                       }
+               }
+       path_list_free(list);
+
+       cm->list = g_list_concat(dlist, cm->list);
+
+       if (cm->list && g_list_find(cm->done_list, cm->list->data) != NULL)
+               {
+               /* check if the dir is empty */
+               
+               if (cm->list->data == path && just_done)
+                       {
+                       if (!still_have_a_file && !dlist && cm->list->next && !rmdir_utf8(path))
+                               {
+                               printf("Unable to delete dir: %s\n", path);
+                               }
+                       }
+               else
+                       {
+                       /* must re-check for an empty dir */
+                       if (isempty(path) && cm->list->next && !rmdir_utf8(path))
+                               {
+                               printf("Unable to delete dir: %s\n", path);
+                               }
+                       }
+
+               path = cm->list->data;
+               cm->done_list = g_list_remove(cm->done_list, path);
+               cm->list = g_list_remove(cm->list, path);
+               g_free(path);
+               }
+
+       if (cm->list)
+               {
+               const gchar *buf;
+
+               path = cm->list->data;
+               if (strlen(path) > base_length)
+                       {
+                       buf = path + base_length;
+                       }
+               else
+                       {
+                       buf = "...";
+                       }
+               gtk_entry_set_text(GTK_ENTRY(cm->entry), buf);
+               }
+
+       return TRUE;
+}
+
+static void cache_maintain_home_close_cb(GenericDialog *gd, gpointer data)
+{
+       CMData *cm = data;
+
+       if (!GTK_WIDGET_SENSITIVE(cm->button_close)) return;
+
+       cache_maintain_home_close(cm);
+}
+
+static void cache_maintain_home_stop_cb(GenericDialog *gd, gpointer data)
+{
+       CMData *cm = data;
+
+       cache_maintain_home_stop(cm);
+}
+
+/* sorry for complexity (cm->done_list), but need it to remove empty dirs */
+void cache_maintain_home(gint metadata, gint clear, GtkWidget *parent)
+{
+       CMData *cm;
+       GList *dlist = NULL;
+       gchar *base;
+       const gchar *msg;
+       const gchar *cache_folder;
+       GtkWidget *hbox;
+
+       if (metadata)
+               {
+               cache_folder = GQVIEW_CACHE_RC_METADATA;
+               }
+       else
+               {
+               cache_folder = GQVIEW_CACHE_RC_THUMB;
+               }
+
+       base = g_strconcat(homedir(), "/", cache_folder, NULL);
+
+       if (!path_list(base, NULL, &dlist))
+               {
+               g_free(base);
+               return;
+               }
+
+       dlist = g_list_append(dlist, base);
+
+       cm = g_new0(CMData, 1);
+       cm->list = dlist;
+       cm->done_list = NULL;
+       cm->clear = clear;
+       cm->metadata = metadata;
+
+       if (metadata)
+               {
+               msg = _("Removing old metadata...");
+               }
+       else if (clear)
+               {
+               msg = _("Clearing cached thumbnails...");
+               }
+       else
+               {
+               msg = _("Removing old thumbnails...");
+               }
+
+       cm->gd = generic_dialog_new(_("Maintenance"),
+                                   "GQview", "gqview_maintenance",
+                                   parent, FALSE,
+                                   NULL, cm);
+       cm->gd->cancel_cb = cache_maintain_home_close_cb;
+       cm->button_close = generic_dialog_add_button(cm->gd, GTK_STOCK_CLOSE, NULL,
+                                                    cache_maintain_home_close_cb, FALSE);
+       gtk_widget_set_sensitive(cm->button_close, FALSE);
+       cm->button_stop = generic_dialog_add_button(cm->gd, GTK_STOCK_STOP, NULL,
+                                                   cache_maintain_home_stop_cb, FALSE);
+
+       generic_dialog_add_message(cm->gd, NULL, msg, NULL);
+       gtk_window_set_default_size(GTK_WINDOW(cm->gd->dialog), PURGE_DIALOG_WIDTH, -1);
+
+       hbox = gtk_hbox_new(FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(cm->gd->vbox), hbox, FALSE, FALSE, 5);
+       gtk_widget_show(hbox);
+
+       cm->entry = gtk_entry_new();
+       GTK_WIDGET_UNSET_FLAGS(cm->entry, GTK_CAN_FOCUS);
+       gtk_editable_set_editable(GTK_EDITABLE(cm->entry), FALSE);
+       gtk_box_pack_start(GTK_BOX(hbox), cm->entry, TRUE, TRUE, 0);
+       gtk_widget_show(cm->entry);
+
+       cm->spinner = spinner_new(NULL, SPINNER_SPEED);
+       gtk_box_pack_start(GTK_BOX(hbox), cm->spinner, FALSE, FALSE, 0);
+       gtk_widget_show(cm->spinner);
+       
+       gtk_widget_show(cm->gd->dialog);
+
+       cm->idle_id = g_idle_add(cache_maintain_home_cb, cm);
+}
+
+/* This checks all files in ~/.gqview/thumbnails and
+ * removes them if thay have no source counterpart.
+ * (this assumes all cache files have an extension of 4 chars including '.')
+ */
+gint cache_maintain_home_dir(const gchar *dir, gint recursive, gint clear)
+{
+       gchar *base;
+       gint base_length;
+       GList *dlist = NULL;
+       GList *flist = NULL;
+       gint still_have_a_file = FALSE;
+
+       if (debug) printf("maintainance check: %s\n", dir);
+
+       base_length = strlen(homedir()) + strlen("/") + strlen(GQVIEW_CACHE_RC_THUMB);
+       base = g_strconcat(homedir(), "/", GQVIEW_CACHE_RC_THUMB, dir, NULL);
+
+       if (path_list(base, &flist, &dlist))
+               {
+               GList *work;
+
+               work = dlist;
+               while(work)
+                       {
+                       gchar *path = work->data;
+                       if (recursive && strlen(path) > base_length &&
+                           !cache_maintain_home_dir(path + base_length, recursive, clear))
+                               {
+                               if (debug) printf("Deleting thumb dir: %s\n", path);
+                               if (!rmdir_utf8(path))
+                                       {
+                                       printf("Unable to delete dir: %s\n", path);
+                                       }
+                               }
+                       else
+                               {
+                               still_have_a_file = TRUE;
+                               }
+                       work = work->next;
+                       }
+
+               work = flist;
+               while (work)
+                       {
+                       gchar *path = work->data;
+                       gchar *dot;
+
+                       dot = extension_find_dot(path);
+
+                       if (dot) *dot = '\0';
+                       if (clear ||
+                           (strlen(path) > base_length && !isfile(path + base_length)) )
+                               {
+                               if (dot) *dot = '.';
+                               if (!unlink_file(path)) printf("failed to delete:%s\n", path);
+                               }
+                       else
+                               {
+                               still_have_a_file = TRUE;
+                               }
+
+                       work = work->next;
+                       }
+               }
+
+       path_list_free(dlist);
+       path_list_free(flist);
+       g_free(base);
+
+       return still_have_a_file;
+}
+
+/* This checks relative caches in dir/.thumbnails and
+ * removes them if they have no source counterpart.
+ */
+gint cache_maintain_dir(const gchar *dir, gint recursive, gint clear)
+{
+       GList *list = NULL;
+       gchar *cachedir;
+       gint still_have_a_file = FALSE;
+       GList *work;
+
+       cachedir = g_strconcat(dir, "/", GQVIEW_CACHE_LOCAL_THUMB, NULL);
+
+       path_list(cachedir, &list, NULL);
+       work = list;
+
+       while (work)
+               {
+               const gchar *path;
+               gchar *source;
+
+               path = work->data;
+               work = work->next;
+
+               source = g_strconcat(dir, "/", filename_from_path(path), NULL);
+
+               if (clear ||
+                   extension_truncate(source, GQVIEW_CACHE_EXT_THUMB) ||
+                   extension_truncate(source, GQVIEW_CACHE_EXT_SIM))
+                       {
+                       if (!clear && isfile(source))
+                               {
+                               still_have_a_file = TRUE;
+                               }
+                       else
+                               {
+                               if (!unlink_file(path))
+                                       {
+                                       if (debug) printf("Failed to remove cache file %s\n", path);
+                                       still_have_a_file = TRUE;
+                                       }
+                               }
+                       }
+               else
+                       {
+                       still_have_a_file = TRUE;
+                       }
+               g_free(source);
+               }
+
+       path_list_free(list);
+       g_free(cachedir);
+
+       if (recursive)
+               {
+               list = NULL;
+
+               path_list(dir, NULL, &list);
+               work = list;
+               while (work)
+                       {
+                       const gchar *path = work->data;
+                       work = work->next;
+
+                       still_have_a_file |= cache_maintain_dir(path, recursive, clear);
+                       }
+
+               path_list_free(list);
+               }
+
+       return still_have_a_file;
+}
+
+static void cache_file_move(const gchar *src, const gchar *dest)
+{
+       if (!dest || !src || !isfile(src)) return;
+
+       if (!move_file(src, dest))
+               {
+               if (debug) printf("Failed to move cache file %s\nto %s\n", src, dest);
+               /* we remove it anyway - it's stale */
+               unlink_file(src);
+               }
+}
+
+void cache_maint_moved(const gchar *src, const gchar *dest)
+{
+       gchar *base;
+       mode_t mode = 0755;
+
+       if (!src || !dest) return;
+
+       base = cache_get_location(CACHE_TYPE_THUMB, dest, FALSE, &mode);
+       if (cache_ensure_dir_exists(base, mode))
+               {
+               gchar *buf;
+               gchar *d;
+
+               buf = cache_find_location(CACHE_TYPE_THUMB, src);
+               d = cache_get_location(CACHE_TYPE_THUMB, dest, TRUE, NULL);
+               cache_file_move(buf, d);
+               g_free(d);
+               g_free(buf);
+
+               buf = cache_find_location(CACHE_TYPE_SIM, src);
+               d = cache_get_location(CACHE_TYPE_SIM, dest, TRUE, NULL);
+               cache_file_move(buf, d);
+               g_free(d);
+               g_free(buf);
+               }
+       else
+               {
+               printf("Failed to create cache dir for move %s\n", base);
+               }
+       g_free(base);
+
+       base = cache_get_location(CACHE_TYPE_METADATA, dest, FALSE, &mode);
+       if (cache_ensure_dir_exists(base, mode))
+               {
+               gchar *buf;
+               gchar *d;
+                                                                                                                    
+               buf = cache_find_location(CACHE_TYPE_METADATA, src);
+               d = cache_get_location(CACHE_TYPE_METADATA, dest, TRUE, NULL);
+               cache_file_move(buf, d);
+               g_free(d);
+               g_free(buf);
+               }
+       g_free(base);
+
+       if (enable_thumb_caching && thumbnail_spec_standard) thumb_std_maint_moved(src, dest);
+}
+
+static void cache_file_remove(const gchar *path)
+{
+       if (path && isfile(path) && !unlink_file(path))
+               {
+               if (debug) printf("Failed to remove cache file %s\n", path);
+               }
+}
+
+void cache_maint_removed(const gchar *source)
+{
+       gchar *buf;
+
+       buf = cache_find_location(CACHE_TYPE_THUMB, source);
+       cache_file_remove(buf);
+       g_free(buf);
+
+       buf = cache_find_location(CACHE_TYPE_SIM, source);
+       cache_file_remove(buf);
+       g_free(buf);
+
+       buf = cache_find_location(CACHE_TYPE_METADATA, source);
+       cache_file_remove(buf);
+       g_free(buf);
+
+       if (enable_thumb_caching && thumbnail_spec_standard) thumb_std_maint_removed(source);
+}
+
+void cache_maint_copied(const gchar *src, const gchar *dest)
+{
+       gchar *dest_base;
+       gchar *src_cache;
+       mode_t mode = 0755;
+
+       src_cache = cache_find_location(CACHE_TYPE_METADATA, src);
+       if (!src_cache) return;
+
+       dest_base = cache_get_location(CACHE_TYPE_METADATA, dest, FALSE, &mode);
+       if (cache_ensure_dir_exists(dest_base, mode))
+               {
+               gchar *path;
+                                                                                                                    
+               path = cache_get_location(CACHE_TYPE_METADATA, dest, TRUE, NULL);
+               if (!copy_file(src_cache, path))
+                       {
+                       if (debug) printf("failed to copy metadata %s to %s\n", src_cache, path);
+                       }
+               g_free(path);
+               }
+
+       g_free(dest_base);
+       g_free(src_cache);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * new cache maintenance utilities
+ *-------------------------------------------------------------------
+ */
+
+typedef struct _CacheManager CacheManager;
+struct _CacheManager
+{
+       GenericDialog *dialog;
+       GtkWidget *folder_entry;
+       GtkWidget *progress;
+
+       GList *list_todo;
+
+       gint count_total;
+       gint count_done;
+};
+
+typedef struct _CleanData CleanData;
+struct _CleanData
+{
+       GenericDialog *gd;
+       ThumbLoaderStd *tl;
+
+       GList *list;
+       GList *list_dir;
+
+       gint days;
+       gint clear;
+
+       GtkWidget *button_close;
+       GtkWidget *button_stop;
+       GtkWidget *button_start;
+       GtkWidget *progress;
+       GtkWidget *spinner;
+
+       GtkWidget *group;
+       GtkWidget *entry;
+
+       gint count_total;
+       gint count_done;
+
+       gint local;
+       gint recurse;
+
+       gint idle_id;
+};
+
+static void cache_manager_render_reset(CleanData *cd)
+{
+       path_list_free(cd->list);
+       cd->list = NULL;
+
+       path_list_free(cd->list_dir);
+       cd->list_dir = NULL;
+
+       thumb_loader_free((ThumbLoader *)cd->tl);
+       cd->tl = NULL;
+}
+
+static void cache_manager_render_close_cb(GenericDialog *fd, gpointer data)
+{
+       CleanData *cd = data;
+
+       if (!GTK_WIDGET_SENSITIVE(cd->button_close)) return;
+
+       cache_manager_render_reset(cd);
+       generic_dialog_close(cd->gd);
+       g_free(cd);
+}
+
+static void cache_manager_render_finish(CleanData *cd)
+{
+       cache_manager_render_reset(cd);
+
+       gtk_entry_set_text(GTK_ENTRY(cd->progress), _("done"));
+       spinner_set_interval(cd->spinner, -1);
+
+       gtk_widget_set_sensitive(cd->group, TRUE);
+       gtk_widget_set_sensitive(cd->button_start, TRUE);
+       gtk_widget_set_sensitive(cd->button_stop, FALSE);
+       gtk_widget_set_sensitive(cd->button_close, TRUE);
+}
+
+static void cache_manager_render_stop_cb(GenericDialog *fd, gpointer data)
+{
+       CleanData *cd = data;
+
+       cache_manager_render_finish(cd);
+}
+
+static void cache_manager_render_folder(CleanData *cd, const gchar *path)
+{
+       GList *list_d = NULL;
+       GList *list_f = NULL;
+
+       if (cd->recurse)
+               {
+               path_list(path, &list_f, &list_d);
+               }
+       else
+               {
+               path_list(path, &list_f, NULL);
+               }
+
+       list_f = path_list_filter(list_f, FALSE);
+       list_d = path_list_filter(list_d, TRUE);
+
+       cd->list = g_list_concat(list_f, cd->list);
+       cd->list_dir = g_list_concat(list_d, cd->list_dir);
+}
+
+static gint cache_manager_render_file(CleanData *cd);
+
+static void cache_manager_render_thumb_done_cb(ThumbLoader *tl, gpointer data)
+{
+       CleanData *cd = data;
+
+       thumb_loader_free((ThumbLoader *)cd->tl);
+       cd->tl = NULL;
+
+       while (cache_manager_render_file(cd));
+}
+
+static gint cache_manager_render_file(CleanData *cd)
+{
+       if (cd->list)
+               {
+               gchar *path;
+               gint success;
+
+               path = cd->list->data;
+               cd->list = g_list_remove(cd->list, path);
+
+               cd->tl = (ThumbLoaderStd *)thumb_loader_new(thumb_max_width, thumb_max_height);
+               thumb_loader_set_callbacks((ThumbLoader *)cd->tl,
+                                          cache_manager_render_thumb_done_cb,
+                                          cache_manager_render_thumb_done_cb,
+                                          NULL, cd);
+               thumb_loader_set_cache((ThumbLoader *)cd->tl, TRUE, cd->local, TRUE);
+               success = thumb_loader_start((ThumbLoader *)cd->tl, path);
+               if (success)
+                       {
+                       gtk_entry_set_text(GTK_ENTRY(cd->progress), path);
+                       }
+               else
+                       {
+                       thumb_loader_free((ThumbLoader *)cd->tl);
+                       cd->tl = NULL;
+                       }
+
+               g_free(path);
+
+               return (!success);
+               }
+       else if (cd->list_dir)
+               {
+               gchar *path;
+
+               path = cd->list_dir->data;
+               cd->list_dir = g_list_remove(cd->list_dir, path);
+
+               cache_manager_render_folder(cd, path);
+
+               g_free(path);
+
+               return TRUE;
+               }
+
+       cache_manager_render_finish(cd);
+
+       return FALSE;
+}
+
+static void cache_manager_render_start_cb(GenericDialog *fd, gpointer data)
+{
+       CleanData *cd = data;
+       gchar *path;
+
+       if (cd->list || !GTK_WIDGET_SENSITIVE(cd->button_start)) return;
+
+       path = remove_trailing_slash((gtk_entry_get_text(GTK_ENTRY(cd->entry))));
+       parse_out_relatives(path);
+
+       if (!isdir(path))
+               {
+               warning_dialog(_("Invalid folder"),
+                               _("The specified folder can not be found."),
+                              GTK_STOCK_DIALOG_WARNING, cd->gd->dialog);
+               }
+       else
+               {
+               gtk_widget_set_sensitive(cd->group, FALSE);
+               gtk_widget_set_sensitive(cd->button_start, FALSE);
+               gtk_widget_set_sensitive(cd->button_stop, TRUE);
+               gtk_widget_set_sensitive(cd->button_close, FALSE);
+
+               spinner_set_interval(cd->spinner, SPINNER_SPEED);
+
+               cache_manager_render_folder(cd, path);
+               while (cache_manager_render_file(cd));
+               }
+
+       g_free(path);
+}
+
+static void cache_manager_render_dialog(GtkWidget *widget, const gchar *path)
+{
+       CleanData *cd;
+       GtkWidget *hbox;
+       GtkWidget *label;
+       GtkWidget *button;
+
+       cd = g_new0(CleanData, 1);
+
+       cd->gd = generic_dialog_new(_("Create thumbnails"),
+                                   "GQview", "create_thumbnails",
+                                   widget, FALSE,
+                                   NULL, cd);
+       gtk_window_set_default_size(GTK_WINDOW(cd->gd->dialog), PURGE_DIALOG_WIDTH, -1);
+       cd->gd->cancel_cb = cache_manager_render_close_cb;
+       cd->button_close = generic_dialog_add_button(cd->gd, GTK_STOCK_CLOSE, NULL,
+                                                    cache_manager_render_close_cb, FALSE);
+       cd->button_start = generic_dialog_add_button(cd->gd, GTK_STOCK_OK, _("S_tart"),
+                                                    cache_manager_render_start_cb, FALSE);
+       cd->button_stop = generic_dialog_add_button(cd->gd, GTK_STOCK_STOP, NULL,
+                                                   cache_manager_render_stop_cb, FALSE);
+       gtk_widget_set_sensitive(cd->button_stop, FALSE);
+
+       generic_dialog_add_message(cd->gd, NULL, _("Create thumbnails"), NULL);
+
+       hbox = pref_box_new(cd->gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, 0);
+       pref_spacer(hbox, PREF_PAD_INDENT);
+       cd->group = pref_box_new(hbox, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
+
+       hbox = pref_box_new(cd->group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+       pref_label_new(hbox, _("Folder:"));
+
+       label = tab_completion_new(&cd->entry, path, NULL, NULL);
+       tab_completion_add_select_button(cd->entry,_("Select folder") , TRUE);
+       gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
+       gtk_widget_show(label);
+
+       pref_checkbox_new_int(cd->group, _("Include subfolders"), FALSE, &cd->recurse);
+       button = pref_checkbox_new_int(cd->group, _("Store thumbnails local to source images"), FALSE, &cd->local);
+       gtk_widget_set_sensitive(button, thumbnail_spec_standard);
+
+       pref_line(cd->gd->vbox, PREF_PAD_SPACE);
+       hbox = pref_box_new(cd->gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+
+       cd->progress = gtk_entry_new();
+       GTK_WIDGET_UNSET_FLAGS(cd->progress, GTK_CAN_FOCUS);
+       gtk_editable_set_editable(GTK_EDITABLE(cd->progress), FALSE);
+       gtk_entry_set_text(GTK_ENTRY(cd->progress), _("click start to begin"));
+       gtk_box_pack_start(GTK_BOX(hbox), cd->progress, TRUE, TRUE, 0);
+       gtk_widget_show(cd->progress);
+
+       cd->spinner = spinner_new(NULL, -1);
+       gtk_box_pack_start(GTK_BOX(hbox), cd->spinner, FALSE, FALSE, 0);
+       gtk_widget_show(cd->spinner);
+
+       cd->list = NULL;
+
+       gtk_widget_show(cd->gd->dialog);
+}
+
+
+
+
+static void cache_manager_standard_clean_close_cb(GenericDialog *gd, gpointer data)
+{
+       CleanData *cd = data;
+
+       if (!GTK_WIDGET_SENSITIVE(cd->button_close)) return;
+
+       generic_dialog_close(cd->gd);
+
+       thumb_loader_std_thumb_file_validate_cancel(cd->tl);
+       path_list_free(cd->list);
+       g_free(cd);
+}
+
+static void cache_manager_standard_clean_done(CleanData *cd)
+{
+       gtk_widget_set_sensitive(cd->button_stop, FALSE);
+       gtk_widget_set_sensitive(cd->button_close, TRUE);
+
+       gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress), 1.0);
+       gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("done"));
+
+       if (cd->idle_id != -1)
+               {
+               g_source_remove(cd->idle_id);
+               cd->idle_id = -1;
+               }
+
+       thumb_loader_std_thumb_file_validate_cancel(cd->tl);
+       cd->tl = NULL;
+
+       path_list_free(cd->list);
+       cd->list = NULL;
+}
+
+static void cache_manager_standard_clean_stop_cb(GenericDialog *gd, gpointer data)
+{
+       CleanData *cd = data;
+
+       cache_manager_standard_clean_done(cd);
+}
+
+static gint cache_manager_standard_clean_clear_cb(gpointer data)
+{
+       CleanData *cd = data;
+
+       if (cd->list)
+               {
+               gchar *next_path;
+
+               next_path = cd->list->data;
+               cd->list = g_list_remove(cd->list, next_path);
+
+               if (debug) printf("thumb removed: %s\n", next_path);
+
+               unlink_file(next_path);
+               g_free(next_path);
+
+               cd->count_done++;
+               if (cd->count_total != 0)
+                       {
+                       gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress),
+                                                     (gdouble)cd->count_done / cd->count_total);
+                       }
+
+               return TRUE;
+               }
+
+       cd->idle_id = -1;
+       cache_manager_standard_clean_done(cd);
+       return FALSE;
+}
+
+static void cache_manager_standard_clean_valid_cb(const gchar *path, gint valid, gpointer data)
+{
+       CleanData *cd = data;
+
+       if (path)
+               {
+               if (!valid)
+                       {
+                       if (debug) printf("thumb cleaned: %s\n", path);
+                       unlink_file(path);
+                       }
+
+               cd->count_done++;
+               if (cd->count_total != 0)
+                       {
+                       gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(cd->progress),
+                                                     (gdouble)cd->count_done / cd->count_total);
+                       }
+               }
+
+       cd->tl = NULL;
+       if (cd->list)
+               {
+               gchar *next_path;
+
+               next_path = cd->list->data;
+               cd->list = g_list_remove(cd->list, next_path);
+       
+               cd->tl = thumb_loader_std_thumb_file_validate(next_path, cd->days,
+                                                             cache_manager_standard_clean_valid_cb, cd);
+               g_free(next_path);
+               }
+       else
+               {
+               cache_manager_standard_clean_done(cd);
+               }
+}
+
+static void cache_manager_standard_clean_start_cb(GenericDialog *gd, gpointer data)
+{
+       CleanData *cd = data;
+       GList *list;
+       gchar *path;
+
+       if (cd->list || !GTK_WIDGET_SENSITIVE(cd->button_start)) return;
+
+       gtk_widget_set_sensitive(cd->button_start, FALSE);
+       gtk_widget_set_sensitive(cd->button_stop, TRUE);
+       gtk_widget_set_sensitive(cd->button_close, FALSE);
+
+       gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("running..."));
+
+       path = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", THUMB_FOLDER_NORMAL, NULL);
+       list = NULL;
+       path_list(path, &list, NULL);
+       cd->list = list;
+       g_free(path);
+
+       path = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", THUMB_FOLDER_LARGE, NULL);
+       list = NULL;
+       path_list(path, &list, NULL);
+       cd->list = g_list_concat(cd->list, list);
+       g_free(path);
+
+       path = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", THUMB_FOLDER_FAIL, NULL);
+       list = NULL;
+       path_list(path, &list, NULL);
+       cd->list = g_list_concat(cd->list, list);
+       g_free(path);
+
+       cd->count_total = g_list_length(cd->list);
+       cd->count_done = 0;
+
+       /* start iterating */
+       if (cd->clear)
+               {
+               cd->idle_id = g_idle_add(cache_manager_standard_clean_clear_cb, cd);
+               }
+       else
+               {
+               cache_manager_standard_clean_valid_cb(NULL, TRUE, cd);
+               }
+}
+
+static void cache_manager_standard_process(GtkWidget *widget, gint clear)
+{
+       CleanData *cd;
+       const gchar *stock_id;
+       const gchar *msg;
+
+       cd = g_new0(CleanData, 1);
+       cd->clear = clear;
+
+       if (clear)
+               {
+               stock_id = GTK_STOCK_DELETE;
+               msg = _("Clearing thumbnails...");
+               }
+       else
+               {
+               stock_id = GTK_STOCK_CLEAR;
+               msg = _("Removing old thumbnails...");
+               }
+
+       cd->gd = generic_dialog_new(_("Maintenance"),
+                                   "GQview", "standard_maintenance",
+                                   widget, FALSE,
+                                   NULL, cd);
+       cd->gd->cancel_cb = cache_manager_standard_clean_close_cb;
+       cd->button_close = generic_dialog_add_button(cd->gd, GTK_STOCK_CLOSE, NULL,
+                                                    cache_manager_standard_clean_close_cb, FALSE);
+       cd->button_start = generic_dialog_add_button(cd->gd, GTK_STOCK_OK, _("S_tart"),
+                                                    cache_manager_standard_clean_start_cb, FALSE);
+       cd->button_stop = generic_dialog_add_button(cd->gd, GTK_STOCK_STOP, NULL,
+                                                   cache_manager_standard_clean_stop_cb, FALSE);
+       gtk_widget_set_sensitive(cd->button_stop, FALSE);
+
+       generic_dialog_add_message(cd->gd, stock_id, msg, NULL);
+
+       cd->progress = gtk_progress_bar_new();
+       gtk_progress_bar_set_text(GTK_PROGRESS_BAR(cd->progress), _("click start to begin"));
+       gtk_box_pack_start(GTK_BOX(cd->gd->vbox), cd->progress, FALSE, FALSE, 0);
+       gtk_widget_show(cd->progress);
+
+       cd->days = 30;
+       cd->tl = NULL;
+       cd->idle_id = -1;
+
+       gtk_widget_show(cd->gd->dialog);
+}
+
+static void cache_manager_standard_clean_cb(GtkWidget *widget, gpointer data)
+{
+       cache_manager_standard_process(widget, FALSE);
+}
+
+static void cache_manager_standard_clear_cb(GtkWidget *widget, gpointer data)
+{
+       cache_manager_standard_process(widget, TRUE);
+}
+
+
+static void cache_manager_gqview_clean_cb(GtkWidget *widget, gpointer data)
+{
+       cache_maintain_home(FALSE, FALSE, widget);
+}
+
+
+static void dummy_cancel_cb(GenericDialog *gd, gpointer data)
+{
+       /* no op, only so cancel button appears */
+}
+
+static void cache_manager_gqview_clear_ok_cb(GenericDialog *gd, gpointer data)
+{
+       cache_maintain_home(FALSE, TRUE, NULL);
+}
+
+void cache_manager_gqview_clear_confirm(GtkWidget *parent)
+{
+       GenericDialog *gd;
+
+       gd = generic_dialog_new(_("Clear cache"),
+                               "GQview", "clear_cache", parent, TRUE,
+                               dummy_cancel_cb, NULL);
+       generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Clear cache"),
+                                  _("This will remove all thumbnails that have\nbeen saved to disk, continue?"));
+       generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, cache_manager_gqview_clear_ok_cb, TRUE);
+
+       gtk_widget_show(gd->dialog);
+}
+
+static void cache_manager_gqview_clear_cb(GtkWidget *widget, gpointer data)
+{
+       cache_manager_gqview_clear_confirm(widget);
+}
+
+static void cache_manager_render_cb(GtkWidget *widget, gpointer data)
+{
+       cache_manager_render_dialog(widget, homedir());
+}
+
+static void cache_manager_metadata_clean_cb(GtkWidget *widget, gpointer data)
+{
+       cache_maintain_home(TRUE, FALSE, widget);
+}
+
+
+static CacheManager *cache_manager = NULL;
+
+static void cache_manager_close_cb(GenericDialog *gd, gpointer data)
+{
+       generic_dialog_close(gd);
+
+       g_free(cache_manager);
+       cache_manager = NULL;
+}
+
+void cache_manager_show(void)
+{
+       GenericDialog *gd;
+       GtkWidget *group;
+       GtkWidget *button;
+       GtkWidget *label;
+       GtkWidget *table;
+       GtkSizeGroup *sizegroup;
+       gchar *buf;
+
+       if (cache_manager)
+               {
+               gtk_window_present(GTK_WINDOW(cache_manager->dialog->dialog));
+               return;
+               }
+
+       cache_manager = g_new0(CacheManager, 1);
+
+       cache_manager->dialog = generic_dialog_new(_("Cache Maintenance - GQview"),
+                                                  "GQiew", "cache_manager",
+                                                  NULL, FALSE,
+                                                  NULL, cache_manager);
+       gd = cache_manager->dialog;
+
+       gd->cancel_cb = cache_manager_close_cb;
+       generic_dialog_add_button(gd, GTK_STOCK_CLOSE, NULL,
+                                 cache_manager_close_cb, FALSE);
+
+       generic_dialog_add_message(gd, NULL, _("Cache and Data Maintenance"), NULL);
+
+       sizegroup = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+
+       group = pref_group_new(gd->vbox, FALSE, _("GQview thumbnail cache"), GTK_ORIENTATION_VERTICAL);
+
+       buf = g_strconcat(_("Location:"), " ", homedir(), "/", GQVIEW_CACHE_RC_THUMB, NULL);
+       label = pref_label_new(group, buf);
+       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+       g_free(buf);
+
+       table = pref_table_new(group, 2, 2, FALSE, FALSE);
+
+       button = pref_table_button(table, 0, 0, GTK_STOCK_CLEAR, _("Clean up"), FALSE,
+                                  G_CALLBACK(cache_manager_gqview_clean_cb), cache_manager);
+       gtk_size_group_add_widget(sizegroup, button);
+       pref_table_label(table, 1, 0, _("Remove orphaned or outdated thumbnails."), 0.0);
+
+       button = pref_table_button(table, 0, 1, GTK_STOCK_DELETE, _("Clear cache"), FALSE,
+                                  G_CALLBACK(cache_manager_gqview_clear_cb), cache_manager);
+       gtk_size_group_add_widget(sizegroup, button);
+       pref_table_label(table, 1, 1, _("Delete all cached thumbnails."), 0.0);
+
+
+       group = pref_group_new(gd->vbox, FALSE, _("Shared thumbnail cache"), GTK_ORIENTATION_VERTICAL);
+
+       buf = g_strconcat(_("Location:"), " ", homedir(), "/", THUMB_FOLDER, NULL);
+       label = pref_label_new(group, buf);
+       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+       g_free(buf);
+
+       table = pref_table_new(group, 2, 2, FALSE, FALSE);
+
+       button = pref_table_button(table, 0, 0, GTK_STOCK_CLEAR, _("Clean up"), FALSE,
+                                  G_CALLBACK(cache_manager_standard_clean_cb), cache_manager);
+       gtk_size_group_add_widget(sizegroup, button);
+       pref_table_label(table, 1, 0, _("Remove orphaned or outdated thumbnails."), 0.0);
+
+       button = pref_table_button(table, 0, 1, GTK_STOCK_DELETE, _("Clear cache"), FALSE,
+                                  G_CALLBACK(cache_manager_standard_clear_cb), cache_manager);
+       gtk_size_group_add_widget(sizegroup, button);
+       pref_table_label(table, 1, 1, _("Delete all cached thumbnails."), 0.0);
+
+       group = pref_group_new(gd->vbox, FALSE, _("Create thumbnails"), GTK_ORIENTATION_VERTICAL);
+
+       table = pref_table_new(group, 2, 1, FALSE, FALSE);
+
+       button = pref_table_button(table, 0, 1, GTK_STOCK_EXECUTE, _("Render"), FALSE,
+                                  G_CALLBACK(cache_manager_render_cb), cache_manager);
+       gtk_size_group_add_widget(sizegroup, button);
+       pref_table_label(table, 1, 1, _("Render thumbnails for a specific folder."), 0.0);
+
+       group = pref_group_new(gd->vbox, FALSE, _("Metadata"), GTK_ORIENTATION_VERTICAL);
+       
+       buf = g_strconcat(_("Location:"), " ", homedir(), "/", GQVIEW_CACHE_RC_METADATA, NULL);
+       label = pref_label_new(group, buf);
+       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+       g_free(buf);
+
+       table = pref_table_new(group, 2, 1, FALSE, FALSE);
+
+       button = pref_table_button(table, 0, 0, GTK_STOCK_CLEAR, _("Clean up"), FALSE,
+                                  G_CALLBACK(cache_manager_metadata_clean_cb), cache_manager);
+       gtk_size_group_add_widget(sizegroup, button);
+       pref_table_label(table, 1, 0, _("Remove orphaned keywords and comments."), 0.0);
+
+       gtk_widget_show(cache_manager->dialog->dialog);
+}
+
diff --git a/src/cache_maint.h b/src/cache_maint.h
new file mode 100644 (file)
index 0000000..749b7c0
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef CACHE_MAINT_H
+#define CACHE_MAINT_H
+
+
+void cache_maintain_home(gint metadata, gint clear, GtkWidget *parent);
+
+gint cache_maintain_home_dir(const gchar *dir, gint recursive, gint clear);
+gint cache_maintain_dir(const gchar *dir, gint recursive, gint clear);
+
+void cache_maint_moved(const gchar *src, const gchar *dest);
+void cache_maint_removed(const gchar *source);
+void cache_maint_copied(const gchar *src, const gchar *dest);
+
+
+void cache_manager_gqview_clear_confirm(GtkWidget *parent);
+void cache_manager_show(void);
+
+
+#endif
+
+
diff --git a/src/cellrenderericon.c b/src/cellrenderericon.c
new file mode 100644 (file)
index 0000000..14f12f1
--- /dev/null
@@ -0,0 +1,643 @@
+/* cellrenderericon.c, based on:
+ *
+ * gtkcellrendererpixbuf.c
+ * Copyright (C) 2000  Red Hat, Inc.,  Jonathan Blandford <jrb@redhat.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <stdlib.h>
+#include "cellrenderericon.h"
+#include "intl.h"
+
+
+#define FIXED_ICON_SIZE_MAX 512
+
+static void gqv_cell_renderer_icon_get_property(GObject                *object,
+                                               guint           param_id,
+                                               GValue          *value,
+                                               GParamSpec      *pspec);
+static void gqv_cell_renderer_icon_set_property(GObject                *object,
+                                               guint           param_id,
+                                               const GValue    *value,
+                                               GParamSpec      *pspec);
+static void gqv_cell_renderer_icon_init(GQvCellRendererIcon *celltext);
+static void gqv_cell_renderer_icon_class_init(GQvCellRendererIconClass *class);
+static void gqv_cell_renderer_icon_finalize(GObject *object);
+static void gqv_cell_renderer_icon_get_size(GtkCellRenderer    *cell,
+                                           GtkWidget           *widget,
+                                           GdkRectangle        *rectangle,
+                                           gint                *x_offset,
+                                           gint                *y_offset,
+                                           gint                *width,
+                                           gint                *height);
+static void gqv_cell_renderer_icon_render(GtkCellRenderer      *cell,
+                                          GdkWindow            *window,
+                                          GtkWidget            *widget,
+                                          GdkRectangle         *background_area,
+                                          GdkRectangle         *cell_area,
+                                          GdkRectangle         *expose_area,
+                                          GtkCellRendererState flags);
+
+
+enum {
+       PROP_ZERO,
+       PROP_PIXBUF,
+       PROP_TEXT,
+       PROP_BACKGROUND_GDK,
+       PROP_FOREGROUND_GDK,
+       PROP_FOCUSED,
+       PROP_FIXED_WIDTH,
+       PROP_FIXED_HEIGHT,
+
+       PROP_BACKGROUND_SET,
+       PROP_FOREGROUND_SET,
+       PROP_SHOW_TEXT
+};
+
+static gpointer parent_class;
+
+GType
+gqv_cell_renderer_icon_get_type (void)
+{
+       static GType cell_icon_type = 0;
+
+       if (!cell_icon_type)
+               {
+               static const GTypeInfo cell_icon_info =
+                       {
+                       sizeof (GQvCellRendererIconClass),
+                       NULL,           /* base_init */
+                       NULL,           /* base_finalize */
+                       (GClassInitFunc) gqv_cell_renderer_icon_class_init,
+                       NULL,           /* class_finalize */
+                       NULL,           /* class_data */
+                       sizeof (GQvCellRendererIcon),
+                       0,              /* n_preallocs */
+               (GInstanceInitFunc) gqv_cell_renderer_icon_init,
+               };
+
+       cell_icon_type = g_type_register_static(GTK_TYPE_CELL_RENDERER,
+                                               "GQvCellRendererIcon",
+                                               &cell_icon_info, 0);
+       }
+
+       return cell_icon_type;
+}
+
+static void
+gqv_cell_renderer_icon_init (GQvCellRendererIcon *cellicon)
+{
+       GTK_CELL_RENDERER(cellicon)->xpad = 2;
+       GTK_CELL_RENDERER(cellicon)->ypad = 2;
+}
+
+static void
+gqv_cell_renderer_icon_class_init (GQvCellRendererIconClass *class)
+{
+       GObjectClass *object_class = G_OBJECT_CLASS (class);
+       GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (class);
+
+       parent_class = g_type_class_peek_parent (class);
+
+       object_class->finalize = gqv_cell_renderer_icon_finalize;
+
+       object_class->get_property = gqv_cell_renderer_icon_get_property;
+       object_class->set_property = gqv_cell_renderer_icon_set_property;
+
+       cell_class->get_size = gqv_cell_renderer_icon_get_size;
+       cell_class->render = gqv_cell_renderer_icon_render;
+
+       g_object_class_install_property(object_class,
+                                       PROP_PIXBUF,
+                                       g_param_spec_object("pixbuf",
+                                                       _("Pixbuf Object"),
+                                                       _("The pixbuf to render"),
+                                                       GDK_TYPE_PIXBUF,
+                                                       G_PARAM_READWRITE));
+
+       g_object_class_install_property(object_class,
+                                       PROP_TEXT,
+                                       g_param_spec_string("text",
+                                                       _("Text"),
+                                                       _("Text to render"),
+                                                       NULL,
+                                                       G_PARAM_READWRITE));
+
+       g_object_class_install_property(object_class,
+                                       PROP_BACKGROUND_GDK,
+                                       g_param_spec_boxed("background_gdk",
+                                                       _("Background color"),
+                                                       _("Background color as a GdkColor"),
+                                                       GDK_TYPE_COLOR,
+                                                       G_PARAM_READWRITE));
+
+       g_object_class_install_property(object_class,
+                                       PROP_FOREGROUND_GDK,
+                                       g_param_spec_boxed("foreground_gdk",
+                                                       _("Foreground color"),
+                                                       _("Foreground color as a GdkColor"),
+                                                       GDK_TYPE_COLOR,
+                                                       G_PARAM_READWRITE));
+
+       g_object_class_install_property(object_class,
+                                       PROP_FOCUSED,
+                                       g_param_spec_boolean ("has_focus",
+                                                       _("Focus"),
+                                                       _("Draw focus indicator"),
+                                                       FALSE,
+                                                       G_PARAM_READWRITE));
+
+       g_object_class_install_property(object_class,
+                                       PROP_FIXED_WIDTH,
+                                       g_param_spec_int("fixed_width",
+                                                       _("Fixed width"),
+                                                       _("Width of cell"),
+                                                       -1, FIXED_ICON_SIZE_MAX,
+                                                       -1,
+                                                       G_PARAM_READWRITE));
+
+       g_object_class_install_property(object_class,
+                                       PROP_FIXED_HEIGHT,
+                                       g_param_spec_int("fixed_height",
+                                                       _("Fixed height"),
+                                                       _("Height of icon excluding text"),
+                                                       -1, FIXED_ICON_SIZE_MAX,
+                                                       -1,
+                                                       G_PARAM_READWRITE));
+
+       g_object_class_install_property(object_class,
+                                       PROP_BACKGROUND_SET,
+                                       g_param_spec_boolean("background_set",
+                                                       _("Background set"),
+                                                       _("Whether this tag affects the background color"),
+                                                       FALSE,
+                                                       G_PARAM_READWRITE));
+
+       g_object_class_install_property(object_class,
+                                       PROP_FOREGROUND_SET,
+                                       g_param_spec_boolean ("foreground_set",
+                                                       _("Foreground set"),
+                                                       _("Whether this tag affects the foreground color"),
+                                                       FALSE,
+                                                       G_PARAM_READWRITE));
+
+       g_object_class_install_property(object_class,
+                                       PROP_SHOW_TEXT,
+                                       g_param_spec_boolean("show_text",
+                                                       _("Show text"),
+                                                       _("Whether the text is displayed"),
+                                                       TRUE,
+                                                       G_PARAM_READWRITE));
+}
+
+static void
+gqv_cell_renderer_icon_finalize (GObject *object)
+{
+       GQvCellRendererIcon *cellicon = GQV_CELL_RENDERER_ICON (object);
+
+       if (cellicon->pixbuf) g_object_unref (cellicon->pixbuf);
+
+       g_free(cellicon->text);
+
+       (* G_OBJECT_CLASS (parent_class)->finalize) (object);
+}
+
+static void
+gqv_cell_renderer_icon_get_property(GObject    *object,
+                                   guint       param_id,
+                                   GValue      *value,
+                                   GParamSpec  *pspec)
+{
+       GQvCellRendererIcon *cellicon = GQV_CELL_RENDERER_ICON (object);
+  
+       switch (param_id)
+               {
+               case PROP_PIXBUF:
+               g_value_set_object(value,
+                                  cellicon->pixbuf ? G_OBJECT (cellicon->pixbuf) : NULL);
+               break;
+       case PROP_TEXT:
+               g_value_set_string (value, cellicon->text);
+               break;
+       case PROP_BACKGROUND_GDK:
+               {
+               GdkColor color;
+
+               color.red = cellicon->background.red;
+               color.green = cellicon->background.green;
+               color.blue = cellicon->background.blue;
+
+               g_value_set_boxed (value, &color);
+               }
+               break;
+       case PROP_FOREGROUND_GDK:
+               {
+               GdkColor color;
+
+               color.red = cellicon->foreground.red;
+               color.green = cellicon->foreground.green;
+               color.blue = cellicon->foreground.blue;
+
+               g_value_set_boxed (value, &color);
+               }
+               break;
+       case PROP_FOCUSED:
+               g_value_set_boolean (value, cellicon->focused);
+               break;
+       case PROP_FIXED_WIDTH:
+               g_value_set_int(value, cellicon->fixed_width);
+               break;
+       case PROP_FIXED_HEIGHT:
+               g_value_set_int(value, cellicon->fixed_height);
+               break;
+       case PROP_BACKGROUND_SET:
+               g_value_set_boolean(value, cellicon->background_set);
+               break;
+       case PROP_FOREGROUND_SET:
+               g_value_set_boolean(value, cellicon->foreground_set);
+               break;
+       case PROP_SHOW_TEXT:
+               g_value_set_boolean(value, cellicon->show_text);
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+               break;
+       }
+}
+
+static void
+set_bg_color (GQvCellRendererIcon *cellicon,
+             GdkColor            *color)
+{
+       if (color)
+               {
+               if (!cellicon->background_set)
+                       {
+                       cellicon->background_set = TRUE;
+                       g_object_notify(G_OBJECT(cellicon), "background_set");
+                       }
+
+               cellicon->background.red = color->red;
+               cellicon->background.green = color->green;
+               cellicon->background.blue = color->blue;
+               }
+       else
+               {
+               if (cellicon->background_set)
+                       {
+                       cellicon->background_set = FALSE;
+                       g_object_notify(G_OBJECT(cellicon), "background_set");
+                       }
+               }
+}
+
+static void set_fg_color (GQvCellRendererIcon *cellicon,
+                         GdkColor            *color)
+{
+       if (color)
+               {
+               if (!cellicon->foreground_set)
+                       {
+                       cellicon->foreground_set = TRUE;
+                       g_object_notify(G_OBJECT(cellicon), "foreground_set");
+                       }
+
+               cellicon->foreground.red = color->red;
+               cellicon->foreground.green = color->green;
+               cellicon->foreground.blue = color->blue;
+               }
+       else
+               {
+               if (cellicon->foreground_set)
+                       {
+                       cellicon->foreground_set = FALSE;
+                       g_object_notify(G_OBJECT(cellicon), "foreground_set");
+                       }
+               }
+}
+
+static void
+gqv_cell_renderer_icon_set_property(GObject            *object,
+                                   guint               param_id,
+                                   const GValue        *value,
+                                   GParamSpec          *pspec)
+{
+       GQvCellRendererIcon *cellicon = GQV_CELL_RENDERER_ICON (object);
+  
+       switch (param_id)
+               {
+               case PROP_PIXBUF:
+                       {
+                       GdkPixbuf *pixbuf;
+
+                       pixbuf = (GdkPixbuf*) g_value_get_object (value);
+                       if (pixbuf) g_object_ref (pixbuf);
+                       if (cellicon->pixbuf) g_object_unref (cellicon->pixbuf);
+                       cellicon->pixbuf = pixbuf;
+                       }
+               break;
+       case PROP_TEXT:
+               {
+               gchar *text;
+
+               text = cellicon->text;
+               cellicon->text = g_strdup(g_value_get_string(value));
+               g_free(text);
+
+               g_object_notify(object, "text");
+               }
+               break;
+       case PROP_BACKGROUND_GDK:
+               set_bg_color(cellicon, g_value_get_boxed(value));
+               break;
+       case PROP_FOREGROUND_GDK:
+               set_fg_color(cellicon, g_value_get_boxed(value));
+               break;
+       case PROP_FOCUSED:
+               cellicon->focused = g_value_get_boolean(value);
+               break;
+       case PROP_FIXED_WIDTH:
+               cellicon->fixed_width = g_value_get_int(value);
+               break;
+       case PROP_FIXED_HEIGHT:
+               cellicon->fixed_height = g_value_get_int(value);
+               break;
+       case PROP_BACKGROUND_SET:
+               cellicon->background_set = g_value_get_boolean(value);
+               break;
+       case PROP_FOREGROUND_SET:
+               cellicon->foreground_set = g_value_get_boolean(value);
+               break;
+       case PROP_SHOW_TEXT:
+               cellicon->show_text = g_value_get_boolean(value);
+               break;
+       default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+               break;
+    }
+}
+
+static PangoLayout *
+gqv_cell_renderer_icon_get_layout(GQvCellRendererIcon *cellicon, GtkWidget *widget, gboolean will_render)
+{
+       PangoLayout *layout;
+       gint width;
+
+       width = (cellicon->fixed_width > 0) ? cellicon->fixed_width * PANGO_SCALE : -1;
+
+       layout = gtk_widget_create_pango_layout(widget, cellicon->text);
+       pango_layout_set_width(layout, width);
+       pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER);
+       pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
+
+       if (will_render)
+               {
+               PangoAttrList *attr_list;
+
+               attr_list = pango_attr_list_new();
+
+               if (cellicon->foreground_set)
+                       {
+                       PangoColor color;
+                       PangoAttribute *attr;
+
+                       color = cellicon->foreground;
+
+                       attr = pango_attr_foreground_new(color.red, color.green, color.blue);
+
+                       attr->start_index = 0;
+                       attr->end_index = G_MAXINT;
+                       pango_attr_list_insert(attr_list, attr);
+                       }
+
+               pango_layout_set_attributes(layout, attr_list);
+               pango_attr_list_unref(attr_list);
+               }
+
+       return layout;
+}
+
+/**
+ * gqv_cell_renderer_icon_new:
+ * 
+ * Creates a new #GQvCellRendererIcon. Adjust rendering
+ * parameters using object properties. Object properties can be set
+ * globally (with g_object_set()). Also, with #GtkTreeViewColumn, you
+ * can bind a property to a value in a #GtkTreeModel. For example, you
+ * can bind the "pixbuf" property on the cell renderer to a pixbuf value
+ * in the model, thus rendering a different image in each row of the
+ * #GtkTreeView.
+ * 
+ * Return value: the new cell renderer
+ **/
+GtkCellRenderer *
+gqv_cell_renderer_icon_new(void)
+{
+       return g_object_new (GQV_TYPE_CELL_RENDERER_ICON, NULL);
+}
+
+static void
+gqv_cell_renderer_icon_get_size(GtkCellRenderer *cell,
+                               GtkWidget       *widget,
+                               GdkRectangle    *cell_area,
+                               gint            *x_offset,
+                               gint            *y_offset,
+                               gint            *width,
+                               gint            *height)
+{
+       GQvCellRendererIcon *cellicon = (GQvCellRendererIcon *) cell;
+       gint calc_width;
+       gint calc_height;
+
+       if (cellicon->fixed_width > 0)
+               {
+               calc_width = cellicon->fixed_width;
+               }
+       else
+               {
+               calc_width = (cellicon->pixbuf) ? gdk_pixbuf_get_width(cellicon->pixbuf) : 0;
+               }
+
+       if (cellicon->fixed_height > 0)
+               {
+               calc_height = cellicon->fixed_height;
+               }
+       else
+               {
+               calc_height = (cellicon->pixbuf) ? gdk_pixbuf_get_height(cellicon->pixbuf) : 0;
+               }
+
+       if (cellicon->show_text && cellicon->text)
+               {
+               PangoLayout *layout;
+               PangoRectangle rect;
+
+               layout = gqv_cell_renderer_icon_get_layout(cellicon, widget, FALSE);
+               pango_layout_get_pixel_extents(layout, NULL, &rect);
+               g_object_unref(layout);
+
+               calc_width = MAX(calc_width, rect.width);
+               calc_height += rect.height;
+               }
+
+       calc_width += (gint)cell->xpad * 2;
+       calc_height += (gint)cell->ypad * 2;
+
+       if (x_offset) *x_offset = 0;
+       if (y_offset) *y_offset = 0;
+
+       if (cell_area && calc_width > 0 && calc_height > 0)
+               {
+               if (x_offset)
+                       {
+                       *x_offset = (cell->xalign * (cell_area->width - calc_width - 2 * cell->xpad));
+                       *x_offset = MAX (*x_offset, 0) + cell->xpad;
+                       }
+               if (y_offset)
+                       {
+                       *y_offset = (cell->yalign * (cell_area->height - calc_height - 2 * cell->ypad));
+                       *y_offset = MAX (*y_offset, 0) + cell->ypad;
+                       }
+               }
+
+       if (width) *width = calc_width;
+       if (height) *height = calc_height;
+}
+
+static void
+gqv_cell_renderer_icon_render(GtkCellRenderer          *cell,
+                             GdkWindow                 *window,
+                             GtkWidget                 *widget,
+                             GdkRectangle              *background_area,
+                             GdkRectangle              *cell_area,
+                             GdkRectangle              *expose_area,
+                             GtkCellRendererState      flags)
+
+{
+       GQvCellRendererIcon *cellicon = (GQvCellRendererIcon *) cell;
+       GdkPixbuf *pixbuf;
+       const gchar *text;
+       GdkRectangle cell_rect;
+       GtkStateType state;
+
+       pixbuf = cellicon->pixbuf;
+       text = cellicon->text;
+
+       if (!pixbuf && !text) return;
+
+       gqv_cell_renderer_icon_get_size(cell, widget, cell_area,
+                                       &cell_rect.x, &cell_rect.y,
+                                       &cell_rect.width, &cell_rect.height);
+
+       cell_rect.x += cell->xpad;
+       cell_rect.y += cell->ypad;
+       cell_rect.width -= cell->xpad * 2;
+       cell_rect.height -= cell->ypad * 2;
+
+       if ((flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED)
+               {
+               if (GTK_WIDGET_HAS_FOCUS(widget))
+                       state = GTK_STATE_SELECTED;
+               else
+                       state = GTK_STATE_ACTIVE;
+               }
+       else
+               {
+               if (GTK_WIDGET_STATE(widget) == GTK_STATE_INSENSITIVE)
+                       state = GTK_STATE_INSENSITIVE;
+               else
+                       state = GTK_STATE_NORMAL;
+               }
+
+       if (pixbuf)
+               {
+               GdkRectangle pix_rect;
+               GdkRectangle draw_rect;
+
+               pix_rect.width = gdk_pixbuf_get_width(pixbuf);
+               pix_rect.height = gdk_pixbuf_get_height(pixbuf);
+
+               pix_rect.x = cell_area->x + (cell_area->width - pix_rect.width) / 2;
+
+               if (cellicon->fixed_height > 0)
+                       {
+                       pix_rect.y = cell_area->y + cell->ypad + (cellicon->fixed_height - pix_rect.height) / 2;
+                       }
+               else
+                       {
+                       pix_rect.y = cell_area->y + cell_rect.y;
+                       }
+
+               if (gdk_rectangle_intersect(cell_area, &pix_rect, &draw_rect) &&
+                   gdk_rectangle_intersect(expose_area, &draw_rect, &draw_rect))
+                       {
+                       gdk_draw_pixbuf(window,
+                                       widget->style->black_gc,
+                                       pixbuf,
+                                       /* pixbuf 0, 0 is at pix_rect.x, pix_rect.y */
+                                       draw_rect.x - pix_rect.x,
+                                       draw_rect.y - pix_rect.y,
+                                       draw_rect.x,
+                                       draw_rect.y,
+                                       draw_rect.width,
+                                       draw_rect.height,
+                                       GDK_RGB_DITHER_NORMAL,
+                                       0, 0);
+                       }
+               }
+
+       if (cellicon->show_text && text)
+               {
+               PangoLayout *layout;
+               PangoRectangle text_rect;
+               GdkRectangle pix_rect;
+                GdkRectangle draw_rect;
+
+               layout = gqv_cell_renderer_icon_get_layout(cellicon, widget, TRUE);
+               pango_layout_get_pixel_extents(layout, NULL, &text_rect);
+
+               pix_rect.width = text_rect.width;
+               pix_rect.height = text_rect.height;
+               pix_rect.x = cell_area->x + cell->xpad + (cell_rect.width - text_rect.width + 1) / 2;
+               pix_rect.y = cell_area->y + cell->ypad + (cell_rect.height - text_rect.height);
+
+               if (gdk_rectangle_intersect(cell_area, &pix_rect, &draw_rect) &&
+                   gdk_rectangle_intersect(expose_area, &draw_rect, &draw_rect))
+                       {
+                       gtk_paint_layout(widget->style, window,
+                                        state, TRUE,
+                                        cell_area, widget,
+                                        "cellrenderertext",
+                                        pix_rect.x - text_rect.x, pix_rect.y,
+                                        layout);
+                       }
+
+               g_object_unref(layout);
+               }
+
+       if (cellicon->focused &&
+           GTK_WIDGET_HAS_FOCUS(widget))
+               {
+               gtk_paint_focus(widget->style, window,
+                               state,
+                               cell_area, widget,
+                               "cellrendererfocus",
+                               cell_area->x, cell_area->y,
+                               cell_area->width, cell_area->height);
+               }
+}
+
diff --git a/src/cellrenderericon.h b/src/cellrenderericon.h
new file mode 100644 (file)
index 0000000..5b18e7b
--- /dev/null
@@ -0,0 +1,80 @@
+/* cellrenderericon.h, based on:
+ *
+ * gtkcellrendererpixbuf.h
+ * Copyright (C) 2000  Red Hat, Inc.,  Jonathan Blandford <jrb@redhat.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GQV_CELL_RENDERER_ICON_H__
+#define __GQV_CELL_RENDERER_ICON_H__
+
+#include <gtk/gtkcellrenderer.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+#define GQV_TYPE_CELL_RENDERER_ICON            (gqv_cell_renderer_icon_get_type ())
+#define GQV_CELL_RENDERER_ICON(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GQV_TYPE_CELL_RENDERER_ICON, GQvCellRendererIcon))
+#define GQV_CELL_RENDERER_ICON_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GQV_TYPE_CELL_RENDERER_ICON, GQvCellRendererIconClass))
+#define GQV_IS_CELL_RENDERER_ICON(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GQV_TYPE_CELL_RENDERER_ICON))
+#define GQV_IS_CELL_RENDERER_ICON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GQV_TYPE_CELL_RENDERER_ICON))
+#define GQV_CELL_RENDERER_ICON_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), GQV_TYPE_CELL_RENDERER_ICON, GQvCellRendererIconClass))
+
+typedef struct _GQvCellRendererIcon GQvCellRendererIcon;
+typedef struct _GQvCellRendererIconClass GQvCellRendererIconClass;
+
+struct _GQvCellRendererIcon
+{
+       GtkCellRenderer parent;
+
+       /*< private >*/
+       GdkPixbuf *pixbuf;
+       gchar *text;
+       PangoColor foreground;
+       PangoColor background;
+       gboolean focused;
+
+       gint fixed_width;
+       gint fixed_height;
+
+       gboolean foreground_set;
+       gboolean background_set;
+
+       gboolean show_text;
+};
+
+struct _GQvCellRendererIconClass
+{
+       GtkCellRendererClass parent_class;
+
+       /* Padding for future expansion */
+       void (*_gtk_reserved1) (void);
+       void (*_gtk_reserved2) (void);
+       void (*_gtk_reserved3) (void);
+       void (*_gtk_reserved4) (void);
+};
+
+GType            gqv_cell_renderer_icon_get_type (void);
+GtkCellRenderer *gqv_cell_renderer_icon_new      (void);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __GQV_CELL_RENDERER_ICON_H__ */
diff --git a/src/collect-dlg.c b/src/collect-dlg.c
new file mode 100644 (file)
index 0000000..66d882a
--- /dev/null
@@ -0,0 +1,251 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "collect.h"
+#include "collect-dlg.h"
+
+#include "collect-io.h"
+#include "utilops.h"
+#include "ui_fileops.h"
+#include "ui_tabcomp.h"
+#include "ui_utildlg.h"
+
+
+enum {
+       DIALOG_SAVE,
+       DIALOG_SAVE_CLOSE,
+       DIALOG_LOAD,
+       DIALOG_APPEND
+};
+
+
+static gint collection_save_confirmed(FileDialog *fd, gint overwrite, CollectionData *cd);
+
+
+static void collection_confirm_ok_cb(GenericDialog *gd, gpointer data)
+{
+       FileDialog *fd = data;
+       CollectionData *cd = GENERIC_DIALOG(fd)->data;
+
+       if (!collection_save_confirmed(fd, TRUE, cd))
+               {
+               collection_unref(cd);
+               file_dialog_close(fd);
+               }
+}
+
+static void collection_confirm_cancel_cb(GenericDialog *gd, gpointer data)
+{
+       /* this is a no-op, so the cancel button is added */
+}
+
+static gint collection_save_confirmed(FileDialog *fd, gint overwrite, CollectionData *cd)
+{
+       gchar *buf;
+
+       if (isdir(fd->dest_path))
+               {
+               buf = g_strdup_printf(_("Specified path:\n%s\nis a folder, collections are files"), fd->dest_path);
+               file_util_warning_dialog(_("Invalid filename"), buf, GTK_STOCK_DIALOG_INFO, GENERIC_DIALOG(fd)->dialog);
+               g_free(buf);
+               return FALSE;
+               }
+
+       if (!overwrite && isfile(fd->dest_path))
+               {
+               GenericDialog *gd;
+
+               gd = file_util_gen_dlg(_("Overwrite File"), "GQview", "dlg_confirm",
+                                       GENERIC_DIALOG(fd)->dialog, TRUE,
+                                       collection_confirm_cancel_cb, fd);
+
+               generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION,
+                                          _("Overwrite existing file?"), fd->dest_path);
+
+               generic_dialog_add_button(gd, GTK_STOCK_OK, _("_Overwrite"), collection_confirm_ok_cb, TRUE);
+
+               gtk_widget_show(gd->dialog);
+
+               return TRUE;
+               }
+
+       if (!collection_save(cd, fd->dest_path))
+               {
+               buf = g_strdup_printf(_("Failed to save the collection:\n%s"), fd->dest_path);
+               file_util_warning_dialog(_("Save Failed"), buf, GTK_STOCK_DIALOG_ERROR, GENERIC_DIALOG(fd)->dialog);
+               g_free(buf);
+               }
+
+       collection_unref(cd);
+       file_dialog_sync_history(fd, TRUE);
+
+       if (fd->type == DIALOG_SAVE_CLOSE) collection_window_close_by_collection(cd);
+       file_dialog_close(fd);
+
+       return TRUE;
+}
+
+static void collection_save_cb(FileDialog *fd, gpointer data)
+{
+       CollectionData *cd = data;
+       const gchar *path;
+
+       path = fd->dest_path;
+       
+       if (!(strlen(path) > 7 && strncasecmp(path + (strlen(path) - 4), ".gqv", 4) == 0))
+               {
+               gchar *buf;
+               buf = g_strconcat(path, ".gqv", NULL);
+               gtk_entry_set_text(GTK_ENTRY(fd->entry), buf);
+               g_free(buf);
+               }
+
+       collection_save_confirmed(fd, FALSE, cd);
+}
+
+static void real_collection_button_pressed(FileDialog *fd, gpointer data, gint append)
+{
+       CollectionData *cd = data;
+
+       if (!fd->dest_path || isdir(fd->dest_path)) return;
+
+       if (append)
+               {
+               collection_load(cd, fd->dest_path, TRUE);
+               collection_unref(cd);
+               }
+       else
+               {
+               collection_window_new(fd->dest_path);
+               }
+
+       file_dialog_sync_history(fd, TRUE);
+       file_dialog_close(fd);
+}
+
+static void collection_load_cb(FileDialog *fd, gpointer data)
+{
+       real_collection_button_pressed(fd, data, FALSE);
+}
+
+static void collection_append_cb(FileDialog *fd, gpointer data)
+{
+       real_collection_button_pressed(fd, data, TRUE);
+}
+
+static void collection_save_or_load_dialog_close_cb(FileDialog *fd, gpointer data)
+{
+       CollectionData *cd = data;
+
+       if (cd) collection_unref(cd);
+       file_dialog_close(fd);
+}
+
+static void collection_save_or_load_dialog(const gchar *path,
+                                          gint type, CollectionData *cd)
+{
+       FileDialog *fd;
+       GtkWidget *parent = NULL;
+       CollectWindow *cw;
+       const gchar *title;
+       const gchar *btntext;
+       void *btnfunc;
+       gchar *base;
+       const gchar *stock_id;
+
+       if (type == DIALOG_SAVE || type == DIALOG_SAVE_CLOSE)
+               {
+               if (!cd) return;
+               title = _("Save collection");
+               btntext = NULL;
+               btnfunc = collection_save_cb;
+               stock_id = GTK_STOCK_SAVE;
+               }
+       else if (type == DIALOG_LOAD)
+               {
+               title = _("Open collection");
+               btntext = NULL;
+               btnfunc = collection_load_cb;
+               stock_id = GTK_STOCK_OPEN;
+               }
+       else
+               {
+               if (!cd) return;
+               title = _("Append collection");
+               btntext = _("_Append");
+               btnfunc = collection_append_cb;
+               stock_id = GTK_STOCK_ADD;
+               }
+
+       if (cd) collection_ref(cd);
+
+       cw = collection_window_find(cd);
+       if (cw) parent = cw->window;
+
+       fd = file_util_file_dlg(title, "GQview", "dlg_collection", parent,
+                            collection_save_or_load_dialog_close_cb, cd);
+
+       generic_dialog_add_message(GENERIC_DIALOG(fd), NULL, title, NULL);
+       file_dialog_add_button(fd, stock_id, btntext, btnfunc, TRUE);
+
+       base = g_strconcat(homedir(), "/", GQVIEW_RC_DIR_COLLECTIONS, NULL);
+       file_dialog_add_path_widgets(fd, base, path,
+                                    "collection_load_save", ".gqv", _("Collection Files"));
+       g_free(base);
+
+       fd->type = type;
+
+       gtk_widget_show(GENERIC_DIALOG(fd)->dialog);
+}
+
+void collection_dialog_save_as(gchar *path, CollectionData *cd)
+{
+#if 0
+       if (!cd->list)
+               {
+               GtkWidget *parent = NULL;
+               CollectWindow *cw;
+
+               cw = collection_window_find(cd);
+               if (cw) parent = cw->window;
+               file_util_warning_dialog(_("Collection empty"),
+                                        _("The current collection is empty, save aborted."),
+                                        GTK_STOCK_DIALOG_INFO, parent);
+               return;
+               }
+#endif
+
+       if (!path) path = cd->path;
+       if (!path) path = cd->name;
+
+       collection_save_or_load_dialog(path, DIALOG_SAVE, cd);
+}
+
+void collection_dialog_save_close(gchar *path, CollectionData *cd)
+{
+       if (!path) path = cd->path;
+       if (!path) path = cd->name;
+
+       collection_save_or_load_dialog(path, DIALOG_SAVE_CLOSE, cd);
+}
+
+void collection_dialog_load(gchar *path)
+{
+       collection_save_or_load_dialog(path, DIALOG_LOAD, NULL);
+}
+
+void collection_dialog_append(gchar *path, CollectionData *cd)
+{
+       collection_save_or_load_dialog(path, DIALOG_APPEND, cd);
+}
+
diff --git a/src/collect-dlg.h b/src/collect-dlg.h
new file mode 100644 (file)
index 0000000..ef553ca
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef COLLECT_DLG_H
+#define COLLECT_DLG_H
+
+
+void collection_dialog_save_as(gchar *path, CollectionData *cd);
+void collection_dialog_save_close(gchar *path, CollectionData *cd);
+
+void collection_dialog_load(gchar *path);
+void collection_dialog_append(gchar *path, CollectionData *cd);
+
+
+#endif
+
diff --git a/src/collect-io.c b/src/collect-io.c
new file mode 100644 (file)
index 0000000..4e59cb6
--- /dev/null
@@ -0,0 +1,792 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "collect-io.h"
+
+#include "collect.h"
+#include "layout_util.h"
+#include "rcfile.h"
+#include "thumb.h"
+#include "ui_fileops.h"
+
+
+#define GQVIEW_COLLECTION_MARKER "#GQview"
+
+#define GQVIEW_COLLECTION_FAIL_MIN     300
+#define GQVIEW_COLLECTION_FAIL_PERCENT 98
+
+
+static void collection_load_thumb_step(CollectionData *cd);
+
+
+static gint scan_geometry(gchar *buffer, gint *x, gint *y, gint *w, gint *h)
+{
+       gint nx, ny, nw, nh;
+
+       if(sscanf(buffer, "%d %d %d %d", &nx, &ny, &nw, &nh) != 4) return FALSE;
+
+       *x = nx;
+       *y = ny;
+       *w = nw;
+       *h = nh;
+
+       return TRUE;
+}
+
+static gint collection_load_private(CollectionData *cd, const gchar *path, gint append, gint flush)
+{
+       gchar s_buf[2048];
+       FILE *f;
+       gchar *pathl;
+       gint official = FALSE;
+       gint success = TRUE;
+       guint total = 0;
+       guint fail = 0;
+
+       collection_load_stop(cd);
+
+       if (flush) collect_manager_flush();
+
+       if (!append)
+               {
+               collection_list_free(cd->list);
+               cd->list = NULL;
+               }
+
+       if (!path && !cd->path) return FALSE;
+
+       if (!path) path = cd->path;
+
+       /* load it */
+       pathl = path_from_utf8(path);
+       f = fopen(pathl, "r");
+       g_free(pathl);
+       if (!f)
+               {
+               printf("Failed to open collection file: \"%s\"\n", path);
+               return FALSE;
+               }
+
+       while (fgets(s_buf, sizeof(s_buf), f))
+               {
+               gchar *buf;
+               if (s_buf[0]=='#')
+                       {
+                       if (strncasecmp(s_buf, GQVIEW_COLLECTION_MARKER, strlen(GQVIEW_COLLECTION_MARKER)) == 0)
+                               {
+                               /* Looks like an official collection, allow unchecked input.
+                                * All this does is allow adding files that may not exist,
+                                * which is needed for the collection manager to work.
+                                * Also unofficial files abort after too many invalid entries.
+                                */
+                               official = TRUE;
+                               }
+                       else if (strncmp(s_buf, "#geometry:", 10 ) == 0 &&
+                           scan_geometry(s_buf + 10, &cd->window_x, &cd->window_y, &cd->window_w, &cd->window_h) )
+                               {
+                               cd->window_read = TRUE;
+                               }
+                       continue;
+                       }
+               if (s_buf[0]=='\n') continue;
+
+               buf = quoted_value(s_buf);
+               if (buf)
+                       {
+                       gint valid;
+
+                       valid = (buf[0] == '/' && collection_add_check(cd, buf, FALSE, flush));
+                       g_free(buf);
+
+                       total++;
+                       if (!valid && !official)
+                               {
+                               fail++;
+                               if (fail > GQVIEW_COLLECTION_FAIL_MIN &&
+                                   fail * 100 / total > GQVIEW_COLLECTION_FAIL_PERCENT)
+                                       {
+                                       printf("Too many invalid filenames in unoffical collection file, closing: %s\n", path);
+                                       success = FALSE;
+                                       break;
+                                       }
+                               }
+                       }
+               }
+
+       fclose(f);
+
+       cd->list = collection_list_sort(cd->list, cd->sort_method);
+       if (!append) cd->changed = FALSE;
+
+       return success;
+}
+
+gint collection_load(CollectionData *cd, const gchar *path, gint append)
+{
+       if (collection_load_private(cd, path, append, TRUE))
+               {
+               layout_recent_add_path(cd->path);
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+static void collection_load_thumb_do(CollectionData *cd)
+{
+       GdkPixbuf *pixbuf;
+
+       if (!cd->thumb_loader || !g_list_find(cd->list, cd->thumb_info)) return;
+
+       pixbuf = thumb_loader_get_pixbuf(cd->thumb_loader, TRUE);
+       collection_info_set_thumb(cd->thumb_info, pixbuf);
+       g_object_unref(pixbuf);
+
+       if (cd->info_updated_func) cd->info_updated_func(cd, cd->thumb_info, cd->info_updated_data);
+}
+
+static void collection_load_thumb_error_cb(ThumbLoader *tl, gpointer data)
+{
+       CollectionData *cd = data;
+
+       collection_load_thumb_do(cd);
+       collection_load_thumb_step(cd);
+}
+
+static void collection_load_thumb_done_cb(ThumbLoader *tl, gpointer data)
+{
+       CollectionData *cd = data;
+
+       collection_load_thumb_do(cd);
+       collection_load_thumb_step(cd);
+}
+
+static void collection_load_thumb_step(CollectionData *cd)
+{
+       GList *work;
+       CollectInfo *ci;
+
+       if (!cd->list)
+               {
+               collection_load_stop(cd);
+               return;
+               }
+
+       work = cd->list;
+       ci = work->data;
+       work = work->next;
+       /* find first unloaded thumb */
+       while (work && ci->pixbuf)
+               {
+               ci = work->data;
+               work = work->next;
+               }
+
+       if (!ci || ci->pixbuf)
+               {
+               /* done */
+               collection_load_stop(cd);
+
+               /* send a NULL CollectInfo to notify end */
+               if (cd->info_updated_func) cd->info_updated_func(cd, NULL, cd->info_updated_data);
+
+               return;
+               }
+
+       /* setup loader and call it */
+       cd->thumb_info = ci;
+       thumb_loader_free(cd->thumb_loader);
+       cd->thumb_loader = thumb_loader_new(thumb_max_width, thumb_max_height);
+       thumb_loader_set_callbacks(cd->thumb_loader,
+                                  collection_load_thumb_done_cb,
+                                  collection_load_thumb_error_cb,
+                                  NULL,
+                                  cd);
+
+       /* start it */
+       if (!thumb_loader_start(cd->thumb_loader, ci->path))
+               {
+               /* error, handle it, do next */
+               if (debug) printf("error loading thumb for %s\n", ci->path);
+               collection_load_thumb_do(cd);
+               collection_load_thumb_step(cd);
+               }
+}
+
+void collection_load_thumb_idle(CollectionData *cd)
+{
+       if (!cd->thumb_loader) collection_load_thumb_step(cd);
+}
+
+gint collection_load_begin(CollectionData *cd, const gchar *path, gint append)
+{
+       if (!collection_load(cd, path, append)) return FALSE;
+
+       collection_load_thumb_idle(cd);
+
+       return TRUE;
+}
+
+void collection_load_stop(CollectionData *cd)
+{
+       if (!cd->thumb_loader) return;
+
+       thumb_loader_free(cd->thumb_loader);
+       cd->thumb_loader = NULL;
+}
+
+static gint collection_save_private(CollectionData *cd, const gchar *path)
+{
+       FILE *f;
+       GList *work;
+       gchar *tmp_path;
+       gchar *pathl;
+       mode_t save_mask;
+
+       if (!path && !cd->path) return FALSE;
+
+       if (!path)
+               {
+               path = cd->path;
+               }
+
+       tmp_path = unique_filename(path, ".tmp", "_", 3);
+       if (!tmp_path) return FALSE;
+
+       pathl = path_from_utf8(tmp_path);
+       save_mask = umask(0077);
+       f = fopen(pathl, "w");
+       umask(save_mask);
+       g_free(pathl);
+
+       if (!f)
+               {
+               /* file open failed */
+               printf("failed to open collection (write) \"%s\"\n", tmp_path);
+               g_free(tmp_path);
+               return FALSE;
+               }
+
+       fprintf(f, "%s collection\n", GQVIEW_COLLECTION_MARKER);
+       fprintf(f, "#created with GQview version %s\n", VERSION);
+
+       collection_update_geometry(cd);
+       if (cd->window_read)
+               {
+               fprintf(f, "#geometry: %d %d %d %d\n", cd->window_x, cd->window_y, cd->window_w, cd->window_h);
+               }
+
+       work = cd->list;
+       while (work)
+               {
+               CollectInfo *ci = work->data;
+               if (fprintf(f, "\"%s\"\n", ci->path) < 0)
+                       {
+                       fclose(f);
+                       printf("Error writing to %s\n", tmp_path);
+                       unlink_file(tmp_path);
+                       g_free(tmp_path);
+                       return FALSE;
+                       }
+               work = work->next;
+               }
+
+       fprintf(f, "#end\n");
+
+       fclose(f);
+
+       copy_file_attributes(path, tmp_path, TRUE, FALSE);
+       if (!rename_file(tmp_path, path))
+               {
+               printf("collection save unable to rename %s to %s\n", tmp_path, path);
+               unlink_file(tmp_path);
+               g_free(tmp_path);
+               return FALSE;
+               }
+
+       g_free(tmp_path);
+
+       if (!cd->path || strcmp(path, cd->path) != 0)
+               {
+               gchar *buf = cd->path;
+               cd->path = g_strdup(path);
+               path = cd->path;
+               g_free(buf);
+
+               g_free(cd->name);
+               cd->name = g_strdup(filename_from_path(cd->path));
+
+               collection_path_changed(cd);
+               }
+
+       cd->changed = FALSE;
+
+       return TRUE;
+}
+
+gint collection_save(CollectionData *cd, const gchar *path)
+{
+       if (collection_save_private(cd, path))
+               {
+               layout_recent_add_path(cd->path);
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+gint collection_load_only_geometry(CollectionData *cd, const gchar *path)
+{
+       gchar s_buf[2048];
+       FILE *f;
+       gchar *pathl;
+
+       if (!path && !cd->path) return FALSE;
+
+       if (!path) path = cd->path;
+
+       /* load it */
+       pathl = path_from_utf8(path);
+       f = fopen(pathl, "r");
+       g_free(pathl);
+       if (!f) return FALSE;
+
+       while (fgets(s_buf, sizeof(s_buf), f))
+               {
+               if (s_buf[0]=='#' &&
+                   strncmp(s_buf, "#geometry:", 10 ) == 0 &&
+                   scan_geometry(s_buf + 10, &cd->window_x, &cd->window_y, &cd->window_w, &cd->window_h) )
+                       {
+                       cd->window_read = TRUE;
+                       fclose(f);
+                       return TRUE;
+                       }
+               }
+       fclose(f);
+       return FALSE;
+}
+
+
+/*
+ *-------------------------------------------------------------------
+ * collection manager
+ *-------------------------------------------------------------------
+ */
+
+#define COLLECT_MANAGER_ACTIONS_PER_IDLE 1000
+#define COLLECT_MANAGER_FLUSH_DELAY      10000
+
+typedef struct _CollectManagerEntry CollectManagerEntry;
+struct _CollectManagerEntry
+{
+       gchar *path;
+       GList *action_list;
+};
+
+typedef enum {
+       COLLECTION_MANAGER_UPDATE,
+       COLLECTION_MANAGER_ADD,
+       COLLECTION_MANAGER_REMOVE
+} CollectManagerType;
+
+typedef struct _CollectManagerAction CollectManagerAction;
+struct _CollectManagerAction
+{
+       gchar *oldpath;
+       gchar *newpath;
+
+       CollectManagerType type;
+
+       gint ref;
+};
+
+
+static GList *collection_manager_entry_list = NULL;
+static GList *collection_manager_action_list = NULL;
+static GList *collection_manager_action_tail = NULL;
+static gint collection_manager_timer_id = -1;
+
+
+static CollectManagerAction *collect_manager_action_new(const gchar *oldpath, const gchar *newpath,
+                                                       CollectManagerType type)
+{
+       CollectManagerAction *action;
+
+       action = g_new0(CollectManagerAction, 1);
+       action->ref = 1;
+
+       action->oldpath = g_strdup(oldpath);
+       action->newpath = g_strdup(newpath);
+
+       action->type = type;
+
+       return action;
+}
+
+static void collect_manager_action_ref(CollectManagerAction *action)
+{
+       action->ref++;
+}
+
+static void collect_manager_action_unref(CollectManagerAction *action)
+{
+       action->ref--;
+
+       if (action->ref > 0) return;
+
+       g_free(action->oldpath);
+       g_free(action->newpath);
+       g_free(action);
+}
+
+static CollectManagerEntry *collect_manager_entry_new(const gchar *path)
+{
+       CollectManagerEntry *entry;
+
+       entry = g_new0(CollectManagerEntry, 1);
+       entry->path = g_strdup(path);
+       entry->action_list = NULL;
+
+       collection_manager_entry_list = g_list_append(collection_manager_entry_list, entry);
+
+       return entry;
+}
+
+static void collect_manager_entry_free(CollectManagerEntry *entry)
+{
+       GList *work;
+
+       collection_manager_entry_list = g_list_remove(collection_manager_entry_list, entry);
+
+       work = entry->action_list;
+       while (work)
+               {
+               CollectManagerAction *action;
+
+               action = work->data;
+               work = work->next;
+
+               collect_manager_action_unref(action);
+               }
+       g_list_free(entry->action_list);
+
+       g_free(entry->path);
+       g_free(entry);
+}
+
+static void collect_manager_refresh(void)
+{
+       GList *list = NULL;
+       GList *work;
+       gchar *base;
+
+       base = g_strconcat(homedir(), "/", GQVIEW_RC_DIR_COLLECTIONS, NULL);
+       path_list(base, &list, NULL);
+       g_free(base);
+
+       work = collection_manager_entry_list;
+       while (work && list)
+               {
+               CollectManagerEntry *entry;
+               GList *list_step;
+
+               entry = work->data;
+               work = work->next;
+
+               list_step = list;
+               while (list_step && entry)
+                       {
+                       gchar *path;
+
+                       path = list_step->data;
+                       list_step = list_step->next;
+
+                       if (strcmp(path, entry->path) == 0)
+                               {
+                               list = g_list_remove(list, path);
+                               g_free(path);
+
+                               entry = NULL;
+                               }
+                       else
+                               {
+                               collect_manager_entry_free(entry);
+                               }
+                       }
+               }
+
+       work = list;
+       while (work)
+               {
+               gchar *path;
+
+               path = work->data;
+               work = work->next;
+
+               collect_manager_entry_new(path);
+               g_free(path);
+               }
+
+       g_list_free(list);
+}
+
+static void collect_manager_process_actions(gint max)
+{
+       if (debug && collection_manager_action_list)
+               {
+               printf("collection manager processing actions\n");
+               }
+
+       while (collection_manager_action_list != NULL && max > 0)
+               {
+               CollectManagerAction *action;
+               GList *work;
+
+               action = collection_manager_action_list->data;
+               work = collection_manager_entry_list;
+               while (work)
+                       {
+                       CollectManagerEntry *entry;
+
+                       entry = work->data;
+                       work = work->next;
+
+                       if (action->type == COLLECTION_MANAGER_UPDATE)
+                               {
+                               entry->action_list = g_list_prepend(entry->action_list, action);
+                               collect_manager_action_ref(action);
+                               }
+                       else if (action->oldpath && action->newpath &&
+                                strcmp(action->newpath, entry->path) == 0)
+                               {
+                               /* convert action to standard add format */
+                               g_free(action->newpath);
+                               if (action->type == COLLECTION_MANAGER_ADD)
+                                       {
+                                       action->newpath = action->oldpath;
+                                       action->oldpath = NULL;
+                                       }
+                               else if (action->type == COLLECTION_MANAGER_REMOVE)
+                                       {
+                                       action->newpath = NULL;
+                                       }
+
+                               entry->action_list = g_list_prepend(entry->action_list, action);
+                               collect_manager_action_ref(action);
+                               }
+
+                       max--;
+                       }
+
+               if (action->type != COLLECTION_MANAGER_UPDATE &&
+                   action->oldpath && action->newpath)
+                       {
+                       printf("collection manager failed to %s %s for collection %s\n",
+                               (action->type == COLLECTION_MANAGER_ADD) ? "add" : "remove",
+                               action->oldpath, action->newpath);
+                       }
+
+               if (collection_manager_action_tail == collection_manager_action_list)
+                       {
+                       collection_manager_action_tail = NULL;
+                       }
+               collection_manager_action_list = g_list_remove(collection_manager_action_list, action);
+               collect_manager_action_unref(action);
+               }
+}
+
+static gint collect_manager_process_entry(CollectManagerEntry *entry)
+{
+       CollectionData *cd;
+       gint success;
+       GList *work;
+
+       if (!entry->action_list) return FALSE;
+
+       cd = collection_new(entry->path);
+       success = collection_load_private(cd, entry->path, FALSE, FALSE);
+
+       work = g_list_last(entry->action_list);
+       while (work)
+               {
+               CollectManagerAction *action;
+
+               action = work->data;
+               work = work->prev;
+
+               if (!action->oldpath)
+                       {
+                       /* add image */
+                       if (collection_list_find(cd->list, action->newpath) == NULL)
+                               {
+                               collection_add_check(cd, action->newpath, FALSE, FALSE);
+                               }
+                       }
+               else if (action->newpath)
+                       {
+                       /* rename image */
+                       while (collection_rename(cd, action->oldpath, action->newpath));
+                       }
+               else
+                       {
+                       /* remove image */
+                       while (collection_remove(cd, action->oldpath));
+                       }
+               collect_manager_action_unref(action);
+               }
+
+       if (success && cd->changed)
+               {
+               collection_save_private(cd, entry->path);
+               if (debug) printf("collection manager updated: %s\n", entry->path);
+               }
+       collection_unref(cd);
+
+       g_list_free(entry->action_list);
+       entry->action_list = NULL;
+
+       return TRUE;
+}
+
+static gint collect_manager_process_entry_list(void)
+{
+       GList *work;
+
+       work = collection_manager_entry_list;
+       while (work)
+               {
+               CollectManagerEntry *entry;
+
+               entry = work->data;
+               work = work->next;
+               if (collect_manager_process_entry(entry)) return TRUE;
+               }
+
+       return FALSE;
+}
+
+static gint collect_manager_process_cb(gpointer data)
+{
+       if (collection_manager_action_list) collect_manager_refresh();
+       collect_manager_process_actions(COLLECT_MANAGER_ACTIONS_PER_IDLE);
+       if (collection_manager_action_list) return TRUE;
+
+       if (collect_manager_process_entry_list()) return TRUE;
+
+       if (debug) printf("collection manager is up to date\n");
+       return FALSE;
+}
+
+static gint collect_manager_timer_cb(gpointer data)
+{
+       if (debug) printf("collection manager timer expired\n");
+
+       g_idle_add_full(G_PRIORITY_LOW, collect_manager_process_cb, NULL, NULL);
+
+       collection_manager_timer_id = -1;
+       return FALSE;
+}
+
+static void collect_manager_timer_push(gint stop)
+{
+       if (collection_manager_timer_id != -1)
+               {
+               if (!stop) return;
+
+               g_source_remove(collection_manager_timer_id);
+               collection_manager_timer_id = -1;
+               }
+
+       if (!stop)
+               {
+               collection_manager_timer_id = g_timeout_add(COLLECT_MANAGER_FLUSH_DELAY,
+                                                           collect_manager_timer_cb, NULL);
+               if (debug) printf("collection manager timer started\n");
+               }
+}
+
+static void collect_manager_add_action(CollectManagerAction *action)
+{
+       if (!action) return;
+
+       /* we keep track of the list's tail to keep this a n(1) operation */
+
+       if (collection_manager_action_tail)
+               {
+               g_list_append(collection_manager_action_tail, action);
+               collection_manager_action_tail = collection_manager_action_tail->next;
+               }
+       else
+               {
+               collection_manager_action_list = g_list_append(collection_manager_action_list, action);
+               collection_manager_action_tail = collection_manager_action_list;
+               }
+
+       collect_manager_timer_push(FALSE);
+}
+
+void collect_manager_moved(const gchar *oldpath, const gchar *newpath)
+{
+       CollectManagerAction *action;
+
+       action = collect_manager_action_new(oldpath, newpath, COLLECTION_MANAGER_UPDATE);
+       collect_manager_add_action(action);
+}
+
+void collect_manager_add(const gchar *path, const gchar *collection)
+{
+       CollectManagerAction *action;
+       CollectWindow *cw;
+
+       if (!path || !collection) return;
+
+       cw = collection_window_find_by_path(collection);
+       if (cw)
+               {
+               if (collection_list_find(cw->cd->list, path) == NULL)
+                       {
+                       collection_add(cw->cd, path, FALSE);
+                       }
+               return;
+               }
+
+       action = collect_manager_action_new(path, collection, COLLECTION_MANAGER_ADD);
+       collect_manager_add_action(action);
+}
+
+void collect_manager_remove(const gchar *path, const gchar *collection)
+{
+       CollectManagerAction *action;
+       CollectWindow *cw;
+
+       if (!path || !collection) return;
+
+       cw = collection_window_find_by_path(collection);
+       if (cw)
+               {
+               while (collection_remove(cw->cd, path));
+               return;
+               }
+
+       action = collect_manager_action_new(path, collection, COLLECTION_MANAGER_REMOVE);
+       collect_manager_add_action(action);
+}
+
+void collect_manager_flush(void)
+{
+       collect_manager_timer_push(TRUE);
+
+       if (debug) printf("collection manager flushing\n");
+       while (collect_manager_process_cb(NULL));
+}
+
diff --git a/src/collect-io.h b/src/collect-io.h
new file mode 100644 (file)
index 0000000..6b59308
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef COLLECT_IO_H
+#define COLLECT_IO_H
+
+
+gint collection_load(CollectionData *cd, const gchar *path, gint append);
+
+gint collection_load_begin(CollectionData *cd, const gchar *path, gint append);
+void collection_load_stop(CollectionData *cd);
+
+void collection_load_thumb_idle(CollectionData *cd);
+
+gint collection_save(CollectionData *cd, const gchar *path);
+
+gint collection_load_only_geometry(CollectionData *cd, const gchar *path);
+
+
+/* these are used to update collections contained in user's collection
+ * folder when moving or renaming files.
+ * also handles:
+ *   deletes file when newpath == NULL
+ *   adds file when oldpath == NULL
+ */
+void collect_manager_moved(const gchar *oldpath, const gchar *newpath);
+
+/* add or removing from a specific collection */
+void collect_manager_add(const gchar *path, const gchar *collection);
+void collect_manager_remove(const gchar *path, const gchar *collection);
+
+/* commit pending operations to disk */
+void collect_manager_flush(void);
+
+
+
+#endif
+
diff --git a/src/collect-table.c b/src/collect-table.c
new file mode 100644 (file)
index 0000000..81757ff
--- /dev/null
@@ -0,0 +1,2450 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "collect-table.h"
+
+#include "cellrenderericon.h"
+#include "collect-dlg.h"
+#include "collect-io.h"
+#include "dnd.h"
+#include "dupe.h"
+#include "editors.h"
+#include "filelist.h"
+#include "img-view.h"
+#include "info.h"
+#include "layout.h"
+#include "layout_image.h"
+#include "menu.h"
+#include "print.h"
+#include "utilops.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_tree_edit.h"
+
+#include "icons/marker.xpm"
+#define MARKER_WIDTH 26
+#define MARKER_HEIGHT 32
+
+#include <gdk/gdkkeysyms.h> /* for keyboard values */
+
+/* between these, the icon width is increased by thumb_max_width / 2 */
+#define THUMB_MIN_ICON_WIDTH 128
+#define THUMB_MAX_ICON_WIDTH 150
+
+#define COLLECT_TABLE_MAX_COLUMNS 32
+#define THUMB_BORDER_PADDING 2
+
+#define COLLECT_TABLE_TIP_DELAY 500
+
+
+enum {
+       CTABLE_COLUMN_POINTER = 0,
+       CTABLE_COLUMN_COUNT
+};
+
+typedef enum {
+       SELECTION_NONE          = 0,
+       SELECTION_SELECTED      = 1 << 0,
+       SELECTION_PRELIGHT      = 1 << 1,
+       SELECTION_FOCUS         = 1 << 2
+} SelectionType;
+
+
+#define INFO_SELECTED(x) (x->flag_mask & SELECTION_SELECTED)
+
+
+static void collection_table_populate_at_new_size(CollectTable *ct, gint w, gint h, gint force);
+
+
+/*
+ *-------------------------------------------------------------------
+ * more misc
+ *-------------------------------------------------------------------
+ */
+
+static gint collection_table_find_position(CollectTable *ct, CollectInfo *info, gint *row, gint *col)
+{
+       gint n;
+
+       n = g_list_index(ct->cd->list, info);
+
+       if (n < 0) return FALSE;
+
+       *row = n / ct->columns;
+       *col = n - (*row * ct->columns);
+
+       return TRUE;
+}
+
+static gint collection_table_find_iter(CollectTable *ct, CollectInfo *info, GtkTreeIter *iter, gint *column)
+{
+       GtkTreeModel *store;
+       gint row, col;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(ct->listview));
+       if (!collection_table_find_position(ct, info, &row, &col)) return FALSE;
+       if (!gtk_tree_model_iter_nth_child(store, iter, NULL, row)) return FALSE;
+       if (column) *column = col;
+
+       return TRUE;
+}
+
+static CollectInfo *collection_table_find_data(CollectTable *ct, gint row, gint col, GtkTreeIter *iter)
+{
+       GtkTreeModel *store;
+       GtkTreeIter p;
+
+       if (row < 0 || col < 0) return NULL;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(ct->listview));
+       if (gtk_tree_model_iter_nth_child(store, &p, NULL, row))
+               {
+               GList *list;
+
+               gtk_tree_model_get(store, &p, CTABLE_COLUMN_POINTER, &list, -1);
+               if (!list) return NULL;
+
+               if (iter) *iter = p;
+
+               return g_list_nth_data(list, col);
+               }
+
+       return NULL;
+}
+
+static CollectInfo *collection_table_find_data_by_coord(CollectTable *ct, gint x, gint y, GtkTreeIter *iter)
+{
+       GtkTreePath *tpath;
+       GtkTreeViewColumn *column;
+
+       if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(ct->listview), x, y,
+                                         &tpath, &column, NULL, NULL))
+               {
+               GtkTreeModel *store;
+               GtkTreeIter row;
+               GList *list;
+               gint n;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(ct->listview));
+               gtk_tree_model_get_iter(store, &row, tpath);
+               gtk_tree_path_free(tpath);
+
+               gtk_tree_model_get(store, &row, CTABLE_COLUMN_POINTER, &list, -1);
+
+               n = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(column), "column_number"));
+               if (list)
+                       {
+                       if (iter) *iter = row;
+                       return g_list_nth_data(list, n);
+                       }
+               }
+
+       return NULL;
+}
+
+static void collection_table_update_status(CollectTable *ct)
+{
+       if (ct->status_label)
+               {
+               gchar *buf;
+
+               if (!ct->cd->list)
+                       {
+                       buf = g_strdup(_("Empty"));
+                       }
+               else if (ct->selection)
+                       {
+                       buf = g_strdup_printf(_("%d images (%d)"), g_list_length(ct->cd->list), g_list_length(ct->selection));
+                       }
+               else
+                       {
+                       buf = g_strdup_printf(_("%d images"), g_list_length(ct->cd->list));
+                       }
+
+               gtk_label_set_text(GTK_LABEL(ct->status_label), buf);
+               g_free(buf);
+               }
+}
+
+static void collection_table_update_extras(CollectTable *ct, gint loading, gdouble value)
+{
+       if (ct->extra_label)
+               {
+               gchar *text;
+               if (loading)
+                       text = _("Loading thumbs...");
+               else
+                       text = " ";
+
+               gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ct->extra_label), value);
+               gtk_progress_bar_set_text(GTK_PROGRESS_BAR(ct->extra_label), text);
+               }
+}
+
+static void collection_table_toggle_filenames(CollectTable *ct)
+{
+       ct->show_text = !ct->show_text;
+       show_icon_names = ct->show_text;
+
+       collection_table_populate_at_new_size(ct, ct->listview->allocation.width, ct->listview->allocation.height, TRUE);
+}
+
+static gint collection_table_get_icon_width(CollectTable *ct)
+{
+       gint width;
+
+       if (!ct->show_text) return thumb_max_width;
+
+       width = thumb_max_width + thumb_max_width / 2;
+       if (width < THUMB_MIN_ICON_WIDTH) width = THUMB_MIN_ICON_WIDTH;
+       if (width > THUMB_MAX_ICON_WIDTH) width = thumb_max_width;
+
+       return width;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * cell updates
+ *-------------------------------------------------------------------
+ */
+
+static void collection_table_selection_set(CollectTable *ct, CollectInfo *info, SelectionType value, GtkTreeIter *iter)
+{
+       GtkTreeModel *store;
+       GList *list;
+
+       if (!info) return;
+
+       if (info->flag_mask == value) return;
+       info->flag_mask = value;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(ct->listview));
+       if (iter)
+               {
+               gtk_tree_model_get(store, iter, CTABLE_COLUMN_POINTER, &list, -1);
+               if (list) gtk_list_store_set(GTK_LIST_STORE(store), iter, CTABLE_COLUMN_POINTER, list, -1);
+               }
+       else
+               {
+               GtkTreeIter row;
+
+               if (collection_table_find_iter(ct, info, &row, NULL))
+                       {
+                       gtk_tree_model_get(store, &row, CTABLE_COLUMN_POINTER, &list, -1);
+                       if (list) gtk_list_store_set(GTK_LIST_STORE(store), &row, CTABLE_COLUMN_POINTER, list, -1);
+                       }
+               }
+}
+
+static void collection_table_selection_add(CollectTable *ct, CollectInfo *info, SelectionType mask, GtkTreeIter *iter)
+{
+       if (!info) return;
+
+       collection_table_selection_set(ct, info, info->flag_mask | mask, iter);
+}
+
+static void collection_table_selection_remove(CollectTable *ct, CollectInfo *info, SelectionType mask, GtkTreeIter *iter)
+{
+       if (!info) return;
+
+       collection_table_selection_set(ct, info, info->flag_mask & ~mask, iter);
+}
+/*
+ *-------------------------------------------------------------------
+ * selections
+ *-------------------------------------------------------------------
+ */
+
+static void collection_table_verify_selections(CollectTable *ct)
+{
+       GList *work;
+
+       work = ct->selection;
+       while (work)
+               {
+               CollectInfo *info = work->data;
+               work = work->next;
+               if (!g_list_find(ct->cd->list, info))
+                       {
+                       ct->selection = g_list_remove(ct->selection, info);
+                       }
+               }
+}
+
+void collection_table_select_all(CollectTable *ct)
+{
+       GList *work;
+
+       g_list_free(ct->selection);
+       ct->selection = NULL;
+
+       work = ct->cd->list;
+       while(work)
+               {
+               ct->selection = g_list_append(ct->selection, work->data);
+               collection_table_selection_add(ct, work->data, SELECTION_SELECTED, NULL);
+               work = work->next;
+               }
+
+       collection_table_update_status(ct);
+}
+
+void collection_table_unselect_all(CollectTable *ct)
+{
+       GList *work;
+
+       work = ct->selection;
+       while (work)
+               {
+               collection_table_selection_remove(ct, work->data, SELECTION_SELECTED, NULL);
+               work = work->next;
+               }
+
+       g_list_free(ct->selection);
+       ct->selection = NULL;
+
+       collection_table_update_status(ct);
+}
+
+static void collection_table_select(CollectTable *ct, CollectInfo *info)
+{
+       ct->prev_selection = info;
+
+       if (!info || INFO_SELECTED(info)) return;
+
+       ct->selection = g_list_append(ct->selection, info);
+       collection_table_selection_add(ct, info, SELECTION_SELECTED, NULL);
+
+       collection_table_update_status(ct);
+}
+
+static void collection_table_unselect(CollectTable *ct, CollectInfo *info)
+{
+       ct->prev_selection = info;
+
+       if (!info || !INFO_SELECTED(info) ) return;
+
+       ct->selection = g_list_remove(ct->selection, info);
+       collection_table_selection_remove(ct, info, SELECTION_SELECTED, NULL);
+
+       collection_table_update_status(ct);
+}
+
+static void collection_table_select_util(CollectTable *ct, CollectInfo *info, gint select)
+{
+       if (select)
+               {
+               collection_table_select(ct, info);
+               }
+       else
+               {
+               collection_table_unselect(ct, info);
+               }
+}
+
+static void collection_table_select_region_util(CollectTable *ct, CollectInfo *start, CollectInfo *end, gint select)
+{
+       gint row1, col1;
+       gint row2, col2;
+       gint t;
+       gint i, j;
+
+       if (!collection_table_find_position(ct, start, &row1, &col1) ||
+           !collection_table_find_position(ct, end, &row2, &col2) ) return;
+
+       ct->prev_selection = end;
+
+       if (!collection_rectangular_selection)
+               {
+               GList *work;
+               CollectInfo *info;
+
+               if (g_list_index(ct->cd->list, start) > g_list_index(ct->cd->list, end))
+                       {
+                       info = start;
+                       start = end;
+                       end = info;
+                       }
+
+               work = g_list_find(ct->cd->list, start);
+               while (work)
+                       {
+                       info = work->data;
+                       collection_table_select_util(ct, info, select);
+                       
+                       if (work->data != end)
+                               work = work->next;
+                       else
+                               work = NULL;
+                       }
+               return;
+               }
+
+       if (row2 < row1)
+               {
+               t = row1;
+               row1 = row2;
+               row2 = t;
+               }
+       if (col2 < col1)
+               {
+               t = col1;
+               col1 = col2;
+               col2 = t;
+               }
+
+       if (debug) printf("table: %d x %d to %d x %d\n", row1, col1, row2, col2);
+
+       for (i = row1; i <= row2; i++)
+               {
+               for (j = col1; j <= col2; j++)
+                       {
+                       CollectInfo *info = collection_table_find_data(ct, i, j, NULL);
+                       if (info) collection_table_select_util(ct, info, select);
+                       }
+               }
+}
+
+GList *collection_table_selection_get_list(CollectTable *ct)
+{
+       return collection_list_to_path_list(ct->selection);
+}
+
+static GList *collection_table_get_list(CollectTable *ct)
+{
+       return collection_list_to_path_list(ct->cd->list);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * tooltip type window
+ *-------------------------------------------------------------------
+ */
+
+static void tip_show(CollectTable *ct)
+{
+       GtkWidget *label;
+       gint x, y;
+
+       if (ct->tip_window) return;
+
+       gdk_window_get_pointer(ct->listview->window, &x, &y, NULL);
+
+       ct->tip_info = collection_table_find_data_by_coord(ct, x, y, NULL);
+       if (!ct->tip_info) return;
+
+       ct->tip_window = gtk_window_new(GTK_WINDOW_POPUP);
+       gtk_window_set_resizable(GTK_WINDOW(ct->tip_window), FALSE);
+       gtk_container_set_border_width(GTK_CONTAINER(ct->tip_window), 2);
+
+       label = gtk_label_new(filename_from_path(ct->tip_info->path));
+
+       g_object_set_data(G_OBJECT(ct->tip_window), "tip_label", label);
+       gtk_container_add(GTK_CONTAINER(ct->tip_window), label);
+       gtk_widget_show(label);
+
+       gdk_window_get_pointer(NULL, &x, &y, NULL);
+
+       if (!GTK_WIDGET_REALIZED(ct->tip_window)) gtk_widget_realize(ct->tip_window);
+       gtk_window_move(GTK_WINDOW(ct->tip_window), x + 16, y + 16);
+       gtk_widget_show(ct->tip_window);
+}
+
+static void tip_hide(CollectTable *ct)
+{
+       if (ct->tip_window) gtk_widget_destroy(ct->tip_window);
+       ct->tip_window = NULL;
+}
+
+static gint tip_schedule_cb(gpointer data)
+{
+       CollectTable *ct = data;
+
+       if (ct->tip_delay_id == -1) return FALSE;
+
+       tip_show(ct);
+
+       ct->tip_delay_id = -1;
+       return FALSE;
+}
+
+static void tip_schedule(CollectTable *ct)
+{
+       tip_hide(ct);
+
+       if (ct->tip_delay_id != -1)
+               {
+               g_source_remove(ct->tip_delay_id);
+               ct->tip_delay_id = -1;
+               }
+
+       if (!ct->show_text)
+               {
+               ct->tip_delay_id = g_timeout_add(COLLECT_TABLE_TIP_DELAY, tip_schedule_cb, ct);
+               }
+}
+
+static void tip_unschedule(CollectTable *ct)
+{
+       tip_hide(ct);
+
+       if (ct->tip_delay_id != -1) g_source_remove(ct->tip_delay_id);
+       ct->tip_delay_id = -1;
+}
+
+static void tip_update(CollectTable *ct, CollectInfo *info)
+{
+       if (ct->tip_window)
+               {
+               gint x, y;
+
+               gdk_window_get_pointer(NULL, &x, &y, NULL);
+               gtk_window_move(GTK_WINDOW(ct->tip_window), x + 16, y + 16);
+
+               if (info != ct->tip_info)
+                       {
+                       GtkWidget *label;
+
+                       ct->tip_info = info;
+
+                       if (!ct->tip_info)
+                               {
+                               tip_hide(ct);
+                               tip_schedule(ct);
+                               return;
+                               }
+
+                       label = g_object_get_data(G_OBJECT(ct->tip_window), "tip_label");
+                       gtk_label_set_text(GTK_LABEL(label), filename_from_path(ct->tip_info->path));
+                       }
+               }
+       else
+               {
+               tip_schedule(ct);
+               }
+}
+
+/*
+ *-------------------------------------------------------------------
+ * popup menus
+ *-------------------------------------------------------------------
+ */
+
+static void collection_table_popup_save_as_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       collection_dialog_save_as(NULL, ct->cd);
+}
+
+static void collection_table_popup_save_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       if (!ct->cd->path)
+               {
+               collection_table_popup_save_as_cb(widget, data);
+               return;
+               }
+
+       if (!collection_save(ct->cd, ct->cd->path))
+               {
+               printf("failed saving to collection path: %s\n", ct->cd->path);
+               }
+}
+
+static GList *collection_table_popup_file_list(CollectTable *ct)
+{
+       if (!ct->click_info) return NULL;
+
+       if (INFO_SELECTED(ct->click_info))
+               {
+               return collection_table_selection_get_list(ct);
+               }
+
+       return g_list_append(NULL, g_strdup(ct->click_info->path));
+}
+
+static void collection_table_popup_edit_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct;
+       gint n;
+       GList *list;
+
+       ct = submenu_item_get_data(widget);
+
+       if (!ct) return;
+       n = GPOINTER_TO_INT(data);
+
+       list = collection_table_popup_file_list(ct);
+       if (list)
+               {
+               start_editor_from_path_list(n, list);
+               path_list_free(list);
+               }
+}
+
+static void collection_table_popup_info_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       info_window_new(NULL, collection_table_popup_file_list(ct));
+}
+
+static void collection_table_popup_copy_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       file_util_copy(NULL, collection_table_popup_file_list(ct), NULL, ct->listview);
+}
+
+static void collection_table_popup_move_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       file_util_move(NULL, collection_table_popup_file_list(ct), NULL, ct->listview);
+}
+
+static void collection_table_popup_rename_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       file_util_rename(NULL, collection_table_popup_file_list(ct), ct->listview);
+}
+
+static void collection_table_popup_delete_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       file_util_delete(NULL, collection_table_popup_file_list(ct), ct->listview);
+}
+
+static void collection_table_popup_sort_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct;
+       SortType type;
+
+       ct = submenu_item_get_data(widget);
+
+       if (!ct) return;
+
+       type = (SortType)GPOINTER_TO_INT(data);
+
+       collection_set_sort_method(ct->cd, type);
+}
+
+static void collection_table_popup_view_new_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       if (ct->click_info && g_list_find(ct->cd->list, ct->click_info))
+               {
+               view_window_new_from_collection(ct->cd, ct->click_info);
+               }
+}
+
+static void collection_table_popup_view_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       if (ct->click_info && g_list_find(ct->cd->list, ct->click_info))
+               {
+               layout_image_set_collection(NULL, ct->cd, ct->click_info);
+               }
+}
+
+static void collection_table_popup_selectall_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       collection_table_select_all(ct);
+       ct->prev_selection= ct->click_info;
+}
+
+static void collection_table_popup_unselectall_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       collection_table_unselect_all(ct);
+       ct->prev_selection= ct->click_info;
+}
+
+static void collection_table_popup_remove_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+       GList *list;
+
+       if (!ct->click_info) return;
+                                                                                                                               
+       if (INFO_SELECTED(ct->click_info))
+               {
+               list = g_list_copy(ct->selection);
+               }
+       else
+               {
+               list = g_list_append(NULL, ct->click_info);
+               }
+
+       collection_remove_by_info_list(ct->cd, list);
+       g_list_free(list);
+}
+
+static void collection_table_popup_add_filelist_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+       GList *list;
+
+       list = layout_list(NULL);
+
+       if (list)
+               {
+               collection_table_add_path_list(ct, list);
+               path_list_free(list);
+               }
+}
+
+static void collection_table_popup_add_collection_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       collection_dialog_append(NULL, ct->cd);
+}
+
+static void collection_table_popup_find_dupes_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+       DupeWindow *dw;
+
+       dw = dupe_window_new(DUPE_MATCH_NAME);
+       dupe_window_add_collection(dw, ct->cd);
+}
+
+static void collection_table_popup_print_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+       const gchar *path;
+
+       path = (ct->click_info) ? ct->click_info->path : NULL;
+
+       print_window_new(path, collection_table_selection_get_list(ct), collection_table_get_list(ct), ct->listview);
+}
+
+static void collection_table_popup_show_names_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       collection_table_toggle_filenames(ct);
+}
+
+static void collection_table_popup_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       collection_table_selection_remove(ct, ct->click_info, SELECTION_PRELIGHT, NULL);
+       ct->click_info = NULL;
+       ct->popup = NULL;
+
+       path_list_free(ct->drop_list);
+       ct->drop_list = NULL;
+       ct->drop_info = NULL;
+}
+
+static GtkWidget *collection_table_popup_menu(CollectTable *ct, gint over_icon)
+{
+       GtkWidget *menu;
+       GtkWidget *item;
+
+       menu = popup_menu_short_lived();
+
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(collection_table_popup_destroy_cb), ct);
+
+       menu_item_add_sensitive(menu, _("_View"), over_icon,
+                       G_CALLBACK(collection_table_popup_view_cb), ct);
+       menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, over_icon,
+                       G_CALLBACK(collection_table_popup_view_new_cb), ct);
+       menu_item_add_divider(menu);
+       menu_item_add_stock_sensitive(menu, _("Rem_ove"), GTK_STOCK_REMOVE, over_icon,
+                       G_CALLBACK(collection_table_popup_remove_cb), ct);
+
+       menu_item_add_stock(menu, _("Append from file list"), GTK_STOCK_ADD,
+                       G_CALLBACK(collection_table_popup_add_filelist_cb), ct);
+       menu_item_add_stock(menu, _("Append from collection..."), GTK_STOCK_OPEN,
+                       G_CALLBACK(collection_table_popup_add_collection_cb), ct);
+       menu_item_add_divider(menu);
+       menu_item_add(menu, _("Select all"),
+                       G_CALLBACK(collection_table_popup_selectall_cb), ct);
+       menu_item_add(menu, _("Select none"),
+                       G_CALLBACK(collection_table_popup_unselectall_cb), ct);
+       menu_item_add_divider(menu);
+
+       submenu_add_edit(menu, &item,
+                       G_CALLBACK(collection_table_popup_edit_cb), ct);
+       gtk_widget_set_sensitive(item, over_icon);
+
+       menu_item_add_sensitive(menu, _("_Properties"), over_icon,
+                       G_CALLBACK(collection_table_popup_info_cb), ct);
+       menu_item_add_divider(menu);
+       menu_item_add_stock_sensitive(menu, _("_Copy..."), GTK_STOCK_COPY, over_icon,
+                       G_CALLBACK(collection_table_popup_copy_cb), ct);
+       menu_item_add_sensitive(menu, _("_Move..."), over_icon,
+                       G_CALLBACK(collection_table_popup_move_cb), ct);
+       menu_item_add_sensitive(menu, _("_Rename..."), over_icon,
+                       G_CALLBACK(collection_table_popup_rename_cb), ct);
+       menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, over_icon,
+                       G_CALLBACK(collection_table_popup_delete_cb), ct);
+       menu_item_add_divider(menu);
+
+       submenu_add_sort(menu, G_CALLBACK(collection_table_popup_sort_cb), ct, FALSE, TRUE, FALSE, 0);
+       menu_item_add_check(menu, _("Show filename _text"), ct->show_text,
+                       G_CALLBACK(collection_table_popup_show_names_cb), ct);
+       menu_item_add_divider(menu);
+       menu_item_add_stock(menu, _("_Save collection"), GTK_STOCK_SAVE,
+                       G_CALLBACK(collection_table_popup_save_cb), ct);
+       menu_item_add_stock(menu, _("Save collection _as..."), GTK_STOCK_SAVE_AS,
+                       G_CALLBACK(collection_table_popup_save_as_cb), ct);
+       menu_item_add_divider(menu);
+       menu_item_add_stock(menu, _("_Find duplicates..."), GTK_STOCK_FIND,
+                       G_CALLBACK(collection_table_popup_find_dupes_cb), ct);
+       menu_item_add_stock_sensitive(menu, _("Print..."), GTK_STOCK_PRINT, over_icon,
+                       G_CALLBACK(collection_table_popup_print_cb), ct);               
+
+       return menu;
+}
+/*
+ *-------------------------------------------------------------------
+ * keyboard callbacks
+ *-------------------------------------------------------------------
+ */
+
+static void collection_table_set_focus(CollectTable *ct, CollectInfo *info)
+{
+       GtkTreeIter iter;
+       gint row, col;
+
+       if (g_list_find(ct->cd->list, ct->focus_info))
+               {
+               if (info == ct->focus_info)
+                       {
+                       /* ensure focus row col are correct */
+                       collection_table_find_position(ct, ct->focus_info,
+                                                      &ct->focus_row, &ct->focus_column);
+                       return;
+                       }
+               collection_table_selection_remove(ct, ct->focus_info, SELECTION_FOCUS, NULL);
+               }
+
+       if (!collection_table_find_position(ct, info, &row, &col))
+               {
+               ct->focus_info = NULL;
+               ct->focus_row = -1;
+               ct->focus_column = -1;
+               return;
+               }
+
+       ct->focus_info = info;
+       ct->focus_row = row;
+       ct->focus_column = col;
+       collection_table_selection_add(ct, ct->focus_info, SELECTION_FOCUS, NULL);
+
+       if (collection_table_find_iter(ct, ct->focus_info, &iter, NULL))
+               {
+               GtkTreePath *tpath;
+               GtkTreeViewColumn *column;
+               GtkTreeModel *store;
+
+               tree_view_row_make_visible(GTK_TREE_VIEW(ct->listview), &iter, FALSE);
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(ct->listview));
+               tpath = gtk_tree_model_get_path(store, &iter);
+               /* focus is set to an extra column with 0 width to hide focus, we draw it ourself */
+               column = gtk_tree_view_get_column(GTK_TREE_VIEW(ct->listview), COLLECT_TABLE_MAX_COLUMNS);
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(ct->listview), tpath, column, FALSE);
+               gtk_tree_path_free(tpath);
+               }
+}
+
+static void collection_table_move_focus(CollectTable *ct, gint row, gint col, gint relative)
+{
+       gint new_row;
+       gint new_col;
+
+       if (relative)
+               {
+               new_row = ct->focus_row;
+               new_col = ct->focus_column;
+
+               new_row += row;
+               if (new_row < 0) new_row = 0;
+               if (new_row >= ct->rows) new_row = ct->rows - 1;
+
+               while(col != 0)
+                       {
+                       if (col < 0)
+                               {
+                               new_col--;
+                               col++;
+                               }
+                       else
+                               {
+                               new_col++;
+                               col--;
+                               }
+
+                       if (new_col < 0)
+                               {
+                               if (new_row > 0)
+                                       {
+                                       new_row--;
+                                       new_col = ct->columns - 1;
+                                       }
+                               else
+                                       {
+                                       new_col = 0;
+                                       }
+                               }
+                       if (new_col >= ct->columns)
+                               {
+                               if (new_row < ct->rows - 1)
+                                       {
+                                       new_row++;
+                                       new_col = 0;
+                                       }
+                               else
+                                       {
+                                       new_col = ct->columns - 1;
+                                       }
+                               }
+                       }
+               }
+       else
+               {
+               new_row = row;
+               new_col = col;
+
+               if (new_row >= ct->rows)
+                       {
+                       if (ct->rows > 0)
+                               new_row = ct->rows - 1;
+                       else
+                               new_row = 0;
+                       new_col = ct->columns - 1;
+                       }
+               if (new_col >= ct->columns) new_col = ct->columns - 1;
+               }
+
+       if (new_row == ct->rows - 1)
+               {
+               gint l;
+
+               /* if we moved beyond the last image, go to the last image */
+
+               l = g_list_length(ct->cd->list);
+               if (ct->rows > 1) l -= (ct->rows - 1) * ct->columns;
+               if (new_col >= l) new_col = l - 1;
+               }
+
+       if (new_row == -1 || new_col == -1)
+               {
+               if (!ct->cd->list) return;
+               new_row = new_col = 0;
+               }
+
+       collection_table_set_focus(ct, collection_table_find_data(ct, new_row, new_col, NULL));
+}
+
+static void collection_table_update_focus(CollectTable *ct)
+{
+       gint new_row = 0;
+       gint new_col = 0;
+
+       if (ct->focus_info && collection_table_find_position(ct, ct->focus_info, &new_row, &new_col))
+               {
+               /* first find the old focus, if it exists and is valid */
+               }
+       else
+               {
+               /* (try to) stay where we were */
+               new_row = ct->focus_row;
+               new_col = ct->focus_column;
+               }
+
+       collection_table_move_focus(ct, new_row, new_col, FALSE);
+}
+
+/* used to figure the page up/down distances */
+static gint page_height(CollectTable *ct)
+{
+       GtkAdjustment *adj;
+       gint page_size;
+       gint row_height;
+       gint ret;
+
+       adj = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(ct->listview));
+       page_size = (gint)adj->page_increment;
+
+       row_height = thumb_max_height + THUMB_BORDER_PADDING * 2;
+       if (ct->show_text) row_height += thumb_max_height / 3;
+
+       ret = page_size / row_height;
+       if (ret < 1) ret = 1;
+
+       return ret;
+}
+
+static void collection_table_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
+{
+       CollectTable *ct = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gint column;
+       GtkTreePath *tpath;
+       gint cw, ch;
+
+       if (!collection_table_find_iter(ct, ct->click_info, &iter, &column)) return;
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(ct->listview));
+       tpath = gtk_tree_model_get_path(store, &iter);
+       tree_view_get_cell_clamped(GTK_TREE_VIEW(ct->listview), tpath, column, FALSE, x, y, &cw, &ch);
+       gtk_tree_path_free(tpath);
+       *y += ch;
+       popup_menu_position_clamp(menu, x, y, 0);
+}
+
+static gint collection_table_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       CollectTable *ct = data;
+       gint stop_signal = FALSE;
+       gint focus_row = 0;
+       gint focus_col = 0;
+       CollectInfo *info;
+
+       switch (event->keyval)
+               {
+               case GDK_Left: case GDK_KP_Left:
+                       focus_col = -1;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Right: case GDK_KP_Right:
+                       focus_col = 1;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Up: case GDK_KP_Up:
+                       focus_row = -1;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Down: case GDK_KP_Down:
+                       focus_row = 1;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Page_Up: case GDK_KP_Page_Up:
+                       focus_row = -page_height(ct);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Page_Down: case GDK_KP_Page_Down:
+                       focus_row = page_height(ct);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Home: case GDK_KP_Home:
+                       focus_row = -ct->focus_row;
+                       focus_col = -ct->focus_column;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_End: case GDK_KP_End:
+                       focus_row = ct->rows - 1 - ct->focus_row;
+                       focus_col = ct->columns - 1 - ct->focus_column;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_space:
+                       info = collection_table_find_data(ct, ct->focus_row, ct->focus_column, NULL);
+                       if (info)
+                               {
+                               ct->click_info = info;
+                               if (event->state & GDK_CONTROL_MASK)
+                                       {
+                                       collection_table_select_util(ct, info, !INFO_SELECTED(info));
+                                       }
+                               else
+                                       {
+                                       collection_table_unselect_all(ct);
+                                       collection_table_select(ct, info);
+                                       }
+                               }
+                       stop_signal = TRUE;
+                       break;
+               case 'T': case 't':
+                       if (event->state & GDK_CONTROL_MASK) collection_table_toggle_filenames(ct);
+                       break;
+               case GDK_Menu:
+               case GDK_F10:
+                       info = collection_table_find_data(ct, ct->focus_row, ct->focus_column, NULL);
+                       ct->click_info = info;
+
+                       collection_table_selection_add(ct, ct->click_info, SELECTION_PRELIGHT, NULL);
+                       tip_unschedule(ct);
+
+                       ct->popup = collection_table_popup_menu(ct, (info != NULL));
+                       gtk_menu_popup(GTK_MENU(ct->popup), NULL, NULL, collection_table_menu_pos_cb, ct, 0, GDK_CURRENT_TIME);
+                       stop_signal = TRUE;
+                       break;
+               default:
+                       break;
+               }
+
+       if (focus_row != 0 || focus_col != 0)
+               {
+               CollectInfo *new_info;
+               CollectInfo *old_info;
+
+               old_info = collection_table_find_data(ct, ct->focus_row, ct->focus_column, NULL);
+               collection_table_move_focus(ct, focus_row, focus_col, TRUE);
+               new_info = collection_table_find_data(ct, ct->focus_row, ct->focus_column, NULL);
+
+               if (new_info != old_info)
+                       {
+                       if (event->state & GDK_SHIFT_MASK)
+                               {
+                               if (!collection_rectangular_selection)
+                                       {
+                                       collection_table_select_region_util(ct, old_info, new_info, FALSE);
+                                       }
+                               else
+                                       {
+                                       collection_table_select_region_util(ct, ct->click_info, old_info, FALSE);
+                                       }
+                               collection_table_select_region_util(ct, ct->click_info, new_info, TRUE);
+                               }
+                       else if (event->state & GDK_CONTROL_MASK)
+                               {
+                               ct->click_info = new_info;
+                               }
+                       else
+                               {
+                               ct->click_info = new_info;
+                               collection_table_unselect_all(ct);
+                               collection_table_select(ct, new_info);
+                               }
+                       }
+               }
+
+       if (stop_signal)
+               {
+               g_signal_stop_emission_by_name(GTK_OBJECT(widget), "key_press_event");
+               tip_unschedule(ct);
+               }
+
+       return stop_signal;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * insert marker
+ *-------------------------------------------------------------------
+ */
+
+static CollectInfo *collection_table_insert_find(CollectTable *ct, CollectInfo *source, gint *after, GdkRectangle *cell,
+                                                gint use_coord, gint x, gint y)
+{
+       CollectInfo *info = NULL;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       GtkTreePath *tpath;
+       GtkTreeViewColumn *column;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(ct->listview));
+
+       if (!use_coord) gdk_window_get_pointer(ct->listview->window, &x, &y, NULL);
+
+       if (source)
+               {
+               gint col;
+               if (collection_table_find_iter(ct, source, &iter, &col))
+                       {
+                       tpath = gtk_tree_model_get_path(store, &iter);
+                       column = gtk_tree_view_get_column(GTK_TREE_VIEW(ct->listview), col);
+                       gtk_tree_view_get_background_area(GTK_TREE_VIEW(ct->listview), tpath, column, cell);
+                       gtk_tree_path_free(tpath);
+
+                       info = source;
+                       *after = (x > cell->x + (cell->width / 2));
+                       }
+               return info;
+               }
+
+       if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(ct->listview), x, y,
+                                         &tpath, &column, NULL, NULL))
+               {
+               GList *list;
+               gint n;
+
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, CTABLE_COLUMN_POINTER, &list, -1);
+
+               n = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(column), "column_number"));
+               info = g_list_nth_data(list, n);
+
+               if (info)
+                       {
+                       gtk_tree_view_get_background_area(GTK_TREE_VIEW(ct->listview), tpath, column, cell);
+                       *after = (x > cell->x + (cell->width / 2));
+                       }
+
+               gtk_tree_path_free(tpath);
+               }
+
+       if (info == NULL)
+               {
+               GList *work;
+
+               work = g_list_last(ct->cd->list);
+               if (work)
+                       {
+                       gint col;
+
+                       info = work->data;
+                       *after = TRUE;
+
+                       if (collection_table_find_iter(ct, info, &iter, &col))
+                               {
+                               tpath = gtk_tree_model_get_path(store, &iter);
+                               column = gtk_tree_view_get_column(GTK_TREE_VIEW(ct->listview), col);
+                               gtk_tree_view_get_background_area(GTK_TREE_VIEW(ct->listview), tpath, column, cell);
+                               gtk_tree_path_free(tpath);
+                               }
+                       }
+               }
+
+       return info;
+}
+
+static CollectInfo *collection_table_insert_point(CollectTable *ct, gint x, gint y)
+{
+       CollectInfo *info;
+       GdkRectangle cell;
+       gint after = FALSE;
+
+       info = collection_table_insert_find(ct, NULL, &after, &cell, TRUE, x, y);
+
+       if (info && after)
+               {
+               GList *work;
+
+               work = g_list_find(ct->cd->list, info);
+               if (work && work->next)
+                       {
+                       info = work->next->data;
+                       }
+               else
+                       {
+                       info = NULL;
+                       }
+               }
+
+       return info;
+}
+
+static void collection_table_insert_marker(CollectTable *ct, CollectInfo *info, gint enable)
+{
+       gint row, col;
+       gint after = FALSE;
+       GdkRectangle cell;
+
+       if (!enable)
+               {
+               if (ct->marker_window) gdk_window_destroy(ct->marker_window);
+               ct->marker_window = NULL;
+
+               return;
+               }
+
+       info = collection_table_insert_find(ct, info, &after, &cell, FALSE, 0, 0);
+
+       /* this setting does not take into account (after), but since it is not really used... */
+       ct->marker_info = info;
+
+       row = -1;
+       col = -1;
+
+       if (!ct->marker_window)
+               {
+               GdkWindow *parent;
+               GdkWindowAttr attributes;
+               gint attributes_mask;
+               GdkPixmap *pixmap;
+               GdkBitmap *mask;
+               GdkPixbuf *pb;
+               gint w, h;
+
+               parent = gtk_tree_view_get_bin_window(GTK_TREE_VIEW(ct->listview));
+
+               pb = gdk_pixbuf_new_from_xpm_data((const char **)marker_xpm);
+               gdk_pixbuf_render_pixmap_and_mask(pb, &pixmap, &mask, 128);
+               gdk_pixbuf_unref(pb);
+
+               gdk_drawable_get_size(pixmap, &w, &h);
+
+               attributes.window_type = GDK_WINDOW_CHILD;
+               attributes.wclass = GDK_INPUT_OUTPUT;
+               attributes.width = w;
+               attributes.height = h;
+               attributes.event_mask = gtk_widget_get_events(ct->listview);
+               attributes_mask = 0;
+
+               ct->marker_window = gdk_window_new(parent, &attributes, attributes_mask);
+               gdk_window_set_back_pixmap(ct->marker_window, pixmap, FALSE);
+               gdk_window_shape_combine_mask(ct->marker_window, mask, 0, 0);
+
+               g_object_unref(pixmap);
+               if (mask) g_object_unref(mask);
+               }
+
+       if (info)
+               {
+               gint x, y;
+               gint w, h;
+
+               gdk_drawable_get_size(ct->marker_window, &w, &h);
+
+               if (!after)
+                       {
+                       x = cell.x;
+                       }
+               else
+                       {
+                       x = cell.x + cell.width;
+                       }
+               x -= (w / 2);
+               y = cell.y + (cell.height / 2) - (h / 2);
+
+               gdk_window_move(ct->marker_window, x, y);
+               gdk_window_clear(ct->marker_window);
+               if (!gdk_window_is_visible(ct->marker_window)) gdk_window_show(ct->marker_window);
+               }
+       else
+               {
+               if (gdk_window_is_visible(ct->marker_window)) gdk_window_hide(ct->marker_window);
+               }
+}
+
+/*
+ *-------------------------------------------------------------------
+ * mouse drag auto-scroll
+ *-------------------------------------------------------------------
+ */
+
+static void collection_table_motion_update(CollectTable *ct, gint x, gint y, gint drop_event)
+{
+       CollectInfo *info;
+
+       info = collection_table_find_data_by_coord(ct, x, y, NULL);
+
+       if (drop_event)
+               {
+               tip_unschedule(ct);
+               collection_table_insert_marker(ct, info, TRUE);
+               }
+       else
+               {
+               tip_update(ct, info);
+               }
+}
+
+static gint collection_table_auto_scroll_idle_cb(gpointer data)
+{
+       CollectTable *ct = data;
+       GdkWindow *window;
+       gint x, y;
+       gint w, h;
+
+       if (ct->drop_idle_id == -1) return FALSE;
+
+       window = ct->listview->window;
+       gdk_window_get_pointer(window, &x, &y, NULL);
+       gdk_drawable_get_size(window, &w, &h);
+       if (x >= 0 && x < w && y >= 0 && y < h)
+               {
+               collection_table_motion_update(ct, x, y, TRUE);
+               }
+
+       ct->drop_idle_id = -1;
+       return FALSE;
+}
+
+static gint collection_table_auto_scroll_notify_cb(GtkWidget *widget, gint x, gint y, gpointer data)
+{
+       CollectTable *ct = data;
+
+       if (ct->drop_idle_id == -1) ct->drop_idle_id = g_idle_add(collection_table_auto_scroll_idle_cb, ct);
+
+       return TRUE;
+}
+
+static void collection_table_scroll(CollectTable *ct, gint scroll)
+{
+       if (!scroll)
+               {
+               if (ct->drop_idle_id != -1)
+                       {
+                       g_source_remove(ct->drop_idle_id);
+                       ct->drop_idle_id = -1;
+                       }
+               widget_auto_scroll_stop(ct->listview);
+               collection_table_insert_marker(ct, NULL, FALSE);
+               }
+       else
+               {
+               GtkAdjustment *adj = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(ct->listview));
+               widget_auto_scroll_start(ct->listview, adj, -1, thumb_max_height / 2,
+                                        collection_table_auto_scroll_notify_cb, ct);
+               }
+}
+
+/*
+ *-------------------------------------------------------------------
+ * mouse callbacks
+ *-------------------------------------------------------------------
+ */
+
+static gint collection_table_motion_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       CollectTable *ct = data;
+
+       collection_table_motion_update(ct, (gint)bevent->x, (gint)bevent->y, FALSE);
+
+       return FALSE;
+}
+
+static gint collection_table_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       CollectTable *ct = data;
+       GtkTreeIter iter;
+       CollectInfo *info;
+
+       tip_unschedule(ct);
+
+       info = collection_table_find_data_by_coord(ct, (gint)bevent->x, (gint)bevent->y, &iter);
+
+       ct->click_info = info;
+       collection_table_selection_add(ct, ct->click_info, SELECTION_PRELIGHT, &iter);
+
+       switch (bevent->button)
+               {
+               case 1:
+                       if (bevent->type == GDK_2BUTTON_PRESS)
+                               {
+                               if (info)
+                                       {
+                                       layout_image_set_collection(NULL, ct->cd, info);
+                                       }
+                               }
+                       else if (!GTK_WIDGET_HAS_FOCUS(ct->listview))
+                               {
+                               gtk_widget_grab_focus(ct->listview);
+                               }
+                       break;
+               case 3:
+                       ct->popup = collection_table_popup_menu(ct, (info != NULL));
+                       gtk_menu_popup(GTK_MENU(ct->popup), NULL, NULL, NULL, NULL, bevent->button, bevent->time);
+                       break;
+               default:
+                       break;
+               }
+
+       return TRUE;
+}
+
+static gint collection_table_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       CollectTable *ct = data;
+       GtkTreeIter iter;
+       CollectInfo *info = NULL;
+
+       tip_schedule(ct);
+
+       if ((gint)bevent->x != 0 || (gint) bevent->y != 0)
+               {
+               info = collection_table_find_data_by_coord(ct, (gint)bevent->x, (gint)bevent->y, &iter);
+               }
+
+       if (ct->click_info)
+               {
+               collection_table_selection_remove(ct, ct->click_info, SELECTION_PRELIGHT, NULL);
+               }
+
+       if (bevent->button == 1 &&
+           info && ct->click_info == info)
+               {
+               collection_table_set_focus(ct, info);
+
+               if (bevent->state & GDK_CONTROL_MASK)
+                       {
+                       gint select;
+
+                       select = !INFO_SELECTED(info);
+                       if ((bevent->state & GDK_SHIFT_MASK) && ct->prev_selection)
+                               {
+                               collection_table_select_region_util(ct, ct->prev_selection, info, select);
+                               }
+                       else
+                               {
+                               collection_table_select_util(ct, info, select);
+                               }
+                       }
+               else
+                       {
+                       collection_table_unselect_all(ct);
+
+                       if ((bevent->state & GDK_SHIFT_MASK) &&
+                           ct->prev_selection)
+                               {
+                               collection_table_select_region_util(ct, ct->prev_selection, info, TRUE);
+                               }
+                       else
+                               {
+                               collection_table_select_util(ct, info, TRUE);
+                               }
+                       }
+               }
+       else if (bevent->button == 2 &&
+                info && ct->click_info == info)
+               {
+               collection_table_select_util(ct, info, !INFO_SELECTED(info));
+               }
+
+       return TRUE;
+}
+
+static gint collection_table_leave_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
+{
+       CollectTable *ct = data;
+
+       tip_unschedule(ct);
+       return FALSE;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * populate, add, insert, etc.
+ *-------------------------------------------------------------------
+ */
+
+static gboolean collection_table_destroy_node_cb(GtkTreeModel *store, GtkTreePath *tpath, GtkTreeIter *iter, gpointer data)
+{
+       GList *list;
+
+       gtk_tree_model_get(store, iter, CTABLE_COLUMN_POINTER, &list, -1);
+       g_list_free(list);
+
+       return FALSE;
+}
+
+static void collection_table_clear_store(CollectTable *ct)
+{
+       GtkTreeModel *store;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(ct->listview));
+       gtk_tree_model_foreach(store, collection_table_destroy_node_cb, NULL);
+
+       gtk_list_store_clear(GTK_LIST_STORE(store));
+}
+
+static GList *collection_table_add_row(CollectTable *ct, GtkTreeIter *iter)
+{
+       GtkListStore *store;
+       GList *list = NULL;
+       gint i;
+
+       for (i = 0; i < ct->columns; i++) list = g_list_prepend(list, NULL);
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(ct->listview)));
+       gtk_list_store_append(store, iter);
+       gtk_list_store_set(store, iter, CTABLE_COLUMN_POINTER, list, -1);
+
+       return list;
+}
+
+static void collection_table_populate(CollectTable *ct, gint resize)
+{
+       gint row;
+       GList *work;
+
+       collection_table_verify_selections(ct);
+
+       collection_table_clear_store(ct);
+
+       if (resize)
+               {
+               gint i;
+               gint thumb_width;
+
+               thumb_width = collection_table_get_icon_width(ct);
+
+               for (i = 0; i < COLLECT_TABLE_MAX_COLUMNS; i++)
+                       {
+                       GtkTreeViewColumn *column;
+                       GtkCellRenderer *cell;
+                       GList *list;
+
+                       column = gtk_tree_view_get_column(GTK_TREE_VIEW(ct->listview), i);
+                       gtk_tree_view_column_set_visible(column, (i < ct->columns));
+                       gtk_tree_view_column_set_fixed_width(column, thumb_width + (THUMB_BORDER_PADDING * 6));
+
+                       list = gtk_tree_view_column_get_cell_renderers(column);
+                       cell = (list) ? list->data : NULL;
+                       g_list_free(list);
+
+                       if (cell && GQV_IS_CELL_RENDERER_ICON(cell))
+                               {
+                               g_object_set(G_OBJECT(cell), "fixed_width", thumb_width,
+                                                            "fixed_height", thumb_max_height,
+                                                            "show_text", ct->show_text, NULL);
+                               }
+                       }
+               if (GTK_WIDGET_REALIZED(ct->listview)) gtk_tree_view_columns_autosize(GTK_TREE_VIEW(ct->listview));
+               }
+
+       row = -1;
+       work = ct->cd->list;
+       while (work)
+               {
+               GList *list;
+               GtkTreeIter iter;
+
+               row++;
+
+               list = collection_table_add_row(ct, &iter);
+               while (work && list)
+                       {
+                       list->data = work->data;
+                       list = list->next;
+                       work = work->next;
+                       }
+               }
+
+       ct->rows = row + 1;
+
+       collection_table_update_focus(ct);
+       collection_table_update_status(ct);
+}
+
+static void collection_table_populate_at_new_size(CollectTable *ct, gint w, gint h, gint force)
+{
+       gint new_cols;
+       gint thumb_width;
+
+       thumb_width = collection_table_get_icon_width(ct);
+
+       new_cols = w / (thumb_width + (THUMB_BORDER_PADDING * 6));
+       if (new_cols < 1) new_cols = 1;
+
+       if (!force && new_cols == ct->columns) return;
+
+       ct->columns = new_cols;
+
+       collection_table_populate(ct, TRUE);
+
+       if (debug) printf("col tab pop cols=%d rows=%d\n", ct->columns, ct->rows);
+}
+
+static void collection_table_sync(CollectTable *ct)
+{
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       GList *work;
+       gint r, c;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(ct->listview));
+
+       r = -1;
+       c = 0;
+
+       work = ct->cd->list;
+       while (work)
+               {
+               GList *list;
+               r++;
+               c = 0;
+               if (gtk_tree_model_iter_nth_child(store, &iter, NULL, r))
+                       {
+                       gtk_tree_model_get(store, &iter, CTABLE_COLUMN_POINTER, &list, -1);
+                       gtk_list_store_set(GTK_LIST_STORE(store), &iter, CTABLE_COLUMN_POINTER, list, -1);
+                       }
+               else
+                       {
+                       list = collection_table_add_row(ct, &iter);
+                       }
+
+               while (list)
+                       {
+                       CollectInfo *info;
+                       if (work)
+                               {
+                               info = work->data;
+                               work = work->next;
+                               c++;
+                               }
+                       else
+                               {
+                               info = NULL;
+                               }
+                       if (list)
+                               {
+                               list->data = info;
+                               list = list->next;
+                               }
+                       }
+               }
+
+       r++;
+       while (gtk_tree_model_iter_nth_child(store, &iter, NULL, r))
+               {
+               GList *list;
+
+               gtk_tree_model_get(store, &iter, CTABLE_COLUMN_POINTER, &list, -1);
+               gtk_list_store_remove(GTK_LIST_STORE(store), &iter);
+               g_list_free(list);
+               }
+
+       ct->rows = r;
+
+       collection_table_update_focus(ct);
+       collection_table_update_status(ct);
+}
+
+static gint collection_table_sync_idle_cb(gpointer data)
+{
+       CollectTable *ct = data;
+
+       if (ct->sync_idle_id == -1) return FALSE;
+       ct->sync_idle_id = -1;
+
+       collection_table_sync(ct);
+       return FALSE;
+}
+
+static void collection_table_sync_idle(CollectTable *ct)
+{
+       if (ct->sync_idle_id == -1)
+               {
+               /* high priority, the view needs to be resynced before a redraw
+                * may contain invalid pointers at this time
+                */
+               ct->sync_idle_id = g_idle_add_full(G_PRIORITY_HIGH, collection_table_sync_idle_cb, ct, NULL);
+               }
+}
+
+void collection_table_add_path_list(CollectTable *ct, GList *list)
+{
+       GList *work;
+
+       if (!list) return;
+
+       work = list;
+       while (work)
+               {
+               collection_add(ct->cd, (gchar *)work->data, FALSE);
+               work = work->next;
+               }
+}
+
+static void collection_table_insert_path_list(CollectTable *ct, GList *list, CollectInfo *insert_info)
+{
+       GList *work;
+
+       if (!list) return;
+
+       work = list;
+       while (work)
+               {
+               collection_insert(ct->cd, (gchar *)work->data, insert_info, FALSE);
+               work = work->next;
+               }
+
+       collection_table_sync_idle(ct);
+}
+
+static void collection_table_move_by_info_list(CollectTable *ct, GList *info_list, gint row, gint col)
+{
+       GList *work;
+       GList *insert_pos = NULL;
+       GList *temp;
+       CollectInfo *info;
+
+       if (!info_list) return;
+
+       info = collection_table_find_data(ct, row, col, NULL);
+
+       if (!info_list->next && info_list->data == info) return;
+
+       if (info) insert_pos = g_list_find(ct->cd->list, info);
+
+       /* FIXME: this may get slow for large lists */
+       work = info_list;
+       while (insert_pos && work)
+               {
+               if (insert_pos->data == work->data)
+                       {
+                       insert_pos = insert_pos->next;
+                       work = info_list;
+                       }
+               else
+                       {
+                       work = work->next;
+                       }
+               }
+
+       work = info_list;
+       while (work)
+               {
+               ct->cd->list = g_list_remove(ct->cd->list, work->data);
+               work = work->next;
+               }
+
+       /* place them back in */
+       temp = g_list_copy(info_list);
+
+       if (insert_pos)
+               {
+               ct->cd->list = uig_list_insert_list(ct->cd->list, insert_pos, temp);
+               }
+       else if (info)
+               {
+               ct->cd->list = g_list_concat(temp, ct->cd->list);
+               }
+       else
+               {
+               ct->cd->list = g_list_concat(ct->cd->list, temp);
+               }
+
+       ct->cd->changed = TRUE;
+
+       collection_table_sync_idle(ct);
+}
+
+
+/*
+ *-------------------------------------------------------------------
+ * updating
+ *-------------------------------------------------------------------
+ */
+
+void collection_table_file_update(CollectTable *ct, CollectInfo *info)
+{
+       GtkTreeIter iter;
+       gint row, col;
+       gdouble value;
+
+       if (!info)
+               {
+               collection_table_update_extras(ct, FALSE, 0.0);
+               return;
+               }
+
+       if (!collection_table_find_position(ct, info, &row, &col)) return;
+
+       if (ct->columns != 0 && ct->rows != 0)
+               {
+               value = (gdouble)(row * ct->columns + col) / (ct->columns * ct->rows);
+               }
+       else
+               {
+               value = 0.0;
+               }
+
+       collection_table_update_extras(ct, TRUE, value);
+
+       if (collection_table_find_iter(ct, info, &iter, NULL))
+               {
+               GtkTreeModel *store;
+               GList *list;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(ct->listview));
+               gtk_tree_model_get(store, &iter, CTABLE_COLUMN_POINTER, &list, -1);
+               gtk_list_store_set(GTK_LIST_STORE(store), &iter, CTABLE_COLUMN_POINTER, list, -1);
+               }
+}
+
+void collection_table_file_add(CollectTable *ct, CollectInfo *info)
+{
+       collection_table_sync_idle(ct);
+}
+
+void collection_table_file_insert(CollectTable *ct, CollectInfo *ci)
+{
+       collection_table_sync_idle(ct);
+}
+
+void collection_table_file_remove(CollectTable *ct, CollectInfo *ci)
+{
+       if (ci && INFO_SELECTED(ci))
+               {
+               ct->selection = g_list_remove(ct->selection, ci);
+               }
+
+       collection_table_sync_idle(ct);
+}
+
+void collection_table_refresh(CollectTable *ct)
+{
+       collection_table_populate(ct, FALSE);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * dnd
+ *-------------------------------------------------------------------
+ */
+
+static void collection_table_add_dir_recursive(CollectTable *ct, gchar *path, gint recursive)
+{
+       GList *d = NULL;
+       GList *f = NULL;
+
+       if (path_list(path, &f, recursive ? &d : NULL))
+               {
+               GList *work;
+
+               f = path_list_filter(f, FALSE);
+               d = path_list_filter(d, TRUE);
+
+               f = path_list_sort(f);
+               d = path_list_sort(d);
+
+               collection_table_insert_path_list(ct, f, ct->marker_info);
+
+               work = g_list_last(d);
+               while (work)
+                       {
+                       collection_table_add_dir_recursive(ct, (gchar *)work->data, TRUE);
+                       work = work->prev;
+                       }
+               path_list_free(f);
+               path_list_free(d);
+               }
+}
+
+static void confirm_dir_list_do(CollectTable *ct, GList *list, gint recursive)
+{
+       GList *work = list;
+       while (work)
+               {
+               gchar *path = work->data;
+               work = work->next;
+               if (isdir(path)) collection_table_add_dir_recursive(ct, path, recursive);
+               }
+       collection_table_insert_path_list(ct, list, ct->marker_info);
+}
+
+
+static void confirm_dir_list_add(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       confirm_dir_list_do(ct, ct->drop_list, FALSE);
+}
+
+static void confirm_dir_list_recurse(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       confirm_dir_list_do(ct, ct->drop_list, TRUE);
+}
+
+static void confirm_dir_list_skip(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       collection_table_insert_path_list(ct, ct->drop_list, ct->marker_info);
+}
+
+static GtkWidget *collection_table_drop_menu(CollectTable *ct)
+{
+       GtkWidget *menu;
+
+       menu = popup_menu_short_lived();
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(collection_table_popup_destroy_cb), ct);
+
+       menu_item_add_stock(menu, _("Dropped list includes folders."), GTK_STOCK_DND_MULTIPLE, NULL, NULL);
+       menu_item_add_divider(menu);
+       menu_item_add_stock(menu, _("_Add contents"), GTK_STOCK_OK,
+                           G_CALLBACK(confirm_dir_list_add), ct);
+       menu_item_add_stock(menu, _("Add contents _recursive"), GTK_STOCK_ADD,
+                           G_CALLBACK(confirm_dir_list_recurse), ct);
+       menu_item_add_stock(menu, _("_Skip folders"), GTK_STOCK_REMOVE,
+                           G_CALLBACK(confirm_dir_list_skip), ct);
+       menu_item_add_divider(menu);
+       menu_item_add_stock(menu, _("Cancel"), GTK_STOCK_CANCEL, NULL, ct);
+
+       return menu;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * dnd
+ *-------------------------------------------------------------------
+ */
+
+static GtkTargetEntry collection_drag_types[] = {
+       { "application/x-gqview-collection-member", 0, TARGET_APP_COLLECTION_MEMBER },
+       { "text/uri-list", 0, TARGET_URI_LIST },
+       { "text/plain", 0, TARGET_TEXT_PLAIN }
+};
+static gint n_collection_drag_types = 3;
+
+static GtkTargetEntry collection_drop_types[] = {
+       { "application/x-gqview-collection-member", 0, TARGET_APP_COLLECTION_MEMBER },
+       { "text/uri-list", 0, TARGET_URI_LIST }
+};
+static gint n_collection_drop_types = 2;
+
+
+static void collection_table_dnd_get(GtkWidget *widget, GdkDragContext *context,
+                                    GtkSelectionData *selection_data, guint info,
+                                    guint time, gpointer data)
+{
+       CollectTable *ct = data;
+       gint selected;
+       GList *list = NULL;
+       gchar *uri_text = NULL;
+       gint total;
+
+       if (!ct->click_info) return;
+
+       selected = INFO_SELECTED(ct->click_info);
+       
+       switch (info)
+               {
+               case TARGET_APP_COLLECTION_MEMBER:
+                       if (selected)
+                               {
+                               uri_text = collection_info_list_to_dnd_data(ct->cd, ct->selection, &total);
+                               }
+                       else
+                               {
+                               list = g_list_append(NULL, ct->click_info);
+                               uri_text = collection_info_list_to_dnd_data(ct->cd, list, &total);
+                               g_list_free(list);
+                               }
+                       break;
+               case TARGET_URI_LIST:
+               case TARGET_TEXT_PLAIN:
+               default:
+                       if (selected)
+                               {
+                               list = collection_table_selection_get_list(ct);
+                               }
+                       else
+                               {
+                               const gchar *path = ct->click_info->path;
+
+                               list = g_list_append(NULL, g_strdup(path));
+                               }
+                       if (!list) return;
+
+                       uri_text = uri_text_from_list(list, &total, (info == TARGET_TEXT_PLAIN));
+                       path_list_free(list);
+                       break;
+               }
+
+       gtk_selection_data_set(selection_data, selection_data->target,
+                              8, uri_text, total);
+       g_free(uri_text);
+}
+
+
+static void collection_table_dnd_receive(GtkWidget *widget, GdkDragContext *context,
+                                         gint x, gint y,
+                                         GtkSelectionData *selection_data, guint info,
+                                         guint time, gpointer data)
+{
+       CollectTable *ct = data;
+       GList *list = NULL;
+       GList *info_list = NULL;
+       CollectionData *source;
+       CollectInfo *drop_info;
+       GList *work;
+
+       if (debug) printf(selection_data->data);
+
+       collection_table_scroll(ct, FALSE);
+       collection_table_insert_marker(ct, NULL, FALSE);
+
+       drop_info = collection_table_insert_point(ct, x, y);
+
+       switch (info)
+               {
+               case TARGET_APP_COLLECTION_MEMBER:
+                       source = collection_from_dnd_data((gchar *)selection_data->data, &list, &info_list);
+                       if (source)
+                               {
+                               if (source == ct->cd)
+                                       {
+                                       gint row = -1;
+                                       gint col = -1;
+
+                                       /* it is a move within a collection */
+                                       path_list_free(list);
+                                       list = NULL;
+
+                                       if (!drop_info)
+                                               {
+                                               collection_table_move_by_info_list(ct, info_list, -1, -1);
+                                               }
+                                       else if (collection_table_find_position(ct, drop_info, &row, &col))
+                                               {
+                                               collection_table_move_by_info_list(ct, info_list, row, col);
+                                               }
+                                       }
+                               else
+                                       {
+                                       /* it is a move/copy across collections */
+                                       if (context->action == GDK_ACTION_MOVE)
+                                               {
+                                               collection_remove_by_info_list(source, info_list);
+                                               }
+                                       }
+                               g_list_free(info_list);
+                               }
+                       break;
+               case TARGET_URI_LIST:
+                       list = uri_list_from_text(selection_data->data, TRUE);
+                       work = list;
+                       while (work)
+                               {
+                               if (isdir((gchar *)work->data))
+                                       {
+                                       GtkWidget *menu;
+
+                                       ct->drop_list = list;
+                                       ct->drop_info = drop_info;
+                                       menu = collection_table_drop_menu(ct);
+                                       gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, time);
+                                       return;
+                                       }
+                               work = work->next;
+                               }
+                       break;
+               default:
+                       list = NULL;
+                       break;
+               }
+
+       if (list)
+               {
+               collection_table_insert_path_list(ct, list, drop_info);
+               path_list_free(list);
+               }
+}
+
+static void collection_table_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       CollectTable *ct = data;
+
+       if (ct->click_info && ct->click_info->pixbuf)
+               {
+               gint items;
+
+               if (INFO_SELECTED(ct->click_info))
+                       items = g_list_length(ct->selection);
+               else
+                       items = 1;
+               dnd_set_drag_icon(widget, context, ct->click_info->pixbuf, items);
+               }
+}
+
+static void collection_table_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       CollectTable *ct = data;
+
+       /* apparently a leave event is not generated on a drop */
+       tip_unschedule(ct);
+
+       collection_table_scroll(ct, FALSE);
+}
+
+static gint collection_table_dnd_motion(GtkWidget *widget, GdkDragContext *context,
+                                       gint x, gint y, guint time, gpointer data)
+{
+       CollectTable *ct = data;
+
+       collection_table_motion_update(ct, x, y, TRUE);
+       collection_table_scroll(ct, TRUE);
+
+       return FALSE;
+}
+
+static void collection_table_dnd_leave(GtkWidget *widget, GdkDragContext *context, guint time, gpointer data)
+{
+       CollectTable *ct = data;
+
+       collection_table_scroll(ct, FALSE);
+}
+static void collection_table_dnd_init(CollectTable *ct)
+{
+       gtk_drag_source_set(ct->listview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+                           collection_drag_types, n_collection_drag_types,
+                           GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+       g_signal_connect(G_OBJECT(ct->listview), "drag_data_get",
+                        G_CALLBACK(collection_table_dnd_get), ct);
+       g_signal_connect(G_OBJECT(ct->listview), "drag_begin",
+                        G_CALLBACK(collection_table_dnd_begin), ct);
+       g_signal_connect(G_OBJECT(ct->listview), "drag_end",
+                        G_CALLBACK(collection_table_dnd_end), ct);
+
+       gtk_drag_dest_set(ct->listview,
+                         GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP,
+                         collection_drop_types, n_collection_drop_types,
+                         GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK);
+       g_signal_connect(G_OBJECT(ct->listview), "drag_motion",
+                        G_CALLBACK(collection_table_dnd_motion), ct);
+       g_signal_connect(G_OBJECT(ct->listview), "drag_leave",
+                        G_CALLBACK(collection_table_dnd_leave), ct);
+       g_signal_connect(G_OBJECT(ct->listview), "drag_data_received",
+                        G_CALLBACK(collection_table_dnd_receive), ct);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * draw, etc.
+ *-----------------------------------------------------------------------------
+ */
+
+typedef struct _ColumnData ColumnData;
+struct _ColumnData
+{
+       CollectTable *ct;
+       gint number;
+};
+
+static void collection_table_cell_data_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
+                                         GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+{
+       ColumnData *cd = data;
+       CollectTable *ct;
+       GtkStyle *style;
+       GList *list;
+       CollectInfo *info;
+       GdkColor color_fg;
+       GdkColor color_bg;
+
+       ct = cd->ct;
+
+       gtk_tree_model_get(tree_model, iter, CTABLE_COLUMN_POINTER, &list, -1);
+       info = g_list_nth_data(list, cd->number);
+
+       style = gtk_widget_get_style(ct->listview);
+       if (info && (info->flag_mask & SELECTION_SELECTED) )
+               {
+               memcpy(&color_fg, &style->text[GTK_STATE_SELECTED], sizeof(color_fg));
+               memcpy(&color_bg, &style->base[GTK_STATE_SELECTED], sizeof(color_bg));
+               }
+       else
+               {
+               memcpy(&color_fg, &style->text[GTK_STATE_NORMAL], sizeof(color_fg));
+               memcpy(&color_bg, &style->base[GTK_STATE_NORMAL], sizeof(color_bg));
+               }
+
+       if (info && (info->flag_mask & SELECTION_PRELIGHT))
+               {
+#if 0
+               shift_color(&color_fg, -1, 0);
+#endif
+               shift_color(&color_bg, -1, 0);
+               }
+
+       if (GQV_IS_CELL_RENDERER_ICON(cell))
+               {
+               if (info)
+                       {
+                       g_object_set(cell,      "pixbuf", info->pixbuf,
+                                               "text", filename_from_path(info->path),
+                                               "cell-background-gdk", &color_bg,
+                                               "cell-background-set", TRUE,
+                                               "foreground-gdk", &color_fg,
+                                               "foreground-set", TRUE,
+                                               "has-focus", (ct->focus_info == info), NULL);
+                       }
+               else
+                       {
+                       g_object_set(cell,      "pixbuf", NULL,
+                                               "text", NULL,
+                                               "cell-background-set", FALSE,
+                                               "foreground-set", FALSE,
+                                               "has-focus", FALSE,  NULL);
+                       }
+               }
+}
+
+static void collection_table_append_column(CollectTable *ct, gint n)
+{
+       ColumnData *cd;
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_min_width(column, 0);
+
+       gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+       gtk_tree_view_column_set_alignment(column, 0.5);
+
+       renderer = gqv_cell_renderer_icon_new();
+       gtk_tree_view_column_pack_start(column, renderer, FALSE);
+       g_object_set(G_OBJECT(renderer), "xpad", THUMB_BORDER_PADDING * 2,
+                                        "ypad", THUMB_BORDER_PADDING,
+                                        "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
+
+       g_object_set_data(G_OBJECT(column), "column_number", GINT_TO_POINTER(n));
+
+       cd = g_new0(ColumnData, 1);
+       cd->ct = ct;
+       cd->number = n;
+       gtk_tree_view_column_set_cell_data_func(column, renderer, collection_table_cell_data_cb, cd, g_free);
+
+       gtk_tree_view_append_column(GTK_TREE_VIEW(ct->listview), column);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * init, destruction
+ *-------------------------------------------------------------------
+ */
+
+static void collection_table_destroy(GtkWidget *widget, gpointer data)
+{
+       CollectTable *ct = data;
+
+       if (ct->popup)
+               {
+               g_signal_handlers_disconnect_matched(GTK_OBJECT(ct->popup), G_SIGNAL_MATCH_DATA,
+                                                    0, 0, 0, NULL, ct);
+               gtk_widget_destroy(ct->popup);
+               }
+
+       if (ct->sync_idle_id != -1) g_source_remove(ct->sync_idle_id);
+
+       tip_unschedule(ct);
+       collection_table_scroll(ct, FALSE);
+
+       g_free(ct);
+}
+
+static void collection_table_sized(GtkWidget *widget, GtkAllocation *allocation, gpointer data)
+{
+       CollectTable *ct = data;
+
+       collection_table_populate_at_new_size(ct, allocation->width, allocation->height, FALSE);
+}
+
+CollectTable *collection_table_new(CollectionData *cd)
+{
+       CollectTable *ct;
+       GtkListStore *store;
+       GtkTreeSelection *selection;
+       gint i;
+
+       ct = g_new0(CollectTable, 1);
+       ct->cd = cd;
+       ct->columns = 0;
+       ct->rows = 0;
+
+       ct->selection = NULL;
+       ct->prev_selection = NULL;
+
+       ct->tip_window = NULL;
+       ct->tip_delay_id = -1;
+
+       ct->marker_window = NULL;
+       ct->marker_info = NULL;
+
+       ct->status_label = NULL;
+       ct->extra_label = NULL;
+
+       ct->focus_row = 0;
+       ct->focus_column = 0;
+       ct->focus_info = NULL;
+
+       ct->show_text = show_icon_names;
+
+       ct->sync_idle_id = -1;
+       ct->drop_idle_id = -1;
+
+       ct->popup = NULL;
+       ct->drop_info = NULL;
+       ct->drop_list = NULL;
+
+       ct->scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(ct->scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (ct->scrolled),
+                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+       store = gtk_list_store_new(1, G_TYPE_POINTER);
+       ct->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(ct->listview));
+       gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_NONE);
+
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(ct->listview), FALSE);
+       gtk_tree_view_set_enable_search(GTK_TREE_VIEW(ct->listview), FALSE);
+
+       for (i = 0; i < COLLECT_TABLE_MAX_COLUMNS; i++)
+               {
+               collection_table_append_column(ct, i);
+               }
+
+       /* zero width column to hide tree view focus, we draw it ourselves */
+       collection_table_append_column(ct, i);
+       /* end column to fill white space */
+       collection_table_append_column(ct, i);
+
+       g_signal_connect(G_OBJECT(ct->listview), "destroy",
+                        G_CALLBACK(collection_table_destroy), ct);
+       g_signal_connect(G_OBJECT(ct->listview), "size_allocate",
+                        G_CALLBACK(collection_table_sized), ct);
+       g_signal_connect(G_OBJECT(ct->listview), "key_press_event",
+                        G_CALLBACK(collection_table_press_key_cb), ct);
+
+       gtk_container_add(GTK_CONTAINER(ct->scrolled), ct->listview);
+       gtk_widget_show(ct->listview);
+
+       collection_table_dnd_init(ct);
+
+       gtk_widget_set_events(ct->listview, GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK |
+                             GDK_BUTTON_PRESS_MASK | GDK_LEAVE_NOTIFY_MASK);
+       g_signal_connect(G_OBJECT(ct->listview),"button_press_event",
+                        G_CALLBACK(collection_table_press_cb), ct);
+       g_signal_connect(G_OBJECT(ct->listview),"button_release_event",
+                        G_CALLBACK(collection_table_release_cb), ct);
+       g_signal_connect(G_OBJECT(ct->listview),"motion_notify_event",
+                        G_CALLBACK(collection_table_motion_cb), ct);
+       g_signal_connect(G_OBJECT(ct->listview), "leave_notify_event",
+                        G_CALLBACK(collection_table_leave_cb), ct);
+
+       return ct;
+}
+
+void collection_table_set_labels(CollectTable *ct, GtkWidget *status, GtkWidget *extra)
+{
+       ct->status_label = status;
+       ct->extra_label = extra;
+       collection_table_update_status(ct);
+       collection_table_update_extras(ct, FALSE, 0.0);
+}
+
+CollectInfo *collection_table_get_focus_info(CollectTable *ct)
+{
+       return collection_table_find_data(ct, ct->focus_row, ct->focus_column, NULL);
+}
+
diff --git a/src/collect-table.h b/src/collect-table.h
new file mode 100644 (file)
index 0000000..7993f62
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef COLLECT_TABLE_H
+#define COLLECT_TABLE_H
+
+#include "collect.h"
+
+void collection_table_select_all(CollectTable *ct);
+void collection_table_unselect_all(CollectTable *ct);
+
+void collection_table_add_path_list(CollectTable *ct, GList *list);
+
+void collection_table_file_update(CollectTable *ct, CollectInfo *ci);
+void collection_table_file_add(CollectTable *ct, CollectInfo *ci);
+void collection_table_file_insert(CollectTable *ct, CollectInfo *ci);
+void collection_table_file_remove(CollectTable *ct, CollectInfo *ci);
+void collection_table_refresh(CollectTable *ct);
+
+CollectTable *collection_table_new(CollectionData *cd);
+
+void collection_table_set_labels(CollectTable *ct, GtkWidget *status, GtkWidget *extra);
+
+CollectInfo *collection_table_get_focus_info(CollectTable *ct);
+GList *collection_table_selection_get_list(CollectTable *ct);
+
+#endif
+
diff --git a/src/collect.c b/src/collect.c
new file mode 100644 (file)
index 0000000..e11e186
--- /dev/null
@@ -0,0 +1,1241 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "collect.h"
+
+#include "collect-dlg.h"
+#include "collect-io.h"
+#include "collect-table.h"
+#include "editors.h"
+#include "filelist.h"
+#include "img-view.h"
+#include "info.h"
+#include "layout.h"
+#include "layout_image.h"
+#include "utilops.h"
+#include "ui_fileops.h"
+#include "ui_tree_edit.h"
+
+#include <gdk/gdkkeysyms.h> /* for keyboard values */
+
+#include "icons/collect.xpm"
+
+#define COLLECT_DEF_WIDTH 440
+#define COLLECT_DEF_HEIGHT 450
+
+static GList *collection_list = NULL;
+static GList *collection_window_list = NULL;
+
+static void collection_window_get_geometry(CollectWindow *cw);
+static void collection_window_refresh(CollectWindow *cw);
+static void collection_window_update_title(CollectWindow *cw);
+static void collection_window_add(CollectWindow *cw, CollectInfo *ci);
+static void collection_window_insert(CollectWindow *cw, CollectInfo *ci);
+static void collection_window_remove(CollectWindow *cw, CollectInfo *ci);
+static void collection_window_update(CollectWindow *cw, CollectInfo *ci);
+
+static void collection_window_close(CollectWindow *cw);
+
+/*
+ *-------------------------------------------------------------------
+ * data, list handling
+ *-------------------------------------------------------------------
+ */
+
+CollectInfo *collection_info_new(const gchar *path, struct stat *st, GdkPixbuf *pixbuf)
+{
+       CollectInfo *ci;
+
+       if (!path) return NULL;
+
+       ci = g_new0(CollectInfo, 1);
+       ci->path = g_strdup(path);
+       ci->size = st->st_size;
+       ci->date = st->st_mtime;
+
+       ci->pixbuf = pixbuf;
+       if (ci->pixbuf) g_object_ref(ci->pixbuf);
+
+       return ci;
+}
+
+void collection_info_free_thumb(CollectInfo *ci)
+{
+       if (ci->pixbuf) g_object_unref(ci->pixbuf);
+       ci->pixbuf = NULL;
+}
+
+void collection_info_free(CollectInfo *ci)
+{
+       if (!ci) return;
+
+       g_free(ci->path);
+       collection_info_free_thumb(ci);
+       g_free(ci);
+}
+
+void collection_info_set_thumb(CollectInfo *ci, GdkPixbuf *pixbuf)
+{
+       if (pixbuf) g_object_ref(pixbuf);
+       collection_info_free_thumb(ci);
+       ci->pixbuf = pixbuf;
+}
+
+gint collection_info_load_thumb(CollectInfo *ci)
+{
+       if (!ci) return FALSE;
+
+       collection_info_free_thumb(ci);
+
+       printf("collection_info_load_thumb not implemented!\n(because an instant thumb loader not implemented)");
+       return FALSE;
+#if 0  
+       if (create_thumbnail(ci->path, &ci->pixmap, &ci->mask) < 0) return FALSE;
+
+       if (ci->pixmap) gdk_pixmap_ref(ci->pixmap);
+       if (ci->mask) gdk_bitmap_ref(ci->mask);
+
+       return TRUE;
+#endif
+}
+
+void collection_list_free(GList *list)
+{
+       GList *work;
+       work = list;
+       while(work)
+               {
+               collection_info_free((CollectInfo *)work->data);
+               work = work->next;
+               }
+       g_list_free(list);
+}
+
+/* an ugly static var, well what ya gonna do ? */
+static SortType collection_list_sort_method = SORT_NAME;
+
+static gint collection_list_sort_cb(gconstpointer a, gconstpointer b)
+{
+       const CollectInfo *cia = a;
+       const CollectInfo *cib = b;
+
+       switch(collection_list_sort_method)
+               {
+               case SORT_NONE:
+                       return 0;
+                       break;
+               case SORT_SIZE:
+                       if (cia->size < cib->size) return -1;
+                       if (cia->size > cib->size) return 1;
+                       return 0;
+                       break;
+               case SORT_TIME:
+                       if (cia->date < cib->date) return -1;
+                       if (cia->date > cib->date) return 1;
+                       return 0;
+                       break;
+               case SORT_PATH:
+                       return CASE_SORT(cia->path, cib->path);
+                       break;
+#ifdef HAVE_STRVERSCMP
+               case SORT_NUMBER:
+                       return strverscmp(filename_from_path(cia->path), filename_from_path(cib->path));
+                       break;
+#endif
+               case SORT_NAME:
+               default:
+                       return CASE_SORT(filename_from_path(cia->path), filename_from_path(cib->path));
+                       break;
+               }
+
+       return 0;
+}
+
+GList *collection_list_sort(GList *list, SortType method)
+{
+       if (method == SORT_NONE) return list;
+
+       collection_list_sort_method = method;
+
+       return g_list_sort(list, collection_list_sort_cb);
+}
+
+GList *collection_list_add(GList *list, CollectInfo *ci, SortType method)
+{
+       if (method != SORT_NONE)
+               {
+               collection_list_sort_method = method;
+               list = g_list_insert_sorted(list, ci, collection_list_sort_cb);
+               }
+       else
+               {
+               list = g_list_append(list, ci);
+               }
+
+       return list;
+}
+
+GList *collection_list_insert(GList *list, CollectInfo *ci, CollectInfo *insert_ci, SortType method)
+{
+       if (method != SORT_NONE)
+               {
+               collection_list_sort_method = method;
+               list = g_list_insert_sorted(list, ci, collection_list_sort_cb);
+               }
+       else
+               {
+               GList *point;
+
+               point = g_list_find(list, insert_ci);
+               list = uig_list_insert_link(list, point, ci);
+               }
+
+       return list;
+}
+
+GList *collection_list_remove(GList *list, CollectInfo *ci)
+{
+       list = g_list_remove(list, ci);
+       collection_info_free(ci);
+       return list;
+}
+
+CollectInfo *collection_list_find(GList *list, const gchar *path)
+{
+       GList *work = list;
+
+       while(work)
+               {
+               CollectInfo *ci = work->data;
+               if (strcmp(ci->path, path) == 0) return ci;
+               work = work->next;
+               }
+
+       return NULL;
+}
+
+#if 0
+static GList *collection_list_find_link(GList *list, gchar *path)
+{
+       GList *work = list;
+
+       while(work)
+               {
+               CollectInfo *ci = work->data;
+               if (strcmp(ci->path, path) == 0) return work;
+               work = work->next;
+               }
+
+       return NULL;
+}
+
+static gint collection_list_find_index(GList *list, gchar *path)
+{
+       gint c = 0;
+       GList *work = list;
+
+       while(work)
+               {
+               CollectInfo *ci = work->data;
+               if (strcmp(ci->path, path) == 0) return c;
+               work = work->next;
+               c++;
+               }
+
+       return -1;
+}
+#endif
+
+GList *collection_list_to_path_list(GList *list)
+{
+       GList *pathlist = NULL;
+       GList *work = list;
+
+       while (work)
+               {
+               CollectInfo *info = work->data;
+               pathlist = g_list_prepend(pathlist, g_strdup(info->path));
+               work = work->next;
+               }
+
+       pathlist = g_list_reverse(pathlist);
+       return pathlist;
+}
+
+CollectWindow *collection_window_find(CollectionData *cd)
+{
+       GList *work;
+
+       work = collection_window_list;
+       while (work)
+               {
+               CollectWindow *cw = work->data;
+               if (cw->cd == cd) return cw;
+               work = work->next;
+               }
+
+       return NULL;
+}
+
+CollectWindow *collection_window_find_by_path(const gchar *path)
+{
+       GList *work;
+
+       if (!path) return NULL;
+
+       work = collection_window_list;
+       while (work)
+               {
+               CollectWindow *cw = work->data;
+               if (cw->cd->path && strcmp(cw->cd->path, path) == 0) return cw;
+               work = work->next;
+               }
+
+       return NULL;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * please use these to actually add/remove stuff
+ *-------------------------------------------------------------------
+ */
+
+CollectionData *collection_new(const gchar *path)
+{
+       CollectionData *cd;
+       static gint untitled_counter = 0;
+
+       cd = g_new0(CollectionData, 1);
+
+       collection_list = g_list_append(collection_list, cd);
+
+       cd->ref = 1;    /* starts with a ref of 1 */
+
+       cd->list = NULL;
+       cd->sort_method = SORT_NONE;
+       cd->thumb_loader = NULL;
+       cd->info_updated_func = NULL;
+
+       cd->window_read = FALSE;
+       cd->window_x = 0;
+       cd->window_y = 0;
+       cd->window_w = COLLECT_DEF_WIDTH;
+       cd->window_h = COLLECT_DEF_HEIGHT;
+
+       cd->changed = FALSE;
+
+       if (path)
+               {
+               cd->path = g_strdup(path);
+               cd->name = g_strdup(filename_from_path(cd->path));
+               /* load it */
+               }
+       else
+               {
+               cd->path = NULL;
+
+               if (untitled_counter == 0)
+                       {
+                       cd->name = g_strdup(_("Untitled"));
+                       }
+               else
+                       {
+                       cd->name = g_strdup_printf(_("Untitled (%d)"), untitled_counter + 1);
+                       }
+
+               untitled_counter++;
+               }
+
+       return cd;
+}
+
+void collection_free(CollectionData *cd)
+{
+       if (!cd) return;
+
+       if (debug) printf("collection \"%s\" freed\n", cd->name);
+
+       collection_load_stop(cd);
+       collection_list_free(cd->list);
+
+       collection_list = g_list_remove(collection_list, cd);
+
+       g_free(cd->path);
+       g_free(cd->name);
+
+       g_free(cd);
+}
+
+void collection_ref(CollectionData *cd)
+{
+       cd->ref++;
+
+       if (debug) printf("collection \"%s\" ref count = %d\n", cd->name, cd->ref);
+}
+
+void collection_unref(CollectionData *cd)
+{
+       cd->ref--;
+
+       if (debug) printf("collection \"%s\" ref count = %d\n", cd->name, cd->ref);
+
+       if (cd->ref < 1)
+               {
+               collection_free(cd);
+               }
+}
+
+void collection_path_changed(CollectionData *cd)
+{
+       collection_window_update_title(collection_window_find(cd));
+}
+
+gint collection_to_number(CollectionData *cd)
+{
+       return g_list_index(collection_list, cd);
+}
+
+CollectionData *collection_from_number(gint n)
+{
+       return g_list_nth_data(collection_list, n);
+}
+
+CollectionData *collection_from_dnd_data(const gchar *data, GList **list, GList **info_list)
+{
+       CollectionData *cd;
+       gint n;
+
+       if (strncmp(data, "COLLECTION:", 11) != 0) return NULL;
+
+       n = (gint)strtol(data + 11, NULL, 10);
+       cd = collection_from_number(n);
+
+       if (!cd || (!list && !info_list))
+               {
+               return cd;
+               }
+       else
+               {
+               GList *work = NULL;
+               GList *infol = NULL;
+               gint b, e;
+
+               b = 0;
+               while(data[b] != '\0' && data[b] != '\n' ) b++;
+               b++;
+               e = b;
+
+               while (data[b] != '\0')
+                       {
+                       CollectInfo *info;
+
+                       while (data[e] != '\n' && data[e] != '\0') e++;
+                       n = (gint)strtol(data + b, NULL, 10);
+
+                       info = g_list_nth_data(cd->list, n);
+                       if (info && list) work = g_list_append(work, g_strdup(info->path));
+                       if (info && info_list) infol = g_list_append(infol, info);
+
+                       while (data[e] == '\n') e++;
+                       b = e;
+                       }
+               if (list) *list = work;
+               if (info_list) *info_list = infol;
+               }
+
+       return cd;
+}
+
+gchar *collection_info_list_to_dnd_data(CollectionData *cd, GList *list, gint *length)
+{
+       gchar *uri_text = NULL;
+       gint total;
+       GList *work;
+       gint n;
+       GList *temp;
+       gchar *ptr;
+
+       n = collection_to_number(cd);
+
+       if (!list || n < 0)
+               {
+               *length = 0;
+               return NULL;
+               }
+
+       temp = NULL;
+       temp = g_list_prepend(temp, g_strdup_printf("COLLECTION:%d\n", n));
+       work = list;
+       while(work)
+               {
+               n = g_list_index(cd->list, work->data);
+               if (n >= 0)
+                       {
+                       temp = g_list_prepend(temp, g_strdup_printf("%d\n", n));
+                       }
+               work = work->next;
+               }
+
+       total = 0;
+       work = temp;
+       while(work)
+               {
+               total += strlen((gchar *)work->data);
+               work = work->next;
+               }
+       total += 1;
+
+       uri_text = g_malloc(total);
+       ptr = uri_text;
+
+       work = g_list_last(temp);
+       while(work)
+               {
+               gchar *text = work->data;
+
+               work = work->prev;
+
+               strcpy(ptr, text);
+               ptr += strlen(text);
+               }
+
+       ptr[0] = '\0';
+
+       path_list_free(temp);
+
+       *length = total;
+
+       return uri_text;
+}
+
+gint collection_info_valid(CollectionData *cd, CollectInfo *info)
+{
+       if (collection_to_number(cd) < 0) return FALSE;
+
+       return (g_list_index(cd->list, info) != 0);
+}
+
+CollectInfo *collection_next_by_info(CollectionData *cd, CollectInfo *info)
+{
+       GList *work;
+
+       work = g_list_find(cd->list, info);
+
+       if (!work) return NULL;
+       work = work->next;
+       if (work) return work->data;
+       return NULL;
+}
+
+CollectInfo *collection_prev_by_info(CollectionData *cd, CollectInfo *info)
+{
+       GList *work;
+
+       work = g_list_find(cd->list, info);
+
+       if (!work) return NULL;
+       work = work->prev;
+       if (work) return work->data;
+       return NULL;
+}
+
+CollectInfo *collection_get_first(CollectionData *cd)
+{
+       if (cd->list) return cd->list->data;
+
+       return NULL;
+}
+
+CollectInfo *collection_get_last(CollectionData *cd)
+{
+       GList *list;
+
+       list = g_list_last(cd->list);
+
+       if (list) return list->data;
+
+       return NULL;
+}
+
+void collection_set_sort_method(CollectionData *cd, SortType method)
+{
+       if (!cd) return;
+
+       if (cd->sort_method == method) return;
+
+       cd->sort_method = method;
+       cd->list = collection_list_sort(cd->list, cd->sort_method);
+       if (cd->list) cd->changed = TRUE;
+
+       collection_window_refresh(collection_window_find(cd));
+}
+
+void collection_set_update_info_func(CollectionData *cd,
+                                    void (*func)(CollectionData *, CollectInfo *, gpointer), gpointer data)
+{
+       cd->info_updated_func = func;
+       cd->info_updated_data = data;
+}
+
+gint collection_add_check(CollectionData *cd, const gchar *path, gint sorted, gint must_exist)
+{
+       struct stat st;
+       gint valid;
+
+       if (must_exist)
+               {
+               valid = (stat_utf8(path, &st) && !S_ISDIR(st.st_mode));
+               }
+       else
+               {
+               valid = TRUE;
+               st.st_size = 0;
+               st.st_mtime = 0;
+               }
+
+       if (valid)
+               {
+               CollectInfo *ci;
+               ci = collection_info_new(path, &st, NULL);
+               cd->list = collection_list_add(cd->list, ci, sorted ? cd->sort_method : SORT_NONE);
+               cd->changed = TRUE;
+
+               if (!sorted || cd->sort_method == SORT_NONE)
+                       {
+                       collection_window_add(collection_window_find(cd), ci);
+                       }
+               else
+                       {
+                       collection_window_insert(collection_window_find(cd), ci);
+                       }
+               }
+
+       return valid;
+}
+
+gint collection_add(CollectionData *cd, const gchar *path, gint sorted)
+{
+       return collection_add_check(cd, path, sorted, TRUE);
+}
+
+gint collection_insert(CollectionData *cd, const gchar *path, CollectInfo *insert_ci, gint sorted)
+{
+       struct stat st;
+
+       if (!insert_ci) return collection_add(cd, path, sorted);
+
+       if (stat_utf8(path, &st) >= 0 && !S_ISDIR(st.st_mode))
+               {
+               CollectInfo *ci;
+               ci = collection_info_new(path, &st, NULL);
+               cd->list = collection_list_insert(cd->list, ci, insert_ci, sorted ? cd->sort_method : SORT_NONE);
+               cd->changed = TRUE;
+
+               collection_window_insert(collection_window_find(cd), ci);
+
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+gint collection_remove(CollectionData *cd, const gchar *path)
+{
+       CollectInfo *ci;
+
+       ci = collection_list_find(cd->list, path);
+
+       if (!ci) return FALSE;
+
+       cd->list = g_list_remove(cd->list, ci);
+       cd->changed = TRUE;
+
+       collection_window_remove(collection_window_find(cd), ci);
+       collection_info_free(ci);
+
+       return TRUE;
+}
+
+static void collection_remove_by_info(CollectionData *cd, CollectInfo *info)
+{
+       if (!info || !g_list_find(cd->list, info)) return;
+
+       cd->list = g_list_remove(cd->list, info);
+       cd->changed = (cd->list != NULL);
+
+       collection_window_remove(collection_window_find(cd), info);
+       collection_info_free(info);
+}
+
+void collection_remove_by_info_list(CollectionData *cd, GList *list)
+{
+       GList *work;
+
+       if (!list) return;
+
+       if (!list->next)
+               {
+               /* more efficient (in collect-table) to remove a single item this way */
+               collection_remove_by_info(cd, (CollectInfo *)list->data);
+               return;
+               }
+
+       work = list;
+       while(work)
+               {
+               cd->list = collection_list_remove(cd->list, work->data);
+               work = work->next;
+               }
+       cd->changed = (cd->list != NULL);
+
+       collection_window_refresh(collection_window_find(cd));
+}
+
+gint collection_rename(CollectionData *cd, const gchar *source, const gchar *dest)
+{
+       CollectInfo *ci;
+
+       ci = collection_list_find(cd->list, source);
+
+       if (!ci) return FALSE;
+
+       g_free(ci->path);
+       ci->path = g_strdup(dest);
+       cd->changed = TRUE;
+
+       collection_window_update(collection_window_find(cd), ci);
+
+       return TRUE;
+}
+
+void collection_update_geometry(CollectionData *cd)
+{
+       collection_window_get_geometry(collection_window_find(cd));
+}
+
+/*
+ *-------------------------------------------------------------------
+ * simple maintenance for renaming, deleting
+ *-------------------------------------------------------------------
+ */
+
+void collection_maint_removed(const gchar *path)
+{
+       GList *work;
+
+       work = collection_list;
+       while(work)
+               {
+               CollectionData *cd = work->data;
+               work = work->next;
+
+               while(collection_remove(cd, path));
+               }
+#if 0
+       /* Do we really need to do this? removed files are
+        * automatically ignored when loading a collection.
+        */
+       collect_manager_moved(path, NULL);
+#endif
+}
+
+void collection_maint_renamed(const gchar *source, const gchar *dest)
+{
+       GList *work;
+
+       work = collection_list;
+       while(work)
+               {
+               CollectionData *cd = work->data;
+               work = work->next;
+
+               while(collection_rename(cd, source, dest));
+               }
+
+       collect_manager_moved(source, dest);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * window key presses
+ *-------------------------------------------------------------------
+ */
+
+static gint collection_window_keypress(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       CollectWindow *cw = data;
+       gint stop_signal = FALSE;
+       gint edit_val = -1;
+       GList *list;
+
+       if (event->state & GDK_CONTROL_MASK)
+               {
+               switch (event->keyval)
+                       {
+                       case '1':
+                               edit_val = 0;
+                               break;
+                       case '2':
+                               edit_val = 1;
+                               break;
+                       case '3':
+                               edit_val = 2;
+                               break;
+                       case '4':
+                               edit_val = 3;
+                               break;
+                       case '5':
+                               edit_val = 4;
+                               break;
+                       case '6':
+                               edit_val = 5;
+                               break;
+                       case '7':
+                               edit_val = 6;
+                               break;
+                       case '8':
+                               edit_val = 7;
+                               break;
+                       case '9':
+                               edit_val = 8;
+                               break;
+                       case '0':
+                               edit_val = 9;
+                               break;
+                       case 'A': case 'a':
+                               if (event->state & GDK_SHIFT_MASK)
+                                       {
+                                       collection_table_unselect_all(cw->table);
+                                       }
+                               else
+                                       {
+                                       collection_table_select_all(cw->table);
+                                       }
+                               stop_signal = TRUE;
+                               break;
+                       case 'L': case 'l':
+                               list = layout_list(NULL);
+                               if (list)
+                                       {
+                                       collection_table_add_path_list(cw->table, list);
+                                       path_list_free(list);
+                                       }
+                               stop_signal = TRUE;
+                               break;
+                       case 'C': case 'c':
+                               file_util_copy(NULL, collection_table_selection_get_list(cw->table), NULL, cw->window);
+                               stop_signal = TRUE;
+                               break;
+                       case 'M': case 'm':
+                               file_util_move(NULL, collection_table_selection_get_list(cw->table), NULL, cw->window);
+                               stop_signal = TRUE;
+                               break;
+                       case 'R': case 'r':
+                               file_util_rename(NULL, collection_table_selection_get_list(cw->table), cw->window);
+                               stop_signal = TRUE;
+                               break;
+                       case 'D': case 'd':
+                               file_util_delete(NULL, collection_table_selection_get_list(cw->table), cw->window);
+                               stop_signal = TRUE;
+                               break;
+                       case 'P': case 'p':
+                               info_window_new(NULL, collection_table_selection_get_list(cw->table));
+                               stop_signal = TRUE;
+                               break;
+                       case 'S': case 's':
+                               collection_dialog_save_as(NULL, cw->cd);
+                               stop_signal = TRUE;
+                               break;
+                       case 'W': case 'w':
+                               collection_window_close(cw);
+                               stop_signal = TRUE;
+                               break;
+                       default:
+                               break;
+                       }
+               }
+       else
+               {
+               switch (event->keyval)
+                       {
+                       case GDK_Return: case GDK_KP_Enter:
+                               layout_image_set_collection(NULL, cw->cd,
+                                       collection_table_get_focus_info(cw->table));
+                               stop_signal = TRUE;
+                               break;
+                       case 'V': case 'v':
+                               view_window_new_from_collection(cw->cd,
+                                       collection_table_get_focus_info(cw->table));
+                               stop_signal = TRUE;
+                               break;
+                       case 'S': case 's':
+                               if (!cw->cd->path)
+                                       {
+                                       collection_dialog_save_as(NULL, cw->cd);
+                                       }
+                               else if (!collection_save(cw->cd, cw->cd->path))
+                                       {
+                                       printf("failed saving to collection path: %s\n", cw->cd->path);
+                                       }
+                               stop_signal = TRUE;
+                               break;
+                       case 'A': case 'a':
+                               if (!(event->state & GDK_CONTROL_MASK))
+                                       {
+                                       collection_dialog_append(NULL, cw->cd);
+                                       stop_signal = TRUE;
+                                       }
+                               break;
+                       case 'N': case 'n':
+                               collection_set_sort_method(cw->cd, SORT_NAME);
+                               stop_signal = TRUE;
+                               break;
+#ifdef HAVE_STRVERSCMP
+                       case 'I': case 'i':
+                               collection_set_sort_method(cw->cd, SORT_NUMBER);
+                               stop_signal = TRUE;
+                               break;
+#endif
+                       case 'D': case 'd':
+                               collection_set_sort_method(cw->cd, SORT_TIME);
+                               stop_signal = TRUE;
+                               break;
+                       case 'B': case 'b':
+                               collection_set_sort_method(cw->cd, SORT_SIZE);
+                               stop_signal = TRUE;
+                               break;
+                       case 'P': case 'p':
+                               collection_set_sort_method(cw->cd, SORT_PATH);
+                               stop_signal = TRUE;
+                               break;
+                       case GDK_Delete: case GDK_KP_Delete:
+                               list = g_list_copy(cw->table->selection);
+                               if (list)
+                                       {
+                                       collection_remove_by_info_list(cw->cd, list);
+                                       g_list_free(list);
+                                       }
+                               else
+                                       {
+                                       collection_remove_by_info(cw->cd, collection_table_get_focus_info(cw->table));
+                                       }
+                               stop_signal = TRUE;
+                               break;
+                       default:
+                               break;
+                       }
+               }
+
+       if (edit_val != -1)
+               {
+               list = collection_table_selection_get_list(cw->table);
+               start_editor_from_path_list(edit_val, list);
+               path_list_free(list);
+               stop_signal = TRUE;
+               }
+
+       return stop_signal;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * window
+ *-------------------------------------------------------------------
+ */
+static void collection_window_get_geometry(CollectWindow *cw)
+{
+       CollectionData *cd;
+
+       if (!cw) return;
+
+       cd = cw->cd;
+       gdk_window_get_position (cw->window->window, &cd->window_x, &cd->window_y);
+       gdk_drawable_get_size(cw->window->window, &cd->window_w, &cd->window_h);
+       cd->window_read = TRUE;
+}
+
+static void collection_window_refresh(CollectWindow *cw)
+{
+       if (!cw) return;
+
+       collection_table_refresh(cw->table);
+}
+
+static void collection_window_update_title(CollectWindow *cw)
+{
+       gchar *buf;
+
+       if (!cw) return;
+
+       buf = g_strdup_printf(_("%s - GQview Collection"), cw->cd->name);
+       gtk_window_set_title(GTK_WINDOW(cw->window), buf);
+       g_free(buf);
+}
+
+static void collection_window_update_info(CollectionData *cd, CollectInfo *ci, gpointer data)
+{
+       CollectWindow *cw = data;
+
+       collection_table_file_update(cw->table, ci);
+}
+
+static void collection_window_add(CollectWindow *cw, CollectInfo *ci)
+{
+       if (!cw) return;
+
+       if (!ci->pixbuf) collection_load_thumb_idle(cw->cd);
+       collection_table_file_add(cw->table, ci);
+}
+
+static void collection_window_insert(CollectWindow *cw, CollectInfo *ci)
+{
+       if (!cw) return;
+
+       if (!ci->pixbuf) collection_load_thumb_idle(cw->cd);
+       collection_table_file_insert(cw->table, ci);
+       if (!cw) return;
+}
+
+#if 0
+static void collection_window_move(CollectWindow *cw, CollectInfo *ci)
+{
+       if (!cw) return;
+}
+#endif
+
+static void collection_window_remove(CollectWindow *cw, CollectInfo *ci)
+{
+       if (!cw) return;
+
+       collection_table_file_remove(cw->table, ci);
+}
+
+static void collection_window_update(CollectWindow *cw, CollectInfo *ci)
+{
+       if (!cw) return;
+
+       collection_table_file_update(cw->table, ci);
+       collection_table_file_update(cw->table, NULL);
+}
+
+static void collection_window_close_final(CollectWindow *cw)
+{
+       if (cw->close_dialog) return;
+
+       collection_window_list = g_list_remove(collection_window_list, cw);
+       collection_window_get_geometry(cw);
+
+       gtk_widget_destroy(cw->window);
+
+       collection_set_update_info_func(cw->cd, NULL, NULL);
+       collection_unref(cw->cd);
+
+       g_free(cw);
+}
+
+static void collection_close_save_cb(GenericDialog *gd, gpointer data)
+{
+       CollectWindow *cw = data;
+
+       cw->close_dialog = NULL;
+       generic_dialog_close(gd);
+
+       if (!cw->cd->path)
+                {
+               collection_dialog_save_close(NULL, cw->cd);
+               return;
+               }
+       else if (!collection_save(cw->cd, cw->cd->path))
+               {
+               gchar *buf;
+               buf = g_strdup_printf(_("Failed to save the collection:\n%s"), cw->cd->path);
+               warning_dialog(_("Save Failed"), buf, GTK_STOCK_DIALOG_ERROR, cw->window);
+               g_free(buf);
+               return;
+               }
+
+       collection_window_close_final(cw);
+}
+
+static void collection_close_close_cb(GenericDialog *gd, gpointer data)
+{
+       CollectWindow *cw = data;
+
+       cw->close_dialog = NULL;
+       generic_dialog_close(gd);
+
+       collection_window_close_final(cw);
+}
+
+static void collection_close_cancel_cb(GenericDialog *gd, gpointer data)
+{
+       CollectWindow *cw = data;
+
+       cw->close_dialog = NULL;
+       generic_dialog_close(gd);
+}
+
+static void collection_close_dlg_show(CollectWindow *cw)
+{
+       GenericDialog *gd;
+
+       if (cw->close_dialog)
+               {
+               gtk_window_present(GTK_WINDOW(cw->close_dialog));
+               return;
+               }
+
+       gd = generic_dialog_new(_("Close collection"),
+                               "GQview", "close_collection", cw->window, FALSE,
+                               collection_close_cancel_cb, cw);
+       generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION,
+                                  _("Close collection"),
+                                  _("Collection has been modified.\nSave first?"));
+
+       generic_dialog_add_button(gd, GTK_STOCK_SAVE, NULL, collection_close_save_cb, TRUE);
+       generic_dialog_add_button(gd, GTK_STOCK_DELETE, _("_Discard"), collection_close_close_cb, FALSE);
+
+       cw->close_dialog = gd->dialog;
+
+       gtk_widget_show(gd->dialog);
+}
+
+static void collection_window_close(CollectWindow *cw)
+{
+       if (!cw->cd->changed && !cw->close_dialog)
+               {
+               collection_window_close_final(cw);
+               return;
+               }
+
+       collection_close_dlg_show(cw);
+}
+
+void collection_window_close_by_collection(CollectionData *cd)
+{
+       CollectWindow *cw;
+
+       cw = collection_window_find(cd);
+       if (cw) collection_window_close_final(cw);
+}
+
+gint collection_window_modified_exists(void)
+{
+       GList *work;
+
+       work = collection_window_list;
+       while (work)
+               {
+               CollectWindow *cw = work->data;
+               if (cw->cd->changed) return TRUE;
+               work = work->next;
+               }
+
+       return FALSE;
+}
+
+static gint collection_window_delete(GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+       CollectWindow *cw = data;
+       collection_window_close(cw);
+
+       return TRUE;
+}
+
+CollectWindow *collection_window_new(const gchar *path)
+{
+       CollectWindow *cw;
+       GtkWidget *vbox;
+       GtkWidget *frame;
+       GtkWidget *status_label;
+       GtkWidget *extra_label;
+       GdkGeometry geometry;
+
+       cw = g_new0(CollectWindow, 1);
+
+       cw->close_dialog = NULL;
+
+       collection_window_list = g_list_append(collection_window_list, cw);
+
+       cw->cd = collection_new(path);
+
+       cw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+       window_set_icon(cw->window, (const gchar **)collect_xpm, NULL);
+
+       geometry.min_width = 32;
+       geometry.min_height = 32;
+       geometry.base_width = COLLECT_DEF_WIDTH;
+       geometry.base_height = COLLECT_DEF_HEIGHT;
+       gtk_window_set_geometry_hints(GTK_WINDOW(cw->window), NULL, &geometry,
+                                     GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE);
+
+
+       if (save_window_positions && path && collection_load_only_geometry(cw->cd, path))
+               {
+               /* FIXME: x, y is not implemented */
+               gtk_window_set_default_size(GTK_WINDOW(cw->window), cw->cd->window_w, cw->cd->window_h);
+               }
+       else
+               {
+               gtk_window_set_default_size(GTK_WINDOW(cw->window), COLLECT_DEF_WIDTH, COLLECT_DEF_HEIGHT);
+               }
+
+       gtk_window_set_resizable(GTK_WINDOW(cw->window), TRUE);
+       collection_window_update_title(cw);
+       gtk_window_set_wmclass(GTK_WINDOW(cw->window), "collection", "GQview");
+       gtk_container_set_border_width (GTK_CONTAINER (cw->window), 0);
+
+       g_signal_connect(G_OBJECT(cw->window), "delete_event",
+                        G_CALLBACK(collection_window_delete), cw);
+
+       g_signal_connect(G_OBJECT(cw->window),"key_press_event",
+                        G_CALLBACK(collection_window_keypress), cw);
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_add(GTK_CONTAINER(cw->window), vbox);
+       gtk_widget_show(vbox);
+
+       cw->table = collection_table_new(cw->cd);
+       gtk_box_pack_start(GTK_BOX(vbox), cw->table->scrolled, TRUE, TRUE, 0);
+       gtk_widget_show(cw->table->scrolled);
+
+       cw->status_box = gtk_hbox_new(TRUE, 0);
+       gtk_box_pack_start(GTK_BOX(vbox), cw->status_box, FALSE, FALSE, 0);
+       gtk_widget_show(cw->status_box);
+
+       frame = gtk_frame_new(NULL);
+       gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
+       gtk_box_pack_start(GTK_BOX(cw->status_box), frame, TRUE, TRUE, 0);
+       gtk_widget_show(frame);
+
+       status_label = gtk_label_new("");
+       gtk_container_add(GTK_CONTAINER(frame), status_label);
+       gtk_widget_show(status_label);
+
+       extra_label = gtk_progress_bar_new();
+       gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(extra_label), 0.0);
+       gtk_box_pack_start(GTK_BOX(cw->status_box), extra_label, TRUE, TRUE, 0);
+       gtk_widget_show(extra_label);
+
+       collection_table_set_labels(cw->table, status_label, extra_label);
+
+       gtk_widget_show(cw->window);
+       gtk_widget_grab_focus(cw->table->listview);
+
+       collection_set_update_info_func(cw->cd, collection_window_update_info, cw);
+
+       if (path && *path == '/') collection_load_begin(cw->cd, NULL, FALSE);
+
+       return cw;
+}
+
diff --git a/src/collect.h b/src/collect.h
new file mode 100644 (file)
index 0000000..40bf4f4
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef COLLECT_H
+#define COLLECT_H
+
+
+CollectInfo *collection_info_new(const gchar *path, struct stat *st, GdkPixbuf *pixbuf);
+
+void collection_info_free_thumb(CollectInfo *ci);
+void collection_info_free(CollectInfo *ci);
+
+void collection_info_set_thumb(CollectInfo *ci, GdkPixbuf *pixbuf);
+gint collection_info_load_thumb(CollectInfo *ci);
+
+void collection_list_free(GList *list);
+
+GList *collection_list_sort(GList *list, SortType method);
+GList *collection_list_add(GList *list, CollectInfo *ci, SortType method);
+GList *collection_list_insert(GList *list, CollectInfo *ci, CollectInfo *insert_ci, SortType method);
+GList *collection_list_remove(GList *list, CollectInfo *ci);
+CollectInfo *collection_list_find(GList *list, const gchar *path);
+GList *collection_list_to_path_list(GList *list);
+
+CollectionData *collection_new(const gchar *path);
+void collection_free(CollectionData *cd);
+
+void collection_ref(CollectionData *cd);
+void collection_unref(CollectionData *cd);
+
+void collection_path_changed(CollectionData *cd);
+
+gint collection_to_number(CollectionData *cd);
+CollectionData *collection_from_number(gint n);
+
+/* pass a NULL pointer to whatever you don't need
+ * use free_selected_list to free list, and
+ * g_list_free to free info_list, which is a list of
+ * CollectInfo pointers into CollectionData
+ */
+CollectionData *collection_from_dnd_data(const gchar *data, GList **list, GList **info_list);
+gchar *collection_info_list_to_dnd_data(CollectionData *cd, GList *list, gint *length);
+
+gint collection_info_valid(CollectionData *cd, CollectInfo *info);
+
+CollectInfo *collection_next_by_info(CollectionData *cd, CollectInfo *info);
+CollectInfo *collection_prev_by_info(CollectionData *cd, CollectInfo *info);
+CollectInfo *collection_get_first(CollectionData *cd);
+CollectInfo *collection_get_last(CollectionData *cd);
+
+void collection_set_sort_method(CollectionData *cd, SortType method);
+void collection_set_update_info_func(CollectionData *cd,
+                                    void (*func)(CollectionData *, CollectInfo *, gpointer), gpointer data);
+
+gint collection_add(CollectionData *cd, const gchar *path, gint sorted);
+gint collection_add_check(CollectionData *cd, const gchar *path, gint sorted, gint must_exist);
+gint collection_insert(CollectionData *cd, const gchar *path, CollectInfo *insert_ci, gint sorted);
+gint collection_remove(CollectionData *cd, const gchar *path);
+void collection_remove_by_info_list(CollectionData *cd, GList *list);
+gint collection_rename(CollectionData *cd, const gchar *source, const gchar *dest);
+
+void collection_update_geometry(CollectionData *cd);
+
+void collection_maint_removed(const gchar *path);
+void collection_maint_renamed(const gchar *source, const gchar *dest);
+
+CollectWindow *collection_window_new(const gchar *path);
+void collection_window_close_by_collection(CollectionData *cd);
+CollectWindow *collection_window_find(CollectionData *cd);
+CollectWindow *collection_window_find_by_path(const gchar *path);
+gint collection_window_modified_exists(void);
+
+
+#endif
+
diff --git a/src/config.c b/src/config.c
deleted file mode 100644 (file)
index e35bf90..0000000
+++ /dev/null
@@ -1,710 +0,0 @@
-/*
- * GQview image viewer
- * (C)2000 John Ellis
- *
- * Author: John Ellis
- *
- */
-
-#include "gqview.h"
-
-/* config memory values */
-static gint startup_path_enable_c;
-static gint confirm_delete_c;
-static gint restore_tool_c;
-static gint save_window_positions_c;
-static gint zoom_mode_c;
-static gint fit_window_c;
-static gint limit_window_size_c;
-static gint max_window_size_c;
-static gint progressive_key_scrolling_c;
-static gint thumb_max_width_c;
-static gint thumb_max_height_c;
-static gint enable_thumb_caching_c;
-static gint use_xvpics_thumbnails_c;
-static gint show_dot_files_c;
-static gint file_filter_disable_c;
-static gint filter_include_jpg_c;
-static gint filter_include_xpm_c;
-static gint filter_include_tif_c;
-static gint filter_include_gif_c;
-static gint filter_include_png_c;
-static gint filter_include_ppm_c;
-static gint filter_include_pgm_c;
-static gint filter_include_pcx_c;
-static gint filter_include_bmp_c;
-static gint slideshow_delay_c;
-static gint slideshow_random_c;
-static gint slideshow_repeat_c;
-
-static gint mousewheel_scrolls_c;
-
-static GtkWidget *configwindow = NULL;
-static GtkWidget *startup_path_entry;
-static GtkWidget *custom_filter_entry;
-static GtkWidget *editor_name_entry[8];
-static GtkWidget *editor_command_entry[8];
-
-static void startup_path_set_current(GtkWidget *widget, gpointer data);
-static void slideshow_delay_cb(GtkObject *adj, gpointer data);
-static void zoom_mode_original_cb(GtkWidget *widget, gpointer data);
-static void zoom_mode_fit_cb(GtkWidget *widget, gpointer data);
-static void zoom_mode_none_cb(GtkWidget *widget, gpointer data);
-static void max_window_size_cb(GtkObject *adj, gpointer data);
-static void thumb_size_48_selected(GtkWidget *w, gpointer data);
-static void thumb_size_64_selected(GtkWidget *w, gpointer data);
-static void thumb_size_85_selected(GtkWidget *w, gpointer data);
-static void thumb_size_100_selected(GtkWidget *w, gpointer data);
-
-static void config_window_apply();
-static void config_window_close_cb(GtkWidget *widget, gpointer data);
-static void config_window_destroy(GtkWidget *w, GdkEvent *event, gpointer data);
-static void config_window_ok_cb(GtkWidget *widget, gpointer data);
-static void config_window_save_cb(GtkWidget *widget, gpointer data);
-
-static void check_button_cb(GtkWidget *widget, gpointer data);
-static void add_check_button(gint option, gint *option_c, gchar *text, GtkWidget *box);
-static void config_window_create(gint start_tab);
-
-/*
- *-----------------------------------------------------------------------------
- * option widget callbacks (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void startup_path_set_current(GtkWidget *widget, gpointer data)
-{
-       gtk_entry_set_text(GTK_ENTRY(startup_path_entry), current_path);
-}
-
-static void slideshow_delay_cb(GtkObject *adj, gpointer data)
-{
-       slideshow_delay_c = (gint)GTK_ADJUSTMENT(adj)->value;
-}
-
-static void zoom_mode_original_cb(GtkWidget *widget, gpointer data)
-{
-       if (GTK_TOGGLE_BUTTON (widget)->active)
-               zoom_mode_c = ZOOM_RESET_ORIGINAL;
-}
-
-static void zoom_mode_fit_cb(GtkWidget *widget, gpointer data)
-{
-       if (GTK_TOGGLE_BUTTON (widget)->active)
-               zoom_mode_c = ZOOM_RESET_FIT_WINDOW;
-}
-
-static void zoom_mode_none_cb(GtkWidget *widget, gpointer data)
-{
-       if (GTK_TOGGLE_BUTTON (widget)->active)
-               zoom_mode_c = ZOOM_RESET_NONE;
-}
-
-static void max_window_size_cb(GtkObject *adj, gpointer data)
-{
-       max_window_size_c = (gint)GTK_ADJUSTMENT(adj)->value;
-}
-
-static void thumb_size_48_selected(GtkWidget *w, gpointer data)
-{
-       if (GTK_TOGGLE_BUTTON (w)->active)
-               {
-               thumb_max_width_c = 48;
-               thumb_max_height_c = 48;
-               }
-}
-
-static void thumb_size_64_selected(GtkWidget *w, gpointer data)
-{
-       if (GTK_TOGGLE_BUTTON (w)->active)
-               {
-               thumb_max_width_c = 64;
-               thumb_max_height_c = 64;
-               }
-}
-
-static void thumb_size_85_selected(GtkWidget *w, gpointer data)
-{
-       if (GTK_TOGGLE_BUTTON (w)->active)
-               {
-               thumb_max_width_c = 85;
-               thumb_max_height_c = 64;
-               }
-}
-
-static void thumb_size_100_selected(GtkWidget *w, gpointer data)
-{
-       if (GTK_TOGGLE_BUTTON (w)->active)
-               {
-               thumb_max_width_c = 100;
-               thumb_max_height_c = 100;
-               }
-}
-
-/*
- *-----------------------------------------------------------------------------
- * sync progam to config window routine (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void config_window_apply()
-{
-       gchar *buf;
-       gint i;
-       gint refresh = FALSE;
-
-       for(i=0; i<8; i++)
-               {
-               g_free(editor_name[i]);
-               editor_name[i] = NULL;
-               buf = gtk_entry_get_text(GTK_ENTRY(editor_name_entry[i]));
-               if (buf && strlen(buf) > 0) editor_name[i] = g_strdup(buf);
-
-               g_free(editor_command[i]);
-               editor_command[i] = NULL;
-               buf = gtk_entry_get_text(GTK_ENTRY(editor_command_entry[i]));
-               if (buf && strlen(buf) > 0) editor_command[i] = g_strdup(buf);
-               }
-       update_edit_menus(mainwindow_accel_grp);
-
-       g_free(startup_path);
-       startup_path = NULL;
-       buf = gtk_entry_get_text(GTK_ENTRY(startup_path_entry));
-       if (buf && strlen(buf) > 0) startup_path = remove_trailing_slash(buf);
-
-       buf = gtk_entry_get_text(GTK_ENTRY(custom_filter_entry));
-       if ((buf && strlen(buf) > 0) != (custom_filter != NULL)) refresh = TRUE;
-       if ((buf && strlen(buf) > 0 && custom_filter) && strcmp(buf, custom_filter) != 0) refresh = TRUE;
-       g_free(custom_filter);
-       custom_filter = NULL;
-       if (buf && strlen(buf) > 0) custom_filter = g_strdup(buf);
-
-       if (show_dot_files != show_dot_files_c) refresh = TRUE;
-       if (file_filter_disable != file_filter_disable_c) refresh = TRUE;
-       if (filter_include_jpg != filter_include_jpg_c) refresh = TRUE;
-       if (filter_include_xpm != filter_include_xpm_c) refresh = TRUE;
-       if (filter_include_tif != filter_include_tif_c) refresh = TRUE;
-       if (filter_include_gif != filter_include_gif_c) refresh = TRUE;
-       if (filter_include_png != filter_include_png_c) refresh = TRUE;
-       if (filter_include_ppm != filter_include_ppm_c) refresh = TRUE;
-       if (filter_include_pgm != filter_include_pgm_c) refresh = TRUE;
-       if (filter_include_pcx != filter_include_pcx_c) refresh = TRUE;
-       if (filter_include_bmp != filter_include_bmp_c) refresh = TRUE;
-
-       startup_path_enable = startup_path_enable_c;
-       confirm_delete = confirm_delete_c;
-       restore_tool = restore_tool_c;
-       save_window_positions = save_window_positions_c;
-       zoom_mode = zoom_mode_c;
-       fit_window = fit_window_c;
-       limit_window_size = limit_window_size_c;
-       max_window_size = max_window_size_c;
-       progressive_key_scrolling = progressive_key_scrolling_c;
-       thumb_max_width = thumb_max_width_c;
-       thumb_max_height = thumb_max_height_c;
-       enable_thumb_caching = enable_thumb_caching_c;
-       use_xvpics_thumbnails = use_xvpics_thumbnails_c;
-       show_dot_files = show_dot_files_c;
-       file_filter_disable = file_filter_disable_c;
-       filter_include_jpg = filter_include_jpg_c;
-       filter_include_xpm = filter_include_xpm_c;
-       filter_include_tif = filter_include_tif_c;
-       filter_include_gif = filter_include_gif_c;
-       filter_include_png = filter_include_png_c;
-       filter_include_ppm = filter_include_ppm_c;
-       filter_include_pgm = filter_include_pgm_c;
-       filter_include_pcx = filter_include_pcx_c;
-       filter_include_bmp = filter_include_bmp_c;
-
-       slideshow_random = slideshow_random_c;
-       slideshow_repeat = slideshow_repeat_c;
-       slideshow_delay = slideshow_delay_c;
-
-       mousewheel_scrolls = mousewheel_scrolls_c;
-
-       if (refresh)
-               {
-               rebuild_file_filter();
-               filelist_refresh();
-               }
-}
-
-/*
- *-----------------------------------------------------------------------------
- * config window main button callbacks (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void config_window_close_cb(GtkWidget *widget, gpointer data)
-{
-       gtk_widget_destroy(configwindow);
-       configwindow = NULL;
-}
-
-static void config_window_destroy(GtkWidget *w, GdkEvent *event, gpointer data)
-{
-       config_window_close_cb(NULL, NULL);
-}
-
-static void config_window_ok_cb(GtkWidget *widget, gpointer data)
-{
-       config_window_apply();
-       config_window_close_cb(NULL, NULL);
-}
-
-static void config_window_apply_cb(GtkWidget *widget, gpointer data)
-{
-       config_window_apply();
-}
-
-/*
- *-----------------------------------------------------------------------------
- * config window setup (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void check_button_cb(GtkWidget *widget, gpointer data)
-{
-       gint *value_ptr = data;
-       *value_ptr = GTK_TOGGLE_BUTTON (widget)->active;
-}
-
-static void add_check_button(gint option, gint *option_c, gchar *text, GtkWidget *box)
-{
-       GtkWidget *button;
-       *option_c = option;
-       button = gtk_check_button_new_with_label (text);
-       gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
-       gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), option);
-       gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) check_button_cb, option_c);
-       gtk_widget_show(button);
-}
-
-static void config_window_create(gint start_tab)
-{
-       GtkWidget *win_vbox;
-       GtkWidget *hbox;
-       GtkWidget *notebook;
-       GtkWidget *frame;
-       GtkWidget *label;
-       GtkWidget *vbox;
-       GtkWidget *vbox1;
-       GtkWidget *vbox2;
-       GtkWidget *button;
-       GtkWidget *tabcomp;
-       GtkWidget *radiobuttongroup;
-       GtkWidget *table;
-       GtkObject *adj;
-       GtkWidget *spin;
-       GdkImlibImage* im;
-       GdkPixmap *pixmap;
-       gchar buf[255];
-       gint i;
-
-       configwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-       gtk_signal_connect (GTK_OBJECT (configwindow), "delete_event",(GtkSignalFunc) config_window_destroy, NULL);
-       gtk_window_set_policy (GTK_WINDOW (configwindow), FALSE, FALSE, FALSE);
-       gtk_window_set_title (GTK_WINDOW (configwindow), _("GQview configuration"));
-       gtk_window_set_wmclass(GTK_WINDOW (configwindow), "config", "GQview");
-       gtk_container_border_width (GTK_CONTAINER (configwindow), 5);
-
-       win_vbox = gtk_vbox_new(FALSE, 5);
-       gtk_container_add(GTK_CONTAINER(configwindow), win_vbox);
-       gtk_widget_show(win_vbox);
-
-       hbox = gtk_hbox_new (TRUE, 0);
-       gtk_box_pack_end(GTK_BOX(win_vbox), hbox, FALSE, FALSE, 0);
-       gtk_widget_show(hbox);
-
-       button = gtk_button_new_with_label(_("Ok"));
-       gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) config_window_ok_cb, NULL);
-       gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 20);
-       gtk_widget_show(button);
-
-       button = gtk_button_new_with_label(_("Apply"));
-       gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) config_window_apply_cb, NULL);
-       gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 20);
-       gtk_widget_show(button);
-
-       button = gtk_button_new_with_label(_("Cancel"));
-       gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) config_window_close_cb, NULL);
-       gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 20);
-       gtk_widget_show(button);
-
-       notebook = gtk_notebook_new();
-       gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
-       gtk_box_pack_start (GTK_BOX(win_vbox), notebook, TRUE, TRUE, 0);
-
-       /* general options tab */
-
-       frame = gtk_frame_new(NULL);
-       gtk_container_border_width (GTK_CONTAINER (frame), 5);
-       gtk_widget_show(frame);
-       label = gtk_label_new(_("General"));
-       gtk_notebook_append_page (GTK_NOTEBOOK(notebook), frame, label);
-
-       vbox = gtk_vbox_new (FALSE, 0);
-       gtk_container_border_width (GTK_CONTAINER (vbox), 5);
-       gtk_container_add (GTK_CONTAINER(frame),vbox);
-       gtk_widget_show(vbox);
-
-       frame = gtk_frame_new(_("Initial directory"));
-       gtk_container_border_width (GTK_CONTAINER (frame), 5);
-       gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
-       gtk_widget_show(frame);
-
-       vbox1 = gtk_vbox_new (FALSE, 0);
-       gtk_container_add (GTK_CONTAINER(frame),vbox1);
-       gtk_widget_show(vbox1);
-
-       add_check_button(startup_path_enable, &startup_path_enable_c,
-                        _("On startup, change to this directory:"), vbox1);
-
-       hbox = gtk_hbox_new (FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0);
-       gtk_widget_show(hbox);
-
-       gtk_widget_realize(configwindow);
-
-       tabcomp = tab_completion_new(&startup_path_entry, configwindow, startup_path, NULL, NULL);
-       gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0);
-       gtk_widget_show(tabcomp);
-
-       button = gtk_button_new_with_label (_("Use current"));
-       gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) startup_path_set_current, NULL);
-       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
-       gtk_widget_show(button);
-
-       add_check_button(confirm_delete, &confirm_delete_c,
-                        _("Confirm file delete"), vbox);
-       add_check_button(restore_tool, &restore_tool_c,
-                        _("Remember tool state (float/hidden)"), vbox);
-       add_check_button(save_window_positions, &save_window_positions_c,
-                        _("Remember window positions"), vbox);
-
-       frame = gtk_frame_new(_("Slide show"));
-       gtk_container_border_width (GTK_CONTAINER (frame), 5);
-       gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
-       gtk_widget_show(frame);
-
-       vbox1 = gtk_vbox_new (FALSE, 0);
-       gtk_container_add (GTK_CONTAINER(frame),vbox1);
-       gtk_widget_show(vbox1);
-
-       hbox = gtk_hbox_new (FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0);
-       gtk_widget_show(hbox);
-
-       label = gtk_label_new(_("Delay before image change (seconds):"));
-       gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-       gtk_widget_show(label);
-
-       slideshow_delay_c = slideshow_delay;
-       adj = gtk_adjustment_new((float)slideshow_delay_c, 1.0, 1200.0, 1, 1, 1);
-        spin = gtk_spin_button_new( GTK_ADJUSTMENT(adj), 1, 0 );
-        gtk_box_pack_start( GTK_BOX(hbox), spin, FALSE, FALSE, 5);
-        gtk_signal_connect( GTK_OBJECT(adj),"value_changed",GTK_SIGNAL_FUNC(slideshow_delay_cb), NULL);
-        gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON(spin),GTK_UPDATE_ALWAYS );
-        gtk_widget_show(spin);
-       
-       add_check_button(slideshow_random, &slideshow_random_c,
-                        _("Random"), vbox1);
-       add_check_button(slideshow_repeat, &slideshow_repeat_c,
-                        _("Repeat"), vbox1);
-
-       /* image tab */
-
-       frame = gtk_frame_new(NULL);
-       gtk_container_border_width (GTK_CONTAINER (frame), 5);
-       gtk_widget_show(frame);
-       label = gtk_label_new(_("Image"));
-       gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label);
-
-       vbox = gtk_vbox_new (FALSE, 0);
-       gtk_container_border_width (GTK_CONTAINER (vbox), 5);
-       gtk_container_add (GTK_CONTAINER(frame),vbox);
-       gtk_widget_show(vbox);
-       
-       frame = gtk_frame_new(_("When new image is selected:"));
-       gtk_container_border_width (GTK_CONTAINER (frame), 5);
-       gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
-       gtk_widget_show(frame);
-
-       vbox1 = gtk_vbox_new (FALSE, 0);
-       gtk_container_add (GTK_CONTAINER(frame),vbox1);
-       gtk_widget_show(vbox1);
-
-       zoom_mode_c = zoom_mode;
-       radiobuttongroup = gtk_radio_button_new_with_label (NULL, _("Zoom to original size"));
-       if (zoom_mode == ZOOM_RESET_ORIGINAL) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(radiobuttongroup), 1);
-       gtk_signal_connect (GTK_OBJECT(radiobuttongroup),"clicked",(GtkSignalFunc) zoom_mode_original_cb, NULL);
-       gtk_box_pack_start(GTK_BOX(vbox1), radiobuttongroup, FALSE, FALSE, 0);
-       gtk_widget_show(radiobuttongroup);
-
-       button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),_("Fit image to window"));
-       if (zoom_mode == ZOOM_RESET_FIT_WINDOW) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1);
-       gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) zoom_mode_fit_cb, NULL);
-       gtk_box_pack_start(GTK_BOX(vbox1), button, FALSE, FALSE, 0);
-       gtk_widget_show(button);
-
-       button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),_("Leave Zoom at previous setting"));
-       if (zoom_mode == ZOOM_RESET_NONE) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1);
-       gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) zoom_mode_none_cb, NULL);
-       gtk_box_pack_start(GTK_BOX(vbox1), button, FALSE, FALSE, 0);
-       gtk_widget_show(button);
-
-       add_check_button(fit_window, &fit_window_c,
-                        _("Fit window to image when tools are hidden/floating"), vbox);
-
-       hbox = gtk_hbox_new (FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-       gtk_widget_show(hbox);
-
-       add_check_button(limit_window_size, &limit_window_size_c,
-                        _("Limit size when auto-sizing window"), hbox);
-
-       max_window_size_c = max_window_size;
-       adj = gtk_adjustment_new((float)max_window_size_c, 10.0, 150.0, 1, 1, 1);
-        spin = gtk_spin_button_new( GTK_ADJUSTMENT(adj), 1, 0 );
-        gtk_box_pack_start( GTK_BOX(hbox), spin, FALSE, FALSE, 5);
-        gtk_signal_connect( GTK_OBJECT(adj),"value_changed",GTK_SIGNAL_FUNC(max_window_size_cb), NULL);
-        gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON(spin),GTK_UPDATE_ALWAYS );
-        gtk_widget_show(spin);
-
-       frame = gtk_frame_new(_("Thumbnails"));
-       gtk_container_border_width (GTK_CONTAINER (frame), 5);
-       gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
-       gtk_widget_show(frame);
-
-       vbox1 = gtk_vbox_new (FALSE, 0);
-       gtk_container_add (GTK_CONTAINER(frame),vbox1);
-       gtk_widget_show(vbox1);
-
-       hbox = gtk_hbox_new (FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 0);
-       gtk_widget_show(hbox);
-
-       thumb_max_width_c = thumb_max_width;
-       thumb_max_height_c = thumb_max_height;
-
-       label = gtk_label_new(_("Size:"));
-       gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
-       gtk_widget_show(label);
-
-       radiobuttongroup = gtk_radio_button_new_with_label (NULL,"48x48");
-       gtk_box_pack_start(GTK_BOX(hbox), radiobuttongroup, FALSE, FALSE, 0);
-       if (thumb_max_width_c == 48 && thumb_max_height_c == 48) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(radiobuttongroup), 1);
-       gtk_signal_connect (GTK_OBJECT(radiobuttongroup),"clicked",(GtkSignalFunc) thumb_size_48_selected, NULL);
-       gtk_widget_show(radiobuttongroup);
-
-       button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),"64x64");
-       gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
-       if (thumb_max_width_c == 64 && thumb_max_height_c == 64) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1);
-       gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) thumb_size_64_selected, NULL);
-       gtk_widget_show(button);
-
-       button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),"85x64");
-       gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
-       if (thumb_max_width_c == 85 && thumb_max_height_c == 64) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1);
-       gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) thumb_size_85_selected, NULL);
-       gtk_widget_show(button);
-
-       button = gtk_radio_button_new_with_label (gtk_radio_button_group(GTK_RADIO_BUTTON(radiobuttongroup)),"100x100");
-       gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
-       if (thumb_max_width_c == 100 && thumb_max_height_c == 100) gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON(button), 1);
-       gtk_signal_connect (GTK_OBJECT(button),"clicked",(GtkSignalFunc) thumb_size_100_selected, NULL);
-       gtk_widget_show(button);
-
-       add_check_button(enable_thumb_caching, &enable_thumb_caching_c,
-                        _("Cache thumbnails"), vbox1);
-       add_check_button(use_xvpics_thumbnails, &use_xvpics_thumbnails_c,
-                        _("Use xvpics thumbnails when found (read only)"), vbox1);
-
-       add_check_button(progressive_key_scrolling, &progressive_key_scrolling_c,
-                        _("Progressive keyboard scrolling"), vbox);
-       add_check_button(mousewheel_scrolls, &mousewheel_scrolls_c,
-                        _("Mouse wheel scrolls image"), vbox);
-
-       /* filtering tab */
-
-       frame = gtk_frame_new(NULL);
-       gtk_container_border_width (GTK_CONTAINER (frame), 5);
-       gtk_widget_show(frame);
-       label = gtk_label_new(_("Filtering"));
-       gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label);
-
-       vbox = gtk_vbox_new (FALSE, 0);
-       gtk_container_border_width (GTK_CONTAINER (vbox), 5);
-       gtk_container_add (GTK_CONTAINER(frame),vbox);
-       gtk_widget_show(vbox);
-
-       add_check_button(show_dot_files, &show_dot_files_c,
-                        _("Show entries that begin with a dot"), vbox);
-       add_check_button(file_filter_disable, &file_filter_disable_c,
-                        _("Disable File Filtering"), vbox);
-
-       frame = gtk_frame_new(_("Include files of type:"));
-       gtk_container_border_width (GTK_CONTAINER (frame), 5);
-       gtk_box_pack_start(GTK_BOX(vbox), frame, TRUE, TRUE, 0);
-       gtk_widget_show(frame);
-
-       vbox1 = gtk_vbox_new (FALSE, 0);
-       gtk_container_add (GTK_CONTAINER(frame),vbox1);
-       gtk_widget_show(vbox1);
-
-       hbox = gtk_hbox_new (TRUE, 0);
-       gtk_box_pack_start (GTK_BOX(vbox1), hbox, FALSE, FALSE, 0);
-       gtk_widget_show(hbox);
-
-       vbox2 = gtk_vbox_new (FALSE, 0);
-       gtk_box_pack_start (GTK_BOX(hbox), vbox2,FALSE, FALSE, 0);
-       gtk_widget_show(vbox2);
-
-       add_check_button(filter_include_jpg, &filter_include_jpg_c,
-                        "JPG / JPEG", vbox2);
-       add_check_button(filter_include_xpm, &filter_include_xpm_c,
-                        "XPM", vbox2);
-       add_check_button(filter_include_tif, &filter_include_tif_c,
-                        "TIF / TIFF", vbox2);
-
-       vbox2 = gtk_vbox_new (FALSE, 0);
-       gtk_box_pack_start (GTK_BOX(hbox), vbox2,FALSE, FALSE, 0);
-       gtk_widget_show(vbox2);
-
-       add_check_button(filter_include_gif, &filter_include_gif_c,
-                        "GIF", vbox2);
-       add_check_button(filter_include_png, &filter_include_png_c,
-                        "PNG", vbox2);
-       add_check_button(filter_include_ppm, &filter_include_ppm_c,
-                        "PPM", vbox2);
-
-       vbox2 = gtk_vbox_new (FALSE, 0);
-       gtk_box_pack_start (GTK_BOX(hbox), vbox2,FALSE, FALSE, 0);
-       gtk_widget_show(vbox2);
-
-       add_check_button(filter_include_pgm, &filter_include_pgm_c,
-                        "PGM", vbox2);
-       add_check_button(filter_include_pcx, &filter_include_pcx_c,
-                        "PCX", vbox2);
-       add_check_button(filter_include_bmp, &filter_include_bmp_c,
-                        "BMP", vbox2);
-
-       hbox = gtk_hbox_new (FALSE, 0);
-       gtk_box_pack_start (GTK_BOX(vbox1), hbox, FALSE, FALSE, 0);
-       gtk_widget_show(hbox);
-
-       label = gtk_label_new(_("Custom file types:"));
-       gtk_box_pack_start(GTK_BOX(hbox),label,FALSE,FALSE,0);
-       gtk_widget_show(label);
-
-       custom_filter_entry = gtk_entry_new();
-       if (custom_filter) gtk_entry_set_text(GTK_ENTRY(custom_filter_entry), custom_filter);
-       gtk_box_pack_start(GTK_BOX(vbox1),custom_filter_entry,FALSE,FALSE,0);
-       gtk_widget_show(custom_filter_entry);
-
-       hbox = gtk_hbox_new (FALSE, 0);
-       gtk_box_pack_start (GTK_BOX(vbox1), hbox, FALSE, FALSE, 0);
-       gtk_widget_show(hbox);
-
-       label = gtk_label_new(_("format: [.foo;.bar]"));
-       gtk_box_pack_end(GTK_BOX(hbox),label,FALSE,FALSE,5);
-       gtk_widget_show(label);
-
-       /* editor entry tab */
-
-       frame = gtk_frame_new(NULL);
-       gtk_container_border_width (GTK_CONTAINER (frame), 5);
-       gtk_widget_show(frame);
-       label = gtk_label_new(_("External Editors"));
-       gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label);
-
-       vbox = gtk_vbox_new(FALSE,0);
-       gtk_container_border_width (GTK_CONTAINER (vbox), 5);
-       gtk_container_add (GTK_CONTAINER(frame),vbox);
-       gtk_widget_show(vbox);
-
-       table=gtk_table_new(3,9,FALSE);
-       gtk_container_add (GTK_CONTAINER(vbox),table);
-       gtk_widget_show(table);
-
-       label = gtk_label_new(_("#"));
-       gtk_table_attach_defaults(GTK_TABLE (table),label, 0, 1, 0, 1);
-       gtk_widget_show(label);
-       label = gtk_label_new(_("Menu name"));
-       gtk_table_attach_defaults(GTK_TABLE (table),label, 1, 2, 0, 1);
-       gtk_widget_show(label);
-       label = gtk_label_new(_("Command Line"));
-       gtk_table_attach_defaults(GTK_TABLE (table),label, 2, 3, 0, 1);
-       gtk_widget_show(label);
-
-       for (i=0; i<8; i++)
-               {
-               sprintf(buf,"%d",i+1);
-               label = gtk_label_new(buf);
-               gtk_table_attach_defaults(GTK_TABLE (table),label, 0, 1, i+1, i+2);
-               gtk_widget_show(label);
-
-               editor_name_entry[i] = gtk_entry_new_with_max_length(32);
-               gtk_widget_set_usize(editor_name_entry[i],80,-1);
-               if (editor_name[i]) gtk_entry_set_text(GTK_ENTRY(editor_name_entry[i]),editor_name[i]);
-               gtk_table_attach_defaults(GTK_TABLE (table),editor_name_entry[i],1,2,i+1,i+2);
-               gtk_widget_show(editor_name_entry[i]);
-
-               editor_command_entry[i] = gtk_entry_new_with_max_length(255);
-               gtk_widget_set_usize(editor_command_entry[i],160,-1);
-               tab_completion_add_to_entry(editor_command_entry[i], NULL, NULL);
-               if (editor_command[i]) gtk_entry_set_text(GTK_ENTRY(editor_command_entry[i]), editor_command[i]);
-               gtk_table_attach_defaults(GTK_TABLE (table),editor_command_entry[i],2,3,i+1,i+2);
-               gtk_widget_show(editor_command_entry[i]);
-               }
-
-       /* about tab */
-
-       frame = gtk_frame_new(NULL);
-       gtk_container_border_width (GTK_CONTAINER (frame), 5);
-       gtk_widget_show(frame);
-       label = gtk_label_new(_("About"));
-       gtk_notebook_append_page (GTK_NOTEBOOK (notebook), frame, label);
-
-       vbox = gtk_vbox_new (FALSE, 0);
-       gtk_container_add (GTK_CONTAINER(frame),vbox);
-       gtk_widget_show(vbox);
-
-       im = gdk_imlib_create_image_from_data((char *)logo, NULL, logo_width, logo_height);
-       gdk_imlib_render(im, logo_width, logo_height);
-       pixmap = gdk_imlib_move_image(im);
-       gdk_imlib_destroy_image(im);
-       
-       button=gtk_pixmap_new(pixmap, NULL);
-       gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
-       gtk_widget_show (button);
-
-       sprintf(buf, _("GQview %s\n\nCopyright (c) 2000 by John Ellis\nhttp://gqview.sorceforge.net\nor http://gqview.netpedia.net\ngqview@email.com\n\nReleased under the GNU Public License"), VERSION);
-       label = gtk_label_new(buf);
-       gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
-       gtk_widget_show (label);
-
-       gtk_notebook_set_page (GTK_NOTEBOOK(notebook), start_tab);
-       gtk_widget_show(notebook);
-
-       gtk_widget_show(configwindow);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * config/about window show (public)
- *-----------------------------------------------------------------------------
- */ 
-
-void show_config_window()
-{
-       if (configwindow) return;
-       config_window_create(0);
-}
-
-void show_about_window()
-{
-       if (configwindow) return;
-       config_window_create(4);
-}
-
index 0779fe4..dd572ff 100644 (file)
--- a/src/dnd.c
+++ b/src/dnd.c
 /*
- * GQview image viewer
- * (C)2000 John Ellis
+ * GQview
+ * (C) 2004 John Ellis
  *
  * Author: John Ellis
  *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
  */
 
+
 #include "gqview.h"
+#include "dnd.h"
+
+#include "collect.h"
 #include "image.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
 
-enum {
-       TARGET_URI_LIST,
-       TARGET_TEXT_PLAIN
-};
 
-static GtkTargetEntry file_drag_types[] = {
+GtkTargetEntry dnd_file_drag_types[] = {
        { "text/uri-list", 0, TARGET_URI_LIST },
        { "text/plain", 0, TARGET_TEXT_PLAIN }
 };
-static gint n_file_drag_types = 2;
+gint dnd_file_drag_types_count = 2;
 
-static GtkTargetEntry file_drop_types[] = {
+GtkTargetEntry dnd_file_drop_types[] = {
+       { "application/x-gqview-collection-member", 0, TARGET_APP_COLLECTION_MEMBER },
        { "text/uri-list", 0, TARGET_URI_LIST }
 };
-static gint n_file_drop_types = 1;
+gint dnd_file_drop_types_count = 2;
 
-static GList *get_uri_file_list(gchar *data);
 
-static void image_get_dnd_data(GtkWidget *widget, GdkDragContext *context,
-                              gint x, gint y,
-                              GtkSelectionData *selection_data, guint info,
-                              guint time, gpointer data);
-static void image_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
-                             GtkSelectionData *selection_data, guint info,
-                             guint time, gpointer data);
-static void image_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data);
+#define DND_ICON_SIZE 48
 
-static void file_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
-                             GtkSelectionData *selection_data, guint info,
-                             guint time, gpointer data);
-static void file_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data);
-static void file_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data);
 
-static void dir_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
-                             GtkSelectionData *selection_data, guint info,
-                             guint time, gpointer data);
-static void dir_clist_set_highlight(gint set);
-static void dir_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data);
-static void dir_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data);
-
-static GList *get_uri_file_list(gchar *data)
+static void pixbuf_draw_border(GdkPixbuf *pixbuf, gint w, gint h)
 {
-       GList *list = NULL;
-       gint b, e;
-
-       b = e = 0;
-
-       while (data[b] != '\0')
+       gint alpha;
+       gint rs;
+       guchar *pix;
+       guchar *p;
+       gint i;
+
+       alpha = gdk_pixbuf_get_has_alpha(pixbuf);
+       rs = gdk_pixbuf_get_rowstride(pixbuf);
+       pix = gdk_pixbuf_get_pixels(pixbuf);
+
+       p = pix;
+       for (i = 0; i < w; i++)
                {
-               while (data[e] != '\r' && data[e] != '\n' && data[e] != '\0') e++;
-               if (!strncmp(data + b, "file:", 5))
-                       {
-                       b += 5;
-                       list = g_list_append(list, g_strndup(data + b, e - b));
-                       }
-               while (data[e] == '\r' || data[e] == '\n') e++;
-               b = e;
+               *p = 0; p++; *p = 0; p++; *p = 0; p++;
+               if (alpha) { *p= 255; p++; }
                }
-
-       return list;
-}
-
-/*
- *-----------------------------------------------------------------------------
- * image drag and drop routines
- *-----------------------------------------------------------------------------
- */ 
-
-static void image_get_dnd_data(GtkWidget *widget, GdkDragContext *context,
-                              gint x, gint y,
-                              GtkSelectionData *selection_data, guint info,
-                              guint time, gpointer data)
-{
-       ImageWindow *imd = data;
-
-       if (info == TARGET_URI_LIST)
+       for (i = 1; i < h - 1; i++)
                {
-               GList *list = get_uri_file_list(selection_data->data);
-               if (list)
-                       {
-                       gchar *path;
-
-                       path = list->data;
-
-                       if (imd == normal_image)
-                               {
-                               if (isfile(path))
-                                       {
-                                       gint row;
-                                       gchar *dir = remove_level_from_path(path);
-                                       if (strcmp(dir, current_path) != 0)
-                                               filelist_change_to(dir);
-                                       g_free(dir);
-       
-                                       row = find_file_in_list(path);
-                                       if (row == -1)
-                                               image_change_to(path);
-                                       else
-                                               file_image_change_to(row);
-                                       }
-                               else if (isdir(path))
-                                       {
-                                       filelist_change_to(path);
-                                       image_change_to(NULL);
-                                       }
-                               }
-                       else
-                               {
-                               if (isfile(path))
-                                       {
-                                       image_area_set_image(imd, path, get_default_zoom(imd));
-                                       }
-                               }
-
-                       if (debug)
-                               {
-                               GList *work = list;
-                               while (work)
-                                       {
-                                       printf("dropped: %s\n", (gchar *)(work->data));
-                                       work = work->next;
-                                       }
-                               }
-
-                       g_list_foreach(list, (GFunc)g_free, NULL);
-                       g_list_free(list);
-                       }
-               }
-}
+               p = pix + rs * i;
+               *p = 0; p++; *p = 0; p++; *p = 0; p++;
+               if (alpha) *p= 255;
 
-static void image_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
-                              GtkSelectionData *selection_data, guint info,
-                              guint time, gpointer data)
-{
-       ImageWindow *imd = data;
-       gchar *path = image_area_get_path(imd);
-
-       if (path)
-               {
-               gchar *text = NULL;
-               switch (info)
-                       {
-                       case TARGET_URI_LIST:
-                               text = g_strconcat("file:", path, "\r\n", NULL);
-                               break;
-                       case TARGET_TEXT_PLAIN:
-                               text = g_strdup(path);
-                               break;
-                       }
-               if (text)
-                       {
-                       gtk_selection_data_set (selection_data, selection_data->target,
-                                               8, text, strlen(text));
-                       g_free(text);
-                       }
+               p = pix + rs * i + (w - 1) * ((alpha == TRUE) ? 4 : 3);
+               *p = 0; p++; *p = 0; p++; *p = 0; p++;
+               if (alpha) *p= 255;
                }
-       else
+       p = pix + rs * (h - 1);
+       for (i = 0; i < w; i++)
                {
-               gtk_selection_data_set (selection_data, selection_data->target,
-                                       8, NULL, 0);
+               *p = 0; p++; *p = 0; p++; *p = 0; p++;
+               if (alpha) { *p= 255; p++; }
                }
 }
 
-static void image_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
+static void pixbuf_draw_rect(GdkPixbuf *pixbuf, gint x, gint y, gint w, gint h, guint8 val)
 {
-       ImageWindow *imd = data;
-       if (context->action == GDK_ACTION_MOVE)
+       gint alpha;
+       gint rs;
+       guchar *pix;
+       guchar *p;
+       gint i, j;
+
+       alpha = gdk_pixbuf_get_has_alpha(pixbuf);
+       rs = gdk_pixbuf_get_rowstride(pixbuf);
+       pix = gdk_pixbuf_get_pixels(pixbuf);
+
+       for (j = 0; j < h; j++)
                {
-               gint row = find_file_in_list(image_area_get_path(imd));
-               if (row < 0) return;
-               if (image_get_path() && strcmp(image_get_path(), image_area_get_path(imd)) == 0)
+               p = pix + (rs * (y + j)) + (x * ((alpha) ? 4 : 3));
+               for (i = 0; i < w; i++)
                        {
-                       if (row < file_count() - 1)
-                               {
-                               file_next_image();
-                               }
-                       else
-                               {
-                               file_prev_image();
-                               }
+                       *p = (*p * (256-val)) >> 8; p++;
+                       *p = (*p * (256-val)) >> 8; p++;
+                       *p = (*p * (256-val)) >> 8; p++;
+                       if (alpha) { *p = 255; p++; }
                        }
-               filelist_refresh();
                }
 }
 
-void image_dnd_init(ImageWindow *imd)
+void dnd_set_drag_icon(GtkWidget *widget, GdkDragContext *context, GdkPixbuf *pixbuf, gint items)
 {
-       gtk_drag_source_set(imd->viewport, GDK_BUTTON2_MASK,
-                               file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
-       gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_data_get",
-                               image_set_dnd_data, imd);
-       gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_end",
-                               image_drag_end, imd);
+               GdkPixmap *pixmap;
+               GdkBitmap *mask;
+               GdkPixbuf *dest;
+               gint w, h;
+               gint sw, sh;
+               PangoLayout *layout = NULL;
+               gint x, y;
 
-       gtk_drag_dest_set(imd->viewport,
-                         GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP,
-                         file_drop_types, n_file_drop_types,
-                          GDK_ACTION_COPY);
-       gtk_signal_connect(GTK_OBJECT(imd->viewport), "drag_data_received",
-                               image_get_dnd_data, imd);
-}
+               x = y = 0;
 
-/*
- *-----------------------------------------------------------------------------
- * file list drag and drop routines (private)
- *-----------------------------------------------------------------------------
- */ 
+               sw = gdk_pixbuf_get_width(pixbuf);
+               sh = gdk_pixbuf_get_height(pixbuf);
 
-static void file_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
-                             GtkSelectionData *selection_data, guint info,
-                             guint time, gpointer data)
-{
-       gchar *uri_text = NULL;
-       gchar *leader = "file:";
-       gchar *sep = "\r\n";
-       gint total;
-       gint leader_l;
-       gint sep_l = strlen(sep);
-       gchar *ptr;
-
-       switch (info)
-               {
-               case TARGET_URI_LIST:
-                       leader_l = strlen(leader);
-                       break;
-               case TARGET_TEXT_PLAIN:
-                       leader_l = 0;
-                       break;
-               default:
-                       return;
-                       break;
-               }
-       
-       if (file_clicked_is_selected())
-               {
-               GList *list;
-               GList *work;
-
-               list = file_get_selected_list();
-               if (!list) return;
-               work = list;
-               total = 0;
-
-               /* compute length */
-
-               while (work)
+               if (sw <= DND_ICON_SIZE && sh <= DND_ICON_SIZE)
                        {
-                       gchar *name = work->data;
-                       total += leader_l + strlen(name) + sep_l;
-                       work = work->next;
+                       w = sw;
+                       h = sh;
                        }
-
-               /* create list */
-               uri_text = g_malloc(total + 1);
-               ptr = uri_text;
-
-               work = list;
-               while (work)
+               else if (sw < sh)
                        {
-                       gchar *name = work->data;
-                       if (leader_l > 0)
-                               {
-                               strcpy(ptr, leader);
-                               ptr += leader_l;
-                               }
-                       strcpy(ptr, name);
-                       ptr += strlen(name);
-                       strcpy(ptr, sep);
-                       ptr += sep_l;
-                       work = work->next;
+                       w = sw * DND_ICON_SIZE / sh;
+                       h = DND_ICON_SIZE;
                        }
-               ptr[0] = '\0';
-               free_selected_list(list);
-               }
-       else
-               {
-               gchar *path = file_clicked_get_path();
-               if (!path) return;
-               switch (info)
+               else
                        {
-                       case TARGET_URI_LIST:
-                               uri_text = g_strconcat("file:", path, "\r\n", NULL);
-                               break;
-                       case TARGET_TEXT_PLAIN:
-                               uri_text = g_strdup(path);
-                               break;
+                       w = DND_ICON_SIZE;
+                       h = sh * DND_ICON_SIZE / sw;
                        }
-               total = strlen(uri_text);
-               g_free(path);
-               }
-
-       if (debug) printf(uri_text);
 
-       gtk_selection_data_set (selection_data, selection_data->target,
-                                       8, uri_text, total);
-       g_free(uri_text);
+               dest = gdk_pixbuf_scale_simple(pixbuf, w, h, GDK_INTERP_BILINEAR);
+               pixbuf_draw_border(dest, w, h);
 
-       file_clist_highlight_unset();
-}
+               if (items > 1)
+                       {
+                       gchar *buf;
+                       gint lw,lh;
 
-static void file_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
-{
-       file_clist_highlight_set();
-}
+                       layout = gtk_widget_create_pango_layout(widget, NULL);
+                       buf = g_strdup_printf("<small> %d </small>", items);
+                       pango_layout_set_markup(layout, buf, -1);
+                       g_free(buf);
 
-static void file_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
-{
-       file_clist_highlight_unset();
+                       pango_layout_get_pixel_size(layout, &lw, &lh);
 
-       if (context->action == GDK_ACTION_MOVE)
-               {
-               filelist_refresh();
-               }
-}
+                       x = MAX(0, w - lw);
+                       y = MAX(0, h - lh);
+                       lw = CLAMP(lw, 0, w - x - 1);
+                       lh = CLAMP(lh, 0, h - y - 1);
 
-/*
- *-----------------------------------------------------------------------------
- * directory list drag and drop routines (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void dir_list_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
-                             GtkSelectionData *selection_data, guint info,
-                             guint time, gpointer data)
-{
-       gint row = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(dir_clist)));
+                       pixbuf_draw_rect(dest, x, y, lw, lh, 128);
+                       }
 
-       if (row >= 0)
-               {
-               gchar *name = gtk_clist_get_row_data(GTK_CLIST(dir_clist), row);
-               gchar *new_path;
-               gchar *text = NULL;
+               gdk_pixbuf_render_pixmap_and_mask(dest, &pixmap, &mask, 128);
+               g_object_unref(dest);
 
-               if (strcmp(name, ".") == 0)
-                       new_path = g_strdup(current_path);
-               else if (strcmp(name, "..") == 0)
-                       new_path = remove_level_from_path(current_path);
-               else
+               if (layout)
                        {
-                       if (strcmp(current_path, "/") == 0)
-                               new_path = g_strconcat(current_path, name, NULL);
-                       else
-                               new_path = g_strconcat(current_path, "/", name, NULL);
-                       }
+                       gdk_draw_layout(pixmap, widget->style->black_gc, x+1, y+1, layout);
+                       gdk_draw_layout(pixmap, widget->style->white_gc, x, y, layout);
 
-               
-               switch (info)
-                       {
-                       case TARGET_URI_LIST:
-                               text = g_strconcat("file:", new_path, "\r\n", NULL);
-                               break;
-                       case TARGET_TEXT_PLAIN:
-                               text = g_strdup(new_path);
-                               break;
-                       }
-               if (text)
-                       {
-                       gtk_selection_data_set (selection_data, selection_data->target,
-                                       8, text, strlen(text));
-                       g_free(text);
+                       g_object_unref(G_OBJECT(layout));
                        }
-               g_free(new_path);
-               }
-}
 
-static void dir_clist_set_highlight(gint set)
-{
-       gint row = GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(dir_clist)));
-       if (set)
-               {
-               gtk_clist_set_background(GTK_CLIST(dir_clist), row,
-                       &GTK_WIDGET (dir_clist)->style->bg[GTK_STATE_SELECTED]);
-               gtk_clist_set_foreground(GTK_CLIST(dir_clist), row,
-                       &GTK_WIDGET (dir_clist)->style->fg[GTK_STATE_SELECTED]);
-               }
-       else
-               {
-               gtk_clist_set_background(GTK_CLIST(dir_clist), row, NULL);
-               gtk_clist_set_foreground(GTK_CLIST(dir_clist), row, NULL);
-               }
-}
-
-static void dir_list_drag_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
-{
-       dir_clist_set_highlight(TRUE);
-}
-
-static void dir_list_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
-{
-       dir_clist_set_highlight(FALSE);
+               gtk_drag_set_icon_pixmap(context, gtk_widget_get_colormap(widget), pixmap, mask, -8, -6);
 
-       if (context->action == GDK_ACTION_MOVE)
-               {
-               filelist_refresh();
-               }
+               g_object_unref(pixmap);
+               if (mask) g_object_unref(mask);
 }
-
-/*
- *-----------------------------------------------------------------------------
- * drag and drop initialization (public)
- *-----------------------------------------------------------------------------
- */ 
-
-void init_dnd()
-{
-       /* dir clist */
-       gtk_drag_source_set(dir_clist, GDK_BUTTON2_MASK,
-                               file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
-       gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_begin",
-                               dir_list_drag_begin, NULL);
-       gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_data_get",
-                               dir_list_set_dnd_data, NULL);
-       gtk_signal_connect(GTK_OBJECT(dir_clist), "drag_end",
-                               dir_list_drag_end, NULL);
-
-       /* file clist */
-       gtk_drag_source_set(file_clist, GDK_BUTTON2_MASK,
-                               file_drag_types, n_file_drag_types, GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
-       gtk_signal_connect(GTK_OBJECT(file_clist), "drag_begin",
-                               file_list_drag_begin, NULL);
-       gtk_signal_connect(GTK_OBJECT(file_clist), "drag_data_get",
-                               file_list_set_dnd_data, NULL);
-       gtk_signal_connect(GTK_OBJECT(file_clist), "drag_end",
-                               file_list_drag_end, NULL);
-
-       /* image */
-       image_dnd_init(main_image);
-}
-
-
diff --git a/src/dnd.h b/src/dnd.h
new file mode 100644 (file)
index 0000000..9bae95f
--- /dev/null
+++ b/src/dnd.h
@@ -0,0 +1,36 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef DND_H
+#define DND_H
+
+
+enum {
+       TARGET_APP_COLLECTION_MEMBER,
+       TARGET_URI_LIST,
+       TARGET_TEXT_PLAIN
+};
+
+
+extern GtkTargetEntry dnd_file_drag_types[];
+extern gint dnd_file_drag_types_count;
+
+extern GtkTargetEntry dnd_file_drop_types[];
+extern gint dnd_file_drop_types_count;
+
+
+/* sets a drag icon to pixbuf, if items is > 1, text is drawn onto icon to indicate value */
+void dnd_set_drag_icon(GtkWidget *widget, GdkDragContext *context, GdkPixbuf *pixbuf, gint items);
+
+
+#endif
+
diff --git a/src/dupe.c b/src/dupe.c
new file mode 100644 (file)
index 0000000..a37d8bc
--- /dev/null
@@ -0,0 +1,3536 @@
+/*
+ * GQview
+ * (C) 2005 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "dupe.h"
+
+#include "cache.h"
+#include "collect.h"
+#include "collect-table.h"
+#include "dnd.h"
+#include "editors.h"
+#include "filelist.h"
+#include "image-load.h"
+#include "img-view.h"
+#include "info.h"
+#include "layout.h"
+#include "layout_image.h"
+#include "md5-util.h"
+#include "menu.h"
+#include "print.h"
+#include "thumb.h"
+#include "utilops.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_misc.h"
+#include "ui_tree_edit.h"
+
+#include <gdk/gdkkeysyms.h> /* for keyboard values */
+
+
+#include <math.h>
+
+
+#define DUPE_DEF_WIDTH 600
+#define DUPE_DEF_HEIGHT 400
+
+/* column assignment order (simply change them here) */
+enum {
+       DUPE_COLUMN_POINTER = 0,
+       DUPE_COLUMN_RANK,
+       DUPE_COLUMN_THUMB,
+       DUPE_COLUMN_NAME,
+       DUPE_COLUMN_SIZE,
+       DUPE_COLUMN_DATE,
+       DUPE_COLUMN_DIMENSIONS,
+       DUPE_COLUMN_PATH,
+       DUPE_COLUMN_COLOR,
+       DUPE_COLUMN_COUNT       /* total columns */
+};
+
+
+static GList *dupe_window_list = NULL; /* list of open DupeWindow *s */
+
+/*
+ * Well, after adding the 'compare two sets' option things got a little sloppy in here
+ * because we have to account for two 'modes' everywhere. (be careful).
+ */
+
+static void dupe_match_unlink(DupeItem *a, DupeItem *b);
+static DupeItem *dupe_match_find_parent(DupeWindow *dw, DupeItem *child);
+
+static gint dupe_match(DupeItem *a, DupeItem *b, DupeMatchType mask, gdouble *rank, gint fast);
+
+static void dupe_thumb_step(DupeWindow *dw);
+static gint dupe_check_cb(gpointer data);
+
+static void dupe_second_add(DupeWindow *dw, DupeItem *di);
+static void dupe_second_remove(DupeWindow *dw, DupeItem *di);
+static GtkWidget *dupe_menu_popup_second(DupeWindow *dw, DupeItem *di);
+
+static void dupe_dnd_init(DupeWindow *dw);
+
+/*
+ * ------------------------------------------------------------------
+ * Window updates
+ * ------------------------------------------------------------------
+ */
+
+
+static void dupe_window_update_count(DupeWindow *dw, gint count_only)
+{
+       gchar *text;
+
+       if (!dw->list)
+               {
+               text = g_strdup(_("Drop files to compare them."));
+               }
+       else if (count_only)
+               {
+               text = g_strdup_printf(_("%d files"), g_list_length(dw->list));
+               }
+       else
+               {
+               text = g_strdup_printf(_("%d matches found in %d files"), g_list_length(dw->dupes), g_list_length(dw->list));
+               }
+
+       if (dw->second_set)
+               {
+               gchar *buf = g_strconcat(text, " ", _("[set 1]"), NULL);
+               g_free(text);
+               text = buf;
+               }
+       gtk_label_set_text(GTK_LABEL(dw->status_label), text);
+
+       g_free(text);
+}
+
+static guint64 msec_time(void)
+{
+       struct timeval tv;
+
+       if (gettimeofday(&tv, NULL) == -1) return 0;
+
+       return (guint64)tv.tv_sec * 1000000 + (guint64)tv.tv_usec;
+}
+
+static gint dupe_iterations(gint n)
+{
+       return (n * ((n + 1) / 2));
+}
+
+static void dupe_window_update_progress(DupeWindow *dw, const gchar *status, gdouble value, gint force)
+{
+       const gchar *status_text;
+
+       if (status)
+               {
+               guint64 new_time = 0;
+
+               if (dw->setup_n % 10 == 0)
+                       {
+                       new_time = msec_time() - dw->setup_time;
+                       }
+               
+               if (!force &&
+                   value != 0.0 &&
+                   dw->setup_count > 0 &&
+                   new_time > 2000000)
+                       {
+                       gchar *buf;
+                       gint t;
+                       gint d;
+                       guint32 rem;
+
+                       if (new_time - dw->setup_time_count < 250000) return;
+                       dw->setup_time_count = new_time;
+
+                       if (dw->setup_done)
+                               {
+                               if (dw->second_set)
+                                       {
+                                       t = dw->setup_count;
+                                       d = dw->setup_count - dw->setup_n;
+                                       }
+                               else
+                                       {
+                                       t = dupe_iterations(dw->setup_count);
+                                       d = dupe_iterations(dw->setup_count - dw->setup_n);
+                                       }
+                               }
+                       else
+                               {
+                               t = dw->setup_count;
+                               d = dw->setup_count - dw->setup_n;
+                               }
+
+                       rem = (t - d) ? ((gdouble)(dw->setup_time_count / 1000000) / (t - d)) * d : 0;
+
+                       gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(dw->extra_label), value);
+
+                       buf = g_strdup_printf("%s %d:%02d ", status, rem / 60, rem % 60);
+                       gtk_progress_bar_set_text(GTK_PROGRESS_BAR(dw->extra_label), buf);
+                       g_free(buf);
+
+                       return;
+                       }
+               else if (force ||
+                        value == 0.0 ||
+                        dw->setup_count == 0 ||
+                        dw->setup_time_count == 0 ||
+                        (new_time > 0 && new_time - dw->setup_time_count >= 250000))
+                       {
+                       if (dw->setup_time_count == 0) dw->setup_time_count = 1;
+                       if (new_time > 0) dw->setup_time_count = new_time;
+                       gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(dw->extra_label), value);
+                       status_text = status;
+                       }
+               else
+                       {
+                       status_text = NULL;
+                       }
+               }       
+       else
+               {
+               gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(dw->extra_label), 0.0);
+               status_text = " ";
+               }
+
+       if (status_text) gtk_progress_bar_set_text(GTK_PROGRESS_BAR(dw->extra_label), status_text);
+}
+
+static void widget_set_cursor(GtkWidget *widget, gint icon)
+{
+       GdkCursor *cursor;
+
+       if (!widget->window) return;
+       if (icon == -1)
+               {
+               cursor = NULL;
+               }
+       else
+               {
+               cursor = gdk_cursor_new (icon);
+               }
+       gdk_window_set_cursor(widget->window, cursor);
+       if (cursor) gdk_cursor_unref(cursor);
+}
+
+/*
+ * ------------------------------------------------------------------
+ * row color utils
+ * ------------------------------------------------------------------
+ */
+
+static void dupe_listview_realign_colors(DupeWindow *dw)
+{
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gboolean color_set = TRUE;
+       DupeItem *parent = NULL;
+       gint valid;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(dw->listview));
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+       while (valid)
+               {
+               DupeItem *child;
+               DupeItem *child_parent;
+
+               gtk_tree_model_get(store, &iter, DUPE_COLUMN_POINTER, &child, -1);
+               child_parent = dupe_match_find_parent(dw, child);
+               if (!parent || parent != child_parent)
+                       {
+                       if (!parent)
+                               {
+                               /* keep the first row as it is */
+                               gtk_tree_model_get(store, &iter, DUPE_COLUMN_COLOR, &color_set, -1);
+                               }
+                       else
+                               {
+                               color_set = !color_set;
+                               }
+                       parent = dupe_match_find_parent(dw, child);
+                       }
+               gtk_list_store_set(GTK_LIST_STORE(store), &iter, DUPE_COLUMN_COLOR, color_set, -1);
+
+               valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
+               }
+}
+
+/*
+ * ------------------------------------------------------------------
+ * Dupe item utils
+ * ------------------------------------------------------------------
+ */
+
+static DupeItem *dupe_item_new(const gchar *path, gint64 size, time_t date)
+{
+       DupeItem *di;
+
+       di = g_new0(DupeItem, 1);
+
+       di->path = g_strdup(path);
+       di->name = filename_from_path(di->path);
+       di->size = size;
+       di->date = date;
+
+       di->group = NULL;
+       di->group_rank = 0.0;
+
+       di->simd = NULL;
+       di->checksum = 0;
+       di->md5sum = NULL;
+       di->width = 0;
+       di->height = 0;
+
+       di->second = FALSE;
+
+       return di;
+}
+
+static void dupe_item_free(DupeItem *di)
+{
+       g_free(di->path);
+       image_sim_free(di->simd);
+       g_free(di->md5sum);
+       if (di->pixbuf) g_object_unref(di->pixbuf);
+
+       g_free(di);
+}
+
+static void dupe_list_free(GList *list)
+{
+       GList *work = list;
+       while (work)
+               {
+               DupeItem *di = work->data;
+               work = work->next;
+               dupe_item_free(di);
+               }
+       g_list_free(list);
+}
+
+static DupeItem *dupe_item_find_path_by_list(const gchar *path, GList *work)
+{
+       while (work)
+               {
+               DupeItem *di = work->data;
+
+               if (strcmp(di->path, path) == 0) return di;
+
+               work = work->next;
+               }
+
+       return NULL;
+}
+
+static DupeItem *dupe_item_find_path(DupeWindow *dw, const gchar *path)
+{
+       DupeItem *di;
+
+       di = dupe_item_find_path_by_list(path, dw->list);
+       if (!di && dw->second_set) di = dupe_item_find_path_by_list(path, dw->second_list);
+
+       return di;
+}
+
+/*
+ * ------------------------------------------------------------------
+ * Image property cache
+ * ------------------------------------------------------------------
+ */
+
+static void dupe_item_read_cache(DupeItem *di)
+{
+       gchar *path;
+       CacheData *cd;
+
+       if (!di) return;
+
+       path = cache_find_location(CACHE_TYPE_SIM, di->path);
+       if (!path) return;
+
+       if (filetime(di->path) != filetime(path))
+               {
+               g_free(path);
+               return;
+               }
+
+       cd = cache_sim_data_load(path);
+       g_free(path);
+
+       if (cd)
+               {
+               if (!di->simd && cd->sim)
+                       {
+                       di->simd = cd->sim;
+                       cd->sim = NULL;
+                       }
+               if (di->width == 0 && di->height == 0 && cd->dimensions)
+                       {
+                       di->width = cd->width;
+                       di->height = cd->height;
+                       }
+               if (di->checksum == 0 && cd->have_checksum)
+                       {
+                       di->checksum = cd->checksum;
+                       }
+               if (!di->md5sum && cd->have_md5sum)
+                       {
+                       di->md5sum = md5_digest_to_text(cd->md5sum);
+                       }
+               cache_sim_data_free(cd);
+               }
+}
+
+static void dupe_item_write_cache(DupeItem *di)
+{
+       gchar *base;
+       mode_t mode = 0755;
+
+       if (!di) return;
+
+       base = cache_get_location(CACHE_TYPE_SIM, di->path, FALSE, &mode);
+       if (cache_ensure_dir_exists(base, mode))
+               {
+               CacheData *cd;
+
+               cd = cache_sim_data_new();
+               cd->path = cache_get_location(CACHE_TYPE_SIM, di->path, TRUE, NULL);
+
+               if (di->width != 0) cache_sim_data_set_dimensions(cd, di->width, di->height);
+               if (di->checksum != 0) cache_sim_data_set_checksum(cd, di->checksum);
+               if (di->md5sum)
+                       {
+                       guchar digest[16];
+                       if (md5_digest_from_text(di->md5sum, digest)) cache_sim_data_set_md5sum(cd, digest);
+                       }
+               if (di->simd) cache_sim_data_set_similarity(cd, di->simd);
+
+               if (cache_sim_data_save(cd))
+                       {
+                       filetime_set(cd->path, filetime(di->path));
+                       }
+               cache_sim_data_free(cd);
+               }
+       g_free(base);
+}
+
+/*
+ * ------------------------------------------------------------------
+ * Window list utils
+ * ------------------------------------------------------------------
+ */
+
+static gint dupe_listview_find_item(GtkListStore *store, DupeItem *item, GtkTreeIter *iter)
+{
+       gint valid;
+       gint row = 0;
+
+       valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), iter);
+       while (valid)
+               {
+               DupeItem *item_n;
+               gtk_tree_model_get(GTK_TREE_MODEL(store), iter, DUPE_COLUMN_POINTER, &item_n, -1);
+               if (item_n == item) return row;
+
+               valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), iter);
+               row++;
+               }
+
+       return -1;
+}
+
+static void dupe_listview_add(DupeWindow *dw, DupeItem *parent, DupeItem *child)
+{
+       DupeItem *di;
+       gint row;
+       gchar *text[DUPE_COLUMN_COUNT];
+       GtkListStore *store;
+       GtkTreeIter iter;
+       gboolean color_set = FALSE;
+       gint rank;
+
+       if (!parent) return;
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dw->listview)));
+
+       if (child)
+               {
+               DupeMatch *dm;
+
+               row = dupe_listview_find_item(store, parent, &iter);
+               gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, DUPE_COLUMN_COLOR, &color_set, -1);
+
+               row++;
+
+               if (child->group)
+                       {
+                       dm = child->group->data;
+                       rank = (gint)floor(dm->rank);
+                       }
+               else
+                       {
+                       rank = 1;
+                       printf("NULL group in item!\n");
+                       }
+               }
+       else
+               {
+               if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter))
+                       {
+                       gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, DUPE_COLUMN_COLOR, &color_set, -1);
+                       color_set = !color_set;
+                       }
+               else
+                       {
+                       color_set = FALSE;
+                       }
+               row = 0;
+               rank = 0;
+               }
+
+       di = (child) ? child : parent;
+
+       if (!child && dw->second_set)
+               {
+               text[DUPE_COLUMN_RANK] = g_strdup("[1]");
+               }
+       else if (rank == 0)
+               {
+               text[DUPE_COLUMN_RANK] = g_strdup((di->second) ? "(2)" : "");
+               }
+       else
+               {
+               text[DUPE_COLUMN_RANK] = g_strdup_printf("%d%s", rank, (di->second) ? " (2)" : "");
+               }
+
+       text[DUPE_COLUMN_THUMB] = "";
+       text[DUPE_COLUMN_NAME] = (gchar *)di->name;
+       text[DUPE_COLUMN_SIZE] = text_from_size(di->size);
+       text[DUPE_COLUMN_DATE] = (gchar *)text_from_time(di->date);
+       if (di->width > 0 && di->height > 0)
+               {
+               text[DUPE_COLUMN_DIMENSIONS] = g_strdup_printf("%d x %d", di->width, di->height);
+               }
+       else
+               {
+               text[DUPE_COLUMN_DIMENSIONS] = g_strdup("");
+               }
+       text[DUPE_COLUMN_PATH] = di->path;
+       text[DUPE_COLUMN_COLOR] = NULL;
+
+       gtk_list_store_insert(store, &iter, row);
+       gtk_list_store_set(store, &iter,
+                               DUPE_COLUMN_POINTER, di,
+                               DUPE_COLUMN_RANK, text[DUPE_COLUMN_RANK],
+                               DUPE_COLUMN_THUMB, NULL,
+                               DUPE_COLUMN_NAME, text[DUPE_COLUMN_NAME],
+                               DUPE_COLUMN_SIZE, text[DUPE_COLUMN_SIZE],
+                               DUPE_COLUMN_DATE, text[DUPE_COLUMN_DATE],
+                               DUPE_COLUMN_DIMENSIONS, text[DUPE_COLUMN_DIMENSIONS],
+                               DUPE_COLUMN_PATH, text[DUPE_COLUMN_PATH],
+                               DUPE_COLUMN_COLOR, color_set,
+                               -1);
+
+       g_free(text[DUPE_COLUMN_RANK]);
+       g_free(text[DUPE_COLUMN_SIZE]);
+       g_free(text[DUPE_COLUMN_DIMENSIONS]);
+}
+
+static void dupe_listview_populate(DupeWindow *dw)
+{
+       GtkListStore *store;
+       GList *work;
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dw->listview)));
+       gtk_list_store_clear(store);
+
+       work = g_list_last(dw->dupes);
+       while (work)
+               {
+               DupeItem *parent = work->data;
+               GList *temp;
+
+               dupe_listview_add(dw, parent, NULL);
+
+               temp = g_list_last(parent->group);
+               while (temp)
+                       {
+                       DupeMatch *dm = temp->data;
+                       DupeItem *child;
+
+                       child = dm->di;
+
+                       dupe_listview_add(dw, parent, child);
+
+                       temp = temp->prev;
+                       }
+
+               work = work->prev;
+               }
+
+       gtk_tree_view_columns_autosize(GTK_TREE_VIEW(dw->listview));
+}
+
+static void dupe_listview_remove(DupeWindow *dw, DupeItem *di)
+{
+       GtkListStore *store;
+       GtkTreeIter iter;
+       gint row;
+
+       if (!di) return;
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dw->listview)));
+       row = dupe_listview_find_item(store, di, &iter);
+       if (row < 0) return;
+
+       tree_view_move_cursor_away(GTK_TREE_VIEW(dw->listview), &iter, TRUE);
+       gtk_list_store_remove(store, &iter);
+
+       if (g_list_find(dw->dupes, di) != NULL)
+               {
+               if (!dw->color_frozen) dupe_listview_realign_colors(dw);
+               }
+}
+
+
+static GList *dupe_listview_get_path_list(DupeWindow *dw, GtkWidget *listview)
+{
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gint valid;
+       GList *list = NULL;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(listview));
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+       while (valid)
+               {
+               DupeItem *di;
+               gtk_tree_model_get(store, &iter, DUPE_COLUMN_POINTER, &di, -1);
+               list = g_list_prepend(list, g_strdup(di->path));
+
+               valid = gtk_tree_model_iter_next(store, &iter);
+               }
+
+       return g_list_reverse(list);
+}
+
+
+static GList *dupe_listview_get_selection(DupeWindow *dw, GtkWidget *listview)
+{
+       GtkTreeModel *store;
+       GtkTreeSelection *selection;
+       GList *slist;
+       GList *list = NULL;
+       GList *work;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(listview));
+       slist = gtk_tree_selection_get_selected_rows(selection, &store);
+       work = slist;
+       while (work)
+               {
+               GtkTreePath *tpath = work->data;
+               DupeItem *di = NULL;
+               GtkTreeIter iter;
+
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DUPE_COLUMN_POINTER, &di, -1);
+               if (di)
+                       {
+                       list = g_list_prepend(list, g_strdup(di->path));
+                       }
+               work = work->next;
+               }
+       g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+       g_list_free(slist);
+
+       return g_list_reverse(list);
+}
+
+static gint dupe_listview_item_is_selected(DupeWindow *dw, DupeItem *di, GtkWidget *listview)
+{
+       GtkTreeModel *store;
+       GtkTreeSelection *selection;
+       GList *slist;
+       GList *work;
+       gint found = FALSE;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(listview));
+       slist = gtk_tree_selection_get_selected_rows(selection, &store);
+       work = slist;
+       while (!found && work)
+               {
+               GtkTreePath *tpath = work->data;
+               DupeItem *di_n;
+               GtkTreeIter iter;
+
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DUPE_COLUMN_POINTER, &di_n, -1);
+               if (di_n == di) found = TRUE;
+               work = work->next;
+               }
+       g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+       g_list_free(slist);
+
+       return found;
+}
+
+static void dupe_listview_select_dupes(DupeWindow *dw, gint parents)
+{
+       GtkTreeModel *store;
+       GtkTreeSelection *selection;
+       GtkTreeIter iter;
+       gint valid;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dw->listview));
+       gtk_tree_selection_unselect_all(selection);
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(dw->listview));
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+       while (valid)
+               {
+               DupeItem *di;
+
+               gtk_tree_model_get(store, &iter, DUPE_COLUMN_POINTER, &di, -1);
+               if ( (dupe_match_find_parent(dw, di) == di) == (parents) )
+                       {
+                       gtk_tree_selection_select_iter(selection, &iter);
+                       }
+               valid = gtk_tree_model_iter_next(store, &iter);
+               }
+}
+
+/*
+ * ------------------------------------------------------------------
+ * Match group manipulation
+ * ------------------------------------------------------------------
+ */
+
+static DupeMatch *dupe_match_find_match(DupeItem *child, DupeItem *parent)
+{
+       GList *work;
+
+       work = parent->group;
+       while (work)
+               {
+               DupeMatch *dm = work->data;
+               if (dm->di == child) return dm;
+               work = work->next;
+               }
+       return NULL;
+}
+
+static void dupe_match_link_child(DupeItem *child, DupeItem *parent, gdouble rank)
+{
+       DupeMatch *dm;
+
+       dm = g_new0(DupeMatch, 1);
+       dm->di = child;
+       dm->rank = rank;
+       parent->group = g_list_append(parent->group, dm);
+}
+
+static void dupe_match_link(DupeItem *a, DupeItem *b, gdouble rank)
+{
+       dupe_match_link_child(a, b, rank);
+       dupe_match_link_child(b, a, rank);
+}
+
+static void dupe_match_unlink_child(DupeItem *child, DupeItem *parent)
+{
+       DupeMatch *dm;
+
+       dm = dupe_match_find_match(child, parent);
+       if (dm)
+               {
+               parent->group = g_list_remove(parent->group, dm);
+               g_free(dm);
+               }
+}
+
+static void dupe_match_unlink(DupeItem *a, DupeItem *b)
+{
+       dupe_match_unlink_child(a, b);
+       dupe_match_unlink_child(b, a);
+}
+
+static void dupe_match_link_clear(DupeItem *parent, gint unlink_children)
+{
+       GList *work;
+                                                                                                                               
+       work = parent->group;
+       while (work)
+               {
+               DupeMatch *dm = work->data;
+               work = work->next;
+
+               if (unlink_children) dupe_match_unlink_child(parent, dm->di);
+
+               g_free(dm);
+               }
+
+       g_list_free(parent->group);
+       parent->group = NULL;
+       parent->group_rank = 0.0;
+}
+
+static gint dupe_match_link_exists(DupeItem *child, DupeItem *parent)
+{
+       return (dupe_match_find_match(child, parent) != NULL);
+}
+
+static gdouble dupe_match_link_rank(DupeItem *child, DupeItem *parent)
+{
+       DupeMatch *dm;
+
+       dm = dupe_match_find_match(child, parent);
+       if (dm) return dm->rank;
+
+       return 0.0;
+}
+
+static DupeItem *dupe_match_highest_rank(DupeItem *child)
+{
+       DupeMatch *dr;
+       GList *work;
+
+       dr = NULL;
+       work = child->group;
+       while (work)
+               {
+               DupeMatch *dm = work->data;
+               if (!dr || dm->rank > dr->rank) dr = dm;
+               work = work->next;
+               }
+
+       return (dr) ? dr->di : NULL;
+}
+
+static void dupe_match_rank_update(DupeItem *parent)
+{
+       GList *work;
+       gdouble rank = 0.0;
+       gint c = 0;
+
+       work = parent->group;
+       while (work)
+               {
+               DupeMatch *dm = work->data;
+               work = work->next;
+               rank += dm->rank;
+               c++;
+               }
+
+       if (c > 0)
+               {
+               parent->group_rank = rank / c;
+               }
+       else
+               {
+               parent->group_rank = 0.0;
+               }
+}
+
+static DupeItem *dupe_match_find_parent(DupeWindow *dw, DupeItem *child)
+{
+       GList *work;
+
+       if (g_list_find(dw->dupes, child)) return child;
+
+       work = child->group;
+       while (work)
+               {
+               DupeMatch *dm = work->data;
+               if (g_list_find(dw->dupes, dm->di)) return dm->di;
+               work = work->next;
+               }
+
+       return NULL;
+}
+
+static void dupe_match_reset_list(GList *work)
+{
+       while (work)
+               {
+               DupeItem *di = work->data;
+               work = work->next;
+
+               dupe_match_link_clear(di, FALSE);
+               }
+}
+
+static void dupe_match_reparent(DupeWindow *dw, DupeItem *old, DupeItem *new)
+{
+       GList *work;
+
+       if (!old || !new || !dupe_match_link_exists(old, new)) return;
+
+       dupe_match_link_clear(new, TRUE);
+       work = old->group;
+       while (work)
+               {
+               DupeMatch *dm = work->data;
+               dupe_match_unlink_child(old, dm->di);
+               dupe_match_link_child(new, dm->di, dm->rank);
+               work = work->next;
+               }
+
+       new->group = old->group;
+       old->group = NULL;
+
+       work = g_list_find(dw->dupes, old);
+       if (work) work->data = new;
+}
+
+static void dupe_match_print_group(DupeItem *di)
+{
+       GList *work;
+
+       printf("+ %f %s\n", di->group_rank, di->name);
+
+       work = di->group;
+       while (work)
+               {
+               DupeMatch *dm = work->data;
+               work = work->next;
+
+               printf("  %f %s\n", dm->rank, dm->di->name);
+               }
+
+       printf("\n");
+}
+
+static void dupe_match_print_list(GList *list)
+{
+       GList *work;
+
+       work = list;
+       while (work)
+               {
+               DupeItem *di = work->data;
+               dupe_match_print_group(di);
+               work = work->next;
+               }
+}
+
+/* level 3, unlinking and orphan handling */
+static GList *dupe_match_unlink_by_rank(DupeItem *child, DupeItem *parent, GList *list, DupeWindow *dw)
+{
+       DupeItem *best;
+
+       best = dupe_match_highest_rank(parent);
+       if (best == child || dupe_match_highest_rank(child) == parent)
+               {
+               GList *work;
+               gdouble rank;
+
+               if (debug > 1) printf("link found %s to %s [%d]\n", child->name, parent->name, g_list_length(parent->group));
+
+               work = parent->group;
+               while (work)
+                       {
+                       DupeMatch *dm = work->data;
+                       DupeItem *orphan;
+
+                       work = work->next;
+                       orphan = dm->di;
+                       if (orphan != child && g_list_length(orphan->group) < 2)
+                               {
+                               dupe_match_link_clear(orphan, TRUE);
+                               if (!dw->second_set || orphan->second)
+                                       {
+                                       dupe_match(orphan, child, dw->match_mask, &rank, FALSE);
+                                       dupe_match_link(orphan, child, rank);
+                                       }
+                               list = g_list_remove(list, orphan);
+                               }
+                       }
+               
+               rank = dupe_match_link_rank(child, parent);
+               dupe_match_link_clear(parent, TRUE);
+               dupe_match_link(child, parent, rank);
+               list = g_list_remove(list, parent);
+               }
+       else
+               {
+               if (debug > 1) printf("unlinking %s and %s\n", child->name, parent->name);
+               
+               dupe_match_unlink(child, parent);
+               }
+
+       return list;
+}
+
+/* level 2 */
+static GList *dupe_match_group_filter(GList *list, DupeItem *di, DupeWindow *dw)
+{
+       GList *work;
+
+       work = g_list_last(di->group);
+       while (work)
+               {
+               DupeMatch *dm = work->data;
+               work = work->prev;
+               list = dupe_match_unlink_by_rank(di, dm->di, list, dw);
+               }
+
+       return list;
+}
+
+/* level 1 (top) */
+static GList *dupe_match_group_trim(GList *list, DupeWindow *dw)
+{
+       GList *work;
+
+       work = list;
+       while (work)
+               {
+               DupeItem *di = work->data;
+               if (!di->second) list = dupe_match_group_filter(list, di, dw);
+               work = work->next;
+               if (di->second) list = g_list_remove(list, di);
+               }
+
+       return list;
+}
+
+static gint dupe_match_sort_groups_cb(gconstpointer a, gconstpointer b)
+{
+       DupeMatch *da = (DupeMatch *)a;
+       DupeMatch *db = (DupeMatch *)b;
+
+       if (da->rank > db->rank) return -1;
+       if (da->rank < db->rank) return 1;
+       return 0;
+}
+
+static void dupe_match_sort_groups(GList *list)
+{
+       GList *work;
+
+       work = list;
+       while (work)
+               {
+               DupeItem *di = work->data;
+               di->group = g_list_sort(di->group, dupe_match_sort_groups_cb);
+               work = work->next;
+               }
+}
+
+static gint dupe_match_rank_sort_cb(gconstpointer a, gconstpointer b)
+{
+       DupeItem *da = (DupeItem *)a;
+       DupeItem *db = (DupeItem *)b;
+
+       if (da->group_rank > db->group_rank) return -1;
+       if (da->group_rank < db->group_rank) return 1;
+       return 0;
+}
+
+/* returns allocated GList of dupes sorted by rank */
+static GList *dupe_match_rank_sort(GList *source_list)
+{
+       GList *list = NULL;
+       GList *work;
+
+       work = source_list;
+       while (work)
+               {
+               DupeItem *di = work->data;
+
+               if (di->group)
+                       {
+                       dupe_match_rank_update(di);
+                       list = g_list_prepend(list, di);
+                       }
+                       
+               work = work->next;
+               }
+
+       return g_list_sort(list, dupe_match_rank_sort_cb);
+}
+
+static void dupe_match_rank(DupeWindow *dw)
+{
+       GList *list;
+
+       list = dupe_match_rank_sort(dw->list);
+
+       if (debug > 1) dupe_match_print_list(list);
+       
+       if (debug) printf("Similar items: %d\n", g_list_length(list));
+       list = dupe_match_group_trim(list, dw);
+       if (debug) printf("Unique groups: %d\n", g_list_length(list));
+
+       dupe_match_sort_groups(list);
+
+       if (debug) dupe_match_print_list(list);
+
+       list = dupe_match_rank_sort(list);
+
+       g_list_free(dw->dupes);
+       dw->dupes = list;
+}
+
+/*
+ * ------------------------------------------------------------------
+ * Match group tests
+ * ------------------------------------------------------------------
+ */
+
+static gint dupe_match(DupeItem *a, DupeItem *b, DupeMatchType mask, gdouble *rank, gint fast)
+{
+       *rank = 0.0;
+
+       if (a == b) return FALSE;
+
+       if (mask & DUPE_MATCH_PATH)
+               {
+               if (strcmp(a->path, b->path) != 0) return FALSE;
+               }
+       if (mask & DUPE_MATCH_NAME)
+               {
+               if (strcmp(a->name, b->name) != 0) return FALSE;
+               }
+       if (mask & DUPE_MATCH_SIZE)
+               {
+               if (a->size != b->size) return FALSE;
+               }
+       if (mask & DUPE_MATCH_DATE)
+               {
+               if (a->date != b->date) return FALSE;
+               }
+       if (mask & DUPE_MATCH_SUM)
+               {
+               if (!a->md5sum) a->md5sum = md5_text_from_file_utf8(a->path, "");
+               if (!b->md5sum) b->md5sum = md5_text_from_file_utf8(b->path, "");
+               if (a->md5sum[0] == '\0' ||
+                   b->md5sum[0] == '\0' ||
+                   strcmp(a->md5sum, b->md5sum) != 0) return FALSE;
+               }
+       if (mask & DUPE_MATCH_DIM)
+               {
+               if (a->width == 0) image_load_dimensions(a->path, &a->width, &a->height);
+               if (b->width == 0) image_load_dimensions(b->path, &b->width, &b->height);
+               if (a->width != b->width || a->height != b->height) return FALSE;
+               }
+       if (mask & DUPE_MATCH_SIM_HIGH ||
+           mask & DUPE_MATCH_SIM_MED ||
+           mask & DUPE_MATCH_SIM_LOW ||
+           mask & DUPE_MATCH_SIM_CUSTOM)
+               {
+               gdouble f;
+               gdouble m;
+
+               if (mask & DUPE_MATCH_SIM_HIGH) m = 0.95;
+               else if (mask & DUPE_MATCH_SIM_MED) m = 0.90;
+               else if (mask & DUPE_MATCH_SIM_CUSTOM) m = (gdouble)dupe_custom_threshold / 100.0;
+               else m = 0.85;
+
+               if (fast)
+                       {
+                       f = image_sim_compare_fast(a->simd, b->simd, m);
+                       }
+               else
+                       {
+                       f = image_sim_compare(a->simd, b->simd);
+                       }
+
+               *rank = f * 100.0;
+
+               if (f < m) return FALSE;
+
+               if (debug > 2) printf("similar: %32s %32s = %f\n", a->name, b->name, f);
+               }
+
+       return TRUE;
+}
+
+static void dupe_list_check_match(DupeWindow *dw, DupeItem *needle, GList *start)
+{
+       GList *work;
+
+       if (dw->second_set)
+               {
+               work = dw->second_list;
+               }
+       else if (start)
+               {
+               work = start;
+               }
+       else
+               {
+               work = g_list_last(dw->list);
+               }
+
+       while (work)
+               {
+               DupeItem *di = work->data;
+
+               /* speed opt: forward for second set, back for simple compare */
+               if (dw->second_set)
+                       work = work->next;
+               else
+                       work = work->prev;
+
+               if (!dupe_match_link_exists(needle, di))
+                       {
+                       gdouble rank;
+
+                       if (dupe_match(di, needle, dw->match_mask, &rank, TRUE))
+                               {
+                               dupe_match_link(di, needle, rank);
+                               }
+                       }
+               }
+}
+
+/*
+ * ------------------------------------------------------------------
+ * Thumbnail handling
+ * ------------------------------------------------------------------
+ */
+
+static void dupe_listview_set_thumb(DupeWindow *dw, DupeItem *di, GtkTreeIter *iter)
+{
+       GtkListStore *store;
+       GtkTreeIter iter_n;
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dw->listview)));
+       if (!iter)
+               {
+               if (dupe_listview_find_item(store, di, &iter_n) >= 0)
+                       {
+                       iter = &iter_n;
+                       }
+               }
+
+       if (iter) gtk_list_store_set(store, iter, DUPE_COLUMN_THUMB, di->pixbuf, -1);
+}
+
+static void dupe_thumb_do(DupeWindow *dw)
+{
+       DupeItem *di;
+
+       if (!dw->thumb_loader || !dw->thumb_item) return;
+       di = dw->thumb_item;
+
+       if (di->pixbuf) g_object_unref(di->pixbuf);
+       di->pixbuf = thumb_loader_get_pixbuf(dw->thumb_loader, TRUE);
+
+       dupe_listview_set_thumb(dw, di, NULL);
+}
+
+static void dupe_thumb_error_cb(ThumbLoader *tl, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       dupe_thumb_do(dw);
+       dupe_thumb_step(dw);
+}
+
+static void dupe_thumb_done_cb(ThumbLoader *tl, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       dupe_thumb_do(dw);
+       dupe_thumb_step(dw);
+}
+
+static void dupe_thumb_step(DupeWindow *dw)
+{
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       DupeItem *di = NULL;
+       gint valid;
+       gint row = 0;
+       gint length = 0;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(dw->listview));
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+
+       while (!di && valid)
+               {
+               GdkPixbuf *pixbuf;
+
+               length++;
+               gtk_tree_model_get(store, &iter, DUPE_COLUMN_POINTER, &di, DUPE_COLUMN_THUMB, &pixbuf, -1);
+               if (pixbuf || di->pixbuf)
+                       {
+                       if (!pixbuf) gtk_list_store_set(GTK_LIST_STORE(store), &iter, DUPE_COLUMN_THUMB, di->pixbuf, -1);
+                       row++;
+                       di = NULL;
+                       }
+               valid = gtk_tree_model_iter_next(store, &iter);
+               }
+       if (valid)
+               {
+               while (gtk_tree_model_iter_next(store, &iter)) length++;
+               }
+
+       if (!di)
+               {
+               dw->thumb_item = NULL;
+               thumb_loader_free(dw->thumb_loader);
+               dw->thumb_loader = NULL;
+
+               dupe_window_update_progress(dw, NULL, 0.0, FALSE);
+               return;
+               }
+
+       dupe_window_update_progress(dw, _("Loading thumbs..."),
+                                   length == 0 ? 0.0 : (gdouble)(row) / length, FALSE);
+
+       dw->thumb_item = di;
+       thumb_loader_free(dw->thumb_loader);
+       dw->thumb_loader = thumb_loader_new(thumb_max_width, thumb_max_height);
+
+       thumb_loader_set_callbacks(dw->thumb_loader,
+                                  dupe_thumb_done_cb,
+                                  dupe_thumb_error_cb,
+                                  NULL,
+                                  dw);
+
+       /* start it */
+       if (!thumb_loader_start(dw->thumb_loader, di->path))
+               {
+               /* error, handle it, do next */
+               if (debug) printf("error loading thumb for %s\n", di->path);
+               dupe_thumb_do(dw);
+               dupe_thumb_step(dw);
+               }
+}
+
+/*
+ * ------------------------------------------------------------------
+ * Dupe checking loop
+ * ------------------------------------------------------------------
+ */
+
+static void dupe_check_stop(DupeWindow *dw)
+{
+       if (dw->idle_id != -1 || dw->img_loader || dw->thumb_loader)
+               {
+               g_source_remove(dw->idle_id);
+               dw->idle_id = -1;
+               dupe_window_update_progress(dw, NULL, 0.0, FALSE);
+               widget_set_cursor(dw->listview, -1);
+               }
+
+       thumb_loader_free(dw->thumb_loader);
+       dw->thumb_loader = NULL;
+
+       image_loader_free(dw->img_loader);
+       dw->img_loader = NULL;
+}
+
+static void dupe_loader_done_cb(ImageLoader *il, gpointer data)
+{
+       DupeWindow *dw = data;
+       GdkPixbuf *pixbuf;
+
+       pixbuf = image_loader_get_pixbuf(il);
+
+       if (dw->setup_point)
+               {
+               DupeItem *di = dw->setup_point->data;
+
+               if (!di->simd)
+                       {
+                       di->simd = image_sim_new_from_pixbuf(pixbuf);
+                       }
+               else
+                       {
+                       image_sim_fill_data(di->simd, pixbuf);
+                       }
+
+               if (di->width == 0 && di->height == 0)
+                       {
+                       di->width = gdk_pixbuf_get_width(pixbuf);
+                       di->height = gdk_pixbuf_get_height(pixbuf);
+                       }
+               if (enable_thumb_caching)
+                       {
+                       dupe_item_write_cache(di);
+                       }
+
+               image_sim_alternate_processing(di->simd);
+               }
+
+       image_loader_free(dw->img_loader);
+       dw->img_loader = NULL;
+
+       dw->idle_id = g_idle_add(dupe_check_cb, dw);
+}
+
+static void dupe_setup_reset(DupeWindow *dw)
+{
+       dw->setup_point = NULL;
+       dw->setup_n = 0;
+       dw->setup_time = msec_time();
+       dw->setup_time_count = 0;
+}
+
+static GList *dupe_setup_point_step(DupeWindow *dw, GList *p)
+{
+       if (!p) return NULL;
+
+       if (p->next) return p->next;
+
+       if (dw->second_set && g_list_first(p) == dw->list) return dw->second_list;
+
+       return NULL;
+}
+
+static gint dupe_check_cb(gpointer data)
+{
+       DupeWindow *dw = data;
+
+       if (dw->idle_id == -1) return FALSE;
+
+       if (!dw->setup_done)
+               {
+               if ((dw->match_mask & DUPE_MATCH_SUM) &&
+                   !(dw->setup_mask & DUPE_MATCH_SUM) )
+                       {
+                       if (!dw->setup_point) dw->setup_point = dw->list;
+
+                       while (dw->setup_point)
+                               {
+                               DupeItem *di = dw->setup_point->data;
+
+                               dw->setup_point = dupe_setup_point_step(dw, dw->setup_point);
+                               dw->setup_n++;
+
+                               if (!di->md5sum)
+                                       {
+                                       dupe_window_update_progress(dw, _("Reading checksums..."),
+                                               dw->setup_count == 0 ? 0.0 : (gdouble)(dw->setup_n - 1) / dw->setup_count, FALSE);
+
+                                       if (enable_thumb_caching)
+                                               {
+                                               dupe_item_read_cache(di);
+                                               if (di->md5sum) return TRUE;
+                                               }
+
+                                       di->md5sum = md5_text_from_file_utf8(di->path, "");
+                                       if (enable_thumb_caching)
+                                               {
+                                               dupe_item_write_cache(di);
+                                               }
+                                       return TRUE;
+                                       }
+                               }
+                       dw->setup_mask |= DUPE_MATCH_SUM;
+                       dupe_setup_reset(dw);
+                       }
+               if ((dw->match_mask & DUPE_MATCH_DIM) &&
+                   !(dw->setup_mask & DUPE_MATCH_DIM) )
+                       {
+                       if (!dw->setup_point) dw->setup_point = dw->list;
+
+                       while (dw->setup_point)
+                               {
+                               DupeItem *di = dw->setup_point->data;
+
+                               dw->setup_point = dupe_setup_point_step(dw, dw->setup_point);
+                               dw->setup_n++;
+                               if (di->width == 0 && di->height == 0)
+                                       {
+                                       dupe_window_update_progress(dw, _("Reading dimensions..."),
+                                               dw->setup_count == 0 ? 0.0 : (gdouble)(dw->setup_n - 1) / dw->setup_count, FALSE);
+
+                                       if (enable_thumb_caching)
+                                               {
+                                               dupe_item_read_cache(di);
+                                               if (di->width != 0 || di->height != 0) return TRUE;
+                                               }
+
+                                       image_load_dimensions(di->path, &di->width, &di->height);
+                                       if (enable_thumb_caching)
+                                               {
+                                               dupe_item_write_cache(di);
+                                               }
+                                       return TRUE;
+                                       }
+                               }
+                       dw->setup_mask |= DUPE_MATCH_DIM;
+                       dupe_setup_reset(dw);
+                       }
+               if ((dw->match_mask & DUPE_MATCH_SIM_HIGH ||
+                    dw->match_mask & DUPE_MATCH_SIM_MED ||
+                    dw->match_mask & DUPE_MATCH_SIM_LOW ||
+                    dw->match_mask & DUPE_MATCH_SIM_CUSTOM) &&
+                   !(dw->setup_mask & DUPE_MATCH_SIM_MED) )
+                       {
+                       if (!dw->setup_point) dw->setup_point = dw->list;
+
+                       while (dw->setup_point)
+                               {
+                               DupeItem *di = dw->setup_point->data;
+
+                               if (!di->simd)
+                                       {
+                                       dupe_window_update_progress(dw, _("Reading similarity data..."),
+                                               dw->setup_count == 0 ? 0.0 : (gdouble)dw->setup_n / dw->setup_count, FALSE);
+
+                                       if (enable_thumb_caching)
+                                               {
+                                               dupe_item_read_cache(di);
+                                               if (cache_sim_data_filled(di->simd))
+                                                       {
+                                                       image_sim_alternate_processing(di->simd);
+                                                       return TRUE;
+                                                       }
+                                               }
+
+                                       dw->img_loader = image_loader_new(di->path);
+                                       image_loader_set_buffer_size(dw->img_loader, 8);
+                                       image_loader_set_error_func(dw->img_loader, dupe_loader_done_cb, dw);
+
+                                       if (!image_loader_start(dw->img_loader, dupe_loader_done_cb, dw))
+                                               {
+                                               image_sim_free(di->simd);
+                                               di->simd = image_sim_new();
+                                               image_loader_free(dw->img_loader);
+                                               dw->img_loader = NULL;
+                                               return TRUE;
+                                               }
+                                       dw->idle_id = -1;
+                                       return FALSE;
+                                       }
+
+                               dw->setup_point = dupe_setup_point_step(dw, dw->setup_point);
+                               dw->setup_n++;
+                               }
+                       dw->setup_mask |= DUPE_MATCH_SIM_MED;
+                       dupe_setup_reset(dw);
+                       }
+               dupe_window_update_progress(dw, _("Comparing..."), 0.0, FALSE);
+               dw->setup_done = TRUE;
+               dupe_setup_reset(dw);
+               dw->setup_count = g_list_length(dw->list);
+               }
+
+       if (!dw->working)
+               {
+               if (dw->setup_count > 0)
+                       {
+                       dw->setup_count = 0;
+                       dupe_window_update_progress(dw, _("Sorting..."), 1.0, TRUE);
+                       return TRUE;
+                       }
+               dw->idle_id = -1;
+               dupe_window_update_progress(dw, NULL, 0.0, FALSE);
+
+               dupe_match_rank(dw);
+               dupe_window_update_count(dw, FALSE);
+
+               dupe_listview_populate(dw);
+
+               /* check thumbs */
+               if (dw->show_thumbs) dupe_thumb_step(dw);
+
+               widget_set_cursor(dw->listview, -1);
+
+               return FALSE;
+               }
+
+       dupe_list_check_match(dw, (DupeItem *)dw->working->data, dw->working);
+       dupe_window_update_progress(dw, _("Comparing..."), dw->setup_count == 0 ? 0.0 : (gdouble) dw->setup_n / dw->setup_count, FALSE);
+       dw->setup_n++;
+
+       dw->working = dw->working->prev;
+
+       return TRUE;
+}
+
+static void dupe_check_start(DupeWindow *dw)
+{
+       dw->setup_done = FALSE;
+
+       dw->setup_count = g_list_length(dw->list);
+       if (dw->second_set) dw->setup_count += g_list_length(dw->second_list);
+
+       dw->setup_mask = 0;
+       dupe_setup_reset(dw);
+
+       dw->working = g_list_last(dw->list);
+
+       dupe_window_update_count(dw, TRUE);
+       widget_set_cursor(dw->listview, GDK_WATCH);
+
+       if (dw->idle_id != -1) return;
+
+       dw->idle_id = g_idle_add(dupe_check_cb, dw);
+}
+
+/*
+ * ------------------------------------------------------------------
+ * Item addition, removal
+ * ------------------------------------------------------------------
+ */
+
+static void dupe_item_remove(DupeWindow *dw, DupeItem *di)
+{
+       if (!di) return;
+
+       /* handle things that may be in progress... */
+       if (dw->working && dw->working->data == di)
+               {
+               dw->working = dw->working->prev;
+               }
+       if (dw->thumb_loader && dw->thumb_item == di)
+               {
+               dupe_thumb_step(dw);
+               }
+       if (dw->setup_point && dw->setup_point->data == di)
+               {
+               dw->setup_point = dupe_setup_point_step(dw, dw->setup_point);
+               if (dw->img_loader)
+                       {
+                       image_loader_free(dw->img_loader);
+                       dw->img_loader = NULL;
+                       dw->idle_id = g_idle_add(dupe_check_cb, dw);
+                       }
+               }
+
+       if (di->group && dw->dupes)
+               {
+               /* is a dupe, must remove from group/reset children if a parent */
+               DupeItem *parent;
+
+               parent = dupe_match_find_parent(dw, di);
+               if (di == parent)
+                       {
+                       if (g_list_length(parent->group) < 2)
+                               {
+                               DupeItem *child;
+
+                               child = dupe_match_highest_rank(parent);
+                               dupe_match_link_clear(child, TRUE);
+                               dupe_listview_remove(dw, child);
+
+                               dupe_match_link_clear(parent, TRUE);
+                               dupe_listview_remove(dw, parent);
+                               dw->dupes = g_list_remove(dw->dupes, parent);
+                               }
+                       else
+                               {
+                               DupeItem *new_parent;
+                               DupeMatch *dm;
+                               
+                               dm = parent->group->data;
+                               new_parent = dm->di;
+                               dupe_match_reparent(dw, parent, new_parent);
+                               dupe_listview_remove(dw, parent);
+                               }
+                       }
+               else
+                       {
+                       if (g_list_length(parent->group) < 2)
+                               {
+                               dupe_match_link_clear(parent, TRUE);
+                               dupe_listview_remove(dw, parent);
+                               dw->dupes = g_list_remove(dw->dupes, parent);
+                               }
+                       dupe_match_link_clear(di, TRUE);
+                       dupe_listview_remove(dw, di);
+                       }
+               }
+       else
+               {
+               /* not a dupe, or not sorted yet, simply reset */
+               dupe_match_link_clear(di, TRUE);
+               }
+
+       if (dw->second_list && g_list_find(dw->second_list, di))
+               {
+               dupe_second_remove(dw, di);
+               }
+       else
+               {
+               dw->list = g_list_remove(dw->list, di);
+               }
+       dupe_item_free(di);
+
+       dupe_window_update_count(dw, FALSE);
+}
+
+static gint dupe_item_remove_by_path(DupeWindow *dw, const gchar *path)
+{
+       DupeItem *di;
+
+       di = dupe_item_find_path(dw, path);
+       if (!di) return FALSE;
+
+       dupe_item_remove(dw, di);
+
+       return TRUE;
+}
+
+static void dupe_files_add(DupeWindow *dw, CollectionData *collection, CollectInfo *info,
+                          const gchar *path, gint recurse)
+{
+       DupeItem *di = NULL;
+
+       if (info)
+               {
+               di = dupe_item_new(info->path, info->size, info->date);
+               }
+       else if (path)
+               {
+               if (isfile(path))
+                       {
+                       di = dupe_item_new(path, filesize(path), filetime(path));
+                       }
+               else if (isdir(path) && recurse)
+                       {
+                       GList *f, *d;
+                       if (path_list(path, &f, &d))
+                               {
+                               GList *work;
+
+                               f = path_list_filter(f, FALSE);
+                               d = path_list_filter(d, TRUE);
+
+                               work = f;
+                               while(work)
+                                       {
+                                       dupe_files_add(dw, NULL, NULL, (gchar *)work->data, TRUE);
+                                       work = work->next;
+                                       }
+                               path_list_free(f);
+                               work = d;
+                               while(work)
+                                       {
+                                       dupe_files_add(dw, NULL, NULL, (gchar *)work->data, TRUE);
+                                       work = work->next;
+                                       }
+                               path_list_free(d);
+                               }
+                       }
+               }
+
+       if (!di) return;
+
+       if (dw->second_drop)
+               {
+               dupe_second_add(dw, di);
+               }
+       else
+               {
+               dw->list = g_list_prepend(dw->list, di);
+               }
+}
+
+void dupe_window_add_collection(DupeWindow *dw, CollectionData *collection)
+{
+       CollectInfo *info;
+
+       info = collection_get_first(collection);
+       while(info)
+               {
+               dupe_files_add(dw, collection, info, NULL, FALSE);
+               info = collection_next_by_info(collection, info);
+               }
+
+       dupe_check_start(dw);
+}
+
+void dupe_window_add_files(DupeWindow *dw, GList *list, gint recurse)
+{
+       GList *work;
+
+       work = list;
+       while(work)
+               {
+               gchar *path = work->data;
+               work = work->next;
+
+               dupe_files_add(dw, NULL, NULL, path, recurse);
+               }
+
+       dupe_check_start(dw);
+}
+
+static gint dupe_item_set_path(DupeWindow *dw, const gchar *source, const gchar *dest)
+{
+       DupeItem *di;
+
+       di = dupe_item_find_path(dw, source);
+       if (!di) return FALSE;
+
+       if ( (dw->match_mask & DUPE_MATCH_NAME) || (dw->match_mask & DUPE_MATCH_PATH) )
+               {
+               /* only effects matches on name or path */
+               gint second;
+
+               second = di->second;
+               dupe_item_remove(dw, di);
+
+               dw->second_drop = second;
+               dupe_files_add(dw, NULL, NULL, dest, FALSE);
+               dw->second_drop = FALSE;
+
+               dupe_check_start(dw);
+               }
+       else
+               {
+               GtkListStore *store;
+               GtkTreeIter iter;
+               gint row;
+
+               g_free(di->path);
+               di->path = g_strdup(dest);
+               di->name = filename_from_path(di->path);
+
+               /* update the listview(s) */
+
+               store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dw->listview)));
+               row = dupe_listview_find_item(store, di, &iter);
+               if (row >= 0)
+                       {
+                       gtk_list_store_set(store, &iter,
+                                          DUPE_COLUMN_NAME, di->name,
+                                          DUPE_COLUMN_PATH, di->path, -1);
+                       }
+
+               if (dw->second_listview)
+                       {
+                       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dw->second_listview)));
+                       row = dupe_listview_find_item(store, di, &iter);
+                       if (row >= 0)
+                               {
+                               gtk_list_store_set(store, &iter, 1, di->path, -1);
+                               }
+                       }
+               }
+
+       return TRUE;
+}
+
+/*
+ * ------------------------------------------------------------------
+ * Misc.
+ * ------------------------------------------------------------------
+ */
+
+static GtkWidget *dupe_display_label(GtkWidget *vbox, const gchar *description, const gchar *text)
+{
+       GtkWidget *hbox;
+       GtkWidget *label;
+
+       hbox = gtk_hbox_new(FALSE, 10);
+
+       label = gtk_label_new(description);
+       gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+       gtk_widget_show(label);
+
+       label = gtk_label_new(text);
+       gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+       gtk_widget_show(label);
+       
+       gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+       gtk_widget_show(hbox);
+
+       return label;
+}
+
+static void dupe_display_stats(DupeWindow *dw, DupeItem *di)
+{
+       GenericDialog *gd;
+       gchar *buf;
+       
+       if (!di) return;
+
+       gd = file_util_gen_dlg("Image thumbprint debug info", "GQview", "thumbprint",
+                              dw->window, TRUE,
+                              NULL, NULL);
+       generic_dialog_add_button(gd, GTK_STOCK_CLOSE, NULL, NULL, TRUE);
+
+       dupe_display_label(gd->vbox, "name:", di->name);
+       buf = text_from_size(di->size);
+       dupe_display_label(gd->vbox, "size:", buf);
+       g_free(buf);
+       dupe_display_label(gd->vbox, "date:", text_from_time(di->date));
+       buf = g_strdup_printf("%d x %d", di->width, di->height);
+       dupe_display_label(gd->vbox, "dimensions:", buf);
+       g_free(buf);
+       dupe_display_label(gd->vbox, "md5sum:", (di->md5sum) ? di->md5sum : "not generated");
+
+       dupe_display_label(gd->vbox, "thumbprint:", (di->simd) ? "" : "not generated");
+       if (di->simd)
+               {
+               GtkWidget *image;
+               GdkPixbuf *pixbuf;
+               gint x, y;
+               guchar *d_pix;
+               guchar *dp;
+               gint rs;
+               gint sp;
+               
+               pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, 32, 32);
+               rs = gdk_pixbuf_get_rowstride(pixbuf);
+               d_pix = gdk_pixbuf_get_pixels(pixbuf);
+
+               for (y = 0; y < 32; y++)
+                       {
+                       dp = d_pix + (y * rs);
+                       sp = y * 32;
+                       for (x = 0; x < 32; x++)
+                               {
+                               *(dp++) = di->simd->avg_r[sp + x];
+                               *(dp++) = di->simd->avg_g[sp + x];
+                               *(dp++) = di->simd->avg_b[sp + x];
+                               }
+                       }
+
+               image = gtk_image_new_from_pixbuf(pixbuf);
+               gtk_box_pack_start(GTK_BOX(gd->vbox), image, FALSE, FALSE, 0);
+               gtk_widget_show(image);
+               
+               gdk_pixbuf_unref(pixbuf);
+               }
+       
+       gtk_widget_show(gd->dialog);
+}
+
+static void dupe_window_recompare(DupeWindow *dw)
+{
+       GtkListStore *store;
+
+       dupe_check_stop(dw);
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dw->listview)));
+       gtk_list_store_clear(store);
+
+       g_list_free(dw->dupes);
+       dw->dupes = NULL;
+
+       dupe_match_reset_list(dw->list);
+       dupe_match_reset_list(dw->second_list);
+
+       dupe_check_start(dw);
+}
+
+static void dupe_menu_view(DupeWindow *dw, DupeItem *di, GtkWidget *listview, gint new_window)
+{
+       if (!di) return;
+
+       if (di->collection && collection_info_valid(di->collection, di->info))
+               {
+               if (new_window)
+                       {
+                       view_window_new_from_collection(di->collection, di->info);
+                       }
+               else
+                       {
+                       layout_image_set_collection(NULL, di->collection, di->info);
+                       }
+               }
+       else
+               {
+               if (new_window)
+                       {
+                       GList *list;
+
+                       list = dupe_listview_get_selection(dw, listview);
+                       view_window_new_from_list(list);
+                       path_list_free(list);
+                       }
+               else
+                       {
+                       layout_image_set_path(NULL, di->path);
+                       }
+               }
+}
+
+static void dupe_window_remove_selection(DupeWindow *dw, GtkWidget *listview)
+{
+       GtkTreeSelection *selection;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       GList *slist;
+       GList *list = NULL;
+       GList *work;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(listview));
+       slist = gtk_tree_selection_get_selected_rows(selection, &store);
+       work = slist;
+       while (work)
+               {
+               GtkTreePath *tpath = work->data;
+               DupeItem *di = NULL;
+
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DUPE_COLUMN_POINTER, &di, -1);
+               if (di) list = g_list_prepend(list, di);
+               work = work->next;
+               }
+       g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+       g_list_free(slist);
+
+       dw->color_frozen = TRUE;
+       work = list;
+       while (work)
+               {
+               DupeItem *di;
+
+               di = work->data;
+               work = work->next;
+               dupe_item_remove(dw, di);
+               }
+       dw->color_frozen = FALSE;
+
+       g_list_free(list);
+
+       dupe_listview_realign_colors(dw);
+}
+
+static void dupe_window_edit_selected(DupeWindow *dw, gint n)
+{
+       GList *list;
+
+       list = dupe_listview_get_selection(dw, dw->listview);
+
+       start_editor_from_path_list(n, list);
+
+       path_list_free(list);
+}
+
+static void dupe_window_collection_from_selection(DupeWindow *dw)
+{
+       CollectWindow *w;
+       GList *list;
+
+       list = dupe_listview_get_selection(dw, dw->listview);
+       w = collection_window_new(NULL);
+       collection_table_add_path_list(w->table, list);
+       path_list_free(list);
+}
+
+static void dupe_window_append_file_list(DupeWindow *dw, gint on_second)
+{
+       GList *list;
+
+       dw->second_drop = (dw->second_set && on_second);
+
+       list = layout_list(NULL);
+       dupe_window_add_files(dw, list, FALSE);
+       path_list_free(list);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * main pop-up menu callbacks
+ *-------------------------------------------------------------------
+ */
+
+static void dupe_menu_view_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       if (dw->click_item) dupe_menu_view(dw, dw->click_item, dw->listview, FALSE);
+}
+
+static void dupe_menu_viewnew_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       if (dw->click_item) dupe_menu_view(dw, dw->click_item, dw->listview, TRUE);
+}
+
+static void dupe_menu_select_all_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+       GtkTreeSelection *selection;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dw->listview));
+       gtk_tree_selection_select_all(selection);
+}
+
+static void dupe_menu_select_none_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+       GtkTreeSelection *selection;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dw->listview));
+       gtk_tree_selection_unselect_all(selection);
+}
+
+static void dupe_menu_select_dupes_set1_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       dupe_listview_select_dupes(dw, TRUE);
+}
+
+static void dupe_menu_select_dupes_set2_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       dupe_listview_select_dupes(dw, FALSE);
+}
+
+static void dupe_menu_edit_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw;
+       gint n;
+
+       dw = submenu_item_get_data(widget);
+       n = GPOINTER_TO_INT(data);
+       if (!dw) return;
+
+       dupe_window_edit_selected(dw, n);
+}
+
+static void dupe_menu_info_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       info_window_new(NULL, dupe_listview_get_selection(dw, dw->listview));
+}
+
+static void dupe_menu_collection_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       dupe_window_collection_from_selection(dw);
+}
+
+static void dupe_menu_print_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+       const gchar *path;
+
+       path = (dw->click_item) ? dw->click_item->path : NULL;
+
+       print_window_new(path,
+                        dupe_listview_get_selection(dw, dw->listview),
+                        dupe_listview_get_path_list(dw, dw->listview), dw->window);
+}
+
+static void dupe_menu_copy_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       file_util_copy(NULL, dupe_listview_get_selection(dw, dw->listview), NULL, dw->window);
+}
+
+static void dupe_menu_move_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       file_util_move(NULL, dupe_listview_get_selection(dw, dw->listview), NULL, dw->window);
+}
+
+static void dupe_menu_rename_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       file_util_rename(NULL, dupe_listview_get_selection(dw, dw->listview), dw->window);
+}
+
+static void dupe_menu_delete_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       file_util_delete(NULL, dupe_listview_get_selection(dw, dw->listview), dw->window);
+}
+
+static void dupe_menu_remove_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       dupe_window_remove_selection(dw, dw->listview);
+}
+
+static void dupe_menu_clear_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       dupe_window_clear(dw);
+}
+
+static void dupe_menu_close_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       dupe_window_close(dw);
+}
+
+static GtkWidget *dupe_menu_popup_main(DupeWindow *dw, DupeItem *di)
+{
+       GtkWidget *menu;
+       GtkWidget *item;
+       gint on_row;
+
+       on_row = (di != NULL);
+
+       menu = popup_menu_short_lived();
+       menu_item_add_sensitive(menu, _("_View"), on_row,
+                               G_CALLBACK(dupe_menu_view_cb), dw);
+       menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, on_row,
+                               G_CALLBACK(dupe_menu_viewnew_cb), dw);
+       menu_item_add_divider(menu);
+       menu_item_add_sensitive(menu, _("Select all"), (dw->dupes != NULL),
+                               G_CALLBACK(dupe_menu_select_all_cb), dw);
+       menu_item_add_sensitive(menu, _("Select none"), (dw->dupes != NULL),
+                               G_CALLBACK(dupe_menu_select_none_cb), dw);
+       menu_item_add_sensitive(menu, _("Select group _1 duplicates"), (dw->dupes != NULL),
+                               G_CALLBACK(dupe_menu_select_dupes_set1_cb), dw);
+       menu_item_add_sensitive(menu, _("Select group _2 duplicates"), (dw->dupes != NULL),
+                               G_CALLBACK(dupe_menu_select_dupes_set2_cb), dw);
+       menu_item_add_divider(menu);
+       submenu_add_edit(menu, &item, G_CALLBACK(dupe_menu_edit_cb), dw);
+       if (!on_row) gtk_widget_set_sensitive(item, FALSE);
+       menu_item_add_stock_sensitive(menu, _("_Properties"), GTK_STOCK_PROPERTIES, on_row,
+                               G_CALLBACK(dupe_menu_info_cb), dw);
+       menu_item_add_stock_sensitive(menu, _("Add to new collection"), GTK_STOCK_INDEX, on_row,
+                               G_CALLBACK(dupe_menu_collection_cb), dw);
+       menu_item_add_stock_sensitive(menu, _("Print..."), GTK_STOCK_PRINT, on_row,
+                               G_CALLBACK(dupe_menu_print_cb), dw);
+       menu_item_add_divider(menu);
+       menu_item_add_stock_sensitive(menu, _("_Copy..."), GTK_STOCK_COPY, on_row,
+                               G_CALLBACK(dupe_menu_copy_cb), dw);
+       menu_item_add_sensitive(menu, _("_Move..."), on_row,
+                               G_CALLBACK(dupe_menu_move_cb), dw);
+       menu_item_add_sensitive(menu, _("_Rename..."), on_row,
+                               G_CALLBACK(dupe_menu_rename_cb), dw);
+       menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, on_row,
+                               G_CALLBACK(dupe_menu_delete_cb), dw);
+       menu_item_add_divider(menu);
+       menu_item_add_stock_sensitive(menu, _("Rem_ove"), GTK_STOCK_REMOVE, on_row,
+                               G_CALLBACK(dupe_menu_remove_cb), dw);
+       menu_item_add_stock_sensitive(menu, _("C_lear"), GTK_STOCK_CLEAR, (dw->list != NULL),
+                               G_CALLBACK(dupe_menu_clear_cb), dw);
+       menu_item_add_divider(menu);
+       menu_item_add_stock(menu, _("Close _window"), GTK_STOCK_CLOSE,
+                           G_CALLBACK(dupe_menu_close_cb), dw);
+
+       return menu;
+}
+
+static gint dupe_listview_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       DupeWindow *dw = data;
+       GtkTreeModel *store;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+       DupeItem *di = NULL;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+
+       if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
+                                         &tpath, NULL, NULL, NULL))
+               {
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DUPE_COLUMN_POINTER, &di, -1);
+               gtk_tree_path_free(tpath);
+               }
+
+       dw->click_item = di;
+
+       if (bevent->button == 3)
+               {
+               /* right click menu */
+               GtkWidget *menu;
+
+               if (bevent->state & GDK_CONTROL_MASK && bevent->state & GDK_SHIFT_MASK)
+                       {
+                       dupe_display_stats(dw, di);
+                       return TRUE;
+                       }
+               if (widget == dw->listview)
+                       {
+                       menu = dupe_menu_popup_main(dw, di);
+                       }
+               else
+                       {
+                       menu = dupe_menu_popup_second(dw, di);
+                       }
+               gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, bevent->button, bevent->time);
+               }
+
+       if (!di) return FALSE;
+
+       if (bevent->button == 1 && bevent->type == GDK_2BUTTON_PRESS)
+               {
+               dupe_menu_view(dw, di, widget, FALSE);
+               }
+
+       if (bevent->button == 2) return TRUE;
+
+       if (bevent->button == 3)
+               {
+               if (!dupe_listview_item_is_selected(dw, di, widget))
+                       {
+                       GtkTreeSelection *selection;
+
+                       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+                       gtk_tree_selection_unselect_all(selection);
+                       gtk_tree_selection_select_iter(selection, &iter);
+
+                       tpath = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
+                       gtk_tree_view_set_cursor(GTK_TREE_VIEW(widget), tpath, NULL, FALSE);
+                       gtk_tree_path_free(tpath);
+                       }
+
+               return TRUE;
+               }
+
+       if (bevent->button == 1 && bevent->type == GDK_BUTTON_PRESS &&
+           !(bevent->state & GDK_SHIFT_MASK ) &&
+           !(bevent->state & GDK_CONTROL_MASK ) &&
+           dupe_listview_item_is_selected(dw, di, widget))
+               {
+               /* this selection handled on release_cb */
+               gtk_widget_grab_focus(widget);
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+static gint dupe_listview_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       DupeWindow *dw = data;
+       GtkTreeModel *store;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+       DupeItem *di = NULL;
+
+       if (bevent->button != 1 && bevent->button != 2) return TRUE;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+
+       if ((bevent->x != 0 || bevent->y != 0) &&
+           gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
+                                         &tpath, NULL, NULL, NULL))
+               {
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DUPE_COLUMN_POINTER, &di, -1);
+               gtk_tree_path_free(tpath);
+               }
+
+       if (bevent->button == 2)
+               {
+               if (di && dw->click_item == di)
+                       {
+                       GtkTreeSelection *selection;
+
+                       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+                       if (dupe_listview_item_is_selected(dw, di, widget))
+                               {
+                               gtk_tree_selection_unselect_iter(selection, &iter);
+                               }
+                       else
+                               {
+                               gtk_tree_selection_select_iter(selection, &iter);
+                               }
+                       }
+               return TRUE;
+               }
+
+       if (di && dw->click_item == di &&
+           !(bevent->state & GDK_SHIFT_MASK ) &&
+           !(bevent->state & GDK_CONTROL_MASK ) &&
+           dupe_listview_item_is_selected(dw, di, widget))
+               {
+               GtkTreeSelection *selection;
+
+               selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+               gtk_tree_selection_unselect_all(selection);
+               gtk_tree_selection_select_iter(selection, &iter);
+
+               tpath = gtk_tree_model_get_path(store, &iter);
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(widget), tpath, NULL, FALSE);
+               gtk_tree_path_free(tpath);
+
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * second set stuff
+ *-------------------------------------------------------------------
+ */
+
+static void dupe_second_update_status(DupeWindow *dw)
+{
+       gchar *buf;
+
+       buf = g_strdup_printf(_("%d files (set 2)"), g_list_length(dw->second_list));
+       gtk_label_set_text(GTK_LABEL(dw->second_status_label), buf);
+       g_free(buf);
+}
+
+static void dupe_second_add(DupeWindow *dw, DupeItem *di)
+{
+       GtkListStore *store;
+       GtkTreeIter iter;
+
+       if (!di) return;
+
+       di->second = TRUE;
+       dw->second_list = g_list_prepend(dw->second_list, di);
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dw->second_listview)));
+       gtk_list_store_append(store, &iter);
+       gtk_list_store_set(store, &iter, DUPE_COLUMN_POINTER, di, 1, di->path, -1);
+
+       dupe_second_update_status(dw);
+}
+
+static void dupe_second_remove(DupeWindow *dw, DupeItem *di)
+{
+       GtkListStore *store;
+       GtkTreeIter iter;
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dw->second_listview)));
+       if (dupe_listview_find_item(store, di, &iter) >= 0)
+               {
+               tree_view_move_cursor_away(GTK_TREE_VIEW(dw->second_listview), &iter, TRUE);
+               gtk_list_store_remove(store, &iter);
+               }
+
+       dw->second_list = g_list_remove(dw->second_list, di);
+
+       dupe_second_update_status(dw);
+}
+
+static void dupe_second_clear(DupeWindow *dw)
+{
+       GtkListStore *store;
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dw->second_listview)));
+       gtk_list_store_clear(store);
+       gtk_tree_view_columns_autosize(GTK_TREE_VIEW(dw->second_listview));
+
+       g_list_free(dw->dupes);
+       dw->dupes = NULL;
+
+       dupe_list_free(dw->second_list);
+       dw->second_list = NULL;
+
+       dupe_match_reset_list(dw->list);
+
+       dupe_second_update_status(dw);
+}
+
+static void dupe_second_menu_view_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       if (dw->click_item) dupe_menu_view(dw, dw->click_item, dw->second_listview, FALSE);
+}
+
+static void dupe_second_menu_viewnew_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       if (dw->click_item) dupe_menu_view(dw, dw->click_item, dw->second_listview, TRUE);
+}
+
+static void dupe_second_menu_select_all_cb(GtkWidget *widget, gpointer data)
+{
+       GtkTreeSelection *selection;
+       DupeWindow *dw = data;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dw->second_listview));
+       gtk_tree_selection_select_all(selection);
+}
+
+static void dupe_second_menu_select_none_cb(GtkWidget *widget, gpointer data)
+{
+       GtkTreeSelection *selection;
+       DupeWindow *dw = data;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dw->second_listview));
+       gtk_tree_selection_unselect_all(selection);
+}
+
+static void dupe_second_menu_remove_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       dupe_window_remove_selection(dw, dw->second_listview);
+}
+
+static void dupe_second_menu_clear_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       dupe_second_clear(dw);
+       dupe_window_recompare(dw);
+}
+
+static GtkWidget *dupe_menu_popup_second(DupeWindow *dw, DupeItem *di)
+{
+       GtkWidget *menu;
+       gint notempty;
+       gint on_row;
+
+       on_row = (di != NULL);
+       notempty = (dw->second_list != NULL);
+
+       menu = popup_menu_short_lived();
+       menu_item_add_sensitive(menu, _("_View"), on_row,
+                               G_CALLBACK(dupe_second_menu_view_cb), dw);
+       menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, on_row,
+                               G_CALLBACK(dupe_second_menu_viewnew_cb), dw);
+       menu_item_add_divider(menu);
+       menu_item_add_sensitive(menu, _("Select all"), notempty,
+                               G_CALLBACK(dupe_second_menu_select_all_cb), dw);
+       menu_item_add_sensitive(menu, _("Select none"), notempty,
+                               G_CALLBACK(dupe_second_menu_select_none_cb), dw);
+       menu_item_add_divider(menu);
+       menu_item_add_stock_sensitive(menu, _("Rem_ove"), GTK_STOCK_REMOVE, on_row,
+                                     G_CALLBACK(dupe_second_menu_remove_cb), dw);
+       menu_item_add_stock_sensitive(menu, _("C_lear"), GTK_STOCK_CLEAR, notempty,
+                                  G_CALLBACK(dupe_second_menu_clear_cb), dw);
+       menu_item_add_divider(menu);
+       menu_item_add_stock(menu, _("Close _window"), GTK_STOCK_CLOSE,
+                           G_CALLBACK(dupe_menu_close_cb), dw);
+
+       return menu;
+}
+
+static void dupe_second_set_toggle_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       dw->second_set = GTK_TOGGLE_BUTTON(widget)->active;
+
+       if (dw->second_set)
+               {
+               dupe_second_update_status(dw);
+               gtk_table_set_col_spacings(GTK_TABLE(dw->table), PREF_PAD_GAP);
+               gtk_widget_show(dw->second_vbox);
+               }
+       else
+               {
+               gtk_table_set_col_spacings(GTK_TABLE(dw->table), 0);
+               gtk_widget_hide(dw->second_vbox);
+               dupe_second_clear(dw);
+               }
+
+       dupe_window_recompare(dw);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * match type menu
+ *-------------------------------------------------------------------
+ */
+
+enum {
+       DUPE_MENU_COLUMN_NAME = 0,
+       DUPE_MENU_COLUMN_MASK
+};
+
+static void dupe_menu_type_cb(GtkWidget *combo, gpointer data)
+{
+       DupeWindow *dw = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+
+       store = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
+       if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter)) return;
+       gtk_tree_model_get(store, &iter, DUPE_MENU_COLUMN_MASK, &dw->match_mask, -1);
+
+       dupe_window_recompare(dw);
+}
+
+static void dupe_menu_add_item(GtkListStore *store, const gchar *text, DupeMatchType type, DupeWindow *dw)
+{
+       GtkTreeIter iter;
+
+       gtk_list_store_append(store, &iter);
+       gtk_list_store_set(store, &iter, DUPE_MENU_COLUMN_NAME, text,
+                                        DUPE_MENU_COLUMN_MASK, type, -1);
+
+       if (dw->match_mask == type) gtk_combo_box_set_active_iter(GTK_COMBO_BOX(dw->combo), &iter);
+}
+
+static void dupe_menu_setup(DupeWindow *dw)
+{
+       GtkListStore *store;
+       GtkCellRenderer *renderer;
+
+       store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
+       dw->combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       renderer = gtk_cell_renderer_text_new();
+       gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dw->combo), renderer, TRUE);
+       gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dw->combo), renderer,
+                                      "text", DUPE_MENU_COLUMN_NAME, NULL);
+
+       dupe_menu_add_item(store, _("Name"), DUPE_MATCH_NAME, dw);
+       dupe_menu_add_item(store, _("Size"), DUPE_MATCH_SIZE, dw);
+       dupe_menu_add_item(store, _("Date"), DUPE_MATCH_DATE, dw);
+       dupe_menu_add_item(store, _("Dimensions"), DUPE_MATCH_DIM, dw);
+       dupe_menu_add_item(store, _("Checksum"), DUPE_MATCH_SUM, dw);
+       dupe_menu_add_item(store, _("Path"), DUPE_MATCH_PATH, dw);
+       dupe_menu_add_item(store, _("Similarity (high)"), DUPE_MATCH_SIM_HIGH, dw);
+       dupe_menu_add_item(store, _("Similarity"), DUPE_MATCH_SIM_MED, dw);
+       dupe_menu_add_item(store, _("Similarity (low)"), DUPE_MATCH_SIM_LOW, dw);
+       dupe_menu_add_item(store, _("Similarity (custom)"), DUPE_MATCH_SIM_CUSTOM, dw);
+
+       g_signal_connect(G_OBJECT(dw->combo), "changed",
+                        G_CALLBACK(dupe_menu_type_cb), dw);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * list view columns
+ *-------------------------------------------------------------------
+ */
+
+/* this overrides the low default of a GtkCellRenderer from 100 to CELL_HEIGHT_OVERRIDE, something sane for our purposes */
+
+#define CELL_HEIGHT_OVERRIDE 512
+                                                                                                                               
+void cell_renderer_height_override(GtkCellRenderer *renderer)
+{
+       GParamSpec *spec;
+
+       spec = g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(renderer)), "height");
+       if (spec && G_IS_PARAM_SPEC_INT(spec))
+               {
+               GParamSpecInt *spec_int;
+
+               spec_int = G_PARAM_SPEC_INT(spec);
+               if (spec_int->maximum < CELL_HEIGHT_OVERRIDE) spec_int->maximum = CELL_HEIGHT_OVERRIDE;
+               }
+}
+
+static GdkColor *dupe_listview_color_shifted(GtkWidget *widget)
+{
+       static GdkColor color;
+       static GtkWidget *done = NULL;
+
+       if (done != widget)
+               {
+               GtkStyle *style;
+
+               style = gtk_widget_get_style(widget);
+               memcpy(&color, &style->base[GTK_STATE_NORMAL], sizeof(color));
+               shift_color(&color, -1, 0);
+               done = widget;
+               }
+
+       return &color;
+}
+
+static void dupe_listview_color_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
+                                  GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+{
+       DupeWindow *dw = data;
+       gboolean set;
+
+       gtk_tree_model_get(tree_model, iter, DUPE_COLUMN_COLOR, &set, -1);
+       g_object_set(G_OBJECT(cell),
+                    "cell-background-gdk", dupe_listview_color_shifted(dw->listview),
+                    "cell-background-set", set, NULL);
+}
+
+static void dupe_listview_add_column(DupeWindow *dw, GtkWidget *listview, gint n, const gchar *title, gint image, gint right_justify)
+{
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_title(column, title);
+       gtk_tree_view_column_set_min_width(column, 4);
+
+       if (n != DUPE_COLUMN_RANK &&
+           n != DUPE_COLUMN_THUMB)
+               {
+               gtk_tree_view_column_set_resizable(column, TRUE);
+               }
+
+       if (!image)
+               {
+               gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
+               renderer = gtk_cell_renderer_text_new();
+               if (right_justify)
+                       {
+                       g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
+                       }
+               gtk_tree_view_column_pack_start(column, renderer, TRUE);
+               gtk_tree_view_column_add_attribute(column, renderer, "text", n);
+               }
+       else
+               {
+               gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+               renderer = gtk_cell_renderer_pixbuf_new();
+               cell_renderer_height_override(renderer);
+               gtk_tree_view_column_pack_start(column, renderer, TRUE);
+               gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", n);
+               }
+
+       if (listview == dw->listview)
+               {
+               /* sets background before rendering */
+               gtk_tree_view_column_set_cell_data_func(column, renderer, dupe_listview_color_cb, dw, NULL);
+               }
+
+       gtk_tree_view_append_column(GTK_TREE_VIEW(listview), column);
+}
+
+static void dupe_listview_set_height(GtkWidget *listview, gint thumb)
+{
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *cell;
+       GList *list;
+
+       column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), DUPE_COLUMN_THUMB - 1);
+       if (!column) return;
+
+       gtk_tree_view_column_set_fixed_width(column, (thumb) ? thumb_max_width : 4);
+       
+       list = gtk_tree_view_column_get_cell_renderers(column);
+       if (!list) return;
+       cell = list->data;
+       g_list_free(list);
+
+       g_object_set(G_OBJECT(cell), "height", (thumb) ? thumb_max_height : -1, NULL);
+       gtk_tree_view_columns_autosize(GTK_TREE_VIEW(listview));
+}
+
+
+/*
+ *-------------------------------------------------------------------
+ * misc cb
+ *-------------------------------------------------------------------
+ */
+
+static void dupe_window_show_thumb_cb(GtkWidget *widget, gpointer data)
+{
+       DupeWindow *dw = data;
+
+       dw->show_thumbs = GTK_TOGGLE_BUTTON(widget)->active;
+
+       if (dw->show_thumbs)
+               {
+               if (!dw->working) dupe_thumb_step(dw);
+               }
+       else
+               {
+               GtkTreeModel *store;
+               GtkTreeIter iter;
+               gint valid;
+
+               thumb_loader_free(dw->thumb_loader);
+               dw->thumb_loader = NULL;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(dw->listview));
+               valid = gtk_tree_model_get_iter_first(store, &iter);
+
+               while (valid)
+                       {
+                       gtk_list_store_set(GTK_LIST_STORE(store), &iter, DUPE_COLUMN_THUMB, NULL, -1);
+                       valid = gtk_tree_model_iter_next(store, &iter);
+                       }
+               dupe_window_update_progress(dw, NULL, 0.0, FALSE);
+               }
+
+       dupe_listview_set_height(dw->listview, dw->show_thumbs);
+}
+
+static void dupe_popup_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
+{
+       GtkWidget *view = data;
+       GtkTreePath *tpath;
+       gint cx, cy, cw, ch;
+       gint column;
+
+       gtk_tree_view_get_cursor(GTK_TREE_VIEW(view), &tpath, NULL);
+       if (!tpath) return;
+
+       if (gtk_tree_view_get_column(GTK_TREE_VIEW(view), DUPE_COLUMN_NAME - 1) != NULL)
+               {
+               column = DUPE_COLUMN_NAME - 1;
+               }
+       else
+               {
+               /* dw->second_listview */
+               column = 0;
+               }
+       tree_view_get_cell_clamped(GTK_TREE_VIEW(view), tpath, column, TRUE, &cx, &cy, &cw, &ch);
+       gtk_tree_path_free(tpath);
+       cy += ch;
+       popup_menu_position_clamp(menu, &cx, &cy, 0);
+       *x = cx;
+       *y = cy;
+}
+
+static gint dupe_window_keypress_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       DupeWindow *dw = data;
+       gint stop_signal = FALSE;
+       gint on_second;
+       GtkWidget *listview;
+       GtkTreeModel *store;
+       GtkTreeSelection *selection;
+       GList *slist;
+       DupeItem *di = NULL;
+
+       on_second = GTK_WIDGET_HAS_FOCUS(dw->second_listview);
+
+       if (on_second)
+               {
+               listview = dw->second_listview;
+               }
+       else
+               {
+               listview = dw->listview;
+               }
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(listview));
+       slist = gtk_tree_selection_get_selected_rows(selection, &store);
+       if (slist)
+               {
+               GtkTreePath *tpath;
+               GtkTreeIter iter;
+               GList *last;
+
+               last = g_list_last(slist);
+               tpath = last->data;
+
+               /* last is newest selected file */
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DUPE_COLUMN_POINTER, &di, -1);
+               }
+       g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+       g_list_free(slist);
+
+       if (event->state & GDK_CONTROL_MASK)
+               {
+               gint edit_val = -1;
+
+               if (!on_second)
+                   switch (event->keyval)
+                       {
+                       case '1':
+                               edit_val = 0;
+                               break;
+                       case '2':
+                               edit_val = 1;
+                               break;
+                       case '3':
+                               edit_val = 2;
+                               break;
+                       case '4':
+                               edit_val = 3;
+                               break;
+                       case '5':
+                               edit_val = 4;
+                               break;
+                       case '6':
+                               edit_val = 5;
+                               break;
+                       case '7':
+                               edit_val = 6;
+                               break;
+                       case '8':
+                               edit_val = 7;
+                               break;
+                       case '9':
+                               edit_val = 8;
+                               break;
+                       case '0':
+                               edit_val = 9;
+                               break;
+                       case 'C': case 'c':
+                               stop_signal = TRUE;
+                               file_util_copy(NULL, dupe_listview_get_selection(dw, listview), NULL, dw->window);
+                               break;
+                       case 'M': case 'm':
+                               file_util_move(NULL, dupe_listview_get_selection(dw, listview), NULL, dw->window);
+                               stop_signal = TRUE;
+                               break;
+                       case 'R': case 'r':
+                               file_util_rename(NULL, dupe_listview_get_selection(dw, listview), dw->window);
+                               stop_signal = TRUE;
+                               break;
+                       case 'D': case 'd':
+                               file_util_delete(NULL, dupe_listview_get_selection(dw, listview), dw->window);
+                               stop_signal = TRUE;
+                               break;
+                       case 'P': case 'p':
+                               info_window_new(NULL, dupe_listview_get_selection(dw, listview));
+                               stop_signal = TRUE;
+                               break;
+                       default:
+                               break;
+                       }
+
+               switch (event->keyval)
+                       {
+                       case 'A': case 'a':
+                               if (event->state & GDK_SHIFT_MASK)
+                                       {
+                                       gtk_tree_selection_unselect_all(selection);
+                                       }
+                               else
+                                       {
+                                       gtk_tree_selection_select_all(selection);
+                                       }
+                               stop_signal = TRUE;
+                               break;
+                       case GDK_Delete: case GDK_KP_Delete:
+                               if (on_second)
+                                       {
+                                       dupe_second_clear(dw);
+                                       dupe_window_recompare(dw);
+                                       }
+                               else
+                                       {
+                                       dupe_window_clear(dw);
+                                       }
+                               stop_signal = TRUE;
+                               break;
+                       case 'L': case 'l':
+                               dupe_window_append_file_list(dw, FALSE);
+                               stop_signal = TRUE;
+                               break;
+                       case 'T': case 't':
+                               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dw->button_thumbs),
+                                       !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dw->button_thumbs)));
+                               stop_signal = TRUE;
+                               break;
+                       case 'W': case 'w':
+                               dupe_window_close(dw);
+                               stop_signal = TRUE;
+                               break;
+                       default:
+                               break;
+                       }
+
+               if (edit_val >= 0)
+                       {
+                       dupe_window_edit_selected(dw, edit_val);
+                       stop_signal = TRUE;
+                       }
+               }
+       else
+               {
+               switch (event->keyval)
+                       {
+                       case GDK_Return: case GDK_KP_Enter:
+                               dupe_menu_view(dw, di, listview, FALSE);
+                               stop_signal = TRUE;
+                               break;
+                       case 'V': case 'v':
+                               stop_signal = TRUE;
+                               dupe_menu_view(dw, di, listview, TRUE);
+                               break;
+                       case GDK_Delete: case GDK_KP_Delete:
+                               dupe_window_remove_selection(dw, listview);
+                               stop_signal = TRUE;
+                               break;
+                       case 'C': case 'c':
+                               if (!on_second)
+                                       {
+                                       dupe_window_collection_from_selection(dw);
+                                       stop_signal = TRUE;
+                                       }
+                               break;
+                       case '1':
+                               dupe_listview_select_dupes(dw, TRUE);
+                               stop_signal = TRUE;
+                               break;
+                       case '2':
+                               dupe_listview_select_dupes(dw, FALSE);
+                               stop_signal = TRUE;
+                               break;
+                       case GDK_Menu:
+                       case GDK_F10:
+                               if (!on_second)
+                                       {
+                                       GtkWidget *menu;
+
+                                       menu = dupe_menu_popup_main(dw, di);
+                                       gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
+                                                      dupe_popup_menu_pos_cb, listview, 0, GDK_CURRENT_TIME);
+                                       }
+                               else
+                                       {
+                                       GtkWidget *menu;
+
+                                       menu = dupe_menu_popup_second(dw, di);
+                                       gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
+                                                      dupe_popup_menu_pos_cb, listview, 0, GDK_CURRENT_TIME);
+                                       }
+                               break;
+                       default:
+                               break;
+                       }
+               }
+
+       return stop_signal;
+}
+
+
+void dupe_window_clear(DupeWindow *dw)
+{
+       GtkListStore *store;
+
+       dupe_check_stop(dw);
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dw->listview)));
+       gtk_list_store_clear(store);
+       gtk_tree_view_columns_autosize(GTK_TREE_VIEW(dw->listview));
+
+       g_list_free(dw->dupes);
+       dw->dupes = NULL;
+
+       dupe_list_free(dw->list);
+       dw->list = NULL;
+
+       dupe_match_reset_list(dw->second_list);
+
+       dupe_window_update_count(dw, FALSE);
+       dupe_window_update_progress(dw, NULL, 0.0, FALSE);
+}
+
+void dupe_window_close(DupeWindow *dw)
+{
+       dupe_check_stop(dw);
+
+       dupe_window_list = g_list_remove(dupe_window_list, dw);
+       gtk_widget_destroy(dw->window);
+
+       g_list_free(dw->dupes);
+       dupe_list_free(dw->list);
+
+       dupe_list_free(dw->second_list);
+
+       g_free(dw);
+}
+
+static gint dupe_window_delete(GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+       DupeWindow *dw = data;
+       dupe_window_close(dw);
+
+       return TRUE;
+}
+
+/* collection and files can be NULL */
+DupeWindow *dupe_window_new(DupeMatchType match_mask)
+{
+       DupeWindow *dw;
+       GtkWidget *vbox;
+       GtkWidget *scrolled;
+       GtkWidget *frame;
+       GtkWidget *status_box;
+       GtkWidget *label;
+       GtkWidget *button;
+       GtkListStore *store;
+       GtkTreeSelection *selection;
+       GdkGeometry geometry;
+
+       dw = g_new0(DupeWindow, 1);
+
+       dw->list = NULL;
+       dw->dupes = NULL;
+       dw->match_mask = match_mask;
+       dw->show_thumbs = FALSE;
+
+       dw->idle_id = -1;
+
+       dw->second_set = FALSE;
+
+       dw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+        window_set_icon(dw->window, NULL, NULL);
+
+       geometry.min_width = 32;
+       geometry.min_height = 32;
+       geometry.base_width = DUPE_DEF_WIDTH;
+       geometry.base_height = DUPE_DEF_HEIGHT;
+       gtk_window_set_geometry_hints(GTK_WINDOW(dw->window), NULL, &geometry,
+                                     GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE);
+
+       gtk_window_set_default_size(GTK_WINDOW(dw->window), DUPE_DEF_WIDTH, DUPE_DEF_HEIGHT);
+
+       gtk_window_set_resizable(GTK_WINDOW(dw->window), TRUE);
+       gtk_window_set_title(GTK_WINDOW(dw->window), _("Find duplicates - GQview"));
+        gtk_window_set_wmclass(GTK_WINDOW(dw->window), "dupe", "GQview");
+        gtk_container_set_border_width (GTK_CONTAINER (dw->window), 0);
+
+        g_signal_connect(G_OBJECT(dw->window), "delete_event",
+                        G_CALLBACK(dupe_window_delete), dw);
+       g_signal_connect(G_OBJECT(dw->window), "key_press_event",
+                        G_CALLBACK(dupe_window_keypress_cb), dw);
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_add(GTK_CONTAINER(dw->window), vbox);
+       gtk_widget_show(vbox);
+
+       dw->table = gtk_table_new(1, 3, FALSE);
+       gtk_box_pack_start(GTK_BOX(vbox), dw->table, TRUE, TRUE, 0);
+       gtk_widget_show(dw->table);
+
+       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+       gtk_table_attach_defaults(GTK_TABLE(dw->table), scrolled, 0, 2, 0, 1);
+        gtk_widget_show(scrolled);
+
+       store = gtk_list_store_new(9, G_TYPE_POINTER, G_TYPE_STRING, GDK_TYPE_PIXBUF,
+                                  G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+                                  G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
+       dw->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dw->listview));
+       gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_MULTIPLE);
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(dw->listview), TRUE);
+       gtk_tree_view_set_enable_search(GTK_TREE_VIEW(dw->listview), FALSE);
+
+       dupe_listview_add_column(dw, dw->listview, DUPE_COLUMN_RANK, "", FALSE, TRUE);
+       dupe_listview_add_column(dw, dw->listview, DUPE_COLUMN_THUMB, "", TRUE, FALSE);
+       dupe_listview_add_column(dw, dw->listview, DUPE_COLUMN_NAME, _("Name"), FALSE, FALSE);
+       dupe_listview_add_column(dw, dw->listview, DUPE_COLUMN_SIZE, _("Size"), FALSE, TRUE);
+       dupe_listview_add_column(dw, dw->listview, DUPE_COLUMN_DATE, _("Date"), FALSE, TRUE);
+       dupe_listview_add_column(dw, dw->listview, DUPE_COLUMN_DIMENSIONS, _("Dimensions"), FALSE, FALSE);
+       dupe_listview_add_column(dw, dw->listview, DUPE_COLUMN_PATH, _("Path"), FALSE, FALSE);
+
+       gtk_container_add(GTK_CONTAINER(scrolled), dw->listview);
+       gtk_widget_show(dw->listview);
+
+       dw->second_vbox = gtk_vbox_new(FALSE, 0);
+       gtk_table_attach_defaults(GTK_TABLE(dw->table), dw->second_vbox, 2, 3, 0, 1);
+       if (dw->second_set)
+               {
+               gtk_table_set_col_spacings(GTK_TABLE(dw->table), PREF_PAD_GAP);
+               gtk_widget_show(dw->second_vbox);
+               }
+       else
+               {
+               gtk_table_set_col_spacings(GTK_TABLE(dw->table), 0);
+               }
+
+       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+       gtk_box_pack_start(GTK_BOX(dw->second_vbox), scrolled, TRUE, TRUE, 0);
+        gtk_widget_show(scrolled);
+
+       store = gtk_list_store_new(2, G_TYPE_POINTER, G_TYPE_STRING);
+       dw->second_listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dw->second_listview));
+       gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_MULTIPLE);
+
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(dw->second_listview), TRUE);
+       gtk_tree_view_set_enable_search(GTK_TREE_VIEW(dw->second_listview), FALSE);
+
+       dupe_listview_add_column(dw, dw->second_listview, 1, _("Compare to:"), FALSE, FALSE);
+
+       gtk_container_add(GTK_CONTAINER(scrolled), dw->second_listview);
+        gtk_widget_show(dw->second_listview);
+
+       dw->second_status_label = gtk_label_new("");
+       gtk_box_pack_start(GTK_BOX(dw->second_vbox), dw->second_status_label, FALSE, FALSE, 0);
+       gtk_widget_show(dw->second_status_label);
+
+       pref_line(dw->second_vbox, GTK_ORIENTATION_HORIZONTAL);
+
+       status_box = pref_box_new(vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, 0);
+
+       label = gtk_label_new(_("Compare by:"));
+       gtk_box_pack_start(GTK_BOX(status_box), label, FALSE, FALSE, PREF_PAD_SPACE);
+       gtk_widget_show(label);
+
+       dupe_menu_setup(dw);
+       gtk_box_pack_start(GTK_BOX(status_box), dw->combo, FALSE, FALSE, 0);
+       gtk_widget_show(dw->combo);
+
+       dw->button_thumbs = gtk_check_button_new_with_label(_("Thumbnails"));
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dw->button_thumbs), dw->show_thumbs);
+       g_signal_connect(G_OBJECT(dw->button_thumbs), "toggled",
+                        G_CALLBACK(dupe_window_show_thumb_cb), dw);
+       gtk_box_pack_start(GTK_BOX(status_box), dw->button_thumbs, FALSE, FALSE, PREF_PAD_SPACE);
+       gtk_widget_show(dw->button_thumbs);
+
+       button = gtk_check_button_new_with_label(_("Compare two file sets"));
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), dw->second_set);
+       g_signal_connect(G_OBJECT(button), "toggled",
+                        G_CALLBACK(dupe_second_set_toggle_cb), dw);
+       gtk_box_pack_end(GTK_BOX(status_box), button, FALSE, FALSE, PREF_PAD_SPACE);
+       gtk_widget_show(button);
+
+       status_box = gtk_hbox_new(FALSE, 0);
+        gtk_box_pack_start(GTK_BOX(vbox), status_box, FALSE, FALSE, 0);
+        gtk_widget_show(status_box);
+
+       frame = gtk_frame_new(NULL);
+       gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
+       gtk_box_pack_start(GTK_BOX(status_box), frame, TRUE, TRUE, 0);
+       gtk_widget_show(frame);
+
+       dw->status_label = gtk_label_new("");
+       gtk_container_add(GTK_CONTAINER(frame), dw->status_label);
+       gtk_widget_show(dw->status_label);
+
+       dw->extra_label = gtk_progress_bar_new();
+       gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(dw->extra_label), 0.0);
+       gtk_box_pack_end(GTK_BOX(status_box), dw->extra_label, FALSE, FALSE, 0);
+       gtk_widget_show(dw->extra_label);
+
+       dupe_dnd_init(dw);
+
+       /* order is important here, dnd_init should be seeing mouse
+        * presses before we possibly handle (and stop) the signal
+        */
+       g_signal_connect(G_OBJECT(dw->listview), "button_press_event",
+                        G_CALLBACK(dupe_listview_press_cb), dw);
+       g_signal_connect(G_OBJECT(dw->listview), "button_release_event",
+                        G_CALLBACK(dupe_listview_release_cb), dw);
+       g_signal_connect(G_OBJECT(dw->second_listview), "button_press_event",
+                        G_CALLBACK(dupe_listview_press_cb), dw);
+       g_signal_connect(G_OBJECT(dw->second_listview), "button_release_event",
+                        G_CALLBACK(dupe_listview_release_cb), dw);
+
+       gtk_widget_show(dw->window);
+
+       dupe_window_update_count(dw, TRUE);
+       dupe_window_update_progress(dw, NULL, 0.0, FALSE);
+
+       dupe_window_list = g_list_append(dupe_window_list, dw);
+
+       return dw;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * dnd confirm dir
+ *-------------------------------------------------------------------
+ */
+
+typedef struct {
+       DupeWindow *dw;
+       GList *list;
+} CDupeConfirmD;
+
+static void confirm_dir_list_cancel(GtkWidget *widget, gpointer data)
+{
+       /* do nothing */
+}
+
+static void confirm_dir_list_add(GtkWidget *widget, gpointer data)
+{
+       CDupeConfirmD *d = data;
+       GList *work;
+
+       dupe_window_add_files(d->dw, d->list, FALSE);
+
+       work = d->list;
+       while (work)
+               {
+               gchar *path = work->data;
+               work = work->next;
+               if (isdir(path))
+                       {
+                       GList *list = NULL;
+
+                       path_list(path, &list, NULL);
+                       list = path_list_filter(list, FALSE);
+                       if (list)
+                               {
+                               dupe_window_add_files(d->dw, list, FALSE);
+                               path_list_free(list);
+                               }
+                       }
+               }
+}
+
+static void confirm_dir_list_recurse(GtkWidget *widget, gpointer data)
+{
+       CDupeConfirmD *d = data;
+       dupe_window_add_files(d->dw, d->list, TRUE);
+}
+
+static void confirm_dir_list_skip(GtkWidget *widget, gpointer data)
+{
+       CDupeConfirmD *d = data;
+       dupe_window_add_files(d->dw, d->list, FALSE);
+}
+
+static void confirm_dir_list_destroy(GtkWidget *widget, gpointer data)
+{
+       CDupeConfirmD *d = data;
+       path_list_free(d->list);
+       g_free(d);
+}
+
+static GtkWidget *dupe_confirm_dir_list(DupeWindow *dw, GList *list)
+{
+       GtkWidget *menu;
+       CDupeConfirmD *d;
+
+       d = g_new0(CDupeConfirmD, 1);
+       d->dw = dw;
+       d->list = list;
+
+       menu = popup_menu_short_lived();
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(confirm_dir_list_destroy), d);
+
+       menu_item_add_stock(menu, _("Dropped list includes folders."), GTK_STOCK_DND_MULTIPLE, NULL, NULL);
+       menu_item_add_divider(menu);
+       menu_item_add_stock(menu, _("_Add contents"), GTK_STOCK_OK, G_CALLBACK(confirm_dir_list_add), d);
+       menu_item_add_stock(menu, _("Add contents _recursive"), GTK_STOCK_ADD, G_CALLBACK(confirm_dir_list_recurse), d);
+       menu_item_add_stock(menu, _("_Skip folders"), GTK_STOCK_REMOVE, G_CALLBACK(confirm_dir_list_skip), d);
+       menu_item_add_divider(menu);
+       menu_item_add_stock(menu, _("Cancel"), GTK_STOCK_CANCEL, G_CALLBACK(confirm_dir_list_cancel), d);
+
+       return menu;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * dnd
+ *-------------------------------------------------------------------
+ */
+
+static GtkTargetEntry dupe_drag_types[] = {
+        { "text/uri-list", 0, TARGET_URI_LIST },
+        { "text/plain", 0, TARGET_TEXT_PLAIN }
+};
+static gint n_dupe_drag_types = 2;
+
+static GtkTargetEntry dupe_drop_types[] = {
+        { "application/x-gqview-collection-member", 0, TARGET_APP_COLLECTION_MEMBER },
+        { "text/uri-list", 0, TARGET_URI_LIST }
+};
+static gint n_dupe_drop_types = 2;
+
+static void dupe_dnd_data_set(GtkWidget *widget, GdkDragContext *context,
+                             GtkSelectionData *selection_data, guint info,
+                             guint time, gpointer data)
+{
+       DupeWindow *dw = data;
+       gchar *uri_text;
+       gint length;
+       GList *list;
+
+       switch (info)
+               {
+               case TARGET_URI_LIST:
+               case TARGET_TEXT_PLAIN:
+                       list = dupe_listview_get_selection(dw, widget);
+                       if (!list) return;
+                       uri_text = uri_text_from_list(list, &length, (info == TARGET_TEXT_PLAIN));
+                       path_list_free(list);
+                       break;
+               default:
+                       uri_text = NULL;
+                       break;
+               }
+
+       if (uri_text) gtk_selection_data_set(selection_data, selection_data->target,
+                                            8, uri_text, length);
+       g_free(uri_text);
+}
+
+static void dupe_dnd_data_get(GtkWidget *widget, GdkDragContext *context,
+                             gint x, gint y,
+                             GtkSelectionData *selection_data, guint info,
+                             guint time, gpointer data)
+{
+       DupeWindow *dw = data;
+       GtkWidget *source;
+       GList *list = NULL;
+       GList *work;
+
+       source = gtk_drag_get_source_widget(context);
+       if (source == dw->listview || source == dw->second_listview) return;
+
+       dw->second_drop = (dw->second_set && widget == dw->second_listview);
+
+       switch (info)
+               {
+               case TARGET_APP_COLLECTION_MEMBER:
+                       collection_from_dnd_data((gchar *)selection_data->data, &list, NULL);
+                       break;
+               case TARGET_URI_LIST:
+                       list = uri_list_from_text(selection_data->data, TRUE);
+                       work = list;
+                       while(work)
+                               {
+                               if (isdir((gchar *)work->data))
+                                       {
+                                       GtkWidget *menu;
+                                       menu = dupe_confirm_dir_list(dw, list);
+                                       gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, time);
+                                       return;
+                                       }
+                               work = work->next;
+                               }
+                       break;
+               default:
+                       list = NULL;
+                       break;
+               }
+
+       if (list)
+               {
+               dupe_window_add_files(dw, list, FALSE);
+               path_list_free(list);
+               }
+}
+
+static void dupe_dest_set(GtkWidget *widget, gint enable)
+{
+       if (enable)
+               {
+               gtk_drag_dest_set(widget,
+                       GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP,
+                       dupe_drop_types, n_dupe_drop_types,
+                       GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK);
+
+               }
+       else
+               {
+               gtk_drag_dest_unset(widget);
+               }
+}
+
+static void dupe_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       DupeWindow *dw = data;
+       dupe_dest_set(dw->listview, FALSE);
+       dupe_dest_set(dw->second_listview, FALSE);
+
+       if (dw->click_item && !dupe_listview_item_is_selected(dw, dw->click_item, widget))
+               {
+               GtkListStore *store;
+               GtkTreeIter iter;
+
+               store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(widget)));
+               if (dupe_listview_find_item(store, dw->click_item, &iter) >= 0)
+                       {
+                       GtkTreeSelection *selection;
+                       GtkTreePath *tpath;
+
+                       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+                       gtk_tree_selection_unselect_all(selection);
+                       gtk_tree_selection_select_iter(selection, &iter);
+
+                       tpath = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
+                       gtk_tree_view_set_cursor(GTK_TREE_VIEW(widget), tpath, NULL, FALSE);
+                       gtk_tree_path_free(tpath);
+                       }
+               }
+
+       if (dw->show_thumbs &&
+           widget == dw->listview &&
+           dw->click_item && dw->click_item->pixbuf)
+               {
+               GtkTreeSelection *selection;
+               gint items;
+
+               selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+               items = gtk_tree_selection_count_selected_rows(selection);
+               dnd_set_drag_icon(widget, context, dw->click_item->pixbuf, items);
+               }
+}
+
+static void dupe_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       DupeWindow *dw = data;
+       dupe_dest_set(dw->listview, TRUE);
+       dupe_dest_set(dw->second_listview, TRUE);
+}
+
+static void dupe_dnd_init(DupeWindow *dw)
+{
+       gtk_drag_source_set(dw->listview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+                           dupe_drag_types, n_dupe_drag_types,
+                           GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+       g_signal_connect(G_OBJECT(dw->listview), "drag_data_get",
+                        G_CALLBACK(dupe_dnd_data_set), dw);
+       g_signal_connect(G_OBJECT(dw->listview), "drag_begin",
+                        G_CALLBACK(dupe_dnd_begin), dw);
+       g_signal_connect(G_OBJECT(dw->listview), "drag_end",
+                        G_CALLBACK(dupe_dnd_end), dw);
+
+       dupe_dest_set(dw->listview, TRUE);
+       g_signal_connect(G_OBJECT(dw->listview), "drag_data_received",
+                        G_CALLBACK(dupe_dnd_data_get), dw);
+
+       gtk_drag_source_set(dw->second_listview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+                           dupe_drag_types, n_dupe_drag_types,
+                           GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+       g_signal_connect(G_OBJECT(dw->second_listview), "drag_data_get",
+                        G_CALLBACK(dupe_dnd_data_set), dw);
+       g_signal_connect(G_OBJECT(dw->second_listview), "drag_begin",
+                        G_CALLBACK(dupe_dnd_begin), dw);
+       g_signal_connect(G_OBJECT(dw->second_listview), "drag_end",
+                        G_CALLBACK(dupe_dnd_end), dw);
+
+       dupe_dest_set(dw->second_listview, TRUE);
+       g_signal_connect(G_OBJECT(dw->second_listview), "drag_data_received",
+                        G_CALLBACK(dupe_dnd_data_get), dw);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * maintenance (move, delete, etc.)
+ *-------------------------------------------------------------------
+ */
+
+void dupe_maint_removed(const gchar *path)
+{
+       GList *work;
+
+       work = dupe_window_list;
+       while (work)
+               {
+               DupeWindow *dw = work->data;
+               work = work->next;
+
+               while (dupe_item_remove_by_path(dw, path));
+               }
+}
+
+void dupe_maint_renamed(const gchar *source, const gchar *dest)
+{
+       GList *work;
+
+       work = dupe_window_list;
+       while (work)
+               {
+               DupeWindow *dw = work->data;
+               work = work->next;
+
+               while (dupe_item_set_path(dw, source, dest));
+               }
+
+}
+
diff --git a/src/dupe.h b/src/dupe.h
new file mode 100644 (file)
index 0000000..0523385
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef DUPE_H
+#define DUPE_H
+
+#include "similar.h"
+
+/* match methods */
+typedef enum
+{
+       DUPE_MATCH_NONE = 0,
+       DUPE_MATCH_NAME = 1 << 0,
+       DUPE_MATCH_SIZE = 1 << 1,
+       DUPE_MATCH_DATE = 1 << 2,
+       DUPE_MATCH_DIM  = 1 << 3,       /* image dimensions */
+       DUPE_MATCH_SUM  = 1 << 4,       /* simple checksum */
+       DUPE_MATCH_PATH = 1 << 5,
+       DUPE_MATCH_SIM_HIGH = 1 << 6,   /* similarity */
+       DUPE_MATCH_SIM_MED  = 1 << 7,
+       DUPE_MATCH_SIM_LOW  = 1 << 8,
+       DUPE_MATCH_SIM_CUSTOM = 1 << 9
+} DupeMatchType;
+
+typedef struct _DupeItem DupeItem;
+struct _DupeItem
+{
+       CollectionData *collection;     /* NULL if from DupeWindow->files */
+       CollectInfo *info;
+
+       gchar *path;
+       const gchar *name;              /* we store the pointer into path for the name,
+                                        * so that we only need to calculate this once,
+                                        * which significantly speeds up comparing names */
+       gint64 size;
+       time_t date;
+
+       long checksum;
+       gchar *md5sum;
+       gint width;
+       gint height;
+
+       ImageSimilarityData *simd;
+
+       /* thumb */
+       GdkPixbuf *pixbuf;
+
+       GList *group;                   /* List of match data */
+       gdouble group_rank;
+
+       gint second;
+};
+
+typedef struct _DupeMatch DupeMatch;
+struct _DupeMatch
+{
+       DupeItem *di;
+       gdouble rank;
+};
+
+typedef struct _DupeWindow DupeWindow;
+struct _DupeWindow
+{
+       GList *list;                    /* dropped files (DupeItem) */
+       GList *dupes;                   /* list of dupes (DupeItem, grouping the DupeMatches) */
+       DupeMatchType match_mask;       /* mask of things to check for match */
+
+       GtkWidget *window;
+       GtkWidget *table;
+       GtkWidget *listview;
+       GtkWidget *combo;
+       GtkWidget *status_label;
+       GtkWidget *extra_label;
+       GtkWidget *button_thumbs;
+
+       gint show_thumbs;
+
+       gint idle_id;
+       GList *working;
+       gint setup_done;
+       gint setup_count;
+       gint setup_n;                   /* these are merely for speed optimization */
+       GList *setup_point;             /* ditto */
+       DupeMatchType setup_mask;       /* ditto */
+       guint64 setup_time;
+       guint64 setup_time_count;
+
+       DupeItem *click_item;           /* for popup menu */
+
+       ThumbLoader *thumb_loader;
+       DupeItem *thumb_item;
+
+       ImageLoader *img_loader;
+
+       /* second set comparison stuff */
+
+       gint second_set;                /* second set enabled ? */
+       GList *second_list;             /* second set dropped files */
+       gint second_drop;               /* drop is on second set */
+
+       GtkWidget *second_vbox;         /* box of second widgets */
+       GtkWidget *second_listview;
+       GtkWidget *second_status_label;
+
+       gint color_frozen;
+};
+
+
+DupeWindow *dupe_window_new(DupeMatchType match_mask);
+
+void dupe_window_clear(DupeWindow *dw);
+void dupe_window_close(DupeWindow *dw);
+
+void dupe_window_add_collection(DupeWindow *dw, CollectionData *collection);
+void dupe_window_add_files(DupeWindow *dw, GList *list, gint recurse);
+
+void dupe_maint_removed(const gchar *path);
+void dupe_maint_renamed(const gchar *source, const gchar *dest);
+
+
+/* cell max with/height hack utility */
+void cell_renderer_height_override(GtkCellRenderer *renderer);
+
+
+#endif
+
+
diff --git a/src/editors.c b/src/editors.c
new file mode 100644 (file)
index 0000000..d7eaa6c
--- /dev/null
@@ -0,0 +1,584 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "editors.h"
+
+#include "utilops.h"
+#include "ui_fileops.h"
+#include "ui_spinner.h"
+#include "ui_utildlg.h"
+
+#include <errno.h>
+
+
+#define EDITOR_WINDOW_WIDTH 500
+#define EDITOR_WINDOW_HEIGHT 300
+
+#define COMMAND_SHELL "sh"
+#define COMMAND_OPT  "-c"
+
+
+typedef struct _EditorVerboseData EditorVerboseData;
+struct _EditorVerboseData {
+       int fd;
+
+       GenericDialog *gd;
+       GtkWidget *button_close;
+       GtkWidget *button_stop;
+       GtkWidget *text;
+       GtkWidget *progress;
+       GtkWidget *spinner;
+       gint count;
+       gint total;
+
+       gchar *command_template;
+       GList *list;
+};
+
+
+static gchar *editor_slot_defaults[] = {
+       N_("The Gimp"), "gimp-remote -n %f",
+       N_("XV"), "xv %f",
+       N_("Xpaint"), "xpaint %f",
+       NULL, NULL,
+       NULL, NULL,
+       NULL, NULL,
+       NULL, NULL,
+       NULL, NULL,
+       N_("Rotate jpeg clockwise"), "%vif jpegtran -rotate 90 -copy all -outfile %p_tmp %p; then mv %p_tmp %p;else rm %p_tmp;fi",
+       N_("Rotate jpeg counterclockwise"), "%vif jpegtran -rotate 270 -copy all -outfile %p_tmp %p; then mv %p_tmp %p;else rm %p_tmp;fi",
+       NULL, NULL
+};
+
+
+static void editor_verbose_window_progress(EditorVerboseData *vd, const gchar *text);
+static gint editor_command_next(EditorVerboseData *vd);
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * external editor routines
+ *-----------------------------------------------------------------------------
+ */
+
+void editor_reset_defaults(void)
+{
+       gint i;
+
+       for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
+               {
+               g_free(editor_name[i]);
+               editor_name[i] = g_strdup(_(editor_slot_defaults[i * 2]));
+               g_free(editor_command[i]);
+               editor_command[i] = g_strdup(editor_slot_defaults[i * 2 + 1]);
+               }
+}
+
+static void editor_verbose_window_close(GenericDialog *gd, gpointer data)
+{
+       EditorVerboseData *vd = data;
+
+       generic_dialog_close(gd);
+       g_free(vd->command_template);
+       g_free(vd);
+}
+
+static void editor_verbose_window_stop(GenericDialog *gd, gpointer data)
+{
+       EditorVerboseData *vd = data;
+
+       path_list_free(vd->list);
+       vd->list = NULL;
+
+       vd->count = 0;
+       editor_verbose_window_progress(vd, _("stopping..."));
+}
+
+static void editor_verbose_window_enable_close(EditorVerboseData *vd)
+{
+       vd->gd->cancel_cb = editor_verbose_window_close;
+
+       spinner_set_interval(vd->spinner, -1);
+       gtk_widget_set_sensitive(vd->button_stop, FALSE);
+       gtk_widget_set_sensitive(vd->button_close, TRUE);
+}
+
+static EditorVerboseData *editor_verbose_window(const gchar *template, const gchar *text)
+{
+       EditorVerboseData *vd;
+       GtkWidget *scrolled;
+       GtkWidget *hbox;
+       gchar *buf;
+
+       vd = g_new0(EditorVerboseData, 1);
+
+       vd->list = NULL;
+       vd->command_template = g_strdup(template);
+       vd->total = 0;
+       vd->count = 0;
+       vd->fd = -1;
+
+       vd->gd = file_util_gen_dlg(_("Edit command results"), "GQview", "editor_results",
+                                  NULL, FALSE,
+                                  NULL, vd);
+       buf = g_strdup_printf(_("Output of %s"), text);
+       generic_dialog_add_message(vd->gd, NULL, buf, NULL);
+       g_free(buf);
+       vd->button_stop = generic_dialog_add_button(vd->gd, GTK_STOCK_STOP, NULL,
+                                                  editor_verbose_window_stop, FALSE);
+       gtk_widget_set_sensitive(vd->button_stop, FALSE);
+       vd->button_close = generic_dialog_add_button(vd->gd, GTK_STOCK_CLOSE, NULL,
+                                                   editor_verbose_window_close, TRUE);
+       gtk_widget_set_sensitive(vd->button_close, FALSE);
+
+       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+       gtk_box_pack_start(GTK_BOX(vd->gd->vbox), scrolled, TRUE, TRUE, 5);
+       gtk_widget_show(scrolled);
+
+       vd->text = gtk_text_view_new();
+       gtk_text_view_set_editable(GTK_TEXT_VIEW(vd->text), FALSE);
+       gtk_widget_set_size_request(vd->text, EDITOR_WINDOW_WIDTH, EDITOR_WINDOW_HEIGHT);
+       gtk_container_add(GTK_CONTAINER(scrolled), vd->text);
+       gtk_widget_show(vd->text);
+
+       hbox = gtk_hbox_new(FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(vd->gd->vbox), hbox, FALSE, FALSE, 0);
+       gtk_widget_show(hbox);
+
+       vd->progress = gtk_progress_bar_new();
+       gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(vd->progress), 0.0);
+       gtk_box_pack_start(GTK_BOX(hbox), vd->progress, TRUE, TRUE, 0);
+       gtk_widget_show(vd->progress);
+
+       vd->spinner = spinner_new(NULL, SPINNER_SPEED);
+       gtk_box_pack_start(GTK_BOX(hbox), vd->spinner, FALSE, FALSE, 0);
+       gtk_widget_show(vd->spinner);
+       
+       gtk_widget_show(vd->gd->dialog);
+
+       return vd;
+}
+
+static void editor_verbose_window_fill(EditorVerboseData *vd, gchar *text, gint len)
+{
+       GtkTextBuffer *buffer;
+       GtkTextIter iter;
+
+       buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(vd->text));
+       gtk_text_buffer_get_iter_at_offset(buffer, &iter, -1);
+       gtk_text_buffer_insert(buffer, &iter, text, len);
+}
+
+static void editor_verbose_window_progress(EditorVerboseData *vd, const gchar *text)
+{
+       if (vd->total)
+               {
+               gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(vd->progress), (double)vd->count / vd->total);
+               }
+
+       gtk_progress_bar_set_text(GTK_PROGRESS_BAR(vd->progress), (text) ? text : "");
+}
+
+static gboolean editor_verbose_io_cb(GIOChannel *source, GIOCondition condition, gpointer data)
+{
+       EditorVerboseData *vd = data;
+       gchar buf[512];
+       gsize count;
+
+       switch (condition)
+               {
+               case G_IO_IN:
+                       while (g_io_channel_read_chars(source, buf, sizeof(buf), &count, NULL) == G_IO_STATUS_NORMAL)
+                               {
+                               if (!g_utf8_validate(buf, count, NULL))
+                                       {
+                                       gchar *utf8;
+                                       utf8 = g_locale_to_utf8(buf, count, NULL, NULL, NULL);
+                                       if (utf8)
+                                               {
+                                               editor_verbose_window_fill(vd, utf8, -1);
+                                               g_free(utf8);
+                                               }
+                                       else
+                                               {
+                                               editor_verbose_window_fill(vd, "GQview: Error converting text to valid utf8\n", -1);
+                                               }
+                                       }
+                               else
+                                       {
+                                       editor_verbose_window_fill(vd, buf, count);
+                                       }
+                               }
+                       break;
+               case G_IO_ERR:
+                       printf("Error reading from command\n");
+               case G_IO_HUP:
+                       if (debug) printf("Editor command HUP\n");
+               default:
+                       while (g_source_remove_by_user_data(vd));
+                       close(vd->fd);
+                       vd->fd = -1;
+                       editor_command_next(vd);
+                       return FALSE;
+                       break;
+               }
+
+       return TRUE;
+}
+
+static int command_pipe(char *command)
+{
+       char *args[4];
+       int fpipe[2];
+       pid_t fpid;
+
+       args[0] = COMMAND_SHELL;
+       args[1] = COMMAND_OPT;
+       args[2] = command;
+       args[3] = NULL;
+
+       if (pipe(fpipe) < 0)
+               {
+               printf("pipe setup failed: %s\n", strerror(errno));
+               return -1;
+               }
+
+       fpid = fork();
+       if (fpid < 0)
+               {
+               /* fork failed */
+               printf("fork failed: %s\n", strerror(errno));
+               }
+       else if (fpid == 0)
+               {
+               /* child */
+               gchar *msg;
+
+               dup2(fpipe[1], 1);
+               dup2(fpipe[1], 2);
+               close(fpipe[0]);
+
+               execvp(args[0], args);
+
+               msg = g_strdup_printf("Unable to exec command:\n%s\n\n%s\n", command, strerror(errno));
+               write(1, msg, strlen(msg));
+
+               _exit(1);
+               }
+       else
+               {
+               /* parent */
+               fcntl(fpipe[0], F_SETFL, O_NONBLOCK);
+               close(fpipe[1]);
+
+               return fpipe[0];
+               }
+
+       return -1;
+}
+
+static gint editor_verbose_start(EditorVerboseData *vd, gchar *command)
+       {
+       GIOChannel *channel;
+       int fd;
+
+       fd = command_pipe(command);
+       if (fd < 0)
+               {
+               gchar *buf;
+
+               buf = g_strdup_printf(_("Failed to run command:\n%s\n"), command);
+               editor_verbose_window_fill(vd, buf, strlen(buf));
+               g_free(buf);
+
+               return FALSE;
+               }
+
+       vd->fd = fd;
+       channel = g_io_channel_unix_new(fd);
+
+       g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, G_IO_IN,
+                           editor_verbose_io_cb, vd, NULL);
+       g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, G_IO_ERR,
+                           editor_verbose_io_cb, vd, NULL);
+       g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, G_IO_HUP,
+                           editor_verbose_io_cb, vd, NULL);
+       g_io_channel_unref(channel);
+
+       return TRUE;
+}
+
+static gint editor_command_one(const gchar *template, const gchar *path, EditorVerboseData *vd)
+{
+       GString *result = NULL;
+       gchar *pathl;
+       gchar *found;
+       const gchar *ptr;
+       gchar path_buffer[512];
+       gchar *current_path;
+       gint path_change = FALSE;
+       gint ret;
+
+       current_path = getcwd(path_buffer, sizeof(path_buffer));
+
+       result = g_string_new("");
+       pathl = path_from_utf8(path);
+
+       ptr = template;
+       while ( (found = strstr(ptr, "%p")) )
+               {
+               result = g_string_append_len(result, ptr, found - ptr);
+               ptr = found + 2;
+               result = g_string_append_c(result, '"');
+               result = g_string_append(result, pathl);
+               result = g_string_append_c(result, '"');
+               }
+       result = g_string_append(result, ptr);
+
+       if (debug) printf("system command: %s\n", result->str);
+
+       if (current_path)
+               {
+               gchar *base;
+               base = remove_level_from_path(path);
+               if (chdir(base) == 0) path_change = TRUE;
+               g_free(base);
+               }
+
+       if (vd)
+               {
+               result = g_string_append(result, " 2>&1");
+               ret = editor_verbose_start(vd, result->str);
+               }
+       else
+               {
+               ret = system(result->str);
+               }
+
+       if (path_change) chdir(current_path);
+
+       g_string_free(result, TRUE);
+       g_free(pathl);
+
+       return ret;
+}
+
+static gint editor_command_next(EditorVerboseData *vd)
+{
+       const gchar *text;
+
+       editor_verbose_window_fill(vd, "\n", 1);
+
+       while (vd->list)
+               {
+               gchar *path;
+               gint success;
+
+               path = vd->list->data;
+               vd->list = g_list_remove(vd->list, path);
+
+               editor_verbose_window_progress(vd, path);
+
+               vd->count++;
+               success = editor_command_one(vd->command_template, path, vd);
+               if (success)
+                       {
+                       gtk_widget_set_sensitive(vd->button_stop, (vd->list != NULL) );
+                       editor_verbose_window_fill(vd, path, strlen(path));
+                       editor_verbose_window_fill(vd, "\n", 1);
+                       }
+
+               g_free(path);
+               if (success) return TRUE;
+               }
+
+       if (vd->count == vd->total)
+               {
+               text = _("done");
+               }
+       else
+               {
+               text = _("stopped by user");
+               }
+       vd->count = 0;
+       editor_verbose_window_progress(vd, text);
+       editor_verbose_window_enable_close(vd);
+       return FALSE;
+}
+
+static void editor_command_start(const gchar *template, const gchar *text, GList *list)
+{
+       EditorVerboseData *vd;
+
+       vd = editor_verbose_window(template, text);
+       vd->list = path_list_copy(list);
+       vd->total = g_list_length(list);
+
+       editor_command_next(vd);
+}
+
+static gint editor_line_break(const gchar *template, gchar **front, const gchar **end)
+{
+       gchar *found;
+
+       *front = g_strdup(template);
+       found = strstr(*front, "%f");
+
+       if (found)
+               {
+               *found = '\0';
+               *end = found + 2;
+               return TRUE;
+               }
+
+       *end = "";
+       return FALSE;
+}
+
+/*
+ * The supported macros for editor commands:
+ *
+ *   %f   first occurence replaced by quoted sequence of filenames, command is run once.
+ *        only one occurence of this macro is supported.
+ *        ([ls %f] results in [ls "file1" "file2" ... "lastfile"])
+ *   %p   command is run for each filename in turn, each instance replaced with single filename.
+ *        multiple occurences of this macro is supported for complex shell commands.
+ *        This macro will BLOCK THE APPLICATION until it completes, since command is run once
+ *        for every file in syncronous order. To avoid blocking add the %v macro, below.
+ *        ([ls %p] results in [ls "file1"], [ls "file2"] ... [ls "lastfile"])
+ *   none if no macro is supplied, the result is equivalent to "command %f"
+ *        ([ls] results in [ls "file1" "file2" ... "lastfile"])
+ *
+ *  Only one of the macros %f or %p may be used in a given commmand.
+ *
+ *   %v   must be the first two characters in a command, causes a window to display
+ *        showing the output of the command(s).
+ *   %V   same as %v except in the case of %p only displays a window for multiple files,
+ *        operating on a single file is suppresses the output dialog.
+ */
+static void editor_command_run(const gchar *template, const gchar *text, GList *list)
+{
+       gint verbose = FALSE;
+       gint for_each = FALSE;
+
+       if (!template || template[0] == '\0') return;
+
+       for_each = (strstr(template, "%p") != NULL);
+
+       if (strncmp(template, "%v", 2) == 0)
+               {
+               template += 2;
+               verbose = TRUE;
+               }
+       else if (strncmp(template, "%V", 2) == 0)
+               {
+               template += 2;
+               if (!for_each || list->next) verbose = TRUE;
+               }
+
+       if (for_each)
+               {
+               if (verbose)
+                       {
+                       editor_command_start(template, text, list);
+                       }
+               else
+                       {
+                       GList *work;
+
+                       work = list;
+                       while (work)
+                               {
+                               gchar *path = work->data;
+                               editor_command_one(template, path, NULL);
+                               work = work->next;
+                               }
+                       }
+               }
+       else
+               {
+               gchar *front;
+               const gchar *end;
+               GList *work;
+               GString *result = NULL;
+               gint parser_match;
+
+               parser_match = editor_line_break(template, &front, &end);
+               result = g_string_new((parser_match) ? "" : " ");
+
+               work = list;
+               while (work)
+                       {
+                       gchar *path = work->data;
+                       gchar *pathl;
+
+                       if (work != list) g_string_append_c(result, ' ');
+                       result = g_string_append_c(result, '"');
+                       pathl = path_from_utf8(path);
+                       result = g_string_append(result, pathl);
+                       g_free(pathl);
+                       result = g_string_append_c(result, '"');
+                       work = work->next;
+                       }
+
+               result = g_string_prepend(result, front);
+               result = g_string_append(result, end);
+               if (verbose) result = g_string_append(result, " 2>&1 ");
+               result = g_string_append(result, "&");
+
+               if (debug) printf("system command: %s\n", result->str);
+
+               if (verbose)
+                       {
+                       EditorVerboseData *vd;
+
+                       vd = editor_verbose_window(template, text);
+                       editor_verbose_window_progress(vd, _("running..."));
+                       editor_verbose_start(vd, result->str);
+                       }
+               else
+                       {
+                       system(result->str);
+                       }
+
+               g_free(front);
+               g_string_free(result, TRUE);
+               }
+}
+
+void start_editor_from_path_list(gint n, GList *list)
+{
+       gchar *command;
+
+       if (n < 0 || n >= GQVIEW_EDITOR_SLOTS || !list ||
+           !editor_command[n] ||
+           strlen(editor_command[n]) == 0) return;
+
+       command = g_locale_from_utf8(editor_command[n], -1, NULL, NULL, NULL);
+       editor_command_run(command, editor_name[n], list);
+       g_free(command);
+}
+
+void start_editor_from_file(gint n, const gchar *path)
+{
+       GList *list;
+
+       if (!path) return;
+
+       list = g_list_append(NULL, (gchar *)path);
+       start_editor_from_path_list(n, list);
+       g_list_free(list);
+}
diff --git a/src/editors.h b/src/editors.h
new file mode 100644 (file)
index 0000000..26fd874
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef EDITORS_H
+#define EDITORS_H
+
+
+void editor_reset_defaults(void);
+void start_editor_from_file(gint n, const gchar *path);
+void start_editor_from_path_list(gint n, GList *list);
+
+
+#endif
+
+
+
diff --git a/src/exif.c b/src/exif.c
new file mode 100644 (file)
index 0000000..82f43ea
--- /dev/null
@@ -0,0 +1,1624 @@
+/*
+ *  GQView
+ *  (C) 2004 John Ellis
+ *
+ *  Authors:
+ *    Support for Exif file format, originally written by Eric Swalens.    
+ *    Modified by Quy Tonthat
+ *
+ *    Reimplemented with generic data storage by John Ellis (Nov 2003)
+ *
+ *  The tags were added with information from the FREE document:
+ *     http://www.ba.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
+ *
+ *  For the official Exif Format, please refer to:
+ *     http://www.exif.org
+ *     http://www.exif.org/specifications.html (PDF spec sheets)
+ *
+ *  Notes:
+ *     Additional tag formats should be added to the proper
+ *     location in ExifKnownMarkersList[].
+ *
+ *     Human readable ouput (that needs additional processing of data to
+ *     be useable) can be defined by adding a key to ExifFormattedList[],
+ *     then handling that tag in the function exif_get_formatted_by_key().
+ *     The human readable formatted keys must begin with the character 'f'.
+ *
+ *  Unsupported at this time:
+ *     IFD1 (thumbnail)
+ *     MakerNote
+ *     GPSInfo
+ *
+ *  TODO:
+ *     Convert data to useable form in the ??_as_text function for:
+ *        ComponentsConfiguration
+ *        UserComment (convert this to UTF-8?)
+ *
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include <stdio.h>
+#include <inttypes.h>   /* stdint.h is not available on all systems... */
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
+#include <math.h>
+#include <glib.h>
+
+#include "intl.h"
+
+#include "exif.h"
+
+#include "ui_fileops.h"
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * Tag formats
+ *-----------------------------------------------------------------------------
+ */
+
+ExifFormatAttrib ExifFormatList[] = {
+       { EXIF_FORMAT_UNKNOWN,          1, "unknown",   "unknown" },
+       { EXIF_FORMAT_BYTE_UNSIGNED,    1, "ubyte",     "unsigned byte" },
+       { EXIF_FORMAT_STRING,           1, "string",    "string" },
+       { EXIF_FORMAT_SHORT_UNSIGNED,   2, "ushort",    "unsigned short" },
+       { EXIF_FORMAT_LONG_UNSIGNED,    4, "ulong",     "unsigned long" },
+       { EXIF_FORMAT_RATIONAL_UNSIGNED,8, "urational", "unsigned rational" },
+       { EXIF_FORMAT_BYTE,             1, "byte",      "byte" },
+       { EXIF_FORMAT_UNDEFINED,        1, "undefined", "undefined" },
+       { EXIF_FORMAT_SHORT,            2, "sshort",    "signed short" },
+       { EXIF_FORMAT_LONG,             4, "slong",     "signed long" },
+       { EXIF_FORMAT_RATIONAL,         8, "srational", "signed rational" },
+       { EXIF_FORMAT_FLOAT,            4, "float",     "float" },
+       { EXIF_FORMAT_DOUBLE,           8, "double",    "double" },
+       { -1, 0, NULL }
+};
+
+/* tags that are special, or need special treatment */
+#define TAG_EXIFOFFSET          0x8769
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * Data
+ *-----------------------------------------------------------------------------
+ */
+
+#define EXIF_TEXT_LIST_END { -1, NULL }
+
+static ExifTextList ExifOrientationList[] = {
+       { EXIF_ORIENTATION_UNKNOWN,     N_("unknown") },
+       { EXIF_ORIENTATION_TOP_LEFT,    N_("top left") },
+       { EXIF_ORIENTATION_TOP_RIGHT,   N_("top right") },
+       { EXIF_ORIENTATION_BOTTOM_RIGHT,N_("bottom right") },
+       { EXIF_ORIENTATION_BOTTOM_LEFT, N_("bottom left") },
+       { EXIF_ORIENTATION_LEFT_TOP,    N_("left top") },
+       { EXIF_ORIENTATION_RIGHT_TOP,   N_("right top") },
+       { EXIF_ORIENTATION_RIGHT_BOTTOM,N_("right bottom") },
+       { EXIF_ORIENTATION_LEFT_BOTTOM, N_("left bottom") },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifUnitList[] = {
+       { EXIF_UNIT_UNKNOWN,    N_("unknown") },
+       { EXIF_UNIT_NOUNIT,     "" },
+       { EXIF_UNIT_INCH,       N_("inch") },
+       { EXIF_UNIT_CENTIMETER, N_("centimeter") },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifYCbCrPosList[] = {
+       { 1,    "center" },
+       { 2,    "datum" },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifMeteringModeList[] = {
+       { 0,    N_("unknown") },
+       { 1,    N_("average") },
+       { 2,    N_("center weighted") },
+       { 3,    N_("spot") },
+       { 4,    N_("multi-spot") },
+       { 5,    N_("multi-segment") },
+       { 6,    N_("partial") },
+       { 255,  N_("other") },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifExposureProgramList[] = {
+       { 0,    N_("not defined") },
+       { 1,    N_("manual") },
+       { 2,    N_("normal") },
+       { 3,    N_("aperture") },
+       { 4,    N_("shutter") },
+       { 5,    N_("creative") },
+       { 6,    N_("action") },
+       { 7,    N_("portrait") },
+       { 8,    N_("landscape") },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifLightSourceList[] = {
+       { 0,    N_("unknown") },
+       { 1,    N_("daylight") },
+       { 2,    N_("fluorescent") },
+       { 3,    N_("tungsten (incandescent)") },
+       { 4,    N_("flash") },
+       { 9,    "fine weather" },
+       { 10,   "cloudy weather" },
+       { 11,   "shade" },
+       { 12,   "daylight fluorescent" },
+       { 13,   "day white fluorescent" },
+       { 14,   "cool white fluorescent" },
+       { 15,   "while fluorescent" },
+       { 17,   "standard light A" },
+       { 18,   "standard light B" },
+       { 19,   "standard light C" },
+       { 20,   "D55" },
+       { 21,   "D65" },
+       { 22,   "D75" },
+       { 23,   "D50" },
+       { 24,   "ISO studio tungsten" },
+       { 255,  N_("other") },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifFlashList[] = {
+       { 0,    N_("no") },
+       { 1,    N_("yes") },
+       { 5,    N_("yes, not detected by strobe") },
+       { 7,    N_("yes, detected by strobe") },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifColorSpaceList[] = {
+       { 1,    "sRGB" },
+       { 65535,"uncalibrated" },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifSensorList[] = {
+       { 1,    "not defined" },
+       { 2,    "1 chip color area" },
+       { 2,    "2 chip color area" },
+       { 4,    "3 chip color area" },
+       { 5,    "color sequential area" },
+       { 7,    "trilinear" },
+       { 8,    "color sequential linear" },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifSourceList[] = {
+       { 3,    "digital still camera" },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifSceneList[] = {
+       { 1,    "direct photo" },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifCustRenderList[] = {
+       { 0,    "normal" },
+       { 1,    "custom" },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifExposureModeList[] = {
+       { 0,    "auto" },
+       { 1,    "manual" },
+       { 2,    "auto bracket" },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifWhiteBalanceList[] = {
+       { 0,    "auto" },
+       { 1,    "manual" },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifSceneCaptureList[] = {
+       { 0,    "standard" },
+       { 1,    "landscape" },
+       { 2,    "portrait" },
+       { 3,    "night scene" },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifGainControlList[] = {
+       { 0,    "none" },
+       { 1,    "low gain up" },
+       { 2,    "high gain up" },
+       { 3,    "low gain down" },
+       { 4,    "high gain down" },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifContrastList[] = {
+       { 0,    "normal" },
+       { 1,    "soft" },
+       { 2,    "hard" },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifSaturationList[] = {
+       { 0,    "normal" },
+       { 1,    "low" },
+       { 2,    "high" },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifSharpnessList[] = {
+       { 0,    "normal" },
+       { 1,    "soft" },
+       { 2,    "hard" },
+       EXIF_TEXT_LIST_END
+};
+
+static ExifTextList ExifSubjectRangeList[] = {
+       { 0,    "unknown" },
+       { 1,    "macro" },
+       { 2,    "close" },
+       { 3,    "distant" },
+       EXIF_TEXT_LIST_END
+};
+
+ExifMarker ExifKnownMarkersList[] = {
+{ 0x010e, EXIF_FORMAT_STRING, -1,              "ImageDescription",     N_("Image description"), NULL },
+{ 0x010f, EXIF_FORMAT_STRING, -1,              "Make",                 "Camera make", NULL },
+{ 0x0110, EXIF_FORMAT_STRING, -1,              "Model",                "Camera model", NULL },
+{ 0x0112, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "Orientation",          N_("Orientation"), ExifOrientationList },
+{ 0x011a, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "XResolution",          "X resolution", NULL },
+{ 0x011b, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "YResolution",          "Y Resolution", NULL },
+{ 0x0128, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "ResolutionUnit",       "Resolution units", ExifUnitList },
+{ 0x0131, EXIF_FORMAT_STRING, -1,              "Software",             "Firmware", NULL },
+{ 0x0132, EXIF_FORMAT_STRING, 20,              "DateTime",             N_("Date"), NULL },
+{ 0x013e, EXIF_FORMAT_RATIONAL_UNSIGNED, 2,    "WhitePoint",           "White point", NULL },
+{ 0x013f, EXIF_FORMAT_RATIONAL_UNSIGNED, 6,    "PrimaryChromaticities","Primary chromaticities", NULL },
+{ 0x0211, EXIF_FORMAT_RATIONAL_UNSIGNED, 3,    "YCbCrCoefficients",    "YCbCy coefficients", NULL },
+{ 0x0213, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "YCbCrPositioning",     "YCbCr positioning", ExifYCbCrPosList },
+{ 0x0214, EXIF_FORMAT_RATIONAL_UNSIGNED, 6,    "ReferenceBlackWhite",  "Black white reference", NULL },
+{ 0x8298, EXIF_FORMAT_STRING, -1,              "Copyright",            N_("Copyright"), NULL },
+{ 0x8769, EXIF_FORMAT_LONG_UNSIGNED, 1,                "ExifOffset",           "SubIFD Exif offset", NULL },
+       /* subIFD follows */
+{ 0x829a, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "ExposureTime",         "Exposure time (seconds)", NULL },
+{ 0x829d, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "FNumber",              "FNumber", NULL },
+{ 0x8822, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "ExposureProgram",      N_("Exposure program"), ExifExposureProgramList },
+{ 0x8824, EXIF_FORMAT_STRING, -1,              "SpectralSensitivity",  "Spectral Sensitivity", NULL },
+{ 0x8827, EXIF_FORMAT_SHORT_UNSIGNED, -1,      "ISOSpeedRatings",      N_("ISO sensitivity"), NULL },
+{ 0x8828, EXIF_FORMAT_UNDEFINED, -1,           "OECF",                 "Optoelectric conversion factor", NULL },
+{ 0x9000, EXIF_FORMAT_UNDEFINED, 4,            "ExifVersion",          "Exif version", NULL },
+{ 0x9003, EXIF_FORMAT_STRING, 20,              "DateTimeOriginal",     N_("Date original"), NULL },
+{ 0x9004, EXIF_FORMAT_STRING, 20,              "DateTimeDigitized",    N_("Date digitized"), NULL },
+{ 0x9101, EXIF_FORMAT_UNDEFINED, -1,           "ComponentsConfiguration","Pixel format", NULL },
+{ 0x9102, EXIF_FORMAT_RATIONAL_UNSIGNED,1,     "CompressedBitsPerPixel","Compression ratio", NULL },
+{ 0x9201, EXIF_FORMAT_RATIONAL, 1,             "ShutterSpeedValue",    N_("Shutter speed"), NULL },
+{ 0x9202, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "ApertureValue",        N_("Aperture"), NULL },
+{ 0x9203, EXIF_FORMAT_RATIONAL, 1,             "BrightnessValue",      "Brightness", NULL },
+{ 0x9204, EXIF_FORMAT_RATIONAL, 1,             "ExposureBiasValue",    N_("Exposure bias"), NULL },
+{ 0x9205, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "MaxApertureValue",     "Maximum aperture", NULL },
+{ 0x9206, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "SubjectDistance",      N_("Subject distance"), NULL },
+{ 0x9207, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "MeteringMode",         N_("Metering mode"), ExifMeteringModeList },
+{ 0x9208, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "LightSource",          N_("Light source"), ExifLightSourceList },
+{ 0x9209, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "Flash",                N_("Flash"), ExifFlashList },
+{ 0x920a, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "FocalLength",          N_("Focal length"), NULL },
+{ 0x9214, EXIF_FORMAT_SHORT_UNSIGNED, -1,      "SubjectArea",          "Subject area", NULL },
+{ 0x927c, EXIF_FORMAT_UNDEFINED, -1,           "MakerNote",            "MakerNote", NULL },
+{ 0x9286, EXIF_FORMAT_UNDEFINED, -1,           "UserComment",          "UserComment", NULL },
+{ 0x9290, EXIF_FORMAT_STRING, -1,              "SubsecTime",           "Subsecond time", NULL },
+{ 0x9291, EXIF_FORMAT_STRING, -1,              "SubsecTimeOriginal",   "Subsecond time original", NULL },
+{ 0x9292, EXIF_FORMAT_STRING, -1,              "SubsecTimeDigitized",  "Subsecond time digitized", NULL },
+{ 0xa000, EXIF_FORMAT_UNDEFINED, 4,            "FlashPixVersion",      "FlashPix version", NULL },
+{ 0xa001, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "ColorSpace",           "Colorspace", ExifColorSpaceList },
+       /* ExifImageWidth, ExifImageHeight can also be unsigned short */
+{ 0xa002, EXIF_FORMAT_LONG_UNSIGNED, 1,                "ExifImageWidth",       N_("Width"), NULL },
+{ 0xa003, EXIF_FORMAT_LONG_UNSIGNED, 1,                "ExifImageHeight",      N_("Height"), NULL },
+{ 0xa004, EXIF_FORMAT_STRING, -1,              "RelatedSoundFile",     "Audio data", NULL },
+{ 0xa005, EXIF_FORMAT_LONG_UNSIGNED, 1,                "ExifInteroperabilityOffset", "ExifR98 extension", NULL },
+{ 0xa20b, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "FlashEnergy",          "Flash strength", NULL },
+{ 0xa20c, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "SpatialFrequencyResponse","Spatial frequency response", NULL },
+{ 0xa20e, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "FocalPlaneXResolution", "X Pixel density", NULL },
+{ 0xa20f, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "FocalPlaneYResolution", "Y Pixel density", NULL },
+{ 0xa210, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "FocalPlaneResolutionUnit", "Pixel density units", ExifUnitList },
+{ 0x0214, EXIF_FORMAT_SHORT_UNSIGNED, 2,       "SubjectLocation",      "Subject location", NULL },
+{ 0xa215, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "ExposureIndex",        N_("ISO sensitivity"), NULL },
+{ 0xa217, EXIF_FORMAT_SHORT_UNSIGNED, -1,      "SensingMethod",        "Sensor type", ExifSensorList },
+{ 0xa300, EXIF_FORMAT_UNDEFINED, 1,            "FileSource",           "Source type", ExifSourceList },
+{ 0xa301, EXIF_FORMAT_UNDEFINED, 1,            "SceneType",            "Scene type", ExifSceneList },
+{ 0xa302, EXIF_FORMAT_UNDEFINED, -1,           "CFAPattern",           "Color filter array pattern", NULL },
+       /* tags a4xx were added for Exif 2.2 (not just these - some above, as well) */
+{ 0xa401, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "CustomRendered",       "Render process", ExifCustRenderList },
+{ 0xa402, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "ExposureMode",         "Exposure mode", ExifExposureModeList },
+{ 0xa403, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "WhiteBalance",         "White balance", ExifWhiteBalanceList },
+{ 0xa404, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "DigitalZoomRatio",     "Digital zoom ratio", NULL },
+{ 0xa405, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "FocalLength35mmFilm",  "Focal length (35mm)", NULL },
+{ 0xa406, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "SceneCapturetype",     "Scene capture type", ExifSceneCaptureList },
+{ 0xa407, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "GainControl",          "Gain control", ExifGainControlList },
+{ 0xa408, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "Contrast",             "Contrast", ExifContrastList },
+{ 0xa409, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "Saturation",           "Saturation", ExifSaturationList },
+{ 0xa40a, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "Sharpness",            "Sharpness", ExifSharpnessList },
+{ 0xa40b, EXIF_FORMAT_UNDEFINED, -1,           "DeviceSettingDescription","Device setting", NULL },
+{ 0xa40c, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "SubjectDistanceRange", "Subject range", ExifSubjectRangeList },
+{ 0xa420, EXIF_FORMAT_STRING, -1,              "ImageUniqueID",        "Image serial number", NULL },
+       /* place known, but undocumented or lesser used tags here */
+{ 0x00fe, EXIF_FORMAT_LONG_UNSIGNED, 1,                "NewSubfileType",       NULL, NULL },
+{ 0x00ff, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "SubfileType",          NULL, NULL },
+{ 0x012d, EXIF_FORMAT_SHORT_UNSIGNED, 3,       "TransferFunction",     NULL, NULL },
+{ 0x013b, EXIF_FORMAT_STRING, -1,              "Artist",               "Artist", NULL },
+{ 0x013d, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "Predictor",            NULL, NULL },
+{ 0x0142, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "TileWidth",            NULL, NULL },
+{ 0x0143, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "TileLength",           NULL, NULL },
+{ 0x0144, EXIF_FORMAT_LONG_UNSIGNED, -1,       "TileOffsets",          NULL, NULL },
+{ 0x0145, EXIF_FORMAT_SHORT_UNSIGNED, -1,      "TileByteCounts",       NULL, NULL },
+{ 0x014a, EXIF_FORMAT_LONG_UNSIGNED, -1,       "SubIFDs",              NULL, NULL },
+{ 0x015b, EXIF_FORMAT_UNDEFINED, -1,           "JPEGTables",           NULL, NULL },
+{ 0x828d, EXIF_FORMAT_SHORT_UNSIGNED, 2,       "CFARepeatPatternDim",  NULL, NULL },
+{ 0x828e, EXIF_FORMAT_BYTE_UNSIGNED, -1,       "CFAPattern",           NULL, NULL },
+{ 0x828f, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "BatteryLevel",         NULL, NULL },
+{ 0x83bb, EXIF_FORMAT_LONG_UNSIGNED, -1,       "IPTC/NAA",             NULL, NULL },
+{ 0x8773, EXIF_FORMAT_UNDEFINED, -1,           "InterColorProfile",    NULL, NULL },
+{ 0x8825, EXIF_FORMAT_LONG_UNSIGNED, 1,                "GPSInfo",              "SubIFD GPS offset", NULL },
+{ 0x8829, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "Interlace",            NULL, NULL },
+{ 0x882a, EXIF_FORMAT_SHORT, 1,                        "TimeZoneOffset",       NULL, NULL },
+{ 0x882b, EXIF_FORMAT_SHORT_UNSIGNED, 1,       "SelfTimerMode",        NULL, NULL },
+{ 0x920b, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "FlashEnergy",          NULL, NULL },
+{ 0x920c, EXIF_FORMAT_UNDEFINED, -1,           "SpatialFrequencyResponse", NULL, NULL },
+{ 0x920d, EXIF_FORMAT_UNDEFINED, -1,           "Noise",                NULL, NULL },
+{ 0x9211, EXIF_FORMAT_LONG_UNSIGNED, 1,                "ImageNumber",          NULL, NULL },
+{ 0x9212, EXIF_FORMAT_STRING, 1,               "SecurityClassification", NULL, NULL },
+{ 0x9213, EXIF_FORMAT_STRING, -1,              "ImageHistory",         NULL, NULL },
+{ 0x9215, EXIF_FORMAT_RATIONAL_UNSIGNED, 1,    "ExposureIndex",        NULL, NULL },
+{ 0x9216, EXIF_FORMAT_BYTE_UNSIGNED, 4,                "TIFF/EPStandardID",    NULL, NULL },
+
+       /* end is marked by 0 tag */
+{ 0x0000, EXIF_FORMAT_UNKNOWN, 0, NULL, NULL, NULL }
+};
+
+ExifMarker ExifUnknownMarkersList[] = {
+{ 0x0000, EXIF_FORMAT_UNKNOWN, 0,              "unknown",      NULL, NULL },
+{ 0x0000, EXIF_FORMAT_BYTE_UNSIGNED, -1,       "unknown",      NULL, NULL },
+{ 0x0000, EXIF_FORMAT_STRING, -1,              "unknown",      NULL, NULL },
+{ 0x0000, EXIF_FORMAT_SHORT_UNSIGNED, -1,      "unknown",      NULL, NULL },
+{ 0x0000, EXIF_FORMAT_LONG_UNSIGNED, -1,       "unknown",      NULL, NULL },
+{ 0x0000, EXIF_FORMAT_RATIONAL_UNSIGNED, -1,   "unknown",      NULL, NULL },
+{ 0x0000, EXIF_FORMAT_BYTE, -1,                        "unknown",      NULL, NULL },
+{ 0x0000, EXIF_FORMAT_UNDEFINED, -1,           "unknown",      NULL, NULL },
+{ 0x0000, EXIF_FORMAT_SHORT, -1,               "unknown",      NULL, NULL },
+{ 0x0000, EXIF_FORMAT_LONG, -1,                        "unknown",      NULL, NULL },
+{ 0x0000, EXIF_FORMAT_RATIONAL, -1,            "unknown",      NULL, NULL },
+{ 0x0000, EXIF_FORMAT_FLOAT, -1,               "unknown",      NULL, NULL },
+{ 0x0000, EXIF_FORMAT_DOUBLE, -1,              "unknown",      NULL, NULL },
+};
+
+/* human readable key list */
+
+ExifFormattedText ExifFormattedList[] = {
+       { "fCamera",            N_("Camera") },
+       { "fDateTime",          N_("Date") },
+       { "fShutterSpeed",      N_("Shutter speed") },
+       { "fAperture",          N_("Aperture") },
+       { "fExposureBias",      N_("Exposure bias") },
+       { "fISOSpeedRating",    N_("ISO sensitivity") },
+       { "fFocalLength",       N_("Focal length") },
+       { "fSubjectDistance",   N_("Subject distance") },
+       { "fFlash",             N_("Flash") },
+       { "fResolution",        N_("Resolution") },
+       { NULL, NULL }
+};
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * misc
+ *-----------------------------------------------------------------------------
+ */
+
+#define BYTE_ORDER_INTEL       1
+#define BYTE_ORDER_MOTOROLA    2
+                                                                                                                          
+#define MARKER_UNKNOWN         0x00
+#define MARKER_SOI             0xD8
+#define MARKER_APP1            0xE1
+
+typedef struct {
+       char            byte_order[2];
+       uint16_t        magic;
+       uint32_t        IFD_offset;
+} TIFFHeader;
+typedef struct {
+       uint16_t        tag;
+       uint16_t        format;
+       uint32_t        nb;
+       uint32_t        data;
+} IFDEntry;
+
+
+static ExifMarker *exif_marker_from_tag(uint16_t tag);
+static int parse_IFD_table(ExifData *exif, unsigned char *tiff, int offset,
+                          int size, int byte_order);
+
+/*
+ *-----------------------------------------------------------------------------
+ * ExifItem
+ *-----------------------------------------------------------------------------
+ */
+
+static ExifItem *exif_item_new(ExifFormatType format, unsigned int tag, unsigned int elements, ExifMarker *marker)
+{
+       ExifItem *item;
+
+       item = g_new0(ExifItem, 1);
+       item->format = format;
+       item->tag = tag;
+       item->marker = marker;
+       item->elements = elements;
+       item->data = NULL;
+       item->data_len = 0;
+
+       switch (format)
+               {
+               case EXIF_FORMAT_UNKNOWN:
+                       /* unknown, data is NULL */
+                       return item;
+                       break;
+               case EXIF_FORMAT_BYTE_UNSIGNED:
+                       item->data_len = sizeof(char) * elements;
+                       break;
+               case EXIF_FORMAT_STRING:
+                       item->data_len = sizeof(char) * elements;
+                       break;
+               case EXIF_FORMAT_SHORT_UNSIGNED:
+                       item->data_len = sizeof(unsigned short int) * elements;
+                       break;
+               case EXIF_FORMAT_LONG_UNSIGNED:
+                       item->data_len = sizeof(unsigned long int) * elements;
+                       break;
+               case EXIF_FORMAT_RATIONAL_UNSIGNED:
+                       item->data_len = sizeof(ExifRational) * elements;
+                       break;
+               case EXIF_FORMAT_BYTE:
+                       item->data_len = sizeof(char) * elements;
+                       break;
+               case EXIF_FORMAT_UNDEFINED:
+                       item->data_len = sizeof(char) * elements;
+                       break;
+               case EXIF_FORMAT_SHORT:
+                       item->data_len = sizeof(short int) * elements;
+                       break;
+               case EXIF_FORMAT_LONG:
+                       item->data_len = sizeof(long int) * elements;
+                       break;
+               case EXIF_FORMAT_RATIONAL:
+                       item->data_len = sizeof(ExifRational) * elements;
+                       break;
+               case EXIF_FORMAT_FLOAT:
+                       item->data_len = sizeof(float) * elements;
+                       break;
+               case EXIF_FORMAT_DOUBLE:
+                       item->data_len = sizeof(double) * elements;
+                       break;
+               }
+
+       item->data = g_malloc0(item->data_len);
+
+       return item;
+}
+
+static void exif_item_free(ExifItem *item)
+{
+       if (!item) return;
+
+       g_free(item->data);
+       g_free(item);
+}
+
+const char *exif_item_get_tag_name(ExifItem *item)
+{
+       if (!item || !item->marker) return NULL;
+       return item->marker->key;
+}
+
+const char *exif_item_get_description(ExifItem *item)
+{
+       if (!item || !item->marker) return NULL;
+       return _(item->marker->description);
+}
+
+const char *exif_item_get_format_name(ExifItem *item, gint brief)
+{
+       if (!item || !item->marker) return NULL; 
+       return (brief) ? ExifFormatList[item->format].short_name : ExifFormatList[item->format].description;
+}
+
+
+#define UNDEFINED_TEXT_BYTE_COUNT 16
+
+static GString *string_append_raw_bytes(GString *string, gpointer data, gint ne)
+{
+       gint i;
+
+       for (i = 0 ; i < ne && i < UNDEFINED_TEXT_BYTE_COUNT; i++)
+               {
+               unsigned char c = ((char *)data)[i];
+               if (c < 32 || c > 127) c = '.';
+               g_string_append_printf(string, "%c", c);
+               }
+       string = g_string_append(string, " : ");
+       for (i = 0 ; i < ne && i < UNDEFINED_TEXT_BYTE_COUNT; i++)
+               {
+               const gchar *spacer;
+               if (i > 0)
+                       {
+                       if (i%8 == 0)
+                               {
+                               spacer = " - ";
+                               }
+                       else
+                               {
+                               spacer = " ";
+                               }
+                       }
+               else
+                       {
+                       spacer = "";
+                       }
+               g_string_append_printf(string, "%s%02x", spacer, ((char *)data)[i]);
+               }
+       if (i >= UNDEFINED_TEXT_BYTE_COUNT) g_string_append_printf(string, " (%d bytes)", ne);
+
+       return string;
+}
+
+static gchar *text_list_find_value(ExifTextList *list, gint value)
+{
+       gchar *result = NULL;
+       gint i;
+
+       i = 0;
+       while (!result && list[i].value >= 0)
+               {
+               if (value == list[i].value) result = g_strdup(_(list[i].description));
+               i++;
+               }
+       if (!result) result = g_strdup_printf("%d (%s)", value, _("unknown"));
+
+       return result;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * byte size utils
+ *-------------------------------------------------------------------
+ */
+
+static uint16_t get_int16(unsigned char *f, int bo)
+{
+       if (bo == BYTE_ORDER_INTEL)
+               return *f + (*(f+1)<<8);
+       else
+               return ((*f)<<8) + *(f+1);
+}
+
+#if 0
+/* not used ? */
+static uint32_t get_int32(unsigned char *f, int bo)
+{
+       if (bo == BYTE_ORDER_INTEL)
+               return get_int16(f, BYTE_ORDER_INTEL) + (get_int16(f+2, BYTE_ORDER_INTEL)<<16);
+       else
+               return (get_int16(f, BYTE_ORDER_MOTOROLA)<<16) + get_int16(f+2, BYTE_ORDER_MOTOROLA);
+}
+#endif
+
+static uint16_t swab_int16(uint16_t n, int bo)
+{
+#if BYTE_ORDER == LITTLE_ENDIAN
+       if (bo == BYTE_ORDER_MOTOROLA)
+#else
+       if (bo == BYTE_ORDER_INTEL)
+#endif
+               return n>>8 | n<<8 ;
+       else
+               return n;
+}
+
+static uint32_t swab_int32(uint32_t n, int bo)
+{
+#if BYTE_ORDER == LITTLE_ENDIAN
+       if (bo == BYTE_ORDER_MOTOROLA)
+#else
+       if (bo == BYTE_ORDER_INTEL)
+#endif
+               return n<<24 | n>>24 | (n & 0xFF0000)>>8 | (n & 0xFF00)<<8;
+       else
+               return n;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * marker utils
+ *-------------------------------------------------------------------
+ */
+
+static int get_marker_size(unsigned char *f)
+{
+       /* Size is always in Motorola byte order */
+       return get_int16(f+2, BYTE_ORDER_MOTOROLA);
+}
+
+static int goto_next_marker(unsigned char **f, int *size, int *marker)
+{
+       int marker_size = 2;
+
+       *marker = MARKER_UNKNOWN;
+
+       /* It is safe to access the marker and its size since we have checked
+        * the SOI and this function guaranties the whole next marker is
+        * available
+        */
+       if (*(*f+1) != MARKER_SOI)
+               {
+               marker_size += get_marker_size(*f);
+               }
+
+       *size -= marker_size;
+
+       /* size should be at least 4, so we can read the marker and its size
+        * and check data are actually available
+        */
+       if (*size < 4) return -1;
+
+       /* Jump to the next marker and be sure it begins with 0xFF
+        */
+       *f += marker_size;
+       if (**f != 0xFF) return -1;
+
+       if (get_marker_size(*f)+2 > *size) return -1;
+
+       *marker = *(*f+1);
+
+       return 0;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * IFD utils
+ *-------------------------------------------------------------------
+ */
+
+static ExifMarker *exif_marker_from_tag(uint16_t tag)
+{
+       static int len = sizeof(ExifKnownMarkersList)/sizeof(ExifMarker) - 1;
+       int i = 0;
+
+       while (i < len && ExifKnownMarkersList[i].tag != tag)
+               {
+               i++;
+               }
+
+       return (i >= len ? NULL : &ExifKnownMarkersList[i]);
+}
+
+static void rational_from_data(ExifRational *r, void *src, int byte_order)
+{
+       r->num = swab_int32(*(uint32_t*)src, byte_order);
+       r->den = swab_int32(*(uint32_t*)(src + sizeof(uint32_t)), byte_order);
+}
+
+static void exif_item_copy_data(ExifItem *item, void *src, int len, ExifFormatType src_format, int byte_order)
+{
+       int bs;
+       int ne;
+       gpointer dest;
+       int i;
+
+       bs = ExifFormatList[item->format].size;
+       ne = item->elements;
+       dest = item->data;
+
+       if (!dest || len > item->data_len)
+               {
+               printf("exif tag %s data size mismatch\n", exif_item_get_tag_name(item));
+               return;
+               }
+
+       switch (item->format)
+               {
+               case EXIF_FORMAT_UNKNOWN:
+                       break;
+               case EXIF_FORMAT_BYTE_UNSIGNED:
+               case EXIF_FORMAT_BYTE:
+               case EXIF_FORMAT_UNDEFINED:
+                       memcpy(dest, src, len);
+                       break;
+               case EXIF_FORMAT_STRING:
+                       memcpy(dest, src, len);
+                       /* string is NULL terminated, make sure this is true */
+                       if (((char *)dest)[len - 1] != '\0') ((char *)dest)[len - 1] = '\0';
+                       break;
+               case EXIF_FORMAT_SHORT_UNSIGNED:
+               case EXIF_FORMAT_SHORT:
+                       for (i = 0; i < ne; i++)
+                               {
+                               ((short *)dest)[i] = swab_int16(*(uint16_t*)(src + i * bs), byte_order);
+                               }
+                       break;
+               case EXIF_FORMAT_LONG_UNSIGNED:
+               case EXIF_FORMAT_LONG:
+                       if (src_format == EXIF_FORMAT_SHORT_UNSIGNED ||
+                           src_format == EXIF_FORMAT_SHORT)
+                               {
+                               /* a short fits into a long, so allow it */
+                               int ss;
+
+                               ss = ExifFormatList[src_format].size;
+                               for (i = 0; i < ne; i++)
+                                       {
+                                       ((long *)dest)[i] = (long)swab_int16(*(uint16_t*)(src + i * ss), byte_order);
+                                       }
+                               }
+                       else
+                               {
+                               for (i = 0; i < ne; i++)
+                                       {
+                                       ((long *)dest)[i] = swab_int32(*(uint32_t*)(src + i * bs), byte_order);
+                                       }
+                               }
+                       break;
+               case EXIF_FORMAT_RATIONAL_UNSIGNED:
+               case EXIF_FORMAT_RATIONAL:
+                       for (i = 0; i < ne; i++)
+                               {
+                               rational_from_data(&((ExifRational *)dest)[i], src + i * bs, byte_order);
+                               }
+                       break;
+               case EXIF_FORMAT_FLOAT:
+                       for (i = 0; i < ne; i++)
+                               {
+                               ((float *)dest)[i] = swab_int32(*(uint32_t*)(src + i * bs), byte_order);
+                               }
+                       break;
+               case EXIF_FORMAT_DOUBLE:
+                       for (i = 0; i < ne; i++)
+                               {
+                               ExifRational r;
+
+                               rational_from_data(&r, src + i * bs, byte_order);
+                               if (r.den) ((double *)dest)[i] = (double)r.num / r.den;
+                               }
+                       break;
+               }
+}
+
+static int parse_IFD_entry(ExifData *exif, unsigned char *tiff, int offset,
+                          int size, int byte_order)
+{
+       IFDEntry *ent = (IFDEntry*)(tiff+offset);
+       uint32_t swabed_data;
+       void *data;
+       int data_len;
+       ExifMarker *marker;
+       ExifItem *item;
+
+       ent->tag = swab_int16(ent->tag, byte_order);
+       ent->format = swab_int16(ent->format, byte_order);
+       ent->nb = swab_int32(ent->nb, byte_order);
+       swabed_data = swab_int32(ent->data, byte_order);
+
+       /* Check tag type. If it does not match, either the format is wrong,
+        * either it is a unknown tag; so it is not really an error.
+        */
+       marker = exif_marker_from_tag(ent->tag);
+       if (!marker)
+               {
+               if (ent->format > EXIF_FORMAT_DOUBLE)
+                       {
+                       printf("warning: exif tag 0x%4x has invalid format %d\n", ent->tag, ent->format);
+                       return 0;
+                       }
+               /* allow non recognized tags to be displayed */
+               marker = &ExifUnknownMarkersList[ent->format];
+               }
+       if (marker->format != ent->format)
+               {
+               /* Some cameras got mixed up signed/unsigned_rational
+                * eg KODAK DC4800 on object_distance tag
+                *
+                * FIXME: what exactly is this test trying to do?
+                * ok, so this test is to allow the case of swapped signed/unsigned mismatch to leak through?
+                */
+               if ( !(marker->format == EXIF_FORMAT_RATIONAL_UNSIGNED && ent->format == EXIF_FORMAT_RATIONAL) &&
+                    !(marker->format == EXIF_FORMAT_RATIONAL && ent->format == EXIF_FORMAT_RATIONAL_UNSIGNED) &&
+                       /* short fits into a long so allow this mismatch
+                        * as well (some tags allowed to be unsigned short _or_ unsigned long)
+                        */
+                    !(marker->format == EXIF_FORMAT_LONG_UNSIGNED && ent->format == EXIF_FORMAT_SHORT_UNSIGNED) )
+                       {
+                       if (ent->format <= EXIF_FORMAT_DOUBLE)
+                               {
+                               printf("warning: exif tag %s format mismatch, found %s exif spec requests %s\n",
+                                       marker->key, ExifFormatList[ent->format].short_name, ExifFormatList[marker->format].short_name);
+                               }
+                       else
+                               {
+                               printf("warning: exif tag %s format mismatch, found unknown id %d exif spec requests %d (%s)\n",
+                                       marker->key, ent->format, marker->format, ExifFormatList[marker->format].short_name);
+                               }
+                       return 0;
+                       }
+               }
+
+       /* Where is the data, is it available?
+        */
+       if (marker->components > 0 && marker->components != ent->nb)
+               {
+               printf("warning: exif tag %s has %d elements, exif spec requests %d\n", marker->key, ent->nb, marker->components);
+               }
+       data_len = ExifFormatList[marker->format].size * ent->nb;
+       if (data_len > sizeof(ent->data))
+               {
+               if (size < swabed_data+data_len)
+                       {
+                       printf("warning: exif tag %s will overrun IFD segment, ignored.\n", marker->key);
+                       return -1;
+                       }
+               data = (void*)tiff + swabed_data;
+               }
+       else
+               {
+               data = (void*)(&(ent->data));
+               }
+
+       item = exif_item_new(marker->format, ent->tag, ent->nb, marker);
+       exif_item_copy_data(item, data, data_len, ent->format, byte_order);
+       exif->items = g_list_prepend(exif->items, item);
+
+       if (item->tag == TAG_EXIFOFFSET)
+               {
+               parse_IFD_table(exif, tiff, swabed_data, size, byte_order);
+               }
+
+       return 0;
+}
+
+static int parse_IFD_table(ExifData *exif, unsigned char *tiff, int offset,
+                          int size, int byte_order)
+{
+       int i, nb_entries;
+
+       /* We should be able to read number of entries in IFD0) */
+       if (size < offset+2) return -1;
+
+       nb_entries = get_int16(tiff+offset, byte_order);
+
+       /* Entries and next IFD offset must be readable */
+       if (size < offset+nb_entries*12+4) return -1;
+
+       for (i=0; i<nb_entries; ++i)
+               {
+               parse_IFD_entry(exif, tiff, offset+2+i*sizeof(IFDEntry), size, byte_order);
+               }
+
+       return 0;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * file formats
+ *-------------------------------------------------------------------
+ */
+
+static int parse_TIFF(ExifData *exif, unsigned char *tiff, int size)
+{
+       int byte_order, offset=0;
+
+       if (size < sizeof(TIFFHeader))
+               {
+               return -1;
+               }
+
+       if (strncmp(((TIFFHeader*)tiff)->byte_order, "II", 2) == 0)
+               {
+               byte_order = BYTE_ORDER_INTEL;
+               }
+       else if (strncmp(((TIFFHeader*)tiff)->byte_order, "MM", 2) == 0)
+               {
+               byte_order = BYTE_ORDER_MOTOROLA;
+               }
+       else
+               {
+               return -1;
+               }
+
+       if (swab_int16(((TIFFHeader*)tiff)->magic, byte_order) != 0x002A)
+               {
+               return -1;
+               }
+
+       offset = swab_int32(((TIFFHeader*)tiff)->IFD_offset, byte_order);
+
+       return parse_IFD_table(exif, tiff, offset, size, byte_order);
+}
+
+static int parse_JPEG(ExifData *exif, unsigned char *f, int size)
+{
+       int marker, marker_size;
+
+       if (size<2 || *f!=0xFF || *(f+1)!=MARKER_SOI)
+               {
+               return -2;
+               }
+
+       do {
+               if (goto_next_marker(&f, &size, &marker) == -1)
+                       {
+                       break;
+                       }
+       } while (marker != MARKER_APP1);
+
+       if (marker != MARKER_APP1)
+               {
+               return -2;
+               }
+
+       marker_size = get_marker_size(f)-2;
+               
+       if (marker_size<6 || strncmp((char*)f+4, "Exif\0\0", 6)!=0)
+               {
+               return -2;
+               }
+
+       return parse_TIFF(exif, f+10, marker_size-6);
+}
+
+static gint map_file(const gchar *path, void **mapping, int *size)
+{
+       int fd;
+       struct stat fs;
+
+       if ((fd = open(path, O_RDONLY)) == -1)
+               {
+               perror(path);
+               return -1;
+               }
+
+       if (fstat(fd, &fs) == -1)
+               {
+               perror(path);
+               close(fd);
+               return -1;
+               }
+
+       *size = fs.st_size;
+
+       if ((*mapping = mmap(0, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0)) == MAP_FAILED)
+               {
+               perror(path);
+               close(fd);
+               return -1;
+               }
+
+       close(fd);
+       return 0;
+}
+
+static gint unmap_file(void *mapping, int size)
+{
+       if (munmap(mapping, size) == -1)
+               {
+               perror("munmap");
+               return -1;
+               }
+
+       return 0;
+}
+
+void exif_free(ExifData *exif)
+{
+       GList *work;
+
+       if (!exif) return;
+
+       work = exif->items;
+       while (work)
+               {
+               ExifItem *item = work->data;
+               work = work->next;
+               exif_item_free(item);
+               }
+
+       g_list_free(exif->items);
+       g_free(exif);
+}
+
+ExifData *exif_read(const gchar *path)
+{
+       ExifData *exif;
+       void *f;
+       int size, res;
+       gchar *pathl;
+
+       if (!path) return NULL;
+
+       pathl = path_from_utf8(path);
+       if (map_file(pathl, &f, &size) == -1)
+               {
+               g_free(pathl);
+               return NULL;
+               }
+       g_free(pathl);
+
+       exif = g_new0(ExifData, 1);
+       exif->items = NULL;
+
+       if ((res = parse_JPEG(exif, (unsigned char *)f, size)) == -2)
+               {
+               res = parse_TIFF(exif, (unsigned char *)f, size);
+               }
+
+       if (res != 0)
+               {
+               exif_free(exif);
+               exif = NULL;
+               }
+
+       unmap_file(f, size);
+
+       if (exif) exif->items = g_list_reverse(exif->items);
+
+#if 0
+       exif_write_data_list(exif, stdout, TRUE);
+       exif_write_data_list(exif, stdout, FALSE);
+#endif
+
+       return exif;
+}
+
+ExifItem *exif_get_item(ExifData *exif, const gchar *key)
+{
+       GList *work;
+
+       if (!key) return NULL;
+
+       work = exif->items;
+       while (work)
+               {
+               ExifItem *item;
+
+               item = work->data;
+               work = work->next;
+               if (item->marker->key && strcmp(key, item->marker->key) == 0) return item;
+                }
+       return NULL;
+}
+
+gchar *exif_item_get_data_as_text(ExifItem *item)
+{
+       ExifMarker *marker;
+       gpointer data;
+       GString *string;
+       gchar *text;
+       gint ne;
+       gint i;
+
+       if (!item) return NULL;
+
+       marker = item->marker;
+       if (!marker) return NULL;
+
+       data = item->data;
+       ne = item->elements;
+       string = g_string_new("");
+       switch (item->format)
+               {
+               case EXIF_FORMAT_UNKNOWN:
+                       break;
+               case EXIF_FORMAT_BYTE_UNSIGNED:
+               case EXIF_FORMAT_BYTE:
+               case EXIF_FORMAT_UNDEFINED:
+                       if (ne == 1 && marker->list)
+                               {
+                               gchar *result;
+                               unsigned char val;
+
+                               if (item->format == EXIF_FORMAT_BYTE_UNSIGNED ||
+                                   item->format == EXIF_FORMAT_UNDEFINED)
+                                       {
+                                       val = ((unsigned char *)data)[0];
+                                       }
+                               else
+                                       {
+                                       val = (unsigned char)(((signed char *)data)[0]);
+                                       }
+
+                               result = text_list_find_value(marker->list, (unsigned short)val);
+                               string = g_string_append(string, result);
+                               g_free(result);
+                               }
+                       else
+                               {
+                               string = string_append_raw_bytes(string, data, ne);
+                               }
+                       break;
+               case EXIF_FORMAT_STRING:
+                       string = g_string_append(string, (gchar *)(item->data));
+                       break;
+               case EXIF_FORMAT_SHORT_UNSIGNED:
+                       if (ne == 1 && marker->list)
+                               {
+                               gchar *result;
+
+                               result = text_list_find_value(marker->list, ((unsigned short *)data)[0]);
+                               string = g_string_append(string, result);
+                               g_free(result);
+                               }
+                       else for (i = 0; i < ne; i++)
+                               {
+                               g_string_append_printf(string, "%s%hd", (i > 0) ? ", " : "",
+                                                       ((unsigned short *)data)[i]);
+                               }
+                       break;
+               case EXIF_FORMAT_LONG_UNSIGNED:
+                       for (i = 0; i < ne; i++)
+                               {
+                               g_string_append_printf(string, "%s%ld", (i > 0) ? ", " : "",
+                                                       ((unsigned long *)data)[i]);
+                               }
+                       break;
+               case EXIF_FORMAT_RATIONAL_UNSIGNED:
+                       for (i = 0; i < ne; i++)
+                               {
+                               ExifRational *r;
+
+                               r = &((ExifRational *)data)[i];
+                               g_string_append_printf(string, "%s%ld/%ld", (i > 0) ? ", " : "",
+                                                       (unsigned long)r->num, (unsigned long)r->den);
+                               }
+                       break;
+               case EXIF_FORMAT_SHORT:
+                       for (i = 0; i < ne; i++)
+                               {
+                               g_string_append_printf(string, "%s%hd", (i > 0) ? ", " : "",
+                                                       ((short *)data)[i]);
+                               }
+                       break;
+               case EXIF_FORMAT_LONG:
+                       for (i = 0; i < ne; i++)
+                               {
+                               g_string_append_printf(string, "%s%ld", (i > 0) ? ", " : "",
+                                                       ((long *)data)[i]);
+                               }
+                       break;
+               case EXIF_FORMAT_RATIONAL:
+                       for (i = 0; i < ne; i++)
+                               {
+                               ExifRational *r;
+
+                               r = &((ExifRational *)data)[i];
+                               g_string_append_printf(string, "%s%ld/%ld", (i > 0) ? ", " : "",
+                                                       (long)r->num, (long)r->den);
+                               }
+                       break;
+               case EXIF_FORMAT_FLOAT:
+                       for (i = 0; i < ne; i++)
+                               {
+                               g_string_append_printf(string, "%s%f", (i > 0) ? ", " : "",
+                                                       ((float *)data)[i]);
+                               }
+                       break;
+               case EXIF_FORMAT_DOUBLE:
+                       for (i = 0; i < ne; i++)
+                               {
+                               g_string_append_printf(string, "%s%f", (i > 0) ? ", " : "",
+                                                       ((double *)data)[i]);
+                               }
+                       break;
+               }
+
+       text = g_strdup(string->str);
+       g_string_free(string, TRUE);
+
+       return text;
+}
+
+gint exif_item_get_integer(ExifItem *item, gint *value)
+{
+       if (!item) return FALSE;
+
+       switch (item->format)
+               {
+               case EXIF_FORMAT_SHORT:
+                       *value = (gint)(((short *)(item->data))[0]);
+                       return TRUE;
+                       break;
+               case EXIF_FORMAT_SHORT_UNSIGNED:
+                       *value = (gint)(((unsigned short *)(item->data))[0]);
+                       return TRUE;
+                       break;
+               case EXIF_FORMAT_LONG:
+                       *value = (gint)(((long *)(item->data))[0]);
+                       return TRUE;
+                       break;
+               case EXIF_FORMAT_LONG_UNSIGNED:
+                       /* FIXME: overflow possible */
+                       *value = (gint)(((unsigned long *)(item->data))[0]);
+                       return TRUE;
+               default:
+                       /* all other type return FALSE */
+                       break;
+               }
+       return FALSE;
+}
+
+gint exif_get_integer(ExifData *exif, const gchar *key, gint *value)
+{
+       ExifItem *item;
+
+       item = exif_get_item(exif, key);
+       return exif_item_get_integer(item, value);
+}
+
+ExifRational *exif_item_get_rational(ExifItem *item, gint *sign)
+{
+       if (!item) return NULL;
+
+       if (item->format == EXIF_FORMAT_RATIONAL ||
+           item->format == EXIF_FORMAT_RATIONAL_UNSIGNED)
+               {
+               if (sign) *sign = (item->format == EXIF_FORMAT_RATIONAL);
+               return &((ExifRational *)(item->data))[0];
+               }
+
+       return NULL;
+}
+
+ExifRational *exif_get_rational(ExifData *exif, const gchar *key, gint *sign)
+{
+       ExifItem *item;
+
+       item = exif_get_item(exif, key);
+       return exif_item_get_rational(item, sign);
+}
+
+double exif_rational_to_double(ExifRational *r, gint sign)
+{
+       if (!r || r->den == 0.0) return 0.0;
+
+       if (sign) return (double)((int)r->num) / (double)((int)r->den);
+       return (double)r->num / r->den;
+}
+
+static double exif_get_rational_as_double(ExifData *exif, const gchar *key)
+{
+       ExifRational *r;
+       gint sign;
+
+       r = exif_get_rational(exif, key, &sign);
+       return exif_rational_to_double(r, sign);
+}
+
+static GString *append_comma_text(GString *string, const gchar *text)
+{
+       string = g_string_append(string, ", ");
+       string = g_string_append(string, text);
+
+       return string;
+}
+
+static gchar *exif_get_formatted_by_key(ExifData *exif, const gchar *key, gint *key_valid)
+{
+       /* must begin with f, else not formatted */
+       if (key[0] != 'f')
+               {
+               if (key_valid) *key_valid = FALSE;
+               return NULL;
+               }
+
+       if (key_valid) *key_valid = TRUE;
+
+       if (strcmp(key, "fCamera") == 0)
+               {
+               gchar *text;
+               gchar *make = exif_get_data_as_text(exif, "Make");
+               gchar *model = exif_get_data_as_text(exif, "Model");
+               gchar *software = exif_get_data_as_text(exif, "Software");
+
+               text = g_strdup_printf("%s%s%s%s%s%s", (make) ? make : "", ((make) && (model)) ? " " : "",
+                                                      (model) ? model : "",
+                                                      (software) ? " (" : "",
+                                                      (software) ? software : "",
+                                                      (software) ? ")" : "");
+
+               g_free(make);
+               g_free(model);
+               g_free(software);
+               return text;
+               }
+       if (strcmp(key, "fDateTime") == 0)
+               {
+               gchar *text = exif_get_data_as_text(exif, "DateTimeOriginal");
+               gchar *subsec = NULL;
+               if (text) subsec = exif_get_data_as_text(exif, "SubsecTimeOriginal");
+               if (!text)
+                       {
+                       text = exif_get_data_as_text(exif, "DateTime");
+                       if (text) subsec = exif_get_data_as_text(exif, "SubsecTime");
+                       }
+               if (subsec)
+                       {
+                       gchar *tmp = text;
+                       text = g_strconcat(tmp, ".", subsec, NULL);
+                       g_free(tmp);
+                       g_free(subsec);
+                       }
+               return text;
+               }
+       if (strcmp(key, "fShutterSpeed") == 0)
+               {
+               ExifRational *r;
+
+               r = exif_get_rational(exif, "ExposureTime", NULL);
+               if (r && r->num && r->den)
+                       {
+                       double n = (double)r->den / (double)r->num;
+                       return g_strdup_printf("%s%.0fs", n > 1.0 ? "1/" : "",
+                                                         n > 1.0 ? n : 1.0 / n);
+                       }
+               r = exif_get_rational(exif, "ShutterSpeedValue", NULL);
+               if (r && r->num  && r->den)
+                       {
+                       double n = pow(2.0, exif_rational_to_double(r, TRUE));
+
+                       /* Correct exposure time to avoid values like 1/91s (seen on Minolta DImage 7) */
+                       if (n > 1.0 && (int)n - ((int)(n/10))*10 == 1) n--;
+
+                       return g_strdup_printf("%s%.0fs", n > 1.0 ? "1/" : "",
+                                                         n > 1.0 ? floor(n) : 1.0 / n);        
+                       }
+               return NULL;
+               }
+       if (strcmp(key, "fAperture") == 0)
+               {
+               double n;
+
+               n = exif_get_rational_as_double(exif, "FNumber");
+               if (n == 0.0) n = exif_get_rational_as_double(exif, "ApertureValue");
+               if (n == 0.0) return NULL;
+
+               return g_strdup_printf("f/%.1f", n);
+               }
+       if (strcmp(key, "fExposureBias") == 0)
+               {
+               ExifRational *r;
+               gint sign;
+               double n;
+
+               r = exif_get_rational(exif, "ExposureBiasValue", &sign);
+               if (!r) return NULL;
+
+               n = exif_rational_to_double(r, sign);
+               return g_strdup_printf("%+.1f", n);
+               }
+       if (strcmp(key, "fFocalLength") == 0)
+               {
+               double n;
+
+               n = exif_get_rational_as_double(exif, "FocalLength");
+               if (n == 0.0) return NULL;
+               return g_strdup_printf("%.2f mm", n);
+               }
+       if (strcmp(key, "fISOSpeedRating") == 0)
+               {
+               gchar *text;
+
+               text = exif_get_data_as_text(exif, "ISOSpeedRatings");
+               /* kodak may set this instead */
+               if (!text) text = exif_get_data_as_text(exif, "ExposureIndex");
+               return text;
+               }
+       if (strcmp(key, "fSubjectDistance") == 0)
+               {
+               ExifRational *r;
+               gint sign;
+               double n;
+
+               r = exif_get_rational(exif, "SubjectDistance", &sign);
+               if (!r) return NULL;
+
+               if ((long)r->num == 0xffffffff) return g_strdup(_("infinity"));
+               if ((long)r->num == 0) return g_strdup(_("unknown"));
+
+               n = exif_rational_to_double(r, sign);
+               if (n == 0.0) return _("unknown");
+               return g_strdup_printf("%.3f m", n);
+               }
+       if (strcmp(key, "fFlash") == 0)
+               {
+               /* grr, flash is a bitmask... */
+               GString *string;
+               gchar *text;
+               gint n;
+               gint v;
+
+               if (!exif_get_integer(exif, "Flash", &n)) return NULL;
+
+               /* Exif 2.1 only defines first 3 bits */
+               if (n <= 0x07) return g_strdup(text_list_find_value(ExifFlashList, n));
+
+               /* must be Exif 2.2 */
+               string = g_string_new("");
+
+               /* flash fired (bit 0) */
+               string = g_string_append(string, (n & 0x01) ? _("yes") : _("no"));
+
+               /* flash mode (bits 3, 4) */
+               v = (n >> 3) & 0x03;
+               if (v) string = append_comma_text(string, _("mode:"));
+               switch (v)
+                       {
+                       case 1:
+                               string = g_string_append(string, _("on"));
+                               break;
+                       case 2:
+                               string = g_string_append(string, _("off"));
+                               break;
+                       case 3:
+                               string = g_string_append(string, _("auto"));
+                               break;
+                       }
+
+               /* return light (bits 1, 2) */
+               v = (n >> 1) & 0x03;
+               if (v == 2) string = append_comma_text(string, _("not detected by strobe"));
+               if (v == 3) string = append_comma_text(string, _("detected by strobe"));
+
+               /* we ignore flash function (bit 5) */
+
+               /* red-eye (bit 6) */
+               if ((n >> 5) & 0x01) string = append_comma_text(string, _("red-eye reduction"));
+
+               text = string->str;
+               g_string_free(string, FALSE);
+               return text;
+               }
+       if (strcmp(key, "fResolution") == 0)
+               {
+               ExifRational *rx, *ry;
+               gchar *units;
+               gchar *text;
+
+               rx = exif_get_rational(exif, "XResolution", NULL);
+               ry = exif_get_rational(exif, "YResolution", NULL);
+               if (!rx || !ry) return NULL;
+
+               units = exif_get_data_as_text(exif, "ResolutionUnit");
+               text = g_strdup_printf("%0.f x %0.f (%s/%s)", rx->den ? (double)rx->num / rx->den : 1.0,
+                                                             ry->den ? (double)ry->num / ry->den : 1.0,
+                                                             _("dot"), (units) ? units : _("unknown"));
+
+               g_free(units);
+               return text;
+               }
+
+       if (key_valid) *key_valid = FALSE;
+       return NULL;
+}
+
+gchar *exif_get_data_as_text(ExifData *exif, const gchar *key)
+{
+       ExifItem *item;
+       gchar *text;
+       gint key_valid;
+
+       if (!key) return NULL;
+
+       text = exif_get_formatted_by_key(exif, key, &key_valid);
+       if (key_valid) return text;
+
+       item = exif_get_item(exif, key);
+       if (item) return exif_item_get_data_as_text(item);
+
+       return NULL;
+}
+
+const gchar *exif_get_description_by_key(const gchar *key)
+{
+       gint i;
+
+       if (!key) return NULL;
+
+       i = 0;
+       while (ExifFormattedList[i].key != NULL)
+               {
+               if (strcmp(key, ExifFormattedList[i].key) == 0) return _(ExifFormattedList[i].description);
+               i++;
+               }
+
+       i = 0;
+       while (ExifKnownMarkersList[i].tag > 0)
+               {
+               if (strcmp(key, ExifKnownMarkersList[i].key) == 0) return _(ExifKnownMarkersList[i].description);
+               i++;
+               }
+
+       return NULL;
+}
+
+static void exif_write_item(FILE *f, ExifItem *item)
+{
+       gchar *text;
+
+       text = exif_item_get_data_as_text(item);
+       if (text)
+               {
+               fprintf(f, "%4x %9s %30s %s\n", item->tag, ExifFormatList[item->format].short_name,
+                       exif_item_get_tag_name(item), text);
+               }
+       g_free(text);
+}
+
+void exif_write_data_list(ExifData *exif, FILE *f, gint human_readable_list)
+{
+       if (!f || !exif) return;
+
+       fprintf(f, " tag   format                             key value\n");
+       fprintf(f, "----------------------------------------------------\n");
+
+       if (human_readable_list)
+               {
+               gint i;
+
+               i = 0;
+               while (ExifFormattedList[i].key)
+                       {
+                       gchar *text;
+
+                       text = exif_get_formatted_by_key(exif, ExifFormattedList[i].key, NULL);
+                       if (text)
+                               {
+                               fprintf(f, "     %9s %30s %s\n", "string", ExifFormattedList[i].key, text);
+                               }
+                       i++;
+                       }
+               }
+       else
+               {
+               GList *work;
+
+               work = exif->items;
+               while (work)
+                       {
+                       ExifItem *item;
+
+                       item = work->data;
+                       work = work->next;
+
+                       exif_write_item(f, item);
+                       }
+               }
+       fprintf(f, "----------------------------------------------------\n");
+}
+
diff --git a/src/exif.h b/src/exif.h
new file mode 100644 (file)
index 0000000..5298dd3
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ *  GQView
+ *  (C) 2004 John Ellis
+ *
+ *  Authors:
+ *    Support for Exif file format, originally written by Eric Swalens.    
+ *    Modified by Quy Tonthat
+ *    Reimplemented with generic data storage by John Ellis
+ *
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __EXIF_H
+#define __EXIF_H
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * Tag formats
+ *-----------------------------------------------------------------------------
+ */
+
+typedef enum {
+       EXIF_FORMAT_UNKNOWN             = 0,
+       EXIF_FORMAT_BYTE_UNSIGNED       = 1,
+       EXIF_FORMAT_STRING              = 2,
+       EXIF_FORMAT_SHORT_UNSIGNED      = 3,
+       EXIF_FORMAT_LONG_UNSIGNED       = 4,
+       EXIF_FORMAT_RATIONAL_UNSIGNED   = 5,
+       EXIF_FORMAT_BYTE                = 6,
+       EXIF_FORMAT_UNDEFINED           = 7,
+       EXIF_FORMAT_SHORT               = 8,
+       EXIF_FORMAT_LONG                = 9,
+       EXIF_FORMAT_RATIONAL            = 10,
+       EXIF_FORMAT_FLOAT               = 11,
+       EXIF_FORMAT_DOUBLE              = 12
+} ExifFormatType;
+
+typedef struct _ExifFormatAttrib ExifFormatAttrib;
+struct _ExifFormatAttrib
+{
+       ExifFormatType type;
+       int size;
+       const char *short_name;
+       const char *description;
+};
+
+/* the list of known tag data formats */
+extern ExifFormatAttrib ExifFormatList[];
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * Data storage
+ *-----------------------------------------------------------------------------
+ */
+
+typedef struct _ExifData ExifData;
+struct _ExifData
+{
+       GList *items;   /* list of (ExifItem *) */
+};
+
+typedef struct _ExifRational ExifRational;
+struct _ExifRational
+{
+       unsigned long int num;
+       unsigned long int den;
+};
+
+
+typedef struct _ExifItem ExifItem;
+typedef struct _ExifMarker ExifMarker;
+typedef struct _ExifTextList ExifTextList;
+
+struct _ExifItem
+{
+       ExifFormatType format;
+       int tag;
+       ExifMarker *marker;
+       int elements;
+       gpointer data;
+       int data_len;
+};
+
+struct _ExifMarker
+{
+       int             tag;
+       ExifFormatType  format;
+       int             components;
+       char            *key;
+       char            *description;
+       ExifTextList    *list;
+};
+
+struct _ExifTextList
+{
+       int value;
+       const char* description;
+};
+
+
+typedef struct _ExifFormattedText ExifFormattedText;
+struct _ExifFormattedText
+{
+       const char *key;
+       const char *description;
+};
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * Data
+ *-----------------------------------------------------------------------------
+ */
+
+/* enums useful for image manipulation */
+
+typedef enum {
+       EXIF_ORIENTATION_UNKNOWN        = 0,
+       EXIF_ORIENTATION_TOP_LEFT       = 1,
+       EXIF_ORIENTATION_TOP_RIGHT      = 2,
+       EXIF_ORIENTATION_BOTTOM_RIGHT   = 3,
+       EXIF_ORIENTATION_BOTTOM_LEFT    = 4,
+       EXIF_ORIENTATION_LEFT_TOP       = 5,
+       EXIF_ORIENTATION_RIGHT_TOP      = 6,
+       EXIF_ORIENTATION_RIGHT_BOTTOM   = 7,
+       EXIF_ORIENTATION_LEFT_BOTTOM    = 8
+} ExifOrientationType;
+
+typedef enum {
+       EXIF_UNIT_UNKNOWN       = 0,
+       EXIF_UNIT_NOUNIT        = 1,
+       EXIF_UNIT_INCH          = 2,
+       EXIF_UNIT_CENTIMETER    = 3
+} ExifUnitType;
+
+
+/* the known exif tags list */
+extern ExifMarker ExifKnownMarkersList[];
+
+/* the unknown tags utilize this generic list */
+extern ExifMarker ExifUnknownMarkersList[];
+
+/* the list of specially formatted keys, for human readable output */
+extern ExifFormattedText ExifFormattedList[];
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * functions
+ *-----------------------------------------------------------------------------
+ */
+
+ExifData *exif_read(const gchar *path);
+void exif_free(ExifData *exif);
+
+gchar *exif_get_data_as_text(ExifData *exif, const gchar *key);
+gint exif_get_integer(ExifData *exif, const gchar *key, gint *value);
+ExifRational *exif_get_rational(ExifData *exif, const gchar *key, gint *sign);
+double exif_rational_to_double(ExifRational *r, gint sign);
+
+ExifItem *exif_get_item(ExifData *exif, const gchar *key);
+
+const char *exif_item_get_tag_name(ExifItem *item);
+const char *exif_item_get_description(ExifItem *item);
+const char *exif_item_get_format_name(ExifItem *item, gint brief);
+gchar *exif_item_get_data_as_text(ExifItem *item);
+gint exif_item_get_integer(ExifItem *item, gint *value);
+ExifRational *exif_item_get_rational(ExifItem *item, gint *sign);
+
+const gchar *exif_get_description_by_key(const gchar *key);
+
+/* usually for debugging to stdout */
+void exif_write_data_list(ExifData *exif, FILE *f, gint human_readable_list);
+
+
+#endif
index 4fd611d..e04322e 100644 (file)
 /*
- * GQview image viewer
- * (C)2000 John Ellis
+ * GQview
+ * (C) 2004 John Ellis
  *
  * Author: John Ellis
  *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
  */
 
-#include "gqview.h"
-
-static gint filelist_click_row = -1;
-
-static void update_progressbar(gfloat val);
-
-static gint file_is_hidden(gchar *name);
-static gint file_is_in_filter(gchar *name);
-static void add_to_filter(gchar *text, gint add);
 
-static gint sort_list_cb(void *a, void *b);
-static void filelist_read(gchar *path);
+#include "gqview.h"
+#include "filelist.h"
 
-static gint file_find_closest_unaccounted(gint row, gint count, GList *ignore_list);
+#include "cache.h"
+#include "rcfile.h"
+#include "ui_fileops.h"
 
-static void history_menu_select_cb(GtkWidget *widget, gpointer data);
-static gchar *truncate_hist_text(gchar *t, gint l);
-static void filelist_set_history(gchar *path);
 
 /*
  *-----------------------------------------------------------------------------
- * file status information (private)
+ * file filtering
  *-----------------------------------------------------------------------------
  */
 
-static void update_progressbar(gfloat val)
+static GList *filter_list = NULL;
+static GList *extension_list = NULL;
+
+gint ishidden(const gchar *name)
 {
-       gtk_progress_bar_update (GTK_PROGRESS_BAR(info_progress_bar), val);
+       if (name[0] != '.') return FALSE;
+       if (name[1] == '\0' || (name[1] == '.' && name[2] == '\0')) return FALSE;
+       return TRUE;
 }
 
-void update_status_label(gchar *text)
+static FilterEntry *filter_entry_new(const gchar *key, const gchar *description,
+                                    const gchar *extensions, gint enabled)
 {
-       gchar *buf;
-       gint count;
-       gchar *ss = "";
-
-       if (text)
-               {
-               gtk_label_set(GTK_LABEL(info_status), text);
-               return;
-               }
+       FilterEntry *fe;
 
-       if (slideshow_is_running()) ss = _(" Slideshow");
+       fe = g_new0(FilterEntry, 1);
+       fe->key = g_strdup(key);
+       fe->description = g_strdup(description);
+       fe->extensions = g_strdup(extensions);
+       fe->enabled = enabled;
+       
+       return fe;
+}
 
-       count = file_selection_count();
-       if (count > 0)
-               buf = g_strdup_printf(_("%d files (%d)%s"), file_count(), count, ss);
-       else
-               buf = g_strdup_printf(_("%d files%s"), file_count(), ss);
+static void filter_entry_free(FilterEntry *fe)
+{
+       if (!fe) return;
 
-       gtk_label_set(GTK_LABEL(info_status), buf);
-       g_free(buf);
+       g_free(fe->key);
+       g_free(fe->description);
+       g_free(fe->extensions);
+       g_free(fe);
 }
 
-/*
- *-----------------------------------------------------------------------------
- * file filtering
- *-----------------------------------------------------------------------------
- */
+GList *filter_get_list(void)
+{
+       return filter_list;
+}
 
-static gint file_is_hidden(gchar *name)
+void filter_remove_entry(FilterEntry *fe)
 {
-       if (name[0] != '.') return FALSE;
-       if (name[1] == '\0' || (name[1] == '.' && name[2] == '\0')) return FALSE;
-       return TRUE;
+       if (!g_list_find(filter_list, fe)) return;
+
+       filter_list = g_list_remove(filter_list, fe);
+       filter_entry_free(fe);
 }
 
-static gint file_is_in_filter(gchar *name)
+static gint filter_key_exists(const gchar *key)
 {
        GList *work;
-       if (!filename_filter || file_filter_disable) return TRUE;
 
-       work = filename_filter;
+       if (!key) return FALSE;
+
+       work = filter_list;
        while (work)
                {
-               gchar *filter = work->data;
-               gint lf = strlen(filter);
-               gint ln = strlen(name);
-               if (ln >= lf)
-                       {
-                       if (strncasecmp(name + ln - lf, filter, lf) == 0) return TRUE;
-                       }
+               FilterEntry *fe = work->data;
                work = work->next;
+
+               if (strcmp(fe->key, key) == 0) return TRUE;
                }
 
        return FALSE;
 }
 
-static void add_to_filter(gchar *text, gint add)
+void filter_add(const gchar *key, const gchar *description, const gchar *extensions, gint enabled)
 {
-       if (add) filename_filter = g_list_append(filename_filter, g_strdup(text));
+       filter_list = g_list_append(filter_list, filter_entry_new(key, description, extensions, enabled));
 }
 
-void rebuild_file_filter()
+void filter_add_unique(const gchar *description, const gchar *extensions, gint enabled)
 {
-       if (filename_filter)
-               {
-               g_list_foreach(filename_filter,(GFunc)g_free,NULL);
-               g_list_free(filename_filter);
-               filename_filter = NULL;
-               }
+       gchar *key;
+       gint n;
 
-       add_to_filter(".jpg", filter_include_jpg);
-       add_to_filter(".jpeg", filter_include_jpg);
-       add_to_filter(".xpm", filter_include_xpm);
-       add_to_filter(".tif", filter_include_tif);
-       add_to_filter(".tiff", filter_include_tif);
-       add_to_filter(".gif", filter_include_gif);
-       add_to_filter(".png", filter_include_png);
-       add_to_filter(".ppm", filter_include_ppm);
-       add_to_filter(".pgm", filter_include_pgm);
-       add_to_filter(".pcx", filter_include_pcx);
-       add_to_filter(".bmp", filter_include_bmp);
-
-       if (custom_filter)
+       key = g_strdup("user0");
+       n = 1;
+       while (filter_key_exists(key))
                {
-               gchar *buf = g_strdup(custom_filter);
-               gchar *pos_ptr_b;
-               gchar *pos_ptr_e = buf;
-               while(pos_ptr_e[0] != '\0')
-                       {
-                       pos_ptr_b = pos_ptr_e;
-                       while (pos_ptr_e[0] != ';' && pos_ptr_e[0] != '\0') pos_ptr_e++;
-                       if (pos_ptr_e[0] == ';')
-                               {
-                               pos_ptr_e[0] = '\0';
-                               pos_ptr_e++;
-                               }
-                       add_to_filter(pos_ptr_b, TRUE);
-                       }
-               g_free(buf);
+               g_free(key);
+               if (n > 999) return;
+               key = g_strdup_printf("user%d", n);
+               n++;
                }
-}
 
-/*
- *-----------------------------------------------------------------------------
- * load file list (private)
- *-----------------------------------------------------------------------------
- */
-
-static gint sort_list_cb(void *a, void *b)
-{
-       return strcmp((gchar *)a, (gchar *)b);
+       filter_add(key, description, extensions, enabled);
+       g_free(key);
 }
 
-static void filelist_read(gchar *path)
+static void filter_add_if_missing(const gchar *key, const gchar *description, const gchar *extensions, gint enabled)
 {
-       DIR *dp;
-       struct dirent *dir;
-       struct stat ent_sbuf;
-
-       if((dp = opendir(path))==NULL)
-               {
-               /* dir not found */
-               return;
-               }
-       
-       g_list_foreach(dir_list,(GFunc)g_free,NULL);
-       g_list_free(dir_list);
-       dir_list = NULL;
+       GList *work;
 
-       g_list_foreach(file_list,(GFunc)g_free,NULL);
-       g_list_free(file_list);
-       file_list = NULL;
+       if (!key) return;
 
-       while ((dir = readdir(dp)) != NULL)
+       work = filter_list;
+       while (work)
                {
-               /* skips removed files */
-               if (dir->d_ino > 0)
-                       {
-                       gchar *name = dir->d_name;
-                       if (show_dot_files || !file_is_hidden(name))
-                               {
-                               gchar *filepath = g_strconcat(path, "/", name, NULL);
-                               if (stat(filepath,&ent_sbuf) >= 0 && S_ISDIR(ent_sbuf.st_mode))
-                                       {
-                                       dir_list = g_list_prepend(dir_list, g_strdup(name));
-                                       }
-                               else
-                                       {
-                                       if (file_is_in_filter(name))
-                                               file_list = g_list_prepend(file_list, g_strdup(name));
-                                       }
-                               g_free(filepath);
-                               }
-                       }
+               FilterEntry *fe = work->data;
+               work = work->next;
+               if (fe->key && strcmp(fe->key, key) == 0) return;
                }
 
-       closedir(dp);
-
-       dir_list = g_list_sort(dir_list, (GCompareFunc) sort_list_cb);
-       file_list = g_list_sort(file_list, (GCompareFunc) sort_list_cb);
+       filter_add(key, description, extensions, enabled);
 }
 
-/*
- *-----------------------------------------------------------------------------
- * file list utilities to retrieve information (public)
- *-----------------------------------------------------------------------------
- */
-
-gint file_count()
+void filter_reset(void)
 {
-       return g_list_length(file_list);
-}
+       GList *work;
 
-gint file_selection_count()
-{
-       gint count = 0;
-       GList *work = GTK_CLIST(file_clist)->selection;
-       while(work)
+       work = filter_list;
+       while (work)
                {
-               count++;
-               if (debug) printf("s = %d\n", GPOINTER_TO_INT(work->data));
+               FilterEntry *fe = work->data;
                work = work->next;
+               filter_entry_free(fe);
                }
 
-       if (debug) printf("files selected = %d\n", count);
-
-       return count;
+       g_list_free(filter_list);
+       filter_list = NULL;
 }
 
-gint find_file_in_list(gchar *path)
+void filter_add_defaults(void)
 {
-       GList *work = file_list;
-       gchar *buf;
-       gchar *name;
-       gint count = -1;
-
-       if (!path) return -1;
+       GSList *list, *work;
 
-       buf = remove_level_from_path(path);
-       if (strcmp(buf, current_path) != 0)
-               {
-               g_free(buf);
-               return -1;
-               }
-       g_free(buf);
-
-       name = filename_from_path(path);
-       while(work)
+       list = gdk_pixbuf_get_formats();
+       work = list;
+       while (work)
                {
-               count++;
-               if (strcmp(name, work->data) == 0) return count;
+               GdkPixbufFormat *format;
+               gchar *name;
+               gchar *desc;
+               gchar **extensions;
+               GString *filter = NULL;
+               gint i;
+               
+               format = work->data;
                work = work->next;
-               }
 
-       return -1;
-}
-
-gchar *file_get_path(gint row)
-{
-       gchar *path = NULL;
-       gchar *name = gtk_clist_get_row_data(GTK_CLIST(file_clist), row);
+               name = gdk_pixbuf_format_get_name(format);
+               desc = gdk_pixbuf_format_get_description(format);
+               extensions = gdk_pixbuf_format_get_extensions(format);
 
-       if (name) path = g_strconcat(current_path, "/", name, NULL);
+               i = 0;
+               while (extensions[i])
+                       {
+                       if (!filter)
+                               {
+                               filter = g_string_new(".");
+                               filter = g_string_append(filter, extensions[i]);
+                               }
+                       else
+                               {
+                               filter = g_string_append(filter, ";.");
+                               filter = g_string_append(filter, extensions[i]);
+                               }
+                       i++;
+                       }
 
-       return path;
-}
+               if (debug) printf("loader reported [%s] [%s] [%s]\n", name, desc, filter->str);
 
-gint file_is_selected(gint row)
-{
-       GList *work = GTK_CLIST(file_clist)->selection;
+               filter_add_if_missing(name, desc, filter->str, TRUE);
 
-       while(work)
-               {
-               if (GPOINTER_TO_INT(work->data) == row) return TRUE;
-               work = work->next;
+               g_free(name);
+               g_free(desc);
+               g_strfreev(extensions);
+               g_string_free(filter, TRUE);
                }
+       g_slist_free(list);
 
-       return FALSE;
+       /* add defaults even if gdk-pixbuf does not have them, but disabled */
+       filter_add_if_missing("jpeg", "JPEG group", ".jpg;.jpeg;.jpe", FALSE);
+       filter_add_if_missing("png", "Portable Network Graphic", ".png", FALSE);
+       filter_add_if_missing("tiff", "Tiff", ".tif;.tiff", FALSE);
+       filter_add_if_missing("pnm", "Packed Pixel formats", ".pbm;.pgm;.pnm;.ppm", FALSE);
+       filter_add_if_missing("gif", "Graphics Interchange Format", ".gif", FALSE);
+       filter_add_if_missing("xbm", "X bitmap", ".xbm", FALSE);
+       filter_add_if_missing("xpm", "X pixmap", ".xpm", FALSE);
+       filter_add_if_missing("bmp", "Bitmap", ".bmp", FALSE);
+       filter_add_if_missing("ico", "Icon file", ".ico;.cur", FALSE);
+       filter_add_if_missing("ras", "Raster", ".ras", FALSE);
+       filter_add_if_missing("svg", "Scalable Vector Graphics", ".svg", FALSE);
 }
 
-/*
- *-----------------------------------------------------------------------------
- * utilities to retrieve list of selected files (public)
- *-----------------------------------------------------------------------------
- */
-
-GList *file_get_selected_list()
+static GList *filter_to_list(const gchar *extensions)
 {
        GList *list = NULL;
-       GList *work = GTK_CLIST(file_clist)->selection;
+       const gchar *p;
+
+       if (!extensions) return NULL;
 
-       while(work)
+       p = extensions;
+       while (*p != '\0')
                {
-               gchar *name = gtk_clist_get_row_data(GTK_CLIST(file_clist),
-                       GPOINTER_TO_INT(work->data));
-               list = g_list_prepend(list, g_strconcat(current_path, "/", name, NULL));
-               work = work->next;
-               }
+               const gchar *b;
+               gint l = 0;
 
-       list = g_list_reverse(list);
+               b = p;
+               while (*p != '\0' && *p != ';')
+                       {
+                       p++;
+                       l++;
+                       }
+               list = g_list_append(list, g_strndup(b, l));
+               if (*p == ';') p++;
+               }
 
        return list;
 }
 
-void free_selected_list(GList *list)
-{
-       g_list_foreach(list, (GFunc)g_free, NULL);
-       g_list_free(list);
-}
-
-gint file_clicked_is_selected()
-{
-       return file_is_selected(filelist_click_row);
-}
-
-gchar *file_clicked_get_path()
-{
-       return file_get_path(filelist_click_row);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * image change routines
- *-----------------------------------------------------------------------------
- */
-
-void file_image_change_to(gint row)
+void filter_rebuild(void)
 {
-       gtk_clist_unselect_all(GTK_CLIST(file_clist));
-       gtk_clist_select_row(GTK_CLIST(file_clist), row, -1);
-       if (gtk_clist_row_is_visible(GTK_CLIST(file_clist), row) != GTK_VISIBILITY_FULL)
-               {
-               gtk_clist_moveto(GTK_CLIST(file_clist), row, -1, 0.5, 0.0);
-               }
-}
+       GList *work;
 
-void file_next_image()
-{
-       gint current;
-       gint total;
+       path_list_free(extension_list);
+       extension_list = NULL;
 
-       if (slideshow_is_running())
+       work = filter_list;
+       while (work)
                {
-               slideshow_next();
-               return;
-               }
+               FilterEntry *fe;
 
-       current = find_file_in_list(image_get_path());
-       total = file_count();
+               fe = work->data;
+               work = work->next;
 
-       if (current >= 0)
-               {
-               if (current < total - 1)
+               if (fe->enabled)
                        {
-                       file_image_change_to(current + 1);
+                       GList *ext;
+
+                       ext = filter_to_list(fe->extensions);
+                       if (ext) extension_list = g_list_concat(extension_list, ext);
                        }
                }
-       else
-               {
-               file_image_change_to(0);
-               }
 }
 
-void file_prev_image()
+gint filter_name_exists(const gchar *name)
 {
-       gint current;
-
-       if (slideshow_is_running())
-               {
-               slideshow_prev();
-               return;
-               }
-
-       current = find_file_in_list(image_get_path());
+       GList *work;
+       if (!extension_list || file_filter_disable) return TRUE;
 
-       if (current >= 0)
+       work = extension_list;
+       while (work)
                {
-               if (current > 0)
+               gchar *filter = work->data;
+               gint lf = strlen(filter);
+               gint ln = strlen(name);
+               if (ln >= lf)
                        {
-                       file_image_change_to(current - 1);
+                       if (strncasecmp(name + ln - lf, filter, lf) == 0) return TRUE;
                        }
+               work = work->next;
                }
-       else
-               {
-               file_image_change_to(file_count() - 1);
-               }
+
+       return FALSE;
 }
 
-void file_first_image()
+void filter_write_list(FILE *f)
 {
-       gint current = find_file_in_list(image_get_path());
-       if (current != 0 && file_count() > 0)
+       GList *work;
+
+       work = filter_list;
+       while (work)
                {
-               file_image_change_to(0);
+               FilterEntry *fe = work->data;
+               work = work->next;
+
+               fprintf(f, "filter_ext: \"%s%s\" \"%s\" \"%s\"\n", (fe->enabled) ? "" : "#",
+                       fe->key, fe->extensions,
+                       (fe->description) ? fe->description : "");
                }
 }
 
-void file_last_image()
+void filter_parse(const gchar *text)
 {
-       gint current = find_file_in_list(image_get_path());
-       gint count = file_count();
-       if (current != count - 1 && count > 0)
-               {
-               file_image_change_to(count - 1);
-               }
-}
+       const gchar *p;
+       gchar *key;
+       gchar *ext;
+       gchar *desc;
+       gint enabled = TRUE;
 
-/*
- *-----------------------------------------------------------------------------
- * file delete/rename update routines
- *-----------------------------------------------------------------------------
- */
+       if (!text || text[0] != '"') return;
 
-static gint file_find_closest_unaccounted(gint row, gint count, GList *ignore_list)
-{
-       GList *list = NULL;
-       GList *work;
-       gint rev = row - 1;
-       row ++;
+       key = quoted_value(text);
+       if (!key) return;
 
-       work = ignore_list;
-       while(work)
+       p = text;
+       p++;
+       while (*p != '"' && *p != '\0') p++;
+       if (*p != '"')
                {
-               gint f = find_file_in_list(work->data);
-               if (f >= 0) list = g_list_append(list, GINT_TO_POINTER(f));
-               work = work->next;
+               g_free(key);
+               return;
                }
-
-       while(list)
+       p++;
+       while (*p != '"' && *p != '\0') p++;
+       if (*p != '"')
                {
-               gint c = TRUE;
-               work = list;
-               while(work && c)
-                       {
-                       gpointer p = work->data;
-                       work = work->next;
-                       if (row == GPOINTER_TO_INT(p))
-                               {
-                               row++;
-                               c = FALSE;
-                               }
-                       if (rev == GPOINTER_TO_INT(p))
-                               {
-                               rev--;
-                               c = FALSE;
-                               }
-                       if (!c) list = g_list_remove(list, p);
-                       }
-               if (c && list)
-                       {
-                       g_list_free(list);
-                       list = NULL;
-                       }
+               g_free(key);
+               return;
                }
-       if (row > count - 1)
+
+       ext = quoted_value(p);
+
+       p++;
+       while (*p != '"' && *p != '\0') p++;
+       if (*p == '"') p++;
+       while (*p != '"' && *p != '\0') p++;
+
+       if (*p == '"')
                {
-               if (rev < 0)
-                       return -1;
-               else
-                       return rev;
+               desc = quoted_value(p);
                }
        else
                {
-               return row;
+               desc = NULL;
                }
-}
 
-void file_is_gone(gchar *path, GList *ignore_list)
-{
-       GList *list;
-       gchar *name;
-       gint row;
-       gint new_row = -1;
-       row = find_file_in_list(path);
-       if (row < 0) return;
-
-       if (file_is_selected(row) /* && file_selection_count() == 1 */)
+       if (key && key[0] == '#')
                {
-               gint n = file_count();
-               if (ignore_list)
-                       {
-                       new_row = file_find_closest_unaccounted(row, n, ignore_list);
-                       if (debug) printf("row = %d, closest is %d\n", row, new_row);
-                       }
-               else
-                       {
-                       if (row + 1 < n)
-                               {
-                               new_row = row + 1;
-                               }
-                       else if (row > 0)
-                               {
-                               new_row = row - 1;
-                               }
-                       }
-               gtk_clist_unselect_all(GTK_CLIST(file_clist));
-               if (new_row >= 0)
-                       {
-                       gtk_clist_select_row(GTK_CLIST(file_clist), new_row, -1);
-                       file_image_change_to(new_row);
-                       }
-               else
-                       {
-                       image_change_to(NULL);
-                       }
+               gchar *tmp;
+               tmp = g_strdup(key + 1);
+               g_free(key);
+               key = tmp;
+
+               enabled = FALSE;
                }
 
-       gtk_clist_remove(GTK_CLIST(file_clist), row);
-       list = g_list_nth(file_list, row);
-       name = list->data;
-       file_list = g_list_remove(file_list, name);
-       g_free(name);
-       update_status_label(NULL);
+       if (key && strlen(key) > 0 && ext) filter_add(key, desc, ext, enabled);
+
+       g_free(key);
+       g_free(ext);
+       g_free(desc);
 }
 
-void file_is_renamed(gchar *source, gchar *dest)
+GList *path_list_filter(GList *list, gint is_dir_list)
 {
-       gint row;
-       gchar *source_base;
-       gchar *dest_base;
-
-       if (image_get_path() && !strcmp(source, image_get_path()))
-               {
-               image_set_path(dest);
-               }
-
-       row = find_file_in_list(source);
-       if (row < 0) return;
+       GList *work;
 
-       source_base = remove_level_from_path(source);
-       dest_base = remove_level_from_path(dest);
+       if (!is_dir_list && file_filter_disable && show_dot_files) return list;
 
-       if (strcmp(source_base, dest_base) == 0)
+       work = list;
+       while (work)
                {
-               gchar *name;
-               gint n;
-               GList *work = g_list_nth(file_list, row);
-               name = work->data;
-               file_list = g_list_remove(file_list, name);
-               g_free(name);
-               name = g_strdup(filename_from_path(dest));
-               file_list = g_list_insert_sorted(file_list, name, (GCompareFunc) sort_list_cb);
-               n = g_list_index(file_list, name);
+               gchar *name = work->data;
+               const gchar *base;
+
+               base = filename_from_path(name);
 
-               if (gtk_clist_get_cell_type(GTK_CLIST(file_clist), row, 0) != GTK_CELL_PIXTEXT)
+               if ((!show_dot_files && ishidden(base)) ||
+                   (!is_dir_list && !filter_name_exists(base)) ||
+                   (is_dir_list && base[0] == '.' && (strcmp(base, GQVIEW_CACHE_LOCAL_THUMB) == 0 ||
+                                                      strcmp(base, GQVIEW_CACHE_LOCAL_METADATA) == 0)) )
                        {
-                       gtk_clist_set_text (GTK_CLIST(file_clist), row, 0, name);
+                       GList *link = work;
+                       work = work->next;
+                       list = g_list_remove_link(list, link);
+                       g_free(name);
+                       g_list_free(link);
                        }
                else
                        {
-                       guint8 spacing = 0;
-                       GdkPixmap *pixmap = NULL;
-                       GdkBitmap *mask = NULL;
-                       gtk_clist_get_pixtext(GTK_CLIST(file_clist), row, 0,
-                               NULL, &spacing, &pixmap, &mask);
-                       gtk_clist_set_pixtext(GTK_CLIST(file_clist), row, 0,
-                               name, spacing, pixmap, mask);
+                       work = work->next;
                        }
-
-               gtk_clist_set_row_data(GTK_CLIST(file_clist), row, name);
-               gtk_clist_row_move(GTK_CLIST(file_clist), row, n);
-               }
-       else
-               {
-               GList *work = g_list_nth(file_list, row);
-               gchar *name = work->data;
-               file_list = g_list_remove(file_list, name);
-               gtk_clist_remove(GTK_CLIST(file_clist), row);
-               g_free(name);
-               update_status_label(NULL);
                }
 
-       g_free(source_base);
-       g_free(dest_base);
-       
+       return list;
 }
 
 /*
  *-----------------------------------------------------------------------------
- * directory list callbacks
+ * path list recursive
  *-----------------------------------------------------------------------------
  */
 
-void dir_select_cb(GtkWidget *widget, gint row, gint col,
-                  GdkEvent *event, gpointer data)
+static gint path_list_sort_cb(gconstpointer a, gconstpointer b)
 {
-       gchar *name;
-       gchar *new_path;
-       name = gtk_clist_get_row_data (GTK_CLIST(dir_clist), row);
-       if (strcmp(name, ".") == 0)
-               {
-               new_path = g_strdup(current_path);
-               }
-       else if (strcmp(name, "..") == 0)
-               {
-               new_path = remove_level_from_path(current_path);
-               }
-       else
-               {
-               if (strcmp(current_path, "/") == 0)
-                       new_path = g_strconcat(current_path, name, NULL);
-               else
-                       new_path = g_strconcat(current_path, "/", name, NULL);
-               }
-       filelist_change_to(new_path);
-       g_free(new_path);
+       return CASE_SORT((gchar *)a, (gchar *)b);
 }
 
-void dir_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+GList *path_list_sort(GList *list)
 {
-       gint row = -1;
-       gint col = -1;
-
-       gtk_clist_get_selection_info (GTK_CLIST (widget), bevent->x, bevent->y, &row, &col);
-
-       if (bevent->button == 2)
-               {
-               gtk_object_set_user_data(GTK_OBJECT(dir_clist), GINT_TO_POINTER(row));
-               }
+       return g_list_sort(list, path_list_sort_cb);
 }
 
-/*
- *-----------------------------------------------------------------------------
- * file list callbacks
- *-----------------------------------------------------------------------------
- */
-
-void file_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+static void path_list_recursive_append(GList **list, GList *dirs)
 {
-       gint row = -1;
-       gint col = -1;
-
-       gtk_clist_get_selection_info (GTK_CLIST (widget), bevent->x, bevent->y, &row, &col);
-       if (row == -1 || col == -1)
-               {
-               filelist_click_row = -1;
-               return;
-               }
-
-       filelist_click_row = row;
-
-       if (bevent->button == 3)
-               {
-               file_clist_highlight_set();
-               gtk_menu_popup (GTK_MENU(menu_file_popup), NULL, NULL, NULL, NULL,
-                               bevent->button, bevent->time);
-               }
-}
-
-void file_select_cb(GtkWidget *widget, gint row, gint col,
-                  GdkEvent *event, gpointer data)
-{
-       gchar *name;
-       gchar *path;
+       GList *work;
 
-       if (file_selection_count() != 1)
+       work = dirs;
+       while (work)
                {
-               update_status_label(NULL);
-               return;
-               }
-
-       name = gtk_clist_get_row_data(GTK_CLIST(file_clist), row);
-       path = g_strconcat(current_path, "/", name, NULL);
-       image_change_to(path);
-       update_status_label(NULL);
-       g_free(path);
-}
-
-void file_unselect_cb(GtkWidget *widget, gint row, gint col,
-                  GdkEvent *event, gpointer data)
-{
-#if 0
-       gchar *name;
-       gchar *path;
+               const gchar *path = work->data;
+               GList *f = NULL;
+               GList *d = NULL;
 
-       name = gtk_clist_get_row_data(GTK_CLIST(file_clist), row);
-       path = g_strconcat(current_path, "/", name, NULL);
-
-       if (strcmp(path, image_get_path()) == 0)
-               {
-               if (file_selection_count() > 0 && !file_is_selected(find_file_in_list(image_get_path())) )
+               if (path_list(path, &f, &d))
                        {
-                       gint new_row = GPOINTER_TO_INT(GTK_CLIST(file_clist)->selection->data);
-                       gchar *new_name = gtk_clist_get_row_data(GTK_CLIST(file_clist), new_row);
-                       gchar *new_path = g_strconcat(current_path, "/", new_name, NULL);
-                       image_change_to(new_path);
-                       g_free(new_path);
+                       f = path_list_filter(f, FALSE);
+                       f = path_list_sort(f);
+                       *list = g_list_concat(*list, f);
+
+                       d = path_list_filter(d, TRUE);
+                       d = path_list_sort(d);
+                       path_list_recursive_append(list, d);
+                       g_list_free(d);
                        }
+
+               work = work->next;
                }
-       g_free(path);
-#endif
-       update_status_label(NULL);
 }
 
-/*
- *-----------------------------------------------------------------------------
- * file list highlight utils
- *-----------------------------------------------------------------------------
- */
-
-void file_clist_highlight_set()
+GList *path_list_recursive(const gchar *path)
 {
-       if (file_clicked_is_selected()) return;
+       GList *list = NULL;
+       GList *d = NULL;
 
-       gtk_clist_set_background(GTK_CLIST(file_clist), filelist_click_row,
-               &GTK_WIDGET (file_clist)->style->bg[GTK_STATE_PRELIGHT]);
-       gtk_clist_set_foreground(GTK_CLIST(file_clist), filelist_click_row,
-               &GTK_WIDGET (file_clist)->style->fg[GTK_STATE_PRELIGHT]);
-}
+       if (!path_list(path, &list, &d)) return NULL;
+       list = path_list_filter(list, FALSE);
+       list = path_list_sort(list);
 
-void file_clist_highlight_unset()
-{
-       if (file_clicked_is_selected()) return;
+       d = path_list_filter(d, TRUE);
+       d = path_list_sort(d);
+       path_list_recursive_append(&list, d);
+       path_list_free(d);
 
-       gtk_clist_set_background(GTK_CLIST(file_clist), filelist_click_row, NULL);
-       gtk_clist_set_foreground(GTK_CLIST(file_clist), filelist_click_row, NULL);
+       return list;
 }
 
 /*
  *-----------------------------------------------------------------------------
- * path entry and history menu
+ * text conversion utils
  *-----------------------------------------------------------------------------
  */
 
-void path_entry_tab_cb(gchar *newdir, gpointer data)
+gchar *text_from_size(gint64 size)
 {
-       gchar *new_path;
-       gchar *buf;
-       gint found = FALSE;
-
-       new_path = g_strdup(newdir);
-       parse_out_relatives(new_path);
-       buf = remove_level_from_path(new_path);
+       gchar *a, *b;
+       gchar *s, *d;
+       gint l, n, i;
 
-       if (buf && current_path && strcmp(buf, current_path) == 0)
+       /* what I would like to use is printf("%'d", size)
+        * BUT: not supported on every libc :(
+        */
+       if (size > G_MAXUINT)
                {
-               GList *work;
-               gchar *part;
+               /* the %lld conversion is not valid in all libcs, so use a simple work-around */
+               a = g_strdup_printf("%d%09d", (guint)(size / 1000000000), (guint)(size % 1000000000));
+               }
+       else
+               {
+               a = g_strdup_printf("%d", (guint)size);
+               }
+       l = strlen(a);
+       n = (l - 1)/ 3;
+       if (n < 1) return a;
 
-               part = filename_from_path(new_path);
-               work = file_list;
+       b = g_new(gchar, l + n + 1);
 
-               while(part && work)
+       s = a;
+       d = b;
+       i = l - n * 3;
+       while (*s != '\0')
+               {
+               if (i < 1)
                        {
-                       gchar *name = work->data;
-                       work = work->next;
-
-                       if (strncmp(part, name, strlen(part)) == 0)
-                               {
-                               gint row = g_list_index(file_list, name);
-                               if (!gtk_clist_row_is_visible(GTK_CLIST(file_clist), row) != GTK_VISIBILITY_FULL)
-                                       {
-                                       gtk_clist_moveto(GTK_CLIST(file_clist), row, -1, 0.5, 0.0);
-                                       }
-                               found = TRUE;
-                               break;
-                               }
+                       i = 3;
+                       *d = ',';
+                       d++;
                        }
-               }
 
-       if (!found && new_path && current_path &&
-           strcmp(new_path, current_path) != 0 && isdir(new_path))
-               {
-               filelist_change_to(new_path);
-               /* we are doing tab completion, add '/' back */
-               gtk_entry_append_text(GTK_ENTRY(path_entry), "/");
+               *d = *s;
+               s++;
+               d++;
+               i--;
                }
+       *d = '\0';
 
-       g_free(buf);
-       g_free(new_path);
+       g_free(a);
+       return b;
 }
 
-void path_entry_cb(gchar *newdir, gpointer data)
+gchar *text_from_size_abrev(gint64 size)
 {
-       gchar *new_path = g_strdup(newdir);
-       parse_out_relatives(new_path);
-       if (isdir(new_path))
-               filelist_change_to(new_path);
-       else if (isfile(new_path))
+       if (size < (gint64)1024)
                {
-               gchar *path = remove_level_from_path(new_path);
-               filelist_change_to(path);
-               g_free(path);
-               image_change_to(new_path);
+               return g_strdup_printf(_("%d bytes"), (gint)size);
+               }
+       if (size < (gint64)1048576)
+               {
+               return g_strdup_printf(_("%.1f K"), (gfloat)size / 1024.0);
+               }
+       if (size < (gint64)1073741824)
+               {
+               return g_strdup_printf(_("%.1f MB"), (gfloat)size / 1048576.0);
                }
-       g_free(new_path);
-}
-
-static void history_menu_select_cb(GtkWidget *widget, gpointer data)
-{
-       gchar *new_path = data;
-       filelist_change_to(new_path);
-}
 
-static gchar *truncate_hist_text(gchar *t, gint l)
-{
-       gchar *tp;
-       gchar *tbuf;
-       if (l >= strlen(t)) return g_strdup(t);
-       tp = t + strlen(t) - l;
-       while (tp[0] != '/' && tp < t + strlen(t)) tp++;
-                /* this checks to see if directory name is longer than l, if so
-                 * reset the length of name to l, it's better to have a partial
-                 * name than no name at all.
-                */
-       if (tp >= t + strlen(t)) tp = t + strlen(t) - l;
-       tbuf = g_strconcat("/...", tp, NULL);
-       return tbuf;
+       /* to avoid overflowing the float, do division in two steps */
+       size /= 1048576.0;
+       return g_strdup_printf(_("%.1f GB"), (gfloat)size / 1024.0);
 }
 
-static void filelist_set_history(gchar *path)
+/* note: returned string is valid until next call to text_from_time() */
+const gchar *text_from_time(time_t t)
 {
-       static GList *history_list = NULL;
-       gchar *buf;
-       gchar *buf_ptr;
-       GtkWidget *menu;
-       GtkWidget *item;
-
-       if (!path) return;
+       static gchar *ret = NULL;
+       gchar buf[128];
+       gint buflen;
+       struct tm *btime;
+       GError *error = NULL;
 
-       gtk_entry_set_text(GTK_ENTRY(path_entry), current_path);
+       btime = localtime(&t);
 
-       if (history_list)
-                {
-                g_list_foreach(history_list, (GFunc)g_free, NULL);
-                g_list_free(history_list);
-                history_list = NULL;
-                }
+       /* the %x warning about 2 digit years is not an error */
+       buflen = strftime(buf, sizeof(buf), "%x %H:%M", btime);
+       if (buflen < 1) return "";
 
-       menu = gtk_menu_new();
-
-       buf = g_strdup(path);
-       buf_ptr = buf + strlen(buf) - 1 ;
-       while (buf_ptr > buf)
+       g_free(ret);
+       ret = g_locale_to_utf8(buf, buflen, NULL, NULL, &error);
+       if (error)
                {
-               gchar *full_path;
-               gchar *truncated;
-               truncated = truncate_hist_text(buf, 32);
-
-               full_path = g_strdup(buf);
-               history_list = g_list_append(history_list, full_path);
-
-               item = gtk_menu_item_new_with_label (truncated);
-               gtk_signal_connect (GTK_OBJECT (item), "activate",
-                       (GtkSignalFunc) history_menu_select_cb, full_path);
-
-               gtk_menu_append (GTK_MENU (menu), item);
-               gtk_widget_show (item);
-
-               g_free(truncated);
-
-               while (buf_ptr[0] != '/' && buf_ptr > buf) buf_ptr--;
-               buf_ptr[0] = '\0';
+               printf("Error converting locale strftime to UTF-8: %s\n", error->message);
+               g_error_free(error);
+               return "";
                }
-       g_free(buf);
-
-       item = gtk_menu_item_new_with_label ("/");
 
-       gtk_signal_connect (GTK_OBJECT (item), "activate",
-               (GtkSignalFunc) history_menu_select_cb, "/");
-
-       gtk_menu_append (GTK_MENU (menu), item);
-       gtk_widget_show (item);
-
-       gtk_option_menu_set_menu(GTK_OPTION_MENU(history_menu), menu);
+       return ret;
 }
 
 /*
  *-----------------------------------------------------------------------------
- * list update routines (public)
+ * file info struct
  *-----------------------------------------------------------------------------
  */
 
-static gint thumbs_running = 0;
-
-void interrupt_thumbs()
+FileData *file_data_new(const gchar *path, struct stat *st)
 {
-        if (thumbs_running > 0) thumbs_running ++;
+       FileData *fd;
+
+       fd = g_new0(FileData, 1);
+       fd->path = path_to_utf8(path);
+       fd->name = filename_from_path(fd->path);
+       fd->size = st->st_size;
+       fd->date = st->st_mtime;
+       fd->pixbuf = NULL;
+
+       return fd;
 }
 
-void filelist_populate_clist()
+FileData *file_data_new_simple(const gchar *path)
 {
-       GList *work;
-       gint width;
-       gint tmp_width;
-       gint row;
-       gchar *image_name = NULL;
-       gchar *buf;
+       FileData *fd;
+       struct stat st;
 
-       gint row_p = 0;
-       gchar *text;
-       guint8 spacing;
-       GdkPixmap *nopixmap;
-       GdkBitmap *nomask;
+       fd = g_new0(FileData, 1);
+       fd->path = g_strdup(path);
+       fd->name = filename_from_path(fd->path);
 
-       interrupt_thumbs();
+       if (stat_utf8(fd->path, &st))
+               {
+               fd->size = st.st_size;
+               fd->date = st.st_mtime;
+               }
 
-       filelist_set_history(current_path);
+       fd->pixbuf = NULL;
 
-       gtk_clist_freeze (GTK_CLIST (dir_clist));
-       gtk_clist_clear (GTK_CLIST (dir_clist));
+       return fd;
+}
 
-       width = 0;
-       work = dir_list;
-       while(work)
-               {
-               gchar *buf[2];
-               buf[0] = work->data;
-               buf[1] = NULL;
-               row = gtk_clist_append(GTK_CLIST(dir_clist), buf);
-               gtk_clist_set_row_data (GTK_CLIST(dir_clist), row, work->data);
-               tmp_width = gdk_string_width(dir_clist->style->font, buf[0]);
-               if (tmp_width > width) width = tmp_width;
-               work = work->next;
-               }
+void file_data_free(FileData *fd)
+{
+       g_free(fd->path);
+       if (fd->pixbuf) g_object_unref(fd->pixbuf);
+       g_free(fd);
+}
 
-       gtk_clist_set_column_width(GTK_CLIST(dir_clist), 0, width);
-       gtk_clist_thaw(GTK_CLIST (dir_clist));
+/*
+ *-----------------------------------------------------------------------------
+ * load file list
+ *-----------------------------------------------------------------------------
+ */
 
-       buf = remove_level_from_path(image_get_path());
-       if (buf && strcmp(buf, current_path) == 0)
-               {
-               image_name = image_get_name();
-               }
-       g_free(buf);
+static SortType filelist_sort_method = SORT_NONE;
+static gint filelist_sort_ascend = TRUE;
 
-       gtk_clist_freeze (GTK_CLIST (file_clist));
+static gint sort_file_cb(void *a, void *b)
+{
+       FileData *fa = a;
+       FileData *fb = b;
 
-       if (!thumbnails_enabled)
+       if (!filelist_sort_ascend)
                {
-               gtk_clist_set_row_height (GTK_CLIST(file_clist),
-                       GTK_WIDGET(file_clist)->style->font->ascent +
-                       GTK_WIDGET(file_clist)->style->font->descent + 1);
+               fa = b;
+               fb = a;
                }
-       else
+
+       switch (filelist_sort_method)
                {
-               gtk_clist_set_row_height (GTK_CLIST(file_clist), thumb_max_height + 2);
-               maintain_thumbnail_dir(current_path, FALSE);
+               case SORT_SIZE:
+                       if (fa->size < fb->size) return -1;
+                       if (fa->size > fb->size) return 1;
+                       return 0;
+                       break;
+               case SORT_TIME:
+                       if (fa->date < fb->date) return -1;
+                       if (fa->date > fb->date) return 1;
+                       return 0;
+                       break;
+#ifdef HAVE_STRVERSCMP
+               case SORT_NUMBER:
+                       return strverscmp(fa->name, fb->name);
+                       break;
+#endif
+               case SORT_NAME:
+               default:
+                       return CASE_SORT(fa->name, fb->name);
+                       break;
                }
+}
 
-       width = 0;
-       work = file_list;
+GList *filelist_sort(GList *list, SortType method, gint ascend)
+{
+       filelist_sort_method = method;
+       filelist_sort_ascend = ascend;
+       return g_list_sort(list, (GCompareFunc) sort_file_cb);
+}
 
-       while(work)
-               {
-               gint has_pixmap;
-               gint match;
-               gchar *name = work->data;
-               gint done = FALSE;
+GList *filelist_insert_sort(GList *list, FileData *fd, SortType method, gint ascend)
+{
+       filelist_sort_method = method;
+       filelist_sort_ascend = ascend;
+       return g_list_insert_sorted(list, fd, (GCompareFunc) sort_file_cb);
+}
 
-               while (!done)
-                       {
-                       if (GTK_CLIST(file_clist)->rows > row_p)
-                               {
-                               if (gtk_clist_get_cell_type(GTK_CLIST(file_clist),row_p, 0) == GTK_CELL_PIXTEXT)
-                                       {
-                                       gtk_clist_get_pixtext(GTK_CLIST(file_clist), row_p, 0, &text, &spacing, &nopixmap, &nomask);
-                                       has_pixmap = TRUE;
-                                       }
-                               else
-                                       {
-                                       gtk_clist_get_text(GTK_CLIST(file_clist), row_p, 0, &text);
-                                       has_pixmap = FALSE;
-                                       }
-                               match = strcmp(name, text);
-                               }
-                       else
-                               {
-                               match = -1;
-                               }
+gint filelist_read(const gchar *path, GList **files, GList **dirs)
+{
+       DIR *dp;
+       struct dirent *dir;
+       struct stat ent_sbuf;
+       gchar *pathl;
+       GList *dlist;
+       GList *flist;
 
-                       if (match < 0)
-                               {
-                               gchar *buf[2];
-                               buf[0] = name;
-                               buf[1] = NULL;
-                               row = gtk_clist_insert(GTK_CLIST(file_clist), row_p, buf);
-                               gtk_clist_set_row_data (GTK_CLIST(file_clist), row, name);
-                               if (thumbnails_enabled)
-                                       gtk_clist_set_shift(GTK_CLIST(file_clist), row, 0, 0, 5 + thumb_max_width);
-                               done = TRUE;
-                               if (image_name && strcmp(name, image_name) == 0)
-                                       gtk_clist_select_row(GTK_CLIST(file_clist), row, 0);
-                               }
-                       else if (match > 0)
-                               {
-                               gtk_clist_remove(GTK_CLIST(file_clist), row_p);
-                               }
-                       else
-                               {
-                               if (thumbnails_enabled && !has_pixmap)
-                                       gtk_clist_set_shift(GTK_CLIST(file_clist), row_p, 0, 0, 5 + thumb_max_width);
-                               if (!thumbnails_enabled/* && has_pixmap*/)
-                                       {
-                                       gtk_clist_set_text(GTK_CLIST(file_clist), row_p, 0, name);
-                                       gtk_clist_set_shift(GTK_CLIST(file_clist), row_p, 0, 0, 0);
-                                       }
-                               gtk_clist_set_row_data (GTK_CLIST(file_clist), row_p, name);
-                               done = TRUE;
-                               }
-                       }
-               row_p++;
+       dlist = NULL;
+       flist = NULL;
 
-               if (thumbnails_enabled)
-                       tmp_width = gdk_string_width(file_clist->style->font, name) + thumb_max_width + 5;
-               else
-                       tmp_width = gdk_string_width(file_clist->style->font, name);
-               if (tmp_width > width) width = tmp_width;
-               work = work->next;
+       pathl = path_from_utf8(path);
+       if (!pathl || (dp = opendir(pathl)) == NULL)
+               {
+               g_free(pathl);
+               if (files) *files = NULL;
+               if (dirs) *dirs = NULL;
+               return FALSE;
                }
 
-       while (GTK_CLIST(file_clist)->rows > row_p)
-               gtk_clist_remove(GTK_CLIST(file_clist), row_p);
-
-       gtk_clist_set_column_width(GTK_CLIST(file_clist), 0, width);
-       gtk_clist_thaw(GTK_CLIST (file_clist));
-
-       if (thumbnails_enabled)
+       /* root dir fix */
+       if (pathl[0] == '/' && pathl[1] == '\0')
                {
-               GList *done_list = NULL;
-               gint past_run;
-               gint finished = FALSE;
-               gint j;
-               gint count = 0;
-               update_status_label(_("Loading thumbs..."));
-
-               for (j = 0; j < GTK_CLIST(file_clist)->rows; j++)
-                       {
-                       done_list = g_list_prepend(done_list, GINT_TO_POINTER(FALSE));
-                       }
-
-               /* load thumbs */
+               g_free(pathl);
+               pathl = g_strdup("");
+               }
 
-               while (!finished && done_list)
+       while ((dir = readdir(dp)) != NULL)
+               {
+               gchar *name = dir->d_name;
+               if (show_dot_files || !ishidden(name))
                        {
-                       gint p = -1;
-                       gint r = -1;
-                       gint c = -1;
-                       gtk_clist_get_selection_info (GTK_CLIST(file_clist), 1, 1, &r, &c);
-                       if (r != -1)
+                       gchar *filepath = g_strconcat(pathl, "/", name, NULL);
+                       if (stat(filepath, &ent_sbuf) >= 0)
                                {
-                               work = g_list_nth(done_list, r);
-                               while (work)
+                               if (S_ISDIR(ent_sbuf.st_mode))
                                        {
-                                       if (gtk_clist_row_is_visible(GTK_CLIST(file_clist), r))
-                                               {
-                                               if (!GPOINTER_TO_INT(work->data))
-                                                       {
-                                                       work->data = GINT_TO_POINTER(TRUE);
-                                                       p = r;
-                                                       work = NULL;
-                                                       }
-                                               else
-                                                       {
-                                                       r++;
-                                                       work = work->next;
-                                                       }
-                                               }
-                                       else
+                                       /* we ignore the .thumbnails dir for cleanliness */
+                                       if ((dirs) &&
+                                           !(name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) &&
+                                           strcmp(name, GQVIEW_CACHE_LOCAL_THUMB) != 0 &&
+                                           strcmp(name, GQVIEW_CACHE_LOCAL_METADATA) != 0)
                                                {
-                                               work = NULL;
+                                               dlist = g_list_prepend(dlist, file_data_new(filepath, &ent_sbuf));
                                                }
                                        }
-                               }
-                       if (p == -1)
-                               {
-                               work = done_list;
-                               r = 0;
-                               while(work && p == -1)
+                               else
                                        {
-                                       if (!GPOINTER_TO_INT(work->data))
-                                               {
-                                               p = r;
-                                               work->data = GINT_TO_POINTER(TRUE);
-                                               }
-                                       else
+                                       if ((files) && filter_name_exists(name))
                                                {
-                                               r++;
-                                               work = work->next;
-                                               if (!work) finished = TRUE;
+                                               flist = g_list_prepend(flist, file_data_new(filepath, &ent_sbuf));
                                                }
                                        }
                                }
-
-                       count++;
-
-                       if (!finished && gtk_clist_get_cell_type(GTK_CLIST(file_clist), p, 0) != GTK_CELL_PIXTEXT)
-                               {
-                               GdkPixmap *pixmap = NULL;
-                               GdkBitmap *mask = NULL;
-                               gchar *name;
-                               gchar *path;
-
-                               thumbs_running ++;
-                               past_run = thumbs_running;
-                               while(gtk_events_pending()) gtk_main_iteration();
-                               if (thumbs_running > past_run)
-                                       {
-                                       thumbs_running -= 2;
-                                       update_progressbar(0.0);
-                                       update_status_label(NULL);
-                                       g_list_free(done_list);
-                                       return;
-                                       }
-                               thumbs_running --;
-
-                               name = gtk_clist_get_row_data(GTK_CLIST(file_clist), p);
-                               path = g_strconcat (current_path, "/", name, NULL);
-                               spacing = create_thumbnail(path, &pixmap, &mask);
-                               g_free(path);
-                               gtk_clist_set_pixtext (GTK_CLIST(file_clist), p, 0, name, spacing + 5, pixmap, mask);
-                               gtk_clist_set_shift(GTK_CLIST(file_clist), p, 0, 0, 0);
-
-                               update_progressbar((gfloat)(count) / GTK_CLIST(file_clist)->rows);
-                               }
+                       g_free(filepath);
                        }
-               update_progressbar(0.0);
-               g_list_free(done_list);
                }
 
-       update_status_label(NULL);
-}
+       closedir(dp);
 
-void filelist_refresh()
-{
-       filelist_read(current_path);
-       filelist_populate_clist();
-       filelist_click_row = -1;
+       g_free(pathl);
+
+       if (dirs) *dirs = dlist;
+       if (files) *files = flist;
+
+       return TRUE;
 }
 
-void filelist_change_to(gchar *path)
+void filelist_free(GList *list)
 {
-       if (!isdir(path)) return;
+       GList *work;
 
-       g_free(current_path);
-       current_path = g_strdup(path);
+       work = list;
+       while (work)
+               {
+               file_data_free((FileData *)work->data);
+               work = work->next;
+               }
 
-       filelist_refresh();
+       g_list_free(list);
 }
+
+
diff --git a/src/filelist.h b/src/filelist.h
new file mode 100644 (file)
index 0000000..ac20c6d
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef FILELIST_H
+#define FILELIST_H
+
+
+typedef struct _FilterEntry FilterEntry;
+struct _FilterEntry {
+       gchar *key;
+       gchar *description;
+       gchar *extensions;
+       gint enabled;
+};
+
+/* you can change, but not add or remove entries from the returned list */
+GList *filter_get_list(void);
+void filter_remove_entry(FilterEntry *fe);
+
+void filter_add(const gchar *key, const gchar *description, const gchar *extensions, gint enabled);
+void filter_add_unique(const gchar *description, const gchar *extensions, gint enabled);
+void filter_add_defaults(void);
+void filter_reset(void);
+void filter_rebuild(void);
+
+gint filter_name_exists(const gchar *name);
+
+void filter_write_list(FILE *f);
+void filter_parse(const gchar *text);
+
+gint ishidden(const gchar *name);
+
+
+GList *path_list_filter(GList *list, gint is_dir_list);
+
+GList *path_list_sort(GList *list);
+GList *path_list_recursive(const gchar *path);
+
+gchar *text_from_size(gint64 size);
+gchar *text_from_size_abrev(gint64 size);
+const gchar *text_from_time(time_t t);
+
+/* this expects a locale encoded path */
+FileData *file_data_new(const gchar *path, struct stat *st);
+/* this expects a utf-8 path */
+FileData *file_data_new_simple(const gchar *path);
+void file_data_free(FileData *fd);
+
+GList *filelist_sort(GList *list, SortType method, gint ascend);
+GList *filelist_insert_sort(GList *list, FileData *fd, SortType method, gint ascend);
+
+gint filelist_read(const gchar *path, GList **files, GList **dirs);
+void filelist_free(GList *list);
+
+#endif
+
+
diff --git a/src/fileops.c b/src/fileops.c
deleted file mode 100644 (file)
index 100e1ca..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * GQview image viewer
- * (C)2000 John Ellis
- *
- * Author: John Ellis
- *
- */
-
-#include "gqview.h"
-
-/*
- *-----------------------------------------------------------------------------
- * generic file information and manipulation routines (public)
- *-----------------------------------------------------------------------------
- */ 
-
-/* first we try the HOME environment var, if that doesn't work, we try getpwuid(). */
-gchar *homedir()
-{
-       gchar *home = getenv("HOME");
-       if(home)
-               return home;
-       else
-               {
-               struct passwd *pw = getpwuid(getuid());
-               if (pw)
-                       return pw->pw_dir;
-               else
-                       return NULL ; /* now we've got a problem */
-               }
-}
-
-int isfile(char *s)
-{
-   struct stat st;
-   
-   if ((!s)||(!*s)) return 0;
-   if (stat(s,&st)<0) return 0;
-   if (S_ISREG(st.st_mode)) return 1;
-   return 0;
-}
-
-int isdir(char *s)
-{
-   struct stat st;
-   
-   if ((!s)||(!*s)) return 0;
-   if (stat(s,&st)<0) return 0;
-   if (S_ISDIR(st.st_mode)) return 1;
-   return 0;
-}
-
-int filesize(char *s)
-{
-   struct stat st;
-   
-   if ((!s)||(!*s)) return 0;
-   if (stat(s,&st)<0) return 0;
-   return (int)st.st_size;
-}
-
-time_t filetime(gchar *s)
-{
-        struct stat st;
-
-        if ((!s)||(!*s)) return 0;
-        if (stat(s,&st)<0) return 0;
-        return st.st_mtime;
-}
-
-int copy_file(char *s, char *t)
-{
-       FILE *fi, *fo;
-       char buf[4096];
-       int b;
-
-       fi = fopen(s, "rb");
-       if (!fi)
-               {
-               return FALSE;
-               }
-
-       fo = fopen(t, "wb");
-       if (!fo)
-               {
-               fclose(fi);
-               return FALSE;
-               }
-
-       while((b = fread(buf, sizeof(char), 4096, fi)) && b != 0)
-               {
-               if (fwrite(buf, sizeof(char), b, fo) != b)
-                       {
-                       fclose(fi);
-                       fclose(fo);
-                       return FALSE;
-                       }
-               }
-
-       fclose(fi);
-       fclose(fo);
-       return TRUE;
-}
-
-int move_file(char *s, char *t)
-{
-       if (rename (s, t) < 0)
-               {
-               /* this may have failed because moving a file across filesystems
-               was attempted, so try copy and delete instead */
-               if (copy_file(s, t))
-                       {
-                       if (unlink (s) < 0)
-                               {
-                               /* err, now we can't delete the source file so return FALSE */
-                               return FALSE;
-                               }
-                       }
-               else
-                       return FALSE;
-               }
-
-       return TRUE;
-}
-
-gchar *get_current_dir()
-{
-       char buf[512];
-       if (getcwd(buf, 510) == NULL)
-               {
-#ifdef __USE_GNU
-               char *dbuf;
-               gchar *ret;
-               dbuf = get_current_dir_name();
-               if (buf)
-                       {
-                       ret = g_strdup(dbuf);   /* don't mix free w/ g_free */
-                       free(dbuf);
-                       return (ret);
-                       }
-#endif
-               return (g_strdup("."));         /* well, return something! broken? */
-               }
-       return g_strdup(buf);
-}
-
-
diff --git a/src/fullscreen.c b/src/fullscreen.c
new file mode 100644 (file)
index 0000000..494a242
--- /dev/null
@@ -0,0 +1,682 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "fullscreen.h"
+
+#include "image.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_misc.h"
+
+
+enum {
+       FULLSCREEN_CURSOR_HIDDEN = 1 << 0,
+       FULLSCREEN_CURSOR_NORMAL = 1 << 1,
+       FULLSCREEN_CURSOR_BUSY   = 1 << 2
+};
+
+
+/*
+ *----------------------------------------------------------------------------
+ * full screen functions
+ *----------------------------------------------------------------------------
+ */
+
+static void clear_mouse_cursor(GtkWidget *widget, gint state)
+{
+       if (!widget->window) return;
+
+       if (state & FULLSCREEN_CURSOR_BUSY)
+               {
+               GdkCursor *cursor;
+
+               cursor = gdk_cursor_new(GDK_WATCH);
+               gdk_window_set_cursor (widget->window, cursor);
+               gdk_cursor_unref(cursor);
+               }
+       else if (state & FULLSCREEN_CURSOR_NORMAL)
+               {
+               gdk_window_set_cursor (widget->window, NULL);
+               }
+       else
+               {
+               GdkCursor *cursor;
+               GdkPixmap *p;
+
+               p = gdk_bitmap_create_from_data(widget->window, "\0\0\0", 1, 1);
+
+               cursor = gdk_cursor_new_from_pixmap(p, p,
+                                                   &widget->style->fg[GTK_STATE_ACTIVE],
+                                                   &widget->style->bg[GTK_STATE_ACTIVE],
+                                                   0, 0);
+
+               gdk_window_set_cursor (widget->window, cursor);
+
+               gdk_cursor_unref(cursor);
+               g_object_unref(p);
+               }
+}
+
+static gint fullscreen_hide_mouse_cb(gpointer data)
+{
+       FullScreenData *fs = data;
+
+       if (fs->hide_mouse_id == -1) return FALSE;
+
+       fs->cursor_state &= ~FULLSCREEN_CURSOR_NORMAL;
+       if (!(fs->cursor_state & FULLSCREEN_CURSOR_BUSY)) clear_mouse_cursor(fs->window, fs->cursor_state);
+
+       fs->hide_mouse_id = -1;
+       return FALSE;
+}
+
+static void fullscreen_hide_mouse_disable(FullScreenData *fs)
+{
+       if (fs->hide_mouse_id != -1)
+               {
+               g_source_remove(fs->hide_mouse_id);
+               fs->hide_mouse_id = -1;
+               }
+}
+
+static void fullscreen_hide_mouse_reset(FullScreenData *fs)
+{
+       fullscreen_hide_mouse_disable(fs);
+       fs->hide_mouse_id = g_timeout_add(FULL_SCREEN_HIDE_MOUSE_DELAY, fullscreen_hide_mouse_cb, fs);
+}
+
+static gint fullscreen_mouse_moved(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       FullScreenData *fs = data;
+
+       if (!(fs->cursor_state & FULLSCREEN_CURSOR_NORMAL))
+               {
+               fs->cursor_state |= FULLSCREEN_CURSOR_NORMAL;
+               if (!(fs->cursor_state & FULLSCREEN_CURSOR_BUSY)) clear_mouse_cursor(fs->window, fs->cursor_state);
+               }
+       fullscreen_hide_mouse_reset(fs);
+
+       return FALSE;
+}
+
+static void fullscreen_busy_mouse_disable(FullScreenData *fs)
+{
+       if (fs->busy_mouse_id != -1)
+               {
+               g_source_remove(fs->busy_mouse_id);
+               fs->busy_mouse_id = -1;
+               }
+}
+
+static void fullscreen_mouse_set_busy(FullScreenData *fs, gint busy)
+{
+       fullscreen_busy_mouse_disable(fs);
+
+       if ((fs->cursor_state & FULLSCREEN_CURSOR_BUSY) == (busy)) return;
+
+       if (busy)
+               {
+               fs->cursor_state |= FULLSCREEN_CURSOR_BUSY;
+               }
+       else
+               {
+               fs->cursor_state &= ~FULLSCREEN_CURSOR_BUSY;
+               }
+
+       clear_mouse_cursor(fs->window, fs->cursor_state);
+}
+
+static gboolean fullscreen_mouse_set_busy_cb(gpointer data)
+{
+       FullScreenData *fs = data;
+
+       fs->busy_mouse_id = -1;
+       fullscreen_mouse_set_busy(fs, TRUE);
+       return FALSE;
+}
+
+static void fullscreen_mouse_set_busy_idle(FullScreenData *fs)
+{
+       if (fs->busy_mouse_id == -1)
+               {
+               fs->busy_mouse_id = g_timeout_add(FULL_SCREEN_BUSY_MOUSE_DELAY,
+                                                 fullscreen_mouse_set_busy_cb, fs);
+               }
+}
+
+static void fullscreen_image_update_cb(ImageWindow *imd, gpointer data)
+{
+       FullScreenData *fs = data;
+
+       if (fs->imd->il &&
+           fs->imd->pixbuf != fs->imd->il->pixbuf)
+               {
+               fullscreen_mouse_set_busy_idle(fs);
+               }
+}
+
+static void fullscreen_image_complete_cb(ImageWindow *imd, gint preload, gpointer data)
+{
+       FullScreenData *fs = data;
+
+       if (!preload) fullscreen_mouse_set_busy(fs, FALSE);
+}
+
+#define XSCREENSAVER_BINARY    "xscreensaver-command"
+#define XSCREENSAVER_COMMAND   "xscreensaver-command -deactivate >&- 2>&- &"
+
+static void fullscreen_saver_deactivate(void)
+{
+       static gint checked = FALSE;
+       static gint found = FALSE;
+
+       if (!checked)
+               {
+               checked = TRUE;
+               found = file_in_path(XSCREENSAVER_BINARY);
+               }
+
+       if (found)
+               {
+               system (XSCREENSAVER_COMMAND);
+               }
+}
+
+static gboolean fullscreen_saver_block_cb(gpointer data)
+{
+       if (fullscreen_disable_saver)
+               {
+               fullscreen_saver_deactivate();
+               }
+
+       return TRUE;
+}
+
+static gint fullscreen_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
+{
+       FullScreenData *fs = data;
+
+       fullscreen_stop(fs);
+       return TRUE;
+}
+
+FullScreenData *fullscreen_start(GtkWidget *window, ImageWindow *imd,
+                                void (*stop_func)(FullScreenData *, gpointer), gpointer stop_data)
+{
+       FullScreenData *fs;
+       GdkScreen *screen;
+       gint same;
+       gint x, y;
+       gint w, h;
+       GdkGeometry geometry;
+
+       if (!window || !imd) return NULL;
+
+       fs = g_new0(FullScreenData, 1);
+
+       fs->hide_mouse_id = -1;
+       fs->busy_mouse_id = -1;
+       fs->cursor_state = FULLSCREEN_CURSOR_HIDDEN;
+
+       fs->normal_window = window;
+       fs->normal_imd = imd;
+
+       fs->stop_func = stop_func;
+       fs->stop_data = stop_data;
+
+       if (debug) printf("full screen requests screen %d\n", fullscreen_screen);
+       fullscreen_prefs_get_geometry(fullscreen_screen, window, &x, &y, &w, &h,
+                                     &screen, &same);
+
+       fs->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+       gtk_window_set_wmclass(GTK_WINDOW(fs->window), "fullscreen", "GQview");
+
+       /* this requests no decorations, if you still have them complain to the window manager author(s) */
+       gtk_window_set_decorated(GTK_WINDOW(fs->window), FALSE);
+
+       if (fullscreen_screen < 0)
+               {
+               /* If we want control of the window size and position this is not what we want.
+                * GQview needs control of which monitor(s) to use for full screen.
+                */
+               gtk_window_fullscreen(GTK_WINDOW(fs->window));
+               }
+       else if (fullscreen_above)
+               {
+               /* request to be above other windows */
+               gtk_window_set_keep_above(GTK_WINDOW(fs->window), TRUE);
+               }
+
+       gtk_window_set_resizable(GTK_WINDOW(fs->window), FALSE);
+
+       gtk_window_set_screen(GTK_WINDOW(fs->window), screen);
+       gtk_container_set_border_width(GTK_CONTAINER(fs->window), 0);
+       g_signal_connect(G_OBJECT(fs->window), "delete_event",
+                        G_CALLBACK(fullscreen_delete_cb), fs);
+
+       gtk_window_set_title(GTK_WINDOW(fs->window), _("GQview full screen"));
+
+       geometry.min_width = w;
+       geometry.min_height = h;
+       geometry.max_width = w;
+       geometry.max_height = h;
+       geometry.base_width = w;
+       geometry.base_height = h;
+       geometry.win_gravity = GDK_GRAVITY_STATIC;
+       /* By setting USER_POS and USER_SIZE, most window managers will
+        * not request positioning of the full screen window (for example twm).
+        *
+        * In addition, setting gravity to STATIC will result in the
+        * decorations of twm to not effect the requested window position,
+        * the decorations will simply be off screen, except in multi monitor setups :-/
+        */
+       gtk_window_set_geometry_hints(GTK_WINDOW(fs->window), fs->window, &geometry,
+                                     GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE | GDK_HINT_BASE_SIZE |
+                                     GDK_HINT_WIN_GRAVITY |
+                                     GDK_HINT_USER_POS | GDK_HINT_USER_SIZE);
+
+       gtk_window_set_default_size(GTK_WINDOW(fs->window), w, h);
+       gtk_window_move(GTK_WINDOW(fs->window), x, y);
+
+       fs->imd = image_new(FALSE);
+
+       gtk_container_add(GTK_CONTAINER(fs->window), fs->imd->widget);
+
+       /* set background to black */
+       if (BLACK_BACKGROUND)
+               {
+               image_background_set_black(fs->imd, TRUE);
+               }
+
+       image_set_delay_flip(fs->imd, fullscreen_clean_flip);
+       image_auto_refresh(fs->imd, fs->normal_imd->auto_refresh_interval);
+
+       if (fullscreen_clean_flip)
+               {
+               image_set_update_func(fs->imd, fullscreen_image_update_cb, fs);
+               image_set_complete_func(fs->imd, fullscreen_image_complete_cb, fs);
+               }
+
+       gtk_widget_show(fs->imd->widget);
+
+       image_change_from_image(fs->imd, fs->normal_imd);
+
+       gtk_widget_show(fs->window);
+
+       /* for hiding the mouse */
+       g_signal_connect(G_OBJECT(fs->imd->image), "motion_notify_event",
+                          G_CALLBACK(fullscreen_mouse_moved), fs);
+       clear_mouse_cursor(fs->window, fs->cursor_state);
+
+       /* set timer to block screen saver */
+       fs->saver_block_id = g_timeout_add(60 * 1000, fullscreen_saver_block_cb, fs);
+
+       /* hide normal window
+        * FIXME: properly restore this window on show
+        */
+#ifdef HIDE_WINDOW_IN_FULLSCREEN
+       gtk_widget_hide(fs->normal_window);
+#endif
+       image_change_path(fs->normal_imd, NULL, image_zoom_get(fs->normal_imd));
+
+       return fs;
+}
+
+void fullscreen_stop(FullScreenData *fs)
+{
+       if (!fs) return;
+
+       g_source_remove(fs->saver_block_id);
+
+       fullscreen_hide_mouse_disable(fs);
+       fullscreen_busy_mouse_disable(fs);
+       gdk_keyboard_ungrab(GDK_CURRENT_TIME);
+
+       image_change_from_image(fs->normal_imd, fs->imd);
+#ifdef HIDE_WINDOW_IN_FULLSCREEN
+       gtk_widget_show(fs->normal_window);
+#endif
+       if (fs->stop_func) fs->stop_func(fs, fs->stop_data);
+
+       gtk_widget_destroy(fs->window);
+
+       g_free(fs);
+}
+
+
+/*
+ *----------------------------------------------------------------------------
+ * full screen preferences and utils
+ *----------------------------------------------------------------------------
+ */
+
+GList *fullscreen_prefs_list(void)
+{
+       GList *list = NULL;
+       GdkDisplay *display;
+       gint number;
+       gint i;
+
+       display = gdk_display_get_default();
+       number = gdk_display_get_n_screens(display);
+
+       for (i = 0; i < number ; i++)
+               {
+               GdkScreen *screen;
+               gint monitors;
+               gint j;
+
+               screen = gdk_display_get_screen(display, i);
+               monitors = gdk_screen_get_n_monitors(screen);
+
+               for (j = -1; j < monitors; j++)
+                       {
+                       ScreenData *sd;
+                       GdkRectangle rect;
+                       gchar *name;
+                       gchar *subname;
+
+                       name = gdk_screen_make_display_name(screen);
+
+                       if (j < 0)
+                               {
+                               rect.x = 0;
+                               rect.y = 0;
+                               rect.width = gdk_screen_get_width(screen);
+                               rect.height = gdk_screen_get_height(screen);
+                               subname = g_strdup(_("Full size"));
+                               }
+                       else
+                               {
+                               gdk_screen_get_monitor_geometry(screen, j, &rect);
+                               subname = g_strdup_printf("%s %d", _("Monitor"), j + 1);
+                               }
+
+                       sd = g_new0(ScreenData, 1);
+                       sd->number = (i+1) * 100 + j + 1;
+                       sd->description = g_strdup_printf("%s %s, %s", _("Screen"), name, subname);
+                       sd->x = rect.x;
+                       sd->y = rect.y;
+                       sd->width = rect.width;
+                       sd->height = rect.height;
+
+                       if (debug) printf("Screen %d %30s %4d,%4d (%4dx%4d)\n",
+                                         sd->number, sd->description, sd->x, sd->y, sd->width, sd->height);
+
+                       list = g_list_append(list, sd);
+
+                       g_free(name);
+                       g_free(subname);
+                       }
+               }
+
+       return list;
+}
+
+void fullscreen_prefs_list_free(GList *list)
+{
+       GList *work;
+
+       work = list;
+       while (work)
+               {
+               ScreenData *sd = work->data;
+               work = work->next;
+
+               g_free(sd->description);        
+               g_free(sd);
+               }
+
+       g_list_free(list);
+}
+
+ScreenData *fullscreen_prefs_list_find(GList *list, gint screen)
+{
+       GList *work;
+
+       work = list;
+       while (work)
+               {
+               ScreenData *sd = work->data;
+               work = work->next;
+
+               if (sd->number == screen) return sd;
+               }
+
+       return NULL;
+}
+
+/* screen is interpreted as such:
+ *  -1  window manager determines size and position, fallback is (1) active monitor
+ *   0  full size of screen containing widget
+ *   1  size of monitor containing widget
+ * 100  full size of screen 1 (screen, monitor counts start at 1)
+ * 101  size of monitor 1 on screen 1
+ * 203  size of monitor 3 on screen 2
+ * returns:
+ * dest_screen: screen to place widget [use gtk_window_set_screen()]
+ * same_region: the returned region will overlap the current location of widget.
+ */
+void fullscreen_prefs_get_geometry(gint screen, GtkWidget *widget, gint *x, gint *y, gint *width, gint *height,
+                                  GdkScreen **dest_screen, gint *same_region)
+{
+       GList *list;
+       ScreenData *sd;
+
+       list = fullscreen_prefs_list();
+       if (screen >= 100)
+               {
+               sd = fullscreen_prefs_list_find(list, screen);
+               }
+       else
+               {
+               sd = NULL;
+               if (screen < 0) screen = 1;
+               }
+
+       if (sd)
+               {
+               GdkDisplay *display;
+               GdkScreen *screen;
+               gint n;
+
+               display = gdk_display_get_default();
+               n = sd->number / 100 - 1;
+               if (n >= 0 && n < gdk_display_get_n_screens(display))
+                       {
+                       screen = gdk_display_get_screen(display, n);
+                       }
+               else
+                       {
+                       screen = gdk_display_get_default_screen(display);
+                       }
+
+               if (x) *x = sd->x;
+               if (y) *y = sd->y;
+               if (width) *width = sd->width;
+               if (height) *height = sd->height;
+
+               if (dest_screen) *dest_screen = screen;
+               if (same_region) *same_region = (!widget || !widget->window ||
+                                       (screen == gtk_widget_get_screen(widget) &&
+                                       (sd->number%100 == 0 ||
+                                        sd->number%100 == gdk_screen_get_monitor_at_window(screen, widget->window)+1)));
+
+               }
+       else if (screen != 1 || !widget || !widget->window)
+               {
+               GdkScreen *screen;
+
+               if (widget)
+                       {
+                       screen = gtk_widget_get_screen(widget);
+                       }
+               else
+                       {
+                       screen = gdk_screen_get_default();
+                       }
+
+               if (x) *x = 0;
+               if (y) *y = 0;
+               if (width) *width = gdk_screen_get_width(screen);
+               if (height) *height = gdk_screen_get_height(screen);
+
+               if (dest_screen) *dest_screen = screen;
+               if (same_region) *same_region = TRUE;
+               }
+       else
+               {
+               GdkScreen *screen;
+               gint monitor;
+               GdkRectangle rect;
+
+               screen = gtk_widget_get_screen(widget);
+               monitor = gdk_screen_get_monitor_at_window(screen, widget->window);
+
+               gdk_screen_get_monitor_geometry(screen, monitor, &rect);
+
+               if (x) *x = rect.x;
+               if (y) *y = rect.y;
+               if (width) *width = rect.width;
+               if (height) *height = rect.height;
+
+               if (dest_screen) *dest_screen = screen;
+               if (same_region) *same_region = TRUE;
+               }
+
+       fullscreen_prefs_list_free(list);
+}
+
+gint fullscreen_prefs_find_screen_for_widget(GtkWidget *widget)
+{
+       GdkScreen *screen;
+       gint monitor;
+       gint n;
+
+       if (!widget || !widget->window) return 0;
+
+       screen = gtk_widget_get_screen(widget);
+       monitor = gdk_screen_get_monitor_at_window(screen, widget->window);
+
+       n = (gdk_screen_get_number(screen)+1) * 100 + monitor + 1;
+
+       if (debug || TRUE) printf("Screen appears to be %d\n", n);
+
+       return n;
+}
+
+enum {
+       FS_MENU_COLUMN_NAME = 0,
+       FS_MENU_COLUMN_VALUE
+};
+
+#define BUTTON_ABOVE_KEY  "button_above"
+
+static void fullscreen_prefs_selection_cb(GtkWidget *combo, gpointer data)
+{
+       gint *value = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       GtkWidget *button;
+
+       if (!value) return;
+
+       store = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
+       if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter)) return;
+       gtk_tree_model_get(store, &iter, FS_MENU_COLUMN_VALUE, value, -1);
+
+       button = g_object_get_data(G_OBJECT(combo), BUTTON_ABOVE_KEY);
+       if (button)
+               {
+               gtk_widget_set_sensitive(button, *value != -1);
+               }
+}
+
+static void fullscreen_prefs_selection_add(GtkListStore *store, const gchar *text, gint value)
+{
+       GtkTreeIter iter;
+
+       gtk_list_store_append(store, &iter);
+       gtk_list_store_set(store, &iter, FS_MENU_COLUMN_NAME, text,
+                                        FS_MENU_COLUMN_VALUE, value, -1);
+}
+
+GtkWidget *fullscreen_prefs_selection_new(const gchar *text, gint *screen_value, gint *above_value)
+{
+       GtkWidget *vbox;
+       GtkWidget *hbox;
+       GtkWidget *combo;
+       GtkListStore *store;
+       GtkCellRenderer *renderer;
+       GtkWidget *button = NULL;
+       GList *list;
+       GList *work;
+       gint current = 0;
+       gint n;
+
+       if (!screen_value) return NULL;
+
+       vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+       hbox = pref_box_new(vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+       if (text) pref_label_new(hbox, text);
+
+       store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
+       combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       renderer = gtk_cell_renderer_text_new();
+       gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, TRUE);
+       gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), renderer,
+                                      "text", FS_MENU_COLUMN_NAME, NULL);
+
+       if (above_value)
+               {
+               button = pref_checkbox_new_int(vbox, _("Stay above other windows"),
+                                              *above_value, above_value);
+               gtk_widget_set_sensitive(button, *screen_value != -1);
+
+               g_object_set_data(G_OBJECT(combo), BUTTON_ABOVE_KEY, button);
+               }
+
+       fullscreen_prefs_selection_add(store, _("Determined by Window Manager"), -1);
+       fullscreen_prefs_selection_add(store, _("Active screen"), 0);
+       if (*screen_value == 0) current = 1;
+       fullscreen_prefs_selection_add(store, _("Active monitor"), 1);
+       if (*screen_value == 1) current = 2;
+
+       n = 3;
+       list = fullscreen_prefs_list();
+       work = list;
+       while (work)
+               {
+               ScreenData *sd = work->data;
+
+               fullscreen_prefs_selection_add(store, sd->description, sd->number);
+               if (*screen_value == sd->number) current = n;
+
+               work = work->next;
+               n++;
+               }
+       fullscreen_prefs_list_free(list);
+
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
+
+       gtk_box_pack_start(GTK_BOX(hbox), combo, FALSE, FALSE, 0);
+       gtk_widget_show(combo);
+
+       g_signal_connect(G_OBJECT(combo), "changed",
+                        G_CALLBACK(fullscreen_prefs_selection_cb), screen_value);
+
+       return vbox;
+}
+
diff --git a/src/fullscreen.h b/src/fullscreen.h
new file mode 100644 (file)
index 0000000..64a487f
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef FULLSCREEN_H
+#define FULLSCREEN_H
+
+#define FULL_SCREEN_HIDE_MOUSE_DELAY 3000
+#define FULL_SCREEN_BUSY_MOUSE_DELAY 200
+#define BLACK_BACKGROUND 1
+
+
+FullScreenData *fullscreen_start(GtkWidget *window, ImageWindow *imd,
+                                void (*stop_func)(FullScreenData *, gpointer), gpointer stop_data);
+void fullscreen_stop(FullScreenData *fs);
+
+
+/* screen numbers for fullscreen_prefs are as follows:
+ *   0  use default display size
+ * 101  screen 0, monitor 0
+ * 102  screen 0, monitor 1
+ * 201  screen 1, monitor 0
+ */
+
+
+typedef struct _ScreenData ScreenData;
+struct _ScreenData {
+       gint number;
+       gchar *description;
+       gint x;
+       gint y;
+       gint width;
+       gint height;
+};
+
+
+GList *fullscreen_prefs_list(void);
+void fullscreen_prefs_list_free(GList *list);
+
+ScreenData *fullscreen_prefs_list_find(GList *list, gint screen);
+
+void fullscreen_prefs_get_geometry(gint screen, GtkWidget *widget, gint *x, gint *y, gint *width, gint *height,
+                                  GdkScreen **dest_screen, gint *same_region);
+
+gint fullscreen_prefs_find_screen_for_widget(GtkWidget *widget);
+
+GtkWidget *fullscreen_prefs_selection_new(const gchar *text, gint *screen_value, gint *above_value);
+
+
+#endif
+
+
index 8e2f532..46e6239 100644 (file)
 /*
- * GQview image viewer
- * (C)2000 John Ellis
+ * GQview
+ * (C) 2004 John Ellis
  *
  * Author: John Ellis
  *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
  */
 
+
 #include "gqview.h"
-#include "logo.h"
-
-/* image */
-ImageWindow *main_image = NULL;
-
-/* main window */
-GtkWidget *mainwindow;
-GtkWidget *mainwindow_hbox;
-GtkWidget *mainwindow_vbox;
-GtkAccelGroup *mainwindow_accel_grp;
-
-GtkWidget *info_box = NULL;
-GtkWidget *info_progress_bar;
-GtkWidget *info_status;
-GtkWidget *info_details;
-GtkWidget *info_zoom;
-
-/* full screen */
-ImageWindow *normal_image = NULL;
-ImageWindow *full_screen_image = NULL;
-GtkWidget *full_screen_window = NULL;
-
-/* tools floating window */
-GtkWidget *toolwindow = NULL;
-
-/* tools */
-GtkWidget *tool_vbox;
-
-GtkWidget *path_entry;
-GtkWidget *history_menu;
-
-GtkWidget *dir_clist;
-GtkWidget *file_clist;
-
-GtkWidget *menu_file;
-GtkWidget *menu_edit;
-GtkWidget *menu_view;
-GtkWidget *menu_help;
-GtkWidget *menu_file_popup;
-GtkWidget *menu_filelist_edit;
-GtkWidget *menu_image_popup;
-GtkWidget *menu_image_edit;
-GtkWidget *menu_window_full;
-GtkWidget *menu_window_full_edit;
-GtkWidget *menu_window_view;
-GtkWidget *menu_window_view_edit;
-
-GtkWidget *thumb_button;
-GtkWidget *thumb_menu_item;
-
-/* lists */
-GList *dir_list = NULL;
-GList *file_list = NULL;
-gchar *current_path = NULL;
+
 
 GList *filename_filter = NULL;
 
 /* -- options -- */
-gint main_window_w = 400;
-gint main_window_h = 350;
+gint main_window_w = 500;
+gint main_window_h = 400;
 gint main_window_x = 0;
 gint main_window_y = 0;
+gint main_window_maximized = FALSE;
 
-gint float_window_w = 150;
-gint float_window_h = 350;
+gint float_window_w = 260;
+gint float_window_h = 450;
 gint float_window_x = 0;
 gint float_window_y = 0;
+gint float_window_divider = -1;
+
+gint window_hdivider_pos = -1;
+gint window_vdivider_pos = 200;
 
 gint save_window_positions = FALSE;
 gint tools_float = FALSE;
 gint tools_hidden = FALSE;
+gint toolbar_hidden = FALSE;
 gint progressive_key_scrolling = FALSE;
 
 gint startup_path_enable = FALSE;
 gchar *startup_path = NULL;
 gint confirm_delete = TRUE;
+gint enable_delete_key = TRUE;
+gint safe_delete_enable = FALSE;
+gchar *safe_delete_path = NULL;
+gint safe_delete_size = 20;
 gint restore_tool = FALSE;
 gint zoom_mode = ZOOM_RESET_ORIGINAL;
+gint two_pass_zoom = TRUE;
+gint scroll_reset_method = SCROLL_RESET_TOPLEFT;
 gint fit_window = FALSE;
 gint limit_window_size = FALSE;
+gint zoom_to_fit_expands = TRUE;
 gint max_window_size = 100;
-gint thumb_max_width = 64;
-gint thumb_max_height = 64;
-gint enable_thumb_caching = FALSE;
+gint thumb_max_width = 96;
+gint thumb_max_height = 72;
+gint enable_thumb_caching = TRUE;
+gint enable_thumb_dirs = FALSE;
 gint use_xvpics_thumbnails = TRUE;
+gint thumbnail_spec_standard = TRUE;
+gint enable_metadata_dirs = FALSE;
 gint show_dot_files = FALSE;
 gint file_filter_disable = FALSE;
-gint filter_include_jpg = TRUE;
-gint filter_include_xpm = TRUE;
-gint filter_include_tif = TRUE;
-gint filter_include_gif = TRUE;
-gint filter_include_png = TRUE;
-gint filter_include_ppm = TRUE;
-gint filter_include_pgm = TRUE;
-gint filter_include_pcx = TRUE;
-gint filter_include_bmp = TRUE;
-gchar *custom_filter = NULL;
-gchar *editor_name[8];
-gchar *editor_command[8];
+gchar *editor_name[GQVIEW_EDITOR_SLOTS];
+gchar *editor_command[GQVIEW_EDITOR_SLOTS];
 
 gint thumbnails_enabled = FALSE;
+SortType file_sort_method = SORT_NAME;
+gint file_sort_ascending = TRUE;
 
-gint slideshow_delay = 15;
+gint slideshow_delay = 150;
 gint slideshow_random = FALSE;
 gint slideshow_repeat = FALSE;
 
-gint mousewheel_scrolls = TRUE;
+gint mousewheel_scrolls = FALSE;
+gint enable_in_place_rename = TRUE;
+
+gint recent_list_max = 10;
+
+gint collection_rectangular_selection = FALSE;
+
+gint tile_cache_max = 10;
+gint thumbnail_quality = (gint)GDK_INTERP_TILES;
+gint zoom_quality = (gint)GDK_INTERP_BILINEAR;
+gint dither_quality = (gint)GDK_RGB_DITHER_NORMAL;
+
+gint zoom_increment = 5;
+
+gint enable_read_ahead = TRUE;
+
+gint place_dialogs_under_mouse = FALSE;
+
+gint black_window_background = FALSE;
+
+gint fullscreen_screen = -1;
+gint fullscreen_clean_flip = FALSE;
+gint fullscreen_disable_saver = TRUE;
+gint fullscreen_above = FALSE;
+
+gint dupe_custom_threshold = 99;
 
 gint debug = FALSE;
 
-/* logo & misc images */
+/* layout */
+gchar *layout_order = NULL;
+gint layout_style = 0;
+
+gint layout_view_icons = FALSE;
+gint layout_view_tree = FALSE;
+
+gint show_icon_names = TRUE;
+
+gint tree_descend_subdirs = FALSE;
 
+gint lazy_image_sync = FALSE;
+gint update_on_time_change = TRUE;
+gint exif_rotate_enable = FALSE;
 
index 031ecd1..bde3eed 100644 (file)
@@ -1,15 +1,26 @@
 /*
- * GQview image viewer
- * (C)2000 John Ellis
+ * GQview
+ * (C) 2004 John Ellis
  *
  * Author: John Ellis
  *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
  */
 
+
+#ifndef GQVIEW_H
+#define GQVIEW_H
+
 #ifdef HAVE_CONFIG_H
 #  include "config.h"
 #endif
 
+#ifdef HAVE_STRVERSCMP
+#  define _GNU_SOURCE
+#endif
+
 #include "intl.h"
 
 /*
 #include <time.h>
 #include <unistd.h>
 #include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/types.h>
 #include <dirent.h>
+#include <fcntl.h>
 
 /*
  *-------------------------------------
- * includes for glib / gtk / imlib
+ * includes for glib / gtk / gdk-pixbuf
  *-------------------------------------
  */
 
 #include <gdk/gdk.h>
 #include <gtk/gtk.h>
-#include <gdk_imlib.h>
+
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <gdk-pixbuf/gdk-pixbuf-loader.h>
+
+#include "typedefs.h"
 
 /*
  *----------------------------------------------------------------------------
  *----------------------------------------------------------------------------
  */
 
-#define RC_FILE_NAME ".gqviewrc"
-#define RC_THUMB_DIR ".gqview_thmb"
+#define GQVIEW_RC_DIR             ".gqview"
+#define GQVIEW_RC_DIR_COLLECTIONS GQVIEW_RC_DIR"/collections"
+#define GQVIEW_RC_DIR_TRASH       GQVIEW_RC_DIR"/trash"
+
+#define RC_FILE_NAME "gqviewrc"
 
 #define ZOOM_RESET_ORIGINAL 0
 #define ZOOM_RESET_FIT_WINDOW 1
 #define ZOOM_RESET_NONE 2
 
+#define SCROLL_RESET_TOPLEFT 0
+#define SCROLL_RESET_CENTER 1
+#define SCROLL_RESET_NOCHANGE 2
+
 #define MOUSEWHEEL_SCROLL_SIZE 20
 
-typedef struct _ImageWindow ImageWindow;
-struct _ImageWindow
-{
-       GtkWidget *eventbox;
-       GtkWidget *table;
-       GtkWidget *viewport;
-       GtkWidget *image;
-
-       gchar *image_path;
-       gchar *image_name;
-
-       gint width;
-       gint height;
-       gint size;
-
-       gint old_width;
-       gint old_height;
-
-       gint unknown;
-       gint zoom;
-
-       GdkPixmap *image_pixmap;
-       GdkImlibImage *image_data;
-
-       gint in_drag;
-       gint drag_last_x;
-       gint drag_last_y;
-       gint drag_moved;
-
-       gint artificial_size;
-       gint new_img;
-
-       /* info, zoom labels & windows */
-
-       GtkWidget *top_window; /* window that gets title set to image filename */
-       GtkWidget *info_label; /* label set to show image h x w , size */
-       GtkWidget *zoom_label; /* label to display zoom */
-       gchar *title;          /* window title to display left of file name */
-       gint show_title_zoom;  /* option to include zoom in window title */
-
-       /* button functions */
-       void (*func_btn1)(ImageWindow *, GdkEventButton *, gpointer);
-       void (*func_btn2)(ImageWindow *, GdkEventButton *, gpointer);
-       void (*func_btn3)(ImageWindow *, GdkEventButton *, gpointer);
-       void (*func_btn4)(ImageWindow *, GdkEventButton *, gpointer);
-       void (*func_btn5)(ImageWindow *, GdkEventButton *, gpointer);
-
-       gpointer data_btn1;
-       gpointer data_btn2;
-       gpointer data_btn3;
-       gpointer data_btn4;
-       gpointer data_btn5;
-};
-
-/* image */
-extern ImageWindow *main_image;
-
-/* main window */
-extern GtkWidget *mainwindow;
-extern GtkWidget *mainwindow_hbox;
-extern GtkWidget *mainwindow_vbox;
-extern GtkAccelGroup *mainwindow_accel_grp;
-
-extern GtkWidget *info_box;
-extern GtkWidget *info_progress_bar;
-extern GtkWidget *info_status;
-extern GtkWidget *info_details;
-extern GtkWidget *info_zoom;
-
-/* full screen */
-extern ImageWindow *normal_image;
-extern ImageWindow *full_screen_image;
-extern GtkWidget *full_screen_window;
-
-/* tools floating window */
-extern GtkWidget *toolwindow;
-
-/* tools */
-extern GtkWidget *tool_vbox;
-
-extern GtkWidget *path_entry;
-extern GtkWidget *history_menu;
-
-extern GtkWidget *dir_clist;
-extern GtkWidget *file_clist;
-
-extern GtkWidget *menu_file;
-extern GtkWidget *menu_edit;
-extern GtkWidget *menu_view;
-extern GtkWidget *menu_help;
-extern GtkWidget *menu_file_popup;
-extern GtkWidget *menu_filelist_edit;
-extern GtkWidget *menu_image_popup;
-extern GtkWidget *menu_image_edit;
-extern GtkWidget *menu_window_full;
-extern GtkWidget *menu_window_full_edit;
-extern GtkWidget *menu_window_view;
-extern GtkWidget *menu_window_view_edit;
-
-extern GtkWidget *thumb_button;
-extern GtkWidget *thumb_menu_item;
-
-/* lists */
-extern GList *dir_list;
-extern GList *file_list;
-extern gchar *current_path;
+#define GQVIEW_EDITOR_SLOTS 10
+
+/*
+ *----------------------------------------------------------------------------
+ * globals
+ *----------------------------------------------------------------------------
+ */
+
+/*
+ * Since globals are used everywhere,
+ * it is easier to define them here.
+ */
 
 extern GList *filename_filter;
 
@@ -166,202 +97,125 @@ extern gint main_window_w;
 extern gint main_window_h;
 extern gint main_window_x;
 extern gint main_window_y;
+extern gint main_window_maximized;
 
 extern gint float_window_w;
 extern gint float_window_h;
 extern gint float_window_x;
 extern gint float_window_y;
+extern gint float_window_divider;
+
+extern gint window_hdivider_pos;
+extern gint window_vdivider_pos;
 
 extern gint save_window_positions;
 extern gint tools_float;
 extern gint tools_hidden;
+extern gint toolbar_hidden;
 extern gint progressive_key_scrolling;
 
 extern gint startup_path_enable;
 extern gchar *startup_path;
 extern gint confirm_delete;
+extern gint enable_delete_key;
+extern gint safe_delete_enable;
+extern gchar *safe_delete_path;
+extern gint safe_delete_size;
 extern gint restore_tool;
 extern gint zoom_mode;
+extern gint two_pass_zoom;
+extern gint scroll_reset_method;
 extern gint fit_window;
 extern gint limit_window_size;
+extern gint zoom_to_fit_expands;
 extern gint max_window_size;
 extern gint thumb_max_width;
 extern gint thumb_max_height;
 extern gint enable_thumb_caching;
+extern gint enable_thumb_dirs;
 extern gint use_xvpics_thumbnails;
+extern gint thumbnail_spec_standard;
+extern gint enable_metadata_dirs;
 extern gint show_dot_files;
 extern gint file_filter_disable;
-extern gint filter_include_jpg;
-extern gint filter_include_xpm;
-extern gint filter_include_tif;
-extern gint filter_include_gif;
-extern gint filter_include_png;
-extern gint filter_include_ppm;
-extern gint filter_include_pgm;
-extern gint filter_include_pcx;
-extern gint filter_include_bmp;
-extern gchar *custom_filter;
 extern gchar *editor_name[];
 extern gchar *editor_command[];
 
 extern gint thumbnails_enabled;
+extern SortType file_sort_method;
+extern gint file_sort_ascending;
 
-extern gint slideshow_delay;   /* in seconds */
+extern gint slideshow_delay;   /* in tenths of a second */
 extern gint slideshow_random;
 extern gint slideshow_repeat;
 
 extern gint mousewheel_scrolls;
+extern gint enable_in_place_rename;
+
+extern gint black_window_background;
+
+extern gint fullscreen_screen;
+extern gint fullscreen_clean_flip;
+extern gint fullscreen_disable_saver;
+extern gint fullscreen_above;
+
+extern gint dupe_custom_threshold;
 
 extern gint debug;
 
-/* logo & misc images */
-extern const int logo_width;
-extern const int logo_height;
-extern const unsigned char logo[];
+extern gint recent_list_max;
+
+extern gint collection_rectangular_selection;
+
+extern gint tile_cache_max;    /* in megabytes */
+extern gint thumbnail_quality;
+extern gint zoom_quality;
+extern gint dither_quality;
 
-/* -- functions -- */
+extern gint zoom_increment;    /* 10 is 1.0, 5 is 0.05, 20 is 2.0, etc. */
+
+extern gint enable_read_ahead;
+
+extern gint place_dialogs_under_mouse;
+
+/* layout */
+extern gchar *layout_order;
+extern gint layout_style;
+
+extern gint layout_view_icons;
+extern gint layout_view_tree;
+
+extern gint show_icon_names;
+
+extern gint tree_descend_subdirs;
+
+extern gint lazy_image_sync;
+extern gint update_on_time_change;
+extern gint exif_rotate_enable;
+
+/*
+ *----------------------------------------------------------------------------
+ * main.c
+ *----------------------------------------------------------------------------
+ */
+
+/*
+ * This also doubles as the main.c header.
+ */
+
+void window_set_icon(GtkWidget *window, const char **icon, const gchar *file);
+gint window_maximized(GtkWidget *window);
+
+gdouble get_zoom_increment(void);
+
+void help_window_show(const gchar *key);
 
-/* main.c */
-gchar *filename_from_path(char *t);
-gchar *remove_level_from_path(gchar *path);
-void parse_out_relatives(gchar *path);
-void start_editor_from_file(gint n, gchar *path);
-void start_editor_from_image(gint n);
-void start_editor_from_list(gint n);
 void keyboard_scroll_calc(gint *x, gint *y, GdkEventKey *event);
-gint key_press_cb(GtkWidget *widget, GdkEventKey *event);
-void exit_gqview();
-
-/* window.c */
-void toolwindow_float();
-void toolwindow_hide();
-void create_main_window();
-
-/* menu.c */
-void add_menu_popup_item(GtkWidget *menu, gchar *label,
-                        GtkSignalFunc func, gpointer data);
-void add_menu_divider(GtkWidget *menu);
-void update_edit_menus(GtkAccelGroup *accel_grp);
-GtkWidget *create_menu_bar(GtkAccelGroup *accel_grp);
-void create_menu_popups();
-GtkWidget *create_button_bar(GtkTooltips *tooltips);
-
-/* img-main.c */
-void full_screen_start();
-void full_screen_stop();
-void full_screen_toggle();
-void image_scroll(gint x, gint y);
-void image_adjust_zoom(gint increment);
-void image_set_zoom(gint zoom);
-void image_set_path(gchar *path);
-gchar *image_get_path();
-gchar *image_get_name();
-void image_change_to(gchar *path);
-void image_set_labels(GtkWidget *info, GtkWidget *zoom);
-GtkWidget *image_create();
-void image_to_root();
-
-/* filelist.c */
-void update_status_label(gchar *text);
-void rebuild_file_filter();
-gint find_file_in_list(gchar *path);
-GList *file_get_selected_list();
-void free_selected_list(GList *list);
-gint file_clicked_is_selected();
-gchar *file_clicked_get_path();
-gint file_count();
-gint file_selection_count();
-gchar *file_get_path(gint row);
-gint file_is_selected(gint row);
-void file_image_change_to(gint row);
-void file_next_image();
-void file_prev_image();
-void file_first_image();
-void file_last_image();
-void file_is_gone(gchar *path, GList *ignore_list);
-void file_is_renamed(gchar *source, gchar *dest);
-void dir_select_cb(GtkWidget *widget, gint row, gint col,
-                  GdkEvent *event, gpointer data);
-void dir_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
-void file_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
-void file_select_cb(GtkWidget *widget, gint row, gint col,
-                  GdkEvent *event, gpointer data);
-void file_unselect_cb(GtkWidget *widget, gint row, gint col,
-                  GdkEvent *event, gpointer data);
-void file_clist_highlight_set();
-void file_clist_highlight_unset();
-void path_entry_tab_cb(gchar *newpath, gpointer data);
-void path_entry_cb(gchar *newdir, gpointer data);
-void interrupt_thumbs();
-void filelist_populate_clist();
-void filelist_refresh();
-void filelist_change_to(gchar *path);
-
-/* config.c */
-void show_config_window();
-void show_about_window();
-
-/* rcfile.c */
-void save_options();
-void load_options();
-
-/* tabcomp.c */
-GtkWidget *tab_completion_new_with_history(GtkWidget **entry, GtkWidget *window, gchar *text,
-                                          const gchar *history_key, gint max_levels,
-                                          void (*enter_func)(gchar *, gpointer), gpointer data);
-gchar *tab_completion_set_to_last_history(GtkWidget *entry);
-void tab_completion_append_to_history(GtkWidget *entry, gchar *path);
-
-GtkWidget *tab_completion_new(GtkWidget **entry, GtkWidget *window, gchar *text,
-                             void (*enter_func)(gchar *, gpointer), gpointer data);
-void tab_completion_add_to_entry(GtkWidget *entry, void (*enter_func)(gchar *, gpointer), gpointer data);
-void tab_completion_add_tab_func(GtkWidget *entry, void (*tab_func)(gchar *, gpointer), gpointer data);
-gchar *remove_trailing_slash(gchar *path);
-
-/* fileops.c */
-gchar *homedir();
-int isfile(char *s);
-int isdir(char *s);
-int filesize(char *s);
-time_t filetime(gchar *s);
-int copy_file(char *s, char *t);
-int move_file(char *s, char *t);
-gchar *get_current_dir();
-
-/* dnd.c */
-void image_dnd_init(ImageWindow *imd);
-void init_dnd();
-
-/* pathsel.c */
-GtkWidget *destination_widget_new(gchar *path, GtkWidget *entry);
-void destination_widget_sync_to_entry(GtkWidget *entry);
-
-#include "utildlg.h"
-
-/* utilops.c */
-void file_util_delete(gchar *source_path, GList *source_list);
-void file_util_move(gchar *source_path, GList *source_list, gchar *dest_path);
-void file_util_copy(gchar *source_path, GList *source_list, gchar *dest_path);
-void file_util_rename(gchar *source_path, GList *source_list);
-void file_util_create_dir(gchar *path);
-
-/* thumb.c */
-gint create_thumbnail(gchar *path, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask);
-gint maintain_thumbnail_dir(gchar *dir, gint recursive);
-
-/* slideshow.c */
-void slideshow_start();
-void slideshow_stop();
-void slideshow_next();
-void slideshow_prev();
-void slideshow_toggle();
-gint slideshow_is_running();
-
-/* img-view.c */
-void view_window_new(gchar *path);
-void view_window_active_edit(gint n);
-void view_window_active_to_root(gint n);
-void create_menu_view_popup();
+gint key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data);
+void exit_gqview(void);
+
+
+#endif
 
 
 
index 8b13875..c3fd0b8 100644 (file)
@@ -1,12 +1,41 @@
+## GQview inline icons
+
+ICONS_INLINE = \
+       folder_closed.png       \
+       folder_locked.png       \
+       folder_open.png         \
+       folder_up.png           \
+       scroller.png            \
+       sheet_broken.png        \
+       gqview_logo.png
+
+ICONS_INLINE_PAIRS = \
+       folder_closed           $(srcdir)/folder_closed.png     \
+       folder_locked           $(srcdir)/folder_locked.png     \
+       folder_open             $(srcdir)/folder_open.png       \
+       folder_up               $(srcdir)/folder_up.png         \
+       icon_scroller           $(srcdir)/scroller.png          \
+       icon_broken             $(srcdir)/sheet_broken.png      \
+       gqview_logo             $(srcdir)/gqview_logo.png
+
+icons_inline.h: $(ICONS_INLINE)
+       gdk-pixbuf-csource --raw --extern --build-list $(ICONS_INLINE_PAIRS) > icons_inline.h
+
+noinst_DATA = icons_inline.h
+CLEANFILES = $(noinst_DATA)
+
+## end GQview specific icons
+
+
 EXTRA_DIST = \
-       icon_config.xpm         \
+       $(ICONS_INLINE)         \
+       collect.xpm             \
+       config.xpm              \
+       dialog.xpm              \
+       icon.xpm                \
        icon_float.xpm          \
-       icon_home.xpm           \
-       icon_reload.xpm         \
        icon_thumb.xpm          \
-       icon_zoom_fit.xpm       \
-       icon_zoom_in.xpm        \
-       icon_zoom_norm.xpm      \
-       icon_zoom_out.xpm       \
-       img_unknown.xpm
+       marker.xpm              \
+       tools.xpm               \
+       view.xpm
 
diff --git a/src/icons/collect.xpm b/src/icons/collect.xpm
new file mode 100644 (file)
index 0000000..8381959
--- /dev/null
@@ -0,0 +1,389 @@
+/* XPM */
+static char * collect_xpm[] = {
+"48 48 338 2",
+"      c None",
+".     c #DE4B0D",
+"+     c #EB5112",
+"@     c #D44407",
+"#     c #C14207",
+"$     c #BF4106",
+"%     c #D74709",
+"&     c #F25415",
+"*     c #D44508",
+"=     c #C04106",
+"-     c #EE5113",
+";     c #D8470A",
+">     c #C84307",
+",     c #E94F10",
+"'     c #E14B0D",
+")     c #D14507",
+"!     c #9A3405",
+"~     c #E24B0D",
+"{     c #E84F10",
+"]     c #D44507",
+"^     c #A43805",
+"/     c #BD4006",
+"(     c #B54410",
+"_     c #DC490A",
+":     c #EF5214",
+"<     c #D34407",
+"[     c #8C2F05",
+"}     c #5C2004",
+"|     c #050505",
+"1     c #652304",
+"2     c #B53E06",
+"3     c #5D2003",
+"4     c #7A2904",
+"5     c #8A5238",
+"6     c #D94809",
+"7     c #C74206",
+"8     c #7B3414",
+"9     c #402012",
+"0     c #160D08",
+"a     c #0A0A0A",
+"b     c #1E1F1F",
+"c     c #1B1B1B",
+"d     c #0D0400",
+"e     c #2C1A12",
+"f     c #1C1C1B",
+"g     c #210E06",
+"h     c #9B3505",
+"i     c #BA3F06",
+"j     c #A94619",
+"k     c #6D6D6D",
+"l     c #EA5011",
+"m     c #E14C0E",
+"n     c #64420E",
+"o     c #252A0B",
+"p     c #1E1A11",
+"q     c #1A1610",
+"r     c #13130D",
+"s     c #111211",
+"t     c #000000",
+"u     c #141414",
+"v     c #111111",
+"w     c #040404",
+"x     c #0E0E0E",
+"y     c #0D0E0F",
+"z     c #1B0D07",
+"A     c #832F08",
+"B     c #765A4D",
+"C     c #7E7E7E",
+"D     c #E64E10",
+"E     c #C1410C",
+"F     c #527433",
+"G     c #5FB04A",
+"H     c #76A24A",
+"I     c #856541",
+"J     c #7E4241",
+"K     c #4B2F3F",
+"L     c #312B2A",
+"M     c #2A2A29",
+"N     c #0C0C0C",
+"O     c #252525",
+"P     c #252827",
+"Q     c #090004",
+"R     c #211212",
+"S     c #1A1816",
+"T     c #181817",
+"U     c #6A2A0C",
+"V     c #924C2C",
+"W     c #717171",
+"X     c #8F8F8F",
+"Y     c #682303",
+"Z     c #6A2303",
+"`     c #DF490C",
+" .    c #0B1900",
+"..    c #5DD455",
+"+.    c #73C151",
+"@.    c #939A52",
+"#.    c #B76550",
+"$.    c #B05673",
+"%.    c #8E58A1",
+"&.    c #412F46",
+"*.    c #0D0B0A",
+"=.    c #010101",
+"-.    c #030403",
+";.    c #120009",
+">.    c #3E522E",
+",.    c #50662F",
+"'.    c #424624",
+").    c #362319",
+"!.    c #32151C",
+"~.    c #762910",
+"{.    c #6F625B",
+"].    c #848484",
+"^.    c #8F8079",
+"/.    c #D84709",
+"(.    c #CA4209",
+"_.    c #060D04",
+":.    c #6ADA55",
+"<.    c #85AA51",
+"[.    c #A57A51",
+"}.    c #B4525B",
+"|.    c #97518E",
+"1.    c #7A51BD",
+"2.    c #6E63CA",
+"3.    c #26180F",
+"4.    c #020202",
+"5.    c #1A191A",
+"6.    c #2F4C27",
+"7.    c #62C653",
+"8.    c #7BC455",
+"9.    c #9E9A55",
+"0.    c #B96355",
+"a.    c #A65777",
+"b.    c #7A5575",
+"c.    c #3D0B1A",
+"d.    c #895136",
+"e.    c #777777",
+"f.    c #949494",
+"g.    c #6E3114",
+"h.    c #6B2404",
+"i.    c #D74607",
+"j.    c #DD4A0B",
+"k.    c #B63C06",
+"l.    c #303410",
+"m.    c #7DC55A",
+"n.    c #988E50",
+"o.    c #B16055",
+"p.    c #A74F76",
+"q.    c #8551AA",
+"r.    c #6952D1",
+"s.    c #504ECE",
+"t.    c #1E1D10",
+"u.    c #080708",
+"v.    c #3E433D",
+"w.    c #327F2E",
+"x.    c #6AD252",
+"y.    c #8AA551",
+"z.    c #A87451",
+"A.    c #B54F5E",
+"B.    c #945194",
+"C.    c #7451B8",
+"D.    c #453463",
+"E.    c #B4440F",
+"F.    c #6A6A6A",
+"G.    c #898989",
+"H.    c #856658",
+"I.    c #AF531B",
+"J.    c #778051",
+"K.    c #AC7751",
+"L.    c #B45265",
+"M.    c #965299",
+"N.    c #7653C9",
+"O.    c #5F53D1",
+"P.    c #463D8C",
+"Q.    c #471702",
+"R.    c #9F3609",
+"S.    c #1B2318",
+"T.    c #488A36",
+"U.    c #7EBE53",
+"V.    c #9C8950",
+"W.    c #B25B57",
+"X.    c #A3507D",
+"Y.    c #8151B3",
+"Z.    c #604DC4",
+"`.    c #4D3A7A",
+" +    c #75594C",
+".+    c #7C7C7C",
+"++    c #908985",
+"@+    c #692303",
+"#+    c #DF4A0D",
+"$+    c #81391A",
+"%+    c #6F3F3E",
+"&+    c #7B3B5D",
+"*+    c #6A418B",
+"=+    c #5B4090",
+"-+    c #573A6F",
+";+    c #8E3A1F",
+">+    c #88340D",
+",+    c #626E3E",
+"'+    c #95A65C",
+")+    c #AE6F52",
+"!+    c #AE526B",
+"~+    c #8F519D",
+"{+    c #7152C8",
+"]+    c #534AC5",
+"^+    c #623A6B",
+"/+    c #9E4922",
+"(+    c #6F6F6F",
+"_+    c #8E8E8E",
+":+    c #7A4C37",
+"<+    c #D9470A",
+"[+    c #BE4108",
+"}+    c #B34014",
+"|+    c #A13F2B",
+"1+    c #813424",
+"2+    c #A53906",
+"3+    c #C04107",
+"4+    c #BF4107",
+"5+    c #873F18",
+"6+    c #7E5A45",
+"7+    c #9A5153",
+"8+    c #934A7C",
+"9+    c #7A4FB2",
+"0+    c #6A58D5",
+"a+    c #493D91",
+"b+    c #6B2D2D",
+"c+    c #6E6059",
+"d+    c #828282",
+"e+    c #8E7F78",
+"f+    c #DA480A",
+"g+    c #B23D06",
+"h+    c #9A391B",
+"i+    c #8F3C34",
+"j+    c #733755",
+"k+    c #643F81",
+"l+    c #362052",
+"m+    c #792D1F",
+"n+    c #B73E08",
+"o+    c #934D2C",
+"p+    c #757575",
+"q+    c #929292",
+"r+    c #D94708",
+"s+    c #686868",
+"t+    c #878787",
+"u+    c #846558",
+"v+    c #E44D0F",
+"w+    c #7F5541",
+"x+    c #7A7A7A",
+"y+    c #8F8784",
+"z+    c #DB490B",
+"A+    c #6E6E6E",
+"B+    c #8C8C8C",
+"C+    c #7F5948",
+"D+    c #6D5F58",
+"E+    c #808080",
+"F+    c #8D7E78",
+"G+    c #D64608",
+"H+    c #CE4407",
+"I+    c #737373",
+"J+    c #909090",
+"K+    c #743E26",
+"L+    c #D34507",
+"M+    c #70625C",
+"N+    c #858585",
+"O+    c #836558",
+"P+    c #895137",
+"Q+    c #797979",
+"R+    c #8E8783",
+"S+    c #6F3114",
+"T+    c #6C6C6C",
+"U+    c #7E5948",
+"V+    c #7D7D7D",
+"W+    c #8B7C76",
+"X+    c #D24407",
+"Y+    c #733D25",
+"Z+    c #494949",
+"`+    c #414141",
+" @    c #9F7561",
+".@    c #875D49",
+"+@    c #A04B24",
+"@@    c #6F615A",
+"#@    c #887268",
+"$@    c #4B4B4B",
+"%@    c #484848",
+"&@    c #3E3E3E",
+"*@    c #8D8D8D",
+"=@    c #747474",
+"-@    c #707070",
+";@    c #696969",
+">@    c #825844",
+",@    c #815643",
+"'@    c #9F4A23",
+")@    c #884F35",
+"!@    c #444444",
+"~@    c #ACACAC",
+"{@    c #A0A0A0",
+"]@    c #979797",
+"^@    c #888888",
+"/@    c #818181",
+"(@    c #7F5441",
+"_@    c #9D4821",
+":@    c #7D5847",
+"<@    c #4A4A4A",
+"[@    c #C7C7C7",
+"}@    c #C3C3C3",
+"|@    c #BEBEBE",
+"1@    c #BABABA",
+"2@    c #B5B5B5",
+"3@    c #AFAFAF",
+"4@    c #A8A8A8",
+"5@    c #9F9F9F",
+"6@    c #646464",
+"7@    c #7D533F",
+"8@    c #9B471F",
+"9@    c #703115",
+"0@    c #8B6452",
+"a@    c #A38B80",
+"b@    c #CECECE",
+"c@    c #CDCDCD",
+"d@    c #CBCBCB",
+"e@    c #5D5D5D",
+"f@    c #794229",
+"g@    c #98786A",
+"h@    c #B1A19A",
+"i@    c #CFCFCF",
+"j@    c #919191",
+"k@    c #83543E",
+"l@    c #A58D82",
+"m@    c #C0B8B5",
+"n@    c #D1D1D1",
+"o@    c #D0D0D0",
+"p@    c #9B9B9B",
+"q@    c #713216",
+"r@    c #8D6553",
+"s@    c #A3A3A3",
+"t@    c #825C4A",
+"u@    c #B2A29B",
+"v@    c #9E9692",
+"w@    c #7E4F39",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                              . + @ # # $ $ $ $ $ $ $                           ",
+"                                            % & * # # # # # # # # # # # # # # # # # # # # =     ",
+"                                            - ; > # # # # # # # # # # # # # # # # # # # #       ",
+"                                          , ' ) # # # # # # # # # # # # # # # # # # # # !       ",
+"                                        ~ { ] # # = ^ / # # # # # # # # # # # # # # # (         ",
+"                                      _ : < # / [ } | 1 # 2 3 4 # # # # # # # # # # # 5         ",
+"                                    6 : ; 7 8 9 0 a b c d e f g h i # # # # # # # # j k         ",
+"                                    l m n o p q r s t u v w x y z A # # # # # # # # B C         ",
+"                                  D E F G H I J K L M N O P Q R S T U $ # # # # # V W X Y Z     ",
+"                                ` +  ...+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.# # # # # {.].^.Z       ",
+"                              /.: (._.:.<.[.}.|.1.2.3.4.5.6.7.8.9.0.a.b.c.# # # d.e.f.g.h.      ",
+"                            i.: j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.# # E.F.G.H.Z         ",
+"                            l ' ) # I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`.# #  +.+++@+          ",
+"                          #++ @ # # # $+%+&+*+=+-+;+# # >+,+'+)+!+~+{+]+^+# /+(+_+:+Z           ",
+"                        <+& * # # # # # [+}+|+1+2+# 3+# 4+5+6+7+8+9+0+a+b+# c+d+e+Z             ",
+"                      f+: ; > # # # # # # # # # # # # # # g+h+i+j+k+l+m+n+o+p+q+g.h.            ",
+"                    r++ ' ) # # # # # # # # # # # # # # # # # # # # # # E.s+t+u+Z               ",
+"                    v+{ ] # # # # # # # # # # # # # # # # # # # # # # # w+x+y+@+h.              ",
+"                  z+: < # # # # # # # # # # # # # # # # # # # # # # # j A+B+C+Z                 ",
+"                <+: ; > # # # # # # # # # # # # # # # # # # # # # # # D+E+F+Z                   ",
+"              G+: j.H+# # # # # # # # # # # # # # # # # # # # # # # o+I+J+K+Z                   ",
+"            r+{ v+L+# # # # # # # # # # # # # # # # # # # # # # # E.M+N+O+Z                     ",
+"            ' + @ # # # # # # # # # # # # # # # # # # # # # # # # P+Q+R+S+h.                    ",
+"          ; : ; > # # # # # # # # # # # # # # # # # # # # # # # j T+G.U+Z                       ",
+"        * & f+> # # # # # # # # # # # # # # # # # # # # # # # # B V+W+@+h.                      ",
+"      X++ ' ) # # # # # # # # # # # # # # # # # # # # # # # # /+W X Y+Z                         ",
+"    h.Z Z+`+ @.@+@/+# # # # # # # # # # # # # # # # # # # # # @@].#@Z h.                        ",
+"    h.$@%@&@*@.+=@-@T+;@>@,@'@/+# # # # # # # # # # # # # # )@p+q+g.h.                          ",
+"    h.$@Z+!@~@{@]@X ^@/@V+Q+=@-@T+;@,@(@/+_@# # # # # # # E.;@t+:@Z                             ",
+"    h.h.$@<@[@}@|@1@2@3@4@5@]@X ^@/@V+Q+=@-@T+6@,@7@/+8@#  +.+++@+h.                            ",
+"      h.h.h.9@0@a@b@c@d@[@}@|@1@2@3@4@5@]@X ^@/@V+Q+=@W e@-@_+Y+Z                               ",
+"              h.h.h.f@g@h@i@b@b@c@d@[@}@|@1@2@3@4@5@]@j@p+t+#@Z h.                              ",
+"                    h.h.h.h.k@l@m@n@o@i@b@b@c@d@[@}@|@1@f.p@S+h.                                ",
+"                            h.h.h.q@r@l@n@n@n@n@o@i@b@b@s@t@h.h.                                ",
+"                                  h.h.h.h.f@g@u@n@n@n@n@v@h.h.                                  ",
+"                                        h.h.h.h.h.k@l@m@w@h.                                    ",
+"                                                h.h.h.h.h.h.                                    ",
+"                                                      h.h.                                      ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                "};
diff --git a/src/icons/config.xpm b/src/icons/config.xpm
new file mode 100644 (file)
index 0000000..07be4b0
--- /dev/null
@@ -0,0 +1,443 @@
+/* XPM */
+static char * config_xpm[] = {
+"48 48 392 2",
+"      c None",
+".     c #000000",
+"+     c #CFCFCF",
+"@     c #FFFFFF",
+"#     c #070707",
+"$     c #2F2F2F",
+"%     c #383838",
+"&     c #313131",
+"*     c #0A0A0A",
+"=     c #0C0C0C",
+"-     c #202020",
+";     c #303030",
+">     c #353535",
+",     c #2C2C2C",
+"'     c #1F1F1F",
+")     c #494949",
+"!     c #111111",
+"~     c #090909",
+"{     c #151515",
+"]     c #050505",
+"^     c #060606",
+"/     c #1D1D1D",
+"(     c #212121",
+"_     c #191919",
+":     c #010101",
+"<     c #161616",
+"[     c #1C1C1C",
+"}     c #040404",
+"|     c #030303",
+"1     c #0E0D0D",
+"2     c #474243",
+"3     c #504C4D",
+"4     c #3B3839",
+"5     c #040303",
+"6     c #323232",
+"7     c #4C4C4C",
+"8     c #151414",
+"9     c #010001",
+"0     c #020001",
+"a     c #0D0304",
+"b     c #401113",
+"c     c #3A1416",
+"d     c #240F11",
+"e     c #0A0102",
+"f     c #100D0D",
+"g     c #141414",
+"h     c #131313",
+"i     c #0B0507",
+"j     c #0E0006",
+"k     c #16000B",
+"l     c #252525",
+"m     c #201818",
+"n     c #1A0705",
+"o     c #3E2218",
+"p     c #484123",
+"q     c #475328",
+"r     c #3E4F24",
+"s     c #404523",
+"t     c #443B23",
+"u     c #4A3023",
+"v     c #532924",
+"w     c #582B2C",
+"x     c #583137",
+"y     c #4C3238",
+"z     c #331C28",
+"A     c #203910",
+"B     c #3E5D32",
+"C     c #61934B",
+"D     c #190B06",
+"E     c #332514",
+"F     c #445E36",
+"G     c #659A4D",
+"H     c #7DBC57",
+"I     c #7FB150",
+"J     c #8E9B50",
+"K     c #9C8450",
+"L     c #AA6C50",
+"M     c #B35D50",
+"N     c #B0605D",
+"O     c #9D666A",
+"P     c #634C52",
+"Q     c #3D2937",
+"R     c #270E22",
+"S     c #0E1D00",
+"T     c #325623",
+"U     c #5E9F4F",
+"V     c #5DB34C",
+"W     c #69BC4F",
+"X     c #3D4826",
+"Y     c #629C4F",
+"Z     c #5DB54C",
+"`     c #6BBC50",
+" .    c #7BB952",
+"..    c #87A951",
+"+.    c #959251",
+"@.    c #A37B51",
+"#.    c #AF6451",
+"$.    c #B35757",
+"%.    c #AD5468",
+"&.    c #9E567D",
+"*.    c #864F89",
+"=.    c #795681",
+"-.    c #624D65",
+";.    c #1E0A1E",
+">.    c #29002D",
+",.    c #37003E",
+"'.    c #325426",
+").    c #4A873F",
+"!.    c #66CB5A",
+"~.    c #66CD53",
+"{.    c #6FC451",
+"].    c #7DB551",
+"^.    c #8BA351",
+"/.    c #998D51",
+"(.    c #A77551",
+"_.    c #B45E51",
+":.    c #B2555C",
+"<.    c #AA516E",
+"[.    c #9D5187",
+"}.    c #8E519D",
+"|.    c #8459A7",
+"1.    c #66CD52",
+"2.    c #71C251",
+"3.    c #7FB351",
+"4.    c #8DA151",
+"5.    c #9B8A51",
+"6.    c #A97251",
+"7.    c #B55C52",
+"8.    c #B2545E",
+"9.    c #A95171",
+"0.    c #9B5189",
+"a.    c #8C51A0",
+"b.    c #835BA7",
+"c.    c #705994",
+"d.    c #443854",
+"e.    c #33143D",
+"f.    c #2C0033",
+"g.    c #162F00",
+"h.    c #4B8342",
+"i.    c #5FBC59",
+"j.    c #5CD851",
+"k.    c #68CC51",
+"l.    c #75BE51",
+"m.    c #83AE51",
+"n.    c #919B51",
+"o.    c #9F8451",
+"p.    c #AD6C51",
+"q.    c #B85652",
+"r.    c #B15262",
+"s.    c #A65177",
+"t.    c #975190",
+"u.    c #8951A5",
+"v.    c #7B51B7",
+"w.    c #6ACA51",
+"x.    c #77BC51",
+"y.    c #84AB51",
+"z.    c #929951",
+"A.    c #A18151",
+"B.    c #AE6951",
+"C.    c #B85453",
+"D.    c #B05265",
+"E.    c #A4517A",
+"F.    c #965192",
+"G.    c #8751A8",
+"H.    c #7951B9",
+"I.    c #6F56BA",
+"J.    c #6C6698",
+"K.    c #3C2950",
+"L.    c #1D0024",
+"M.    c #0B1800",
+"N.    c #419A3C",
+"O.    c #5BD455",
+"P.    c #60D451",
+"Q.    c #6CC751",
+"R.    c #7AB851",
+"S.    c #88A651",
+"T.    c #969251",
+"U.    c #A47A51",
+"V.    c #B06552",
+"W.    c #B85354",
+"X.    c #AD5169",
+"Y.    c #9F5181",
+"Z.    c #915199",
+"`.    c #8451AD",
+" +    c #7751BD",
+".+    c #6B52C8",
+"++    c #695AC5",
+"@+    c #8251AF",
+"#+    c #7551BF",
+"$+    c #6B53C8",
+"%+    c #685BC4",
+"&+    c #312458",
+"*+    c #0E0013",
+"=+    c #040900",
+"-+    c #3D9D39",
+";+    c #5BD952",
+">+    c #65CF51",
+",+    c #71C151",
+"'+    c #7FB151",
+")+    c #8E9F51",
+"!+    c #9C8951",
+"~+    c #A97151",
+"{+    c #B25E54",
+"]+    c #B5525C",
+"^+    c #A85173",
+"/+    c #9A518B",
+"(+    c #8B51A2",
+"_+    c #7E51B4",
+":+    c #7151C3",
+"<+    c #6652CF",
+"[+    c #5F55D6",
+"}+    c #7D51B6",
+"|+    c #7051C5",
+"1+    c #6552D0",
+"2+    c #5E55D7",
+"3+    c #282159",
+"4+    c #050008",
+"5+    c #000100",
+"6+    c #3C9A38",
+"7+    c #5DD650",
+"8+    c #77BB51",
+"9+    c #85AA51",
+"0+    c #939751",
+"a+    c #A27F51",
+"b+    c #AE6851",
+"c+    c #B45856",
+"d+    c #B05165",
+"e+    c #A3517D",
+"f+    c #945194",
+"g+    c #8551AB",
+"h+    c #7851BB",
+"i+    c #6C51C9",
+"j+    c #6051D5",
+"k+    c #5652DD",
+"l+    c #28276B",
+"m+    c #131212",
+"n+    c #5F52D6",
+"o+    c #5452DF",
+"p+    c #212058",
+"q+    c #000001",
+"r+    c #409738",
+"s+    c #62D250",
+"t+    c #6EC551",
+"u+    c #7CB551",
+"v+    c #998E51",
+"w+    c #B36051",
+"x+    c #B65259",
+"y+    c #AC516E",
+"z+    c #9D5186",
+"A+    c #7F51B1",
+"B+    c #7351C0",
+"C+    c #6752CD",
+"D+    c #5D53D9",
+"E+    c #5352E0",
+"F+    c #27276C",
+"G+    c #5C53DA",
+"H+    c #5252E1",
+"I+    c #1F2059",
+"J+    c #060900",
+"K+    c #47943A",
+"L+    c #69CB53",
+"M+    c #73BF51",
+"N+    c #82AF51",
+"O+    c #909A51",
+"P+    c #9E8451",
+"Q+    c #AB6D51",
+"R+    c #B35B54",
+"S+    c #B25160",
+"T+    c #97518F",
+"U+    c #6E51C5",
+"V+    c #6352D2",
+"W+    c #5953DC",
+"X+    c #5854DD",
+"Y+    c #30296A",
+"Z+    c #110808",
+"`+    c #222121",
+" @    c #25215D",
+".@    c #05000A",
+"+@    c #0F1700",
+"@@    c #4E8A40",
+"#@    c #6FBC57",
+"$@    c #79B951",
+"%@    c #87A851",
+"&@    c #B06451",
+"*@    c #B35759",
+"=@    c #AE5168",
+"-@    c #A05181",
+";@    c #915198",
+">@    c #8351AC",
+",@    c #7651BE",
+"'@    c #6A51CB",
+")@    c #5E52D7",
+"!@    c #5654DD",
+"~@    c #5E58CE",
+"{@    c #3C2B61",
+"]@    c #170100",
+"^@    c #030000",
+"/@    c #2E235E",
+"(@    c #0D0019",
+"_@    c #1C2A00",
+":@    c #537249",
+"<@    c #729F5F",
+"[@    c #B65B51",
+"}@    c #B3535E",
+"|@    c #7E51B3",
+"1@    c #6452D0",
+"2@    c #5455DA",
+"3@    c #655DA9",
+"4@    c #4D2F4B",
+"5@    c #330300",
+"6@    c #324124",
+"7@    c #546942",
+"8@    c #85A065",
+"9@    c #929555",
+"0@    c #AE6A51",
+"a@    c #B75653",
+"b@    c #B05264",
+"c@    c #A3517B",
+"d@    c #955193",
+"e@    c #7A51B9",
+"f@    c #6D51C8",
+"g@    c #6051D4",
+"h@    c #6157D2",
+"i@    c #6357B6",
+"j@    c #453155",
+"k@    c #3B1C2A",
+"l@    c #121600",
+"m@    c #3A4128",
+"n@    c #6A7254",
+"o@    c #7E764E",
+"p@    c #987051",
+"q@    c #B06457",
+"r@    c #B65458",
+"s@    c #AC516C",
+"t@    c #9D5184",
+"u@    c #8F519C",
+"v@    c #8251AE",
+"w@    c #7852BD",
+"x@    c #6F53C6",
+"y@    c #5B4CBB",
+"z@    c #594AA0",
+"A@    c #5A4376",
+"B@    c #2E121E",
+"C@    c #8D519F",
+"D@    c #8151B0",
+"E@    c #21200A",
+"F@    c #443C36",
+"G@    c #7D5554",
+"H@    c #B06264",
+"I@    c #B25261",
+"J@    c #A75074",
+"K@    c #99508D",
+"L@    c #8950A5",
+"M@    c #7E4FB3",
+"N@    c #7A53BC",
+"O@    c #7A59BC",
+"P@    c #544376",
+"Q@    c #392537",
+"R@    c #270807",
+"S@    c #8850A7",
+"T@    c #7C4FB5",
+"U@    c #382D16",
+"V@    c #452F1E",
+"W@    c #4E2C24",
+"X@    c #472123",
+"Y@    c #3F1E2A",
+"Z@    c #371D33",
+"`@    c #311D3C",
+" #    c #311D41",
+".#    c #372044",
+"+#    c #422443",
+"@#    c #431D29",
+"##    c #3C1619",
+"$#    c #3D1D2C",
+"%#    c #361D34",
+"&#    c #311D3D",
+"*#    c #301D45",
+"=#    c #331E4F",
+"-#    c #381F55",
+";#    c #312500",
+">#    c #261B00",
+",#    c #170E00",
+"'#    c #0B0600",
+")#    c #040200",
+"!#    c #070100",
+"~#    c #120300",
+"{#    c #210600",
+"]#    c #390800",
+"^#    c #030002",
+"/#    c #040006",
+"(#    c #0C0011",
+"_#    c #150020",
+"                                                                                                ",
+"                      . . . . . .                                                               ",
+"                      . . . . . .                                                               ",
+"                  . . + + + + + + . .                                                           ",
+"                  . . + + + + + + . .                                                           ",
+"                      . . + + + + + + . .                                                       ",
+"                      . . + + + + + + . .                                                       ",
+"                          . . + + + + + + . .                                                   ",
+"                          . . + + + + + + . .                                                   ",
+"      . .                     . . + + + + . .                                                   ",
+"      . .                     . . + + + + . .                                                   ",
+"  . . + + . .             . . + + + + @ @ . .                                                   ",
+"  . . + + . .             . . + + + + @ @ . .           . . .                                   ",
+"  . . + + + + . .     . . + + + + + + + + . .       . # $ % & * . .                             ",
+"  . . + + + + . .     . . + + + + + + + + . . .   . = - ; > , # . .                             ",
+"  . . + + + + + + . . + + + + @ @ + + + + . . .   . ' ) ! . . . . . . . .                       ",
+"  . . + + + + + + . . + + + + @ @ + + + + . . . . . ~ { ] . . . . . . . . . .                   ",
+"      . . + + + + + + + + + + + + @ @ + + + + . . * . . . . ^ / ( _ : < ( - ~ .                 ",
+"      . . + + + + + + + + + + + + @ @ + + + + . . [ } : ] | 1 2 3 4 5 6 7 ) 8 9 0               ",
+"          . . + + + + @ @ + + + + + + @ @ + + + + . . ] & ( a b c d e f g h i j k               ",
+"          . . + + + + @ @ + + + + + + @ @ + + + + . . l , m n o p q r s t u v w x y z           ",
+"        A B C . . . . . . . . . . + + + + @ @ + + + + . . D E F G H I J K L M N O P Q R         ",
+"    S T U V W . . . . . . . . . . + + + + @ @ + + + + . . X Y Z `  ...+.@.#.$.%.&.*.=.-.;.>.,.  ",
+"    '.).!.~.{.].^./.(._.:.<.[.}.|.. . + + + + @ @ + + + + . . 1.2.3.4.5.6.7.8.9.0.a.b.c.d.e.f.  ",
+"  g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.. . + + + + @ @ + + + + . . w.x.y.z.A.B.C.D.E.F.G.H.I.J.K.L.  ",
+"  M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+++. . + + + + @ @ + + + + . . . . . . . . . . @+#+$+%+&+*+  ",
+"  =+-+;+>+,+'+)+!+~+{+]+^+/+(+_+:+<+[+. . + + + + @ @ + + + + . . . . . . . . . . }+|+1+2+3+4+  ",
+"  5+6+7+w.8+9+0+a+b+c+d+e+f+g+h+i+j+k+l+m+. . + + + + @ @ + + + + + + @ @ + + + + . . n+o+p+q+  ",
+"  5+r+s+t+u+^.v+(.w+x+y+z+}.A+B+C+D+E+F+m+. . + + + + @ @ + + + + + + @ @ + + + + . . G+H+I+q+  ",
+"  J+K+L+M+N+O+P+Q+R+S+s.T+u.v.U+V+W+X+Y+Z+`+< . . + + + + @ @ + + + + + + + + + + + + . .  @.@  ",
+"  +@@@#@$@%@T.@.&@*@=@-@;@>@,@'@)@!@~@{@]@^@  . . + + + + @ @ + + + + + + + + + + + + . . /@(@  ",
+"  _@:@<@3.4.5.6.[@}@9.0.a.|@:+1@W+2@3@4@5@        . . + + + + @ @ + + + + . . + + + + + + . .   ",
+"    6@7@8@9@A.0@a@b@c@d@G.e@f@g@h@i@j@k@          . . + + + + @ @ + + + + . . + + + + + + . .   ",
+"    l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@            . . + + + + + + + + . . C@D@. . + + + + . .   ",
+"        E@F@G@H@I@J@K@L@M@N@O@P@Q@R@              . . + + + + + + + + . . S@T@. . + + + + . .   ",
+"          U@V@W@X@Y@Z@`@ #.#+#@###                . . @ @ + + + + . . $#%#&#*#=#-#. . + + . .   ",
+"          ;#>#,#'#)#. . !#~#{#]#                  . . @ @ + + + + . . ^#. . /#(#_#. . + + . .   ",
+"                                                  . . + + + + . .                     . .       ",
+"                                                  . . + + + + . .                     . .       ",
+"                                                  . . + + + + + + . .                           ",
+"                                                  . . + + + + + + . .                           ",
+"                                                      . . + + + + + + . .                       ",
+"                                                      . . + + + + + + . .                       ",
+"                                                          . . + + + + + + . .                   ",
+"                                                          . . + + + + + + . .                   ",
+"                                                              . . . . . .                       ",
+"                                                              . . . . . .                       ",
+"                                                                                                "};
diff --git a/src/icons/dialog.xpm b/src/icons/dialog.xpm
new file mode 100644 (file)
index 0000000..b5e27df
--- /dev/null
@@ -0,0 +1,705 @@
+/* XPM */
+static char * dialog_xpm[] = {
+"48 48 654 2",
+"      c None",
+".     c #000000",
+"+     c #030200",
+"@     c #0A0A0A",
+"#     c #313131",
+"$     c #383838",
+"%     c #302F2F",
+"&     c #0A0907",
+"*     c #020100",
+"=     c #070707",
+"-     c #2F2F2F",
+";     c #2C2C2C",
+">     c #353535",
+",     c #303030",
+"'     c #202020",
+")     c #0C0C0C",
+"!     c #111111",
+"~     c #494949",
+"{     c #1F1F1F",
+"]     c #050505",
+"^     c #151515",
+"/     c #090909",
+"(     c #191919",
+"_     c #212121",
+":     c #131313",
+"<     c #141414",
+"[     c #060606",
+"}     c #1D1D1D",
+"|     c #010101",
+"1     c #161616",
+"2     c #020500",
+"3     c #010200",
+"4     c #010100",
+"5     c #2B2B2B",
+"6     c #4C4C4C",
+"7     c #1B1B1B",
+"8     c #1C1B1B",
+"9     c #4E4E4C",
+"0     c #4D4D4C",
+"a     c #030303",
+"b     c #1C1C1C",
+"c     c #040404",
+"d     c #0E0D0D",
+"e     c #474243",
+"f     c #504C4D",
+"g     c #3B3839",
+"h     c #040303",
+"i     c #323232",
+"j     c #151414",
+"k     c #010001",
+"l     c #020001",
+"m     c #122100",
+"n     c #0B1400",
+"o     c #060900",
+"p     c #0D0E0B",
+"q     c #0A0A07",
+"r     c #111007",
+"s     c #252214",
+"t     c #191814",
+"u     c #0B0B0B",
+"v     c #080808",
+"w     c #343434",
+"x     c #1E1E1E",
+"y     c #0E0E0E",
+"z     c #3A3A3A",
+"A     c #252525",
+"B     c #262626",
+"C     c #0D0304",
+"D     c #401113",
+"E     c #3A1416",
+"F     c #240F11",
+"G     c #0A0102",
+"H     c #100D0D",
+"I     c #0B0507",
+"J     c #0E0006",
+"K     c #16000B",
+"L     c #324920",
+"M     c #3D5D27",
+"N     c #406327",
+"O     c #3C5623",
+"P     c #3E4923",
+"Q     c #433C23",
+"R     c #4A3123",
+"S     c #512D23",
+"T     c #563127",
+"U     c #553A2F",
+"V     c #302622",
+"W     c #191410",
+"X     c #110C06",
+"Y     c #292826",
+"Z     c #292929",
+"`     c #272727",
+" .    c #2E2E2E",
+"..    c #121212",
+"+.    c #201818",
+"@.    c #1A0705",
+"#.    c #3E2218",
+"$.    c #484123",
+"%.    c #475328",
+"&.    c #3E4F24",
+"*.    c #404523",
+"=.    c #443B23",
+"-.    c #4A3023",
+";.    c #532924",
+">.    c #582B2C",
+",.    c #583137",
+"'.    c #4C3238",
+").    c #331C28",
+"!.    c #203910",
+"~.    c #3E5D32",
+"{.    c #61934B",
+"].    c #7DBE58",
+"^.    c #7FB351",
+"/.    c #8C9E50",
+"(.    c #9A8750",
+"_.    c #A86E50",
+":.    c #B25F50",
+"<.    c #B25E5B",
+"[.    c #A4696D",
+"}.    c #6A4F55",
+"|.    c #423333",
+"1.    c #25180F",
+"2.    c #0A0603",
+"3.    c #282726",
+"4.    c #393939",
+"5.    c #434343",
+"6.    c #131010",
+"7.    c #190B06",
+"8.    c #332514",
+"9.    c #445E36",
+"0.    c #659A4D",
+"a.    c #7DBC57",
+"b.    c #7FB150",
+"c.    c #8E9B50",
+"d.    c #9C8450",
+"e.    c #AA6C50",
+"f.    c #B35D50",
+"g.    c #B0605D",
+"h.    c #9D666A",
+"i.    c #634C52",
+"j.    c #3D2937",
+"k.    c #270E22",
+"l.    c #0E1D00",
+"m.    c #325623",
+"n.    c #5E9F4F",
+"o.    c #5DB34C",
+"p.    c #69BC4F",
+"q.    c #7ABB53",
+"r.    c #85AB51",
+"s.    c #939551",
+"t.    c #A17E51",
+"u.    c #AE6751",
+"v.    c #B35956",
+"w.    c #AE5465",
+"x.    c #A1567C",
+"y.    c #895088",
+"z.    c #7B5681",
+"A.    c #685564",
+"B.    c #251714",
+"C.    c #130C09",
+"D.    c #0D0D0D",
+"E.    c #110F0F",
+"F.    c #180404",
+"G.    c #3D4826",
+"H.    c #629C4F",
+"I.    c #5DB54C",
+"J.    c #6BBC50",
+"K.    c #7BB952",
+"L.    c #87A951",
+"M.    c #959251",
+"N.    c #A37B51",
+"O.    c #AF6451",
+"P.    c #B35757",
+"Q.    c #AD5468",
+"R.    c #9E567D",
+"S.    c #864F89",
+"T.    c #795681",
+"U.    c #624D65",
+"V.    c #1E0A1E",
+"W.    c #29002D",
+"X.    c #37003E",
+"Y.    c #325426",
+"Z.    c #4A873F",
+"`.    c #66CB5A",
+" +    c #66CD53",
+".+    c #6FC451",
+"++    c #7DB551",
+"@+    c #8BA351",
+"#+    c #998D51",
+"$+    c #A77551",
+"%+    c #B45E51",
+"&+    c #B2555C",
+"*+    c #AA516E",
+"=+    c #9D5187",
+"-+    c #8E519D",
+";+    c #8459A7",
+">+    c #765E9B",
+",+    c #4C4054",
+"'+    c #2C1E1F",
+")+    c #1B0E09",
+"!+    c #262524",
+"~+    c #101010",
+"{+    c #181818",
+"]+    c #060704",
+"^+    c #333B24",
+"/+    c #538843",
+"(+    c #66CB59",
+"_+    c #66CD52",
+":+    c #71C251",
+"<+    c #8DA151",
+"[+    c #9B8A51",
+"}+    c #A97251",
+"|+    c #B55C52",
+"1+    c #B2545E",
+"2+    c #A95171",
+"3+    c #9B5189",
+"4+    c #8C51A0",
+"5+    c #835BA7",
+"6+    c #705994",
+"7+    c #443854",
+"8+    c #33143D",
+"9+    c #2C0033",
+"0+    c #162F00",
+"a+    c #4B8342",
+"b+    c #5FBC59",
+"c+    c #5CD851",
+"d+    c #68CC51",
+"e+    c #75BE51",
+"f+    c #83AE51",
+"g+    c #919B51",
+"h+    c #9F8451",
+"i+    c #AD6C51",
+"j+    c #B85652",
+"k+    c #B15262",
+"l+    c #A65177",
+"m+    c #975190",
+"n+    c #8951A5",
+"o+    c #7B51B7",
+"p+    c #7054BE",
+"q+    c #6D649D",
+"r+    c #4B3847",
+"s+    c #32180F",
+"t+    c #434140",
+"u+    c #2C2A2A",
+"v+    c #0C0F08",
+"w+    c #4D844A",
+"x+    c #5FC058",
+"y+    c #5ED751",
+"z+    c #6ACA51",
+"A+    c #77BC51",
+"B+    c #84AB51",
+"C+    c #929951",
+"D+    c #A18151",
+"E+    c #AE6951",
+"F+    c #B85453",
+"G+    c #B05265",
+"H+    c #A4517A",
+"I+    c #965192",
+"J+    c #8751A8",
+"K+    c #7951B9",
+"L+    c #6F56BA",
+"M+    c #6C6698",
+"N+    c #3C2950",
+"O+    c #1D0024",
+"P+    c #0B1800",
+"Q+    c #419A3C",
+"R+    c #5BD455",
+"S+    c #60D451",
+"T+    c #6CC751",
+"U+    c #7AB851",
+"V+    c #88A651",
+"W+    c #969251",
+"X+    c #A47A51",
+"Y+    c #B06552",
+"Z+    c #B85354",
+"`+    c #AD5169",
+" @    c #9F5181",
+".@    c #915199",
+"+@    c #8451AD",
+"@@    c #7751BD",
+"#@    c #6B52C8",
+"$@    c #695AC5",
+"%@    c #3E2E5E",
+"&@    c #150603",
+"*@    c #0E0D0C",
+"=@    c #0F0808",
+"-@    c #181208",
+";@    c #4AA644",
+">@    c #5CD454",
+",@    c #61D251",
+"'@    c #6EC551",
+")@    c #7CB651",
+"!@    c #8AA451",
+"~@    c #989051",
+"{@    c #A67751",
+"]@    c #B16252",
+"^@    c #B85256",
+"/@    c #AB516C",
+"(@    c #9D5184",
+"_@    c #8F519B",
+":@    c #8251AF",
+"<@    c #7551BF",
+"[@    c #6B53C8",
+"}@    c #685BC4",
+"|@    c #312458",
+"1@    c #0E0013",
+"2@    c #040900",
+"3@    c #3D9D39",
+"4@    c #5BD952",
+"5@    c #65CF51",
+"6@    c #71C151",
+"7@    c #7FB151",
+"8@    c #8E9F51",
+"9@    c #9C8951",
+"0@    c #A97151",
+"a@    c #B25E54",
+"b@    c #B5525C",
+"c@    c #A85173",
+"d@    c #9A518B",
+"e@    c #8B51A2",
+"f@    c #7E51B4",
+"g@    c #7151C3",
+"h@    c #6652CF",
+"i@    c #5F55D6",
+"j@    c #312A67",
+"k@    c #110B09",
+"l@    c #282827",
+"m@    c #1E1A1A",
+"n@    c #111307",
+"o@    c #46AE40",
+"p@    c #5CD752",
+"q@    c #66CD51",
+"r@    c #73C051",
+"s@    c #81AF51",
+"t@    c #909C51",
+"u@    c #9E8651",
+"v@    c #AB6E51",
+"w@    c #B25C55",
+"x@    c #B4515E",
+"y@    c #A65176",
+"z@    c #98518E",
+"A@    c #7D51B6",
+"B@    c #7051C5",
+"C@    c #6552D0",
+"D@    c #5E55D7",
+"E@    c #282159",
+"F@    c #050008",
+"G@    c #000100",
+"H@    c #3C9A38",
+"I@    c #5DD650",
+"J@    c #77BB51",
+"K@    c #85AA51",
+"L@    c #939751",
+"M@    c #A27F51",
+"N@    c #AE6851",
+"O@    c #B45856",
+"P@    c #B05165",
+"Q@    c #A3517D",
+"R@    c #945194",
+"S@    c #8551AB",
+"T@    c #7851BB",
+"U@    c #6C51C9",
+"V@    c #6051D5",
+"W@    c #5652DD",
+"X@    c #28276B",
+"Y@    c #131212",
+"Z@    c #333333",
+"`@    c #081307",
+" #    c #44AD3F",
+".#    c #5FD550",
+"+#    c #6BC851",
+"@#    c #78BA51",
+"##    c #87A851",
+"$#    c #959451",
+"%#    c #A37C51",
+"&#    c #AF6551",
+"*#    c #B35758",
+"=#    c #AF5167",
+"-#    c #A15180",
+";#    c #935197",
+">#    c #7751BC",
+",#    c #6A51CA",
+"'#    c #5F52D6",
+")#    c #5452DF",
+"!#    c #212058",
+"~#    c #000001",
+"{#    c #409738",
+"]#    c #62D250",
+"^#    c #7CB551",
+"/#    c #998E51",
+"(#    c #B36051",
+"_#    c #B65259",
+":#    c #AC516E",
+"<#    c #9D5186",
+"[#    c #7F51B1",
+"}#    c #7351C0",
+"|#    c #6752CD",
+"1#    c #5D53D9",
+"2#    c #5352E0",
+"3#    c #27276C",
+"4#    c #091307",
+"5#    c #48AA3F",
+"6#    c #64D050",
+"7#    c #70C351",
+"8#    c #7EB351",
+"9#    c #8CA051",
+"0#    c #9A8A51",
+"a#    c #A87251",
+"b#    c #B45D51",
+"c#    c #AA5171",
+"d#    c #8C519F",
+"e#    c #7E51B3",
+"f#    c #7151C1",
+"g#    c #5C53DA",
+"h#    c #5252E1",
+"i#    c #1F2059",
+"j#    c #47943A",
+"k#    c #69CB53",
+"l#    c #73BF51",
+"m#    c #82AF51",
+"n#    c #909A51",
+"o#    c #9E8451",
+"p#    c #AB6D51",
+"q#    c #B35B54",
+"r#    c #B25160",
+"s#    c #97518F",
+"t#    c #6E51C5",
+"u#    c #6352D2",
+"v#    c #5953DC",
+"w#    c #5854DD",
+"x#    c #30296A",
+"y#    c #110808",
+"z#    c #222121",
+"A#    c #1B1617",
+"B#    c #131208",
+"C#    c #50A442",
+"D#    c #6ACA53",
+"E#    c #75BD51",
+"F#    c #84AD51",
+"G#    c #929851",
+"H#    c #A08151",
+"I#    c #AD6A51",
+"J#    c #B45955",
+"K#    c #B15163",
+"L#    c #955192",
+"M#    c #8751A7",
+"N#    c #6D51C7",
+"O#    c #6152D3",
+"P#    c #5755DD",
+"Q#    c #25215D",
+"R#    c #05000A",
+"S#    c #0F1700",
+"T#    c #4E8A40",
+"U#    c #6FBC57",
+"V#    c #79B951",
+"W#    c #B06451",
+"X#    c #B35759",
+"Y#    c #AE5168",
+"Z#    c #A05181",
+"`#    c #915198",
+" $    c #8351AC",
+".$    c #7651BE",
+"+$    c #6A51CB",
+"@$    c #5E52D7",
+"#$    c #5654DD",
+"$$    c #5E58CE",
+"%$    c #3C2B61",
+"&$    c #170100",
+"*$    c #030000",
+"=$    c #0C0002",
+"-$    c #22100B",
+";$    c #589448",
+">$    c #70BC57",
+",$    c #7BB751",
+"'$    c #89A651",
+")$    c #978F51",
+"!$    c #A57851",
+"~$    c #B26151",
+"{$    c #B3565A",
+"]$    c #AC516B",
+"^$    c #9E5184",
+"/$    c #90519B",
+"($    c #6851CD",
+"_$    c #5D52D8",
+":$    c #5754DB",
+"<$    c #5F59CC",
+"[$    c #2E235E",
+"}$    c #0D0019",
+"|$    c #1C2A00",
+"1$    c #537249",
+"2$    c #729F5F",
+"3$    c #B65B51",
+"4$    c #B3535E",
+"5$    c #6452D0",
+"6$    c #5455DA",
+"7$    c #655DA9",
+"8$    c #4D2F4B",
+"9$    c #330300",
+"0$    c #360D10",
+"a$    c #5E7253",
+"b$    c #74A25D",
+"c$    c #81B051",
+"d$    c #8F9E51",
+"e$    c #9D8751",
+"f$    c #AB6F51",
+"g$    c #B85851",
+"h$    c #B25360",
+"i$    c #A85174",
+"j$    c #9A518C",
+"k$    c #8A51A3",
+"l$    c #7C51B5",
+"m$    c #6F51C5",
+"n$    c #6353D2",
+"o$    c #5853DD",
+"p$    c #5756D4",
+"q$    c #675EA3",
+"r$    c #392559",
+"s$    c #1A002E",
+"t$    c #324124",
+"u$    c #546942",
+"v$    c #85A065",
+"w$    c #929555",
+"x$    c #AE6A51",
+"y$    c #B75653",
+"z$    c #B05264",
+"A$    c #A3517B",
+"B$    c #955193",
+"C$    c #7A51B9",
+"D$    c #6D51C8",
+"E$    c #6051D4",
+"F$    c #6157D2",
+"G$    c #6357B6",
+"H$    c #453155",
+"I$    c #3B1C2A",
+"J$    c #3B322B",
+"K$    c #5E6A49",
+"L$    c #869F63",
+"M$    c #949453",
+"N$    c #A27E51",
+"O$    c #AF6752",
+"P$    c #AE5267",
+"Q$    c #A1517E",
+"R$    c #935196",
+"S$    c #8651AA",
+"T$    c #6B51CA",
+"U$    c #5F51D6",
+"V$    c #6258D0",
+"W$    c #5D52AD",
+"X$    c #382B57",
+"Y$    c #2A1842",
+"Z$    c #121600",
+"`$    c #3A4128",
+" %    c #6A7254",
+".%    c #7E764E",
+"+%    c #987051",
+"@%    c #B06457",
+"#%    c #B65458",
+"$%    c #AC516C",
+"%%    c #8F519C",
+"&%    c #8251AE",
+"*%    c #7852BD",
+"=%    c #6F53C6",
+"-%    c #5B4CBB",
+";%    c #594AA0",
+">%    c #5A4376",
+",%    c #2E121E",
+"'%    c #1C0007",
+")%    c #473C34",
+"!%    c #6E6D56",
+"~%    c #81764E",
+"{%    c #9C6F52",
+"]%    c #B16257",
+"^%    c #B75158",
+"/%    c #AA516F",
+"(%    c #9C5187",
+"_%    c #8D519F",
+":%    c #8151B0",
+"<%    c #7752BE",
+"[%    c #6C53C5",
+"}%    c #584CB9",
+"|%    c #5849A0",
+"1%    c #4F3D79",
+"2%    c #180828",
+"3%    c #21200A",
+"4%    c #443C36",
+"5%    c #7D5554",
+"6%    c #B06264",
+"7%    c #B25261",
+"8%    c #A75074",
+"9%    c #99508D",
+"0%    c #8950A5",
+"a%    c #7E4FB3",
+"b%    c #7A53BC",
+"c%    c #7A59BC",
+"d%    c #544376",
+"e%    c #392537",
+"f%    c #270807",
+"g%    c #220610",
+"h%    c #2A1119",
+"i%    c #493D3D",
+"j%    c #865857",
+"k%    c #B16064",
+"l%    c #B25061",
+"m%    c #A55077",
+"n%    c #975090",
+"o%    c #8850A7",
+"p%    c #7C4FB5",
+"q%    c #7A54BD",
+"r%    c #7556B3",
+"s%    c #4F406E",
+"t%    c #2D1E40",
+"u%    c #160426",
+"v%    c #382D16",
+"w%    c #452F1E",
+"x%    c #4E2C24",
+"y%    c #472123",
+"z%    c #3F1E2A",
+"A%    c #371D33",
+"B%    c #311D3C",
+"C%    c #311D41",
+"D%    c #372044",
+"E%    c #422443",
+"F%    c #431D29",
+"G%    c #3C1619",
+"H%    c #3C172A",
+"I%    c #481F2E",
+"J%    c #4D232D",
+"K%    c #461D27",
+"L%    c #3D1D2C",
+"M%    c #361D34",
+"N%    c #311D3D",
+"O%    c #301D45",
+"P%    c #331E4F",
+"Q%    c #381F55",
+"R%    c #311748",
+"S%    c #270F3A",
+"T%    c #312500",
+"U%    c #261B00",
+"V%    c #170E00",
+"W%    c #0B0600",
+"X%    c #040200",
+"Y%    c #070100",
+"Z%    c #120300",
+"`%    c #210600",
+" &    c #390800",
+".&    c #35001E",
+"+&    c #260017",
+"@&    c #15000E",
+"#&    c #090006",
+"$&    c #030002",
+"%&    c #040006",
+"&&    c #0C0011",
+"*&    c #150020",
+"=&    c #210035",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     ",
+"    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                             . . +               . . .                           . .     ",
+"    . .                       . . @ # $ % & *       . = - $ # @ . .                     . .     ",
+"    . .                       . . = ; > , ' ) .   . ) ' , > ; = . .                     . .     ",
+"    . .                 . . . . . . . . ! ~ { .   . { ~ ! . . . . . . . .               . .     ",
+"    . .             . . . . . . . . . . ] ^ / . . . / ^ ] . . . . . . . . . .           . .     ",
+"    . .           ( _ _ ) ) _ _ : . . . . . < _ _ @ . . . . [ } _ ( | 1 _ ' / .         . .     ",
+"    .       2 3 4 5 6 6 7 8 9 0 5 | ] a | [ # 6 6 b c | ] a d e f g h i 6 ~ j k l         .     ",
+"            m n o p < < q r s t u v w x y z A < < i B ] # _ C D E F G H < : I J K               ",
+"          L M N O P Q R S T U V W X Y Z `  .... . ' 5 A ; +.@.#.$.%.&.*.=.-.;.>.,.'.).          ",
+"        !.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.[ . . . . } 5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.        ",
+"    l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.| . . . . [ E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.  ",
+"    Y.Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+. . b {+]+^+/+(+_+:+^.<+[+}+|+1+2+3+4+5+6+7+8+9+  ",
+"  0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+7 . . # u+v+w+x+y+z+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+  ",
+"  P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@@@#@$@%@&@*@] . . / =@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@1@  ",
+"  2@3@4@5@6@7@8@9@0@a@b@c@d@e@f@g@h@i@j@k@l@! . . x m@n@o@p@q@r@s@t@u@v@w@x@y@z@n+A@B@C@D@E@F@  ",
+"  G@H@I@z+J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@6 ' . . z Z@`@ #.#+#@###$#%#&#*#=#-#;#+@>#,#'#)#!#~#  ",
+"  G@{#]#'@^#@+/#$+(#_#:#<#-+[#}#|#1#2#3#Y@6 ' . . z Z@4#5#6#7#8#9#0#a#b#b@c#3+d#e#f#h@g#h#i#~#  ",
+"  o j#k#l#m#n#o#p#q#r#l+s#n+o+t#u#v#w#x#y#z#1     { A#B#C#D#E#F#G#H#I#J#K#H+L#M#K+N#O#v#P#Q#R#  ",
+"  S#T#U#V###W+N.W#X#Y#Z#`# $.$+$@$#$$$%$&$*$      . =$-$;$>$,$'$)$!$~${$]$^$/$:@<@($_$:$<$[$}$  ",
+"  |$1$2$^.<+[+}+3$4$2+3+4+e#g@5$v#6$7$8$9$            0$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$  ",
+"    t$u$v$w$D+x$y$z$A$B$J+C$D$E$F$G$H$I$                J$K$L$M$N$O$F+P$Q$R$S$T@T$U$V$W$X$Y$    ",
+"    Z$`$ %.%+%@%#%$%(@%%&%*%=%-%;%>%,%                  '%)%!%~%{%]%^%/%(%_%:%<%[%}%|%1%2%      ",
+"        3%4%5%6%7%8%9%0%a%b%c%d%e%f%                      g%h%i%j%k%l%m%n%o%p%q%r%s%t%u%        ",
+"          v%w%x%y%z%A%B%C%D%E%F%G%                            H%I%J%K%L%M%N%O%P%Q%R%S%          ",
+"    .     T%U%V%W%X%. . Y%Z%`% &                              .&+&@&#&$&. . %&&&*&=&      .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     ",
+"    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                "};
diff --git a/src/icons/folder_closed.png b/src/icons/folder_closed.png
new file mode 100644 (file)
index 0000000..6a181fa
Binary files /dev/null and b/src/icons/folder_closed.png differ
diff --git a/src/icons/folder_locked.png b/src/icons/folder_locked.png
new file mode 100644 (file)
index 0000000..83e3948
Binary files /dev/null and b/src/icons/folder_locked.png differ
diff --git a/src/icons/folder_open.png b/src/icons/folder_open.png
new file mode 100644 (file)
index 0000000..5e9675f
Binary files /dev/null and b/src/icons/folder_open.png differ
diff --git a/src/icons/folder_up.png b/src/icons/folder_up.png
new file mode 100644 (file)
index 0000000..a2b4382
Binary files /dev/null and b/src/icons/folder_up.png differ
diff --git a/src/icons/gqview_logo.png b/src/icons/gqview_logo.png
new file mode 100755 (executable)
index 0000000..bb981d1
Binary files /dev/null and b/src/icons/gqview_logo.png differ
diff --git a/src/icons/icon.xpm b/src/icons/icon.xpm
new file mode 100644 (file)
index 0000000..9bdf3fd
--- /dev/null
@@ -0,0 +1,705 @@
+/* XPM */
+static char * icon_xpm[] = {
+"48 48 654 2",
+"      c None",
+".     c #000000",
+"+     c #030200",
+"@     c #0A0A0A",
+"#     c #313131",
+"$     c #383838",
+"%     c #302F2F",
+"&     c #0A0907",
+"*     c #020100",
+"=     c #070707",
+"-     c #2F2F2F",
+";     c #2C2C2C",
+">     c #353535",
+",     c #303030",
+"'     c #202020",
+")     c #0C0C0C",
+"!     c #111111",
+"~     c #494949",
+"{     c #1F1F1F",
+"]     c #050505",
+"^     c #151515",
+"/     c #090909",
+"(     c #191919",
+"_     c #212121",
+":     c #131313",
+"<     c #141414",
+"[     c #060606",
+"}     c #1D1D1D",
+"|     c #010101",
+"1     c #161616",
+"2     c #020500",
+"3     c #010200",
+"4     c #010100",
+"5     c #2B2B2B",
+"6     c #4C4C4C",
+"7     c #1B1B1B",
+"8     c #1C1B1B",
+"9     c #4E4E4C",
+"0     c #4D4D4C",
+"a     c #030303",
+"b     c #1C1C1C",
+"c     c #040404",
+"d     c #0E0D0D",
+"e     c #474243",
+"f     c #504C4D",
+"g     c #3B3839",
+"h     c #040303",
+"i     c #323232",
+"j     c #151414",
+"k     c #010001",
+"l     c #020001",
+"m     c #122100",
+"n     c #0B1400",
+"o     c #060900",
+"p     c #0D0E0B",
+"q     c #0A0A07",
+"r     c #111007",
+"s     c #252214",
+"t     c #191814",
+"u     c #0B0B0B",
+"v     c #080808",
+"w     c #343434",
+"x     c #1E1E1E",
+"y     c #0E0E0E",
+"z     c #3A3A3A",
+"A     c #252525",
+"B     c #262626",
+"C     c #0D0304",
+"D     c #401113",
+"E     c #3A1416",
+"F     c #240F11",
+"G     c #0A0102",
+"H     c #100D0D",
+"I     c #0B0507",
+"J     c #0E0006",
+"K     c #16000B",
+"L     c #324920",
+"M     c #3D5D27",
+"N     c #406327",
+"O     c #3C5623",
+"P     c #3E4923",
+"Q     c #433C23",
+"R     c #4A3123",
+"S     c #512D23",
+"T     c #563127",
+"U     c #553A2F",
+"V     c #302622",
+"W     c #191410",
+"X     c #110C06",
+"Y     c #292826",
+"Z     c #292929",
+"`     c #272727",
+" .    c #2E2E2E",
+"..    c #121212",
+"+.    c #201818",
+"@.    c #1A0705",
+"#.    c #3E2218",
+"$.    c #484123",
+"%.    c #475328",
+"&.    c #3E4F24",
+"*.    c #404523",
+"=.    c #443B23",
+"-.    c #4A3023",
+";.    c #532924",
+">.    c #582B2C",
+",.    c #583137",
+"'.    c #4C3238",
+").    c #331C28",
+"!.    c #203910",
+"~.    c #3E5D32",
+"{.    c #61934B",
+"].    c #7DBE58",
+"^.    c #7FB351",
+"/.    c #8C9E50",
+"(.    c #9A8750",
+"_.    c #A86E50",
+":.    c #B25F50",
+"<.    c #B25E5B",
+"[.    c #A4696D",
+"}.    c #6A4F55",
+"|.    c #423333",
+"1.    c #25180F",
+"2.    c #0A0603",
+"3.    c #282726",
+"4.    c #393939",
+"5.    c #434343",
+"6.    c #131010",
+"7.    c #190B06",
+"8.    c #332514",
+"9.    c #445E36",
+"0.    c #659A4D",
+"a.    c #7DBC57",
+"b.    c #7FB150",
+"c.    c #8E9B50",
+"d.    c #9C8450",
+"e.    c #AA6C50",
+"f.    c #B35D50",
+"g.    c #B0605D",
+"h.    c #9D666A",
+"i.    c #634C52",
+"j.    c #3D2937",
+"k.    c #270E22",
+"l.    c #0E1D00",
+"m.    c #325623",
+"n.    c #5E9F4F",
+"o.    c #5DB34C",
+"p.    c #69BC4F",
+"q.    c #7ABB53",
+"r.    c #85AB51",
+"s.    c #939551",
+"t.    c #A17E51",
+"u.    c #AE6751",
+"v.    c #B35956",
+"w.    c #AE5465",
+"x.    c #A1567C",
+"y.    c #895088",
+"z.    c #7B5681",
+"A.    c #685564",
+"B.    c #251714",
+"C.    c #130C09",
+"D.    c #0D0D0D",
+"E.    c #110F0F",
+"F.    c #180404",
+"G.    c #3D4826",
+"H.    c #629C4F",
+"I.    c #5DB54C",
+"J.    c #6BBC50",
+"K.    c #7BB952",
+"L.    c #87A951",
+"M.    c #959251",
+"N.    c #A37B51",
+"O.    c #AF6451",
+"P.    c #B35757",
+"Q.    c #AD5468",
+"R.    c #9E567D",
+"S.    c #864F89",
+"T.    c #795681",
+"U.    c #624D65",
+"V.    c #1E0A1E",
+"W.    c #29002D",
+"X.    c #37003E",
+"Y.    c #325426",
+"Z.    c #4A873F",
+"`.    c #66CB5A",
+" +    c #66CD53",
+".+    c #6FC451",
+"++    c #7DB551",
+"@+    c #8BA351",
+"#+    c #998D51",
+"$+    c #A77551",
+"%+    c #B45E51",
+"&+    c #B2555C",
+"*+    c #AA516E",
+"=+    c #9D5187",
+"-+    c #8E519D",
+";+    c #8459A7",
+">+    c #765E9B",
+",+    c #4C4054",
+"'+    c #2C1E1F",
+")+    c #1B0E09",
+"!+    c #262524",
+"~+    c #101010",
+"{+    c #181818",
+"]+    c #060704",
+"^+    c #333B24",
+"/+    c #538843",
+"(+    c #66CB59",
+"_+    c #66CD52",
+":+    c #71C251",
+"<+    c #8DA151",
+"[+    c #9B8A51",
+"}+    c #A97251",
+"|+    c #B55C52",
+"1+    c #B2545E",
+"2+    c #A95171",
+"3+    c #9B5189",
+"4+    c #8C51A0",
+"5+    c #835BA7",
+"6+    c #705994",
+"7+    c #443854",
+"8+    c #33143D",
+"9+    c #2C0033",
+"0+    c #162F00",
+"a+    c #4B8342",
+"b+    c #5FBC59",
+"c+    c #5CD851",
+"d+    c #68CC51",
+"e+    c #75BE51",
+"f+    c #83AE51",
+"g+    c #919B51",
+"h+    c #9F8451",
+"i+    c #AD6C51",
+"j+    c #B85652",
+"k+    c #B15262",
+"l+    c #A65177",
+"m+    c #975190",
+"n+    c #8951A5",
+"o+    c #7B51B7",
+"p+    c #7054BE",
+"q+    c #6D649D",
+"r+    c #4B3847",
+"s+    c #32180F",
+"t+    c #434140",
+"u+    c #2C2A2A",
+"v+    c #0C0F08",
+"w+    c #4D844A",
+"x+    c #5FC058",
+"y+    c #5ED751",
+"z+    c #6ACA51",
+"A+    c #77BC51",
+"B+    c #84AB51",
+"C+    c #929951",
+"D+    c #A18151",
+"E+    c #AE6951",
+"F+    c #B85453",
+"G+    c #B05265",
+"H+    c #A4517A",
+"I+    c #965192",
+"J+    c #8751A8",
+"K+    c #7951B9",
+"L+    c #6F56BA",
+"M+    c #6C6698",
+"N+    c #3C2950",
+"O+    c #1D0024",
+"P+    c #0B1800",
+"Q+    c #419A3C",
+"R+    c #5BD455",
+"S+    c #60D451",
+"T+    c #6CC751",
+"U+    c #7AB851",
+"V+    c #88A651",
+"W+    c #969251",
+"X+    c #A47A51",
+"Y+    c #B06552",
+"Z+    c #B85354",
+"`+    c #AD5169",
+" @    c #9F5181",
+".@    c #915199",
+"+@    c #8451AD",
+"@@    c #7751BD",
+"#@    c #6B52C8",
+"$@    c #695AC5",
+"%@    c #3E2E5E",
+"&@    c #150603",
+"*@    c #0E0D0C",
+"=@    c #0F0808",
+"-@    c #181208",
+";@    c #4AA644",
+">@    c #5CD454",
+",@    c #61D251",
+"'@    c #6EC551",
+")@    c #7CB651",
+"!@    c #8AA451",
+"~@    c #989051",
+"{@    c #A67751",
+"]@    c #B16252",
+"^@    c #B85256",
+"/@    c #AB516C",
+"(@    c #9D5184",
+"_@    c #8F519B",
+":@    c #8251AF",
+"<@    c #7551BF",
+"[@    c #6B53C8",
+"}@    c #685BC4",
+"|@    c #312458",
+"1@    c #0E0013",
+"2@    c #040900",
+"3@    c #3D9D39",
+"4@    c #5BD952",
+"5@    c #65CF51",
+"6@    c #71C151",
+"7@    c #7FB151",
+"8@    c #8E9F51",
+"9@    c #9C8951",
+"0@    c #A97151",
+"a@    c #B25E54",
+"b@    c #B5525C",
+"c@    c #A85173",
+"d@    c #9A518B",
+"e@    c #8B51A2",
+"f@    c #7E51B4",
+"g@    c #7151C3",
+"h@    c #6652CF",
+"i@    c #5F55D6",
+"j@    c #312A67",
+"k@    c #110B09",
+"l@    c #282827",
+"m@    c #1E1A1A",
+"n@    c #111307",
+"o@    c #46AE40",
+"p@    c #5CD752",
+"q@    c #66CD51",
+"r@    c #73C051",
+"s@    c #81AF51",
+"t@    c #909C51",
+"u@    c #9E8651",
+"v@    c #AB6E51",
+"w@    c #B25C55",
+"x@    c #B4515E",
+"y@    c #A65176",
+"z@    c #98518E",
+"A@    c #7D51B6",
+"B@    c #7051C5",
+"C@    c #6552D0",
+"D@    c #5E55D7",
+"E@    c #282159",
+"F@    c #050008",
+"G@    c #000100",
+"H@    c #3C9A38",
+"I@    c #5DD650",
+"J@    c #77BB51",
+"K@    c #85AA51",
+"L@    c #939751",
+"M@    c #A27F51",
+"N@    c #AE6851",
+"O@    c #B45856",
+"P@    c #B05165",
+"Q@    c #A3517D",
+"R@    c #945194",
+"S@    c #8551AB",
+"T@    c #7851BB",
+"U@    c #6C51C9",
+"V@    c #6051D5",
+"W@    c #5652DD",
+"X@    c #28276B",
+"Y@    c #131212",
+"Z@    c #333333",
+"`@    c #081307",
+" #    c #44AD3F",
+".#    c #5FD550",
+"+#    c #6BC851",
+"@#    c #78BA51",
+"##    c #87A851",
+"$#    c #959451",
+"%#    c #A37C51",
+"&#    c #AF6551",
+"*#    c #B35758",
+"=#    c #AF5167",
+"-#    c #A15180",
+";#    c #935197",
+">#    c #7751BC",
+",#    c #6A51CA",
+"'#    c #5F52D6",
+")#    c #5452DF",
+"!#    c #212058",
+"~#    c #000001",
+"{#    c #409738",
+"]#    c #62D250",
+"^#    c #7CB551",
+"/#    c #998E51",
+"(#    c #B36051",
+"_#    c #B65259",
+":#    c #AC516E",
+"<#    c #9D5186",
+"[#    c #7F51B1",
+"}#    c #7351C0",
+"|#    c #6752CD",
+"1#    c #5D53D9",
+"2#    c #5352E0",
+"3#    c #27276C",
+"4#    c #091307",
+"5#    c #48AA3F",
+"6#    c #64D050",
+"7#    c #70C351",
+"8#    c #7EB351",
+"9#    c #8CA051",
+"0#    c #9A8A51",
+"a#    c #A87251",
+"b#    c #B45D51",
+"c#    c #AA5171",
+"d#    c #8C519F",
+"e#    c #7E51B3",
+"f#    c #7151C1",
+"g#    c #5C53DA",
+"h#    c #5252E1",
+"i#    c #1F2059",
+"j#    c #47943A",
+"k#    c #69CB53",
+"l#    c #73BF51",
+"m#    c #82AF51",
+"n#    c #909A51",
+"o#    c #9E8451",
+"p#    c #AB6D51",
+"q#    c #B35B54",
+"r#    c #B25160",
+"s#    c #97518F",
+"t#    c #6E51C5",
+"u#    c #6352D2",
+"v#    c #5953DC",
+"w#    c #5854DD",
+"x#    c #30296A",
+"y#    c #110808",
+"z#    c #222121",
+"A#    c #1B1617",
+"B#    c #131208",
+"C#    c #50A442",
+"D#    c #6ACA53",
+"E#    c #75BD51",
+"F#    c #84AD51",
+"G#    c #929851",
+"H#    c #A08151",
+"I#    c #AD6A51",
+"J#    c #B45955",
+"K#    c #B15163",
+"L#    c #955192",
+"M#    c #8751A7",
+"N#    c #6D51C7",
+"O#    c #6152D3",
+"P#    c #5755DD",
+"Q#    c #25215D",
+"R#    c #05000A",
+"S#    c #0F1700",
+"T#    c #4E8A40",
+"U#    c #6FBC57",
+"V#    c #79B951",
+"W#    c #B06451",
+"X#    c #B35759",
+"Y#    c #AE5168",
+"Z#    c #A05181",
+"`#    c #915198",
+" $    c #8351AC",
+".$    c #7651BE",
+"+$    c #6A51CB",
+"@$    c #5E52D7",
+"#$    c #5654DD",
+"$$    c #5E58CE",
+"%$    c #3C2B61",
+"&$    c #170100",
+"*$    c #030000",
+"=$    c #0C0002",
+"-$    c #22100B",
+";$    c #589448",
+">$    c #70BC57",
+",$    c #7BB751",
+"'$    c #89A651",
+")$    c #978F51",
+"!$    c #A57851",
+"~$    c #B26151",
+"{$    c #B3565A",
+"]$    c #AC516B",
+"^$    c #9E5184",
+"/$    c #90519B",
+"($    c #6851CD",
+"_$    c #5D52D8",
+":$    c #5754DB",
+"<$    c #5F59CC",
+"[$    c #2E235E",
+"}$    c #0D0019",
+"|$    c #1C2A00",
+"1$    c #537249",
+"2$    c #729F5F",
+"3$    c #B65B51",
+"4$    c #B3535E",
+"5$    c #6452D0",
+"6$    c #5455DA",
+"7$    c #655DA9",
+"8$    c #4D2F4B",
+"9$    c #330300",
+"0$    c #360D10",
+"a$    c #5E7253",
+"b$    c #74A25D",
+"c$    c #81B051",
+"d$    c #8F9E51",
+"e$    c #9D8751",
+"f$    c #AB6F51",
+"g$    c #B85851",
+"h$    c #B25360",
+"i$    c #A85174",
+"j$    c #9A518C",
+"k$    c #8A51A3",
+"l$    c #7C51B5",
+"m$    c #6F51C5",
+"n$    c #6353D2",
+"o$    c #5853DD",
+"p$    c #5756D4",
+"q$    c #675EA3",
+"r$    c #392559",
+"s$    c #1A002E",
+"t$    c #324124",
+"u$    c #546942",
+"v$    c #85A065",
+"w$    c #929555",
+"x$    c #AE6A51",
+"y$    c #B75653",
+"z$    c #B05264",
+"A$    c #A3517B",
+"B$    c #955193",
+"C$    c #7A51B9",
+"D$    c #6D51C8",
+"E$    c #6051D4",
+"F$    c #6157D2",
+"G$    c #6357B6",
+"H$    c #453155",
+"I$    c #3B1C2A",
+"J$    c #3B322B",
+"K$    c #5E6A49",
+"L$    c #869F63",
+"M$    c #949453",
+"N$    c #A27E51",
+"O$    c #AF6752",
+"P$    c #AE5267",
+"Q$    c #A1517E",
+"R$    c #935196",
+"S$    c #8651AA",
+"T$    c #6B51CA",
+"U$    c #5F51D6",
+"V$    c #6258D0",
+"W$    c #5D52AD",
+"X$    c #382B57",
+"Y$    c #2A1842",
+"Z$    c #121600",
+"`$    c #3A4128",
+" %    c #6A7254",
+".%    c #7E764E",
+"+%    c #987051",
+"@%    c #B06457",
+"#%    c #B65458",
+"$%    c #AC516C",
+"%%    c #8F519C",
+"&%    c #8251AE",
+"*%    c #7852BD",
+"=%    c #6F53C6",
+"-%    c #5B4CBB",
+";%    c #594AA0",
+">%    c #5A4376",
+",%    c #2E121E",
+"'%    c #1C0007",
+")%    c #473C34",
+"!%    c #6E6D56",
+"~%    c #81764E",
+"{%    c #9C6F52",
+"]%    c #B16257",
+"^%    c #B75158",
+"/%    c #AA516F",
+"(%    c #9C5187",
+"_%    c #8D519F",
+":%    c #8151B0",
+"<%    c #7752BE",
+"[%    c #6C53C5",
+"}%    c #584CB9",
+"|%    c #5849A0",
+"1%    c #4F3D79",
+"2%    c #180828",
+"3%    c #21200A",
+"4%    c #443C36",
+"5%    c #7D5554",
+"6%    c #B06264",
+"7%    c #B25261",
+"8%    c #A75074",
+"9%    c #99508D",
+"0%    c #8950A5",
+"a%    c #7E4FB3",
+"b%    c #7A53BC",
+"c%    c #7A59BC",
+"d%    c #544376",
+"e%    c #392537",
+"f%    c #270807",
+"g%    c #220610",
+"h%    c #2A1119",
+"i%    c #493D3D",
+"j%    c #865857",
+"k%    c #B16064",
+"l%    c #B25061",
+"m%    c #A55077",
+"n%    c #975090",
+"o%    c #8850A7",
+"p%    c #7C4FB5",
+"q%    c #7A54BD",
+"r%    c #7556B3",
+"s%    c #4F406E",
+"t%    c #2D1E40",
+"u%    c #160426",
+"v%    c #382D16",
+"w%    c #452F1E",
+"x%    c #4E2C24",
+"y%    c #472123",
+"z%    c #3F1E2A",
+"A%    c #371D33",
+"B%    c #311D3C",
+"C%    c #311D41",
+"D%    c #372044",
+"E%    c #422443",
+"F%    c #431D29",
+"G%    c #3C1619",
+"H%    c #3C172A",
+"I%    c #481F2E",
+"J%    c #4D232D",
+"K%    c #461D27",
+"L%    c #3D1D2C",
+"M%    c #361D34",
+"N%    c #311D3D",
+"O%    c #301D45",
+"P%    c #331E4F",
+"Q%    c #381F55",
+"R%    c #311748",
+"S%    c #270F3A",
+"T%    c #312500",
+"U%    c #261B00",
+"V%    c #170E00",
+"W%    c #0B0600",
+"X%    c #040200",
+"Y%    c #070100",
+"Z%    c #120300",
+"`%    c #210600",
+" &    c #390800",
+".&    c #35001E",
+"+&    c #260017",
+"@&    c #15000E",
+"#&    c #090006",
+"$&    c #030002",
+"%&    c #040006",
+"&&    c #0C0011",
+"*&    c #150020",
+"=&    c #210035",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                    . . +               . . .                                   ",
+"                              . . @ # $ % & *       . = - $ # @ . .                             ",
+"                              . . = ; > , ' ) .   . ) ' , > ; = . .                             ",
+"                        . . . . . . . . ! ~ { .   . { ~ ! . . . . . . . .                       ",
+"                    . . . . . . . . . . ] ^ / . . . / ^ ] . . . . . . . . . .                   ",
+"                  ( _ _ ) ) _ _ : . . . . . < _ _ @ . . . . [ } _ ( | 1 _ ' / .                 ",
+"            2 3 4 5 6 6 7 8 9 0 5 | ] a | [ # 6 6 b c | ] a d e f g h i 6 ~ j k l               ",
+"            m n o p < < q r s t u v w x y z A < < i B ] # _ C D E F G H < : I J K               ",
+"          L M N O P Q R S T U V W X Y Z `  .... . ' 5 A ; +.@.#.$.%.&.*.=.-.;.>.,.'.).          ",
+"        !.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.[ . . . . } 5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.        ",
+"    l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.| . . . . [ E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.  ",
+"    Y.Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+. . b {+]+^+/+(+_+:+^.<+[+}+|+1+2+3+4+5+6+7+8+9+  ",
+"  0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+7 . . # u+v+w+x+y+z+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+  ",
+"  P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@@@#@$@%@&@*@] . . / =@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@1@  ",
+"  2@3@4@5@6@7@8@9@0@a@b@c@d@e@f@g@h@i@j@k@l@! . . x m@n@o@p@q@r@s@t@u@v@w@x@y@z@n+A@B@C@D@E@F@  ",
+"  G@H@I@z+J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@6 ' . . z Z@`@ #.#+#@###$#%#&#*#=#-#;#+@>#,#'#)#!#~#  ",
+"  G@{#]#'@^#@+/#$+(#_#:#<#-+[#}#|#1#2#3#Y@6 ' . . z Z@4#5#6#7#8#9#0#a#b#b@c#3+d#e#f#h@g#h#i#~#  ",
+"  o j#k#l#m#n#o#p#q#r#l+s#n+o+t#u#v#w#x#y#z#1     { A#B#C#D#E#F#G#H#I#J#K#H+L#M#K+N#O#v#P#Q#R#  ",
+"  S#T#U#V###W+N.W#X#Y#Z#`# $.$+$@$#$$$%$&$*$      . =$-$;$>$,$'$)$!$~${$]$^$/$:@<@($_$:$<$[$}$  ",
+"  |$1$2$^.<+[+}+3$4$2+3+4+e#g@5$v#6$7$8$9$            0$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$  ",
+"    t$u$v$w$D+x$y$z$A$B$J+C$D$E$F$G$H$I$                J$K$L$M$N$O$F+P$Q$R$S$T@T$U$V$W$X$Y$    ",
+"    Z$`$ %.%+%@%#%$%(@%%&%*%=%-%;%>%,%                  '%)%!%~%{%]%^%/%(%_%:%<%[%}%|%1%2%      ",
+"        3%4%5%6%7%8%9%0%a%b%c%d%e%f%                      g%h%i%j%k%l%m%n%o%p%q%r%s%t%u%        ",
+"          v%w%x%y%z%A%B%C%D%E%F%G%                            H%I%J%K%L%M%N%O%P%Q%R%S%          ",
+"          T%U%V%W%X%. . Y%Z%`% &                              .&+&@&#&$&. . %&&&*&=&            ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                ",
+"                                                                                                "};
diff --git a/src/icons/icon_config.xpm b/src/icons/icon_config.xpm
deleted file mode 100644 (file)
index 427c868..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/* XPM */
-static char * icon_config_xpm[] = {
-"20 20 5 1",
-"      c None",
-".     c #000000000000",
-"X     c #CF3CCF3CCF3C",
-"o     c #79E77DF779E7",
-"O     c #FFFFFFFFFFFF",
-"                    ",
-"    ...             ",
-"    .XX.            ",
-"     .XX.           ",
-" ..   .X.o          ",
-" .X. .XX.o          ",
-" .XX.XXO.o          ",
-"  .XXOXXX.          ",
-"   ....XOX.         ",
-"    ooo.XOX.        ",
-"        .XOX....    ",
-"         .XXOXOX.   ",
-"          .XXX.XX.  ",
-"          .OX.o.X.o ",
-"          .X.oo ..o ",
-"          .XX.   oo ",
-"           .XX.     ",
-"            ...o    ",
-"             ooo    ",
-"                    "};
diff --git a/src/icons/icon_home.xpm b/src/icons/icon_home.xpm
deleted file mode 100644 (file)
index 7e3ed43..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/* XPM */
-static char * icon_home_xpm[] = {
-"20 20 7 1",
-"      c None",
-".     c #FFFF00000000",
-"X     c #79E700000000",
-"o     c #10402CB22081",
-"O     c #79E77DF779E7",
-"+     c #9E799A699E79",
-"@     c #FFFFFFFFFFFF",
-"                    ",
-"    .XX  oo         ",
-"    .XoOo++o        ",
-"    .Xoo+++@o       ",
-"    .Xo+++@@@o      ",
-"    .o+++@@@@@o     ",
-"    o+++@@@@@@@o    ",
-"   o+++@@@@@@@@@o   ",
-"  ooo+@@@@@@@@@ooo  ",
-"   Oo@@@@@@@@@@oOOO ",
-"    o@@@@@@@@@@oO   ",
-"    o@@oooo@@@@oO   ",
-"    o@@oO o@@@@oO   ",
-"    o@@oO o@@@@oO   ",
-"    o@@oO o@@@@oO   ",
-"    o@@oO o@@@@oO   ",
-"    o@@oO o@@@@oO   ",
-"    ooooO ooooooO   ",
-"     OOOO  OOOOOO   ",
-"                    "};
diff --git a/src/icons/icon_reload.xpm b/src/icons/icon_reload.xpm
deleted file mode 100644 (file)
index b39fc37..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-/* XPM */
-static char * icon_reload_xpm[] = {
-"20 20 4 1",
-"      c None",
-".     c #000000000000",
-"X     c #00007DF70000",
-"o     c #79E77DF779E7",
-"                    ",
-"                    ",
-"      ......        ",
-"     .XXXXXX..      ",
-"    .XXXXXXXXX.     ",
-"   .XXXX...XXXX.    ",
-"   .XXX.ooo..XX.    ",
-"   .XX.oo   .XXX.   ",
-" ...XX...    .XX.o  ",
-"  .XXXX.oo   .XX.o  ",
-"   .XX.oo    .XX.o  ",
-"    ..oo     .XX.o  ",
-"     oo     .XXX.o  ",
-"   .....   ..XX.oo  ",
-"   .XXX....XXXX.o   ",
-"    .XXXXXXXXX.oo   ",
-"     ..XXXXX..oo    ",
-"      o.....ooo     ",
-"        ooooo       ",
-"                    "};
diff --git a/src/icons/icon_zoom_fit.xpm b/src/icons/icon_zoom_fit.xpm
deleted file mode 100644 (file)
index ac6eb2f..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/* XPM */
-static char * icon_zoom_fit_xpm[] = {
-"20 20 3 1",
-"      c None",
-".     c #000000000000",
-"X     c #79E77DF779E7",
-"                    ",
-"                    ",
-"      .......       ",
-"       XX.XXXX      ",
-"        ...         ",
-"       . .X.        ",
-"  .      .X     .   ",
-"  .X .   .X  .  .X  ",
-"  .X.     X   . .X  ",
-"  ......   ......X  ",
-"  .X.XXXX   XX.X.X  ",
-"  .X .   .   .  .X  ",
-"  .X     .X     .X  ",
-"   X   . .X.     X  ",
-"        ...         ",
-"         .X         ",
-"      .......       ",
-"       XXXXXXX      ",
-"                    ",
-"                    "};
diff --git a/src/icons/icon_zoom_in.xpm b/src/icons/icon_zoom_in.xpm
deleted file mode 100644 (file)
index f4e74eb..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/* XPM */
-static char * icon_zoom_in_xpm[] = {
-"20 20 6 1",
-"      c None",
-".     c #000000000000",
-"X     c #E79DE79DE79D",
-"o     c #B6DAB2CAB6DA",
-"O     c #79E77DF779E7",
-"+     c #FFFFFFFFFFFF",
-"                    ",
-"     ...            ",
-"   ..XXX..          ",
-"  .XXo.oXX.         ",
-"  .Xoo.XoX.         ",
-" .XooX.XXXX.        ",
-" .X.......X.O       ",
-" .XoXX.XXXX.O       ",
-"  .XXX.XXX.OO       ",
-"  .XXX.XXX.O        ",
-"   ..XXX..X.        ",
-"     ...OO.X..      ",
-"      OOO  .+X.     ",
-"           .X+X.    ",
-"            .X+X.   ",
-"             .X+X.  ",
-"              .X+X. ",
-"               .X.OO",
-"                .OO ",
-"                O   "};
diff --git a/src/icons/icon_zoom_norm.xpm b/src/icons/icon_zoom_norm.xpm
deleted file mode 100644 (file)
index e8169af..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/* XPM */
-static char * icon_zoom_norm_xpm[] = {
-"20 20 3 1",
-"      c None",
-".     c #000000000000",
-"X     c #79E77DF779E7",
-"                    ",
-"                    ",
-"  .....     .....   ",
-"  .XXXXX     XXX.X  ",
-"  .X            .X  ",
-"  .X            .X  ",
-"  .X            .X  ",
-"   X             X  ",
-"                    ",
-"                    ",
-"                    ",
-"                    ",
-"  .             .   ",
-"  .X            .X  ",
-"  .X            .X  ",
-"  .X            .X  ",
-"  .....     .....X  ",
-"   XXXXX     XXXXX  ",
-"                    ",
-"                    "};
diff --git a/src/icons/icon_zoom_out.xpm b/src/icons/icon_zoom_out.xpm
deleted file mode 100644 (file)
index 6f8e354..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/* XPM */
-static char * icon_zoom_out_xpm[] = {
-"20 20 6 1",
-"      c None",
-".     c #000000000000",
-"X     c #E79DE79DE79D",
-"o     c #B6DAB2CAB6DA",
-"O     c #79E77DF779E7",
-"+     c #FFFFFFFFFFFF",
-"                    ",
-"     ...            ",
-"   ..XXX..          ",
-"  .XXoooXX.         ",
-"  .XooXooX.         ",
-" .XooXXXXXX.        ",
-" .X.......X.O       ",
-" .XoXXXXXXX.O       ",
-"  .XXXXXXX.OO       ",
-"  .XXXXXXX.O        ",
-"   ..XXX..X.        ",
-"     ...OO.X..      ",
-"      OOO  .+X.     ",
-"           .X+X.    ",
-"            .X+X.   ",
-"             .X+X.  ",
-"              .X+X. ",
-"               .X.OO",
-"                .OO ",
-"                O   "};
diff --git a/src/icons/img_unknown.xpm b/src/icons/img_unknown.xpm
deleted file mode 100644 (file)
index 0b202bf..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-/* XPM */
-static char * img_unknown_xpm[] = {
-"48 48 108 2",
-"      c None",
-".     c #DDDDDD",
-"+     c #DCDCDC",
-"@     c #DBDBDB",
-"#     c #DADADA",
-"$     c #D9D9D9",
-"%     c #D8D8D8",
-"&     c #D7D7D7",
-"*     c #D6D6D6",
-"=     c #D5D5D5",
-"-     c #D4D4D4",
-";     c #D3D3D3",
-">     c #D2D2D2",
-",     c #D1D1D1",
-"'     c #F40000",
-")     c #F30000",
-"!     c #F10000",
-"~     c #F00000",
-"{     c #EF0000",
-"]     c #EE0000",
-"^     c #ED0000",
-"/     c #CDCDCD",
-"(     c #CECECE",
-"_     c #CFCFCF",
-":     c #D0D0D0",
-"<     c #F50000",
-"[     c #EB0000",
-"}     c #EA0000",
-"|     c #E90000",
-"1     c #E80000",
-"2     c #C9C9C9",
-"3     c #CACACA",
-"4     c #CCCCCC",
-"5     c #F60000",
-"6     c #EC0000",
-"7     c #E60000",
-"8     c #E50000",
-"9     c #E40000",
-"0     c #E30000",
-"a     c #E20000",
-"b     c #C6C6C6",
-"c     c #C7C7C7",
-"d     c #CBCBCB",
-"e     c #C4C4C4",
-"f     c #C3C3C3",
-"g     c #DF0000",
-"h     c #DE0000",
-"i     c #DD0000",
-"j     c #DC0000",
-"k     c #F70000",
-"l     c #E70000",
-"m     c #C0C0C0",
-"n     c #BEBEBE",
-"o     c #BCBCBC",
-"p     c #D80000",
-"q     c #D70000",
-"r     c #D90000",
-"s     c #BDBDBD",
-"t     c #BFBFBF",
-"u     c #C5C5C5",
-"v     c #F20000",
-"w     c #C2C2C2",
-"x     c #BBBBBB",
-"y     c #B9B9B9",
-"z     c #B8B8B8",
-"A     c #D30000",
-"B     c #D20000",
-"C     c #D50000",
-"D     c #C1C1C1",
-"E     c #E00000",
-"F     c #BABABA",
-"G     c #B6B6B6",
-"H     c #B5B5B5",
-"I     c #B4B4B4",
-"J     c #CF0000",
-"K     c #CE0000",
-"L     c #D00000",
-"M     c #B7B7B7",
-"N     c #B3B3B3",
-"O     c #B2B2B2",
-"P     c #CC0000",
-"Q     c #CB0000",
-"R     c #CA0000",
-"S     c #B1B1B1",
-"T     c #C80000",
-"U     c #C70000",
-"V     c #AFAFAF",
-"W     c #C90000",
-"X     c #C60000",
-"Y     c #C50000",
-"Z     c #ADADAD",
-"`     c #C40000",
-" .    c #ABABAB",
-"..    c #AEAEAE",
-"+.    c #C8C8C8",
-"@.    c #C30000",
-"#.    c #AAAAAA",
-"$.    c #B0B0B0",
-"%.    c #D10000",
-"&.    c #A9A9A9",
-"*.    c #ACACAC",
-"=.    c #D60000",
-"-.    c #DA0000",
-";.    c #D40000",
-">.    c #CD0000",
-",.    c #DB0000",
-"'.    c #E10000",
-").    c #000000",
-". . . . . . . . . . . . . . . . + + @ @ # $ % & * * * = = = = = = * * & % $ $ # @ + + . . . . . ",
-". . . . . . . . . . . . . . . + + @ # $ % & * = - ; > > , , , , > ; ; = * * % $ # @ + + . . . . ",
-". . . . . . . . . . . . . . + + @ # % & * = ' ) ! ~ { ] ^ / / / ( _ : , > - * & % # @ + + . . . ",
-". . . . . . . . . . . . . + + @ # % * * < ) ! { ^ [ } | 1 1 1 1 2 3 4 / _ , ; = * % $ @ + + . . ",
-". . . . . . . . . . . . . + @ # % * 5 ' ! { 6 } 1 7 8 9 0 a a 0 0 b c 2 d / : > = * % # @ + . . ",
-". . . . . . . . . . . . + @ # $ & 5 ' ! ] [ 1 b e f g h i i j i i g f e c 2 4 : > = * % # @ + . ",
-". . . . . . . . . . . . + @ $ & k ' ! ] } l 9 f m n o o p q q q p r s t f u 2 4 : > = & $ @ + . ",
-". . . . . . . . . . . + @ # % * < v { [ l 0 w t o x y z A A B B B A C x s D u 2 / : ; * % # @ + ",
-". . . . . . . . . . . + @ $ & k ' ~ 6 1 9 E n o F z G H I J K K K J L G y s D u 2 ( , = & $ @ + ",
-". . . . . . . . . . . + # $ & 5 v { } 7 a m o F M G H N O P Q R R Q P O G y n f c 4 : ; * % # + ",
-". . . . . . . . . . + + # % * - v ] | 8 f t o y M G I O S Q R T U U T V O G x m u 2 _ > * % # @ ",
-". . . . . . . . . . + @ # % * - : / 2 b w n o y M G I N S Q W U X Y X Z V I z s f 2 / , = & $ @ ",
-". . . . . . . . . . + @ # % * - : ( 2 b f t o F z G G I O Q W U Y ` `  ...S G o w c 4 : - & $ @ ",
-". . . . . . . . . . + + # % * - , ( 3 +.e D n o x y M G J P R U Y @.@.#.Z $.G x D b d : - * $ @ ",
-". . . . . . . . . . . + # $ & = > : 4 2 b f D n o x y M %.K Q U Y @.&.&.*.$.H x m b d : - * $ @ ",
-". . . . . . . . . . . + @ $ % * ; : ( d 2 b f D t s x =.A J Q T Y ` &.&.*.$.H x D b d : - * $ @ ",
-". . . . . . . . . . . + @ # % * = > : / 3 +.b f w t -.q ;.L P W X &.&.#.Z S G o D c 4 : - & $ @ ",
-". . . . . . . . . . . + + @ $ & * - , _ / 3 +.u f g j p ;.L >.W *.#.#.*.V N M o f +./ , = & $ @ ",
-". . . . . . . . . . . . + @ # % & = ; : _ 4 2 c 0 E j p C %.>.V Z *.*...$.H y t e 2 ( > * % # @ ",
-". . . . . . . . . . . . + + @ $ % * - > : / } l 0 E j p ;.%.O V ....V $.N M o D b d : ; * % # + ",
-". . . . . . . . . . . . . + @ # % * = > ! ^ } 7 0 g ,.p M H O $.V V S N G x t e 2 / , = & $ @ + ",
-". . . . . . . . . . . . . + @ # $ & = ' ~ ^ | 7 a h o F M H N O S O I G F n f c d : ; * % # @ + ",
-". . . . . . . . . . . . . + @ # $ & = ) ~ 6 1 9 w t o y M G I I I G M F s w b 3 ( , = * $ # + . ",
-". . . . . . . . . . . . . + @ # % * = v { [ l e D n x y M G G G M y o n w u 2 / : ; * % # @ + . ",
-". . . . . . . . . . . . . + @ # % * - ! ] } b f m o x y z M z y x o t f b 2 / : ; * & $ @ + . . ",
-". . . . . . . . . . . . . + @ $ & * ' ~ 6 1 u w t o x F y F x o n D f c 2 / : > = & $ # @ + . . ",
-". . . . . . . . . . . . . + # $ & = ) { [ l e D n o x x x o s m w u +.3 / : ; = * % # @ + . . . ",
-". . . . . . . . . . . . + @ # % * - : / 2 b f m s o o o s t D f b 2 d ( : ; = & % # @ + . . . . ",
-". . . . . . . . . . . . + @ $ & * ; : 4 2 u w t s o o s t w f c 2 4 _ , - * & $ # @ + . . . . . ",
-". . . . . . . . . . . . + # $ * = , _ } c f D t s s s t D f c 2 / : > - * & $ # @ + . . . . . . ",
-". . . . . . . . . . . + @ # % * - ! ^ | 8 '.m n s s n D f b 2 4 : > - * & $ # @ + . . . . . . . ",
-". . . . . . . . . . . + @ $ & = ) { [ l 0 g j s o s t w e +.d _ , - * & $ # @ + . . . . . . . . ",
-". . . . . . . . . . . + # $ * < v ] } 8 '.h ,.o o s t w u 2 / : ; * & $ # @ + . . . . . . . . . ",
-". . . . . . . . . . + @ # % * ' ! 6 1 0 g j -.o o o t f b 3 ( , - * % # @ + . . . . . . . . . . ",
-". . . . . . . . . . + @ # & * ) { [ 7 a h -.p x x o t f c 3 _ > = & $ @ + . . . . . . . . . . . ",
-". . . . . . . . . . + @ $ & = ) ] } 8 '.i r x F x o m f c d _ > * & # @ + . . . . . . . . . . . ",
-". . . . . . . . . . + @ $ & = , ] | 8 E j o F F x s m f +.4 : ; * % # @ + . . . . . . . . . . . ",
-". . . . . . . . . . + @ $ & = , ( 3 b f t o x x o n D u 2 / : - * % # + . . . . . . . . . . . . ",
-". . . . . . . . . . + @ $ & = ).).3 c f m n o o s m f b 3 ( , = & $ @ + . . . . . . . . . . . . ",
-". . . . . . . . . . + @ $ & * ).).4 2 u f m t t m f u 2 4 : > * & $ @ + . . . . . . . . . . . . ",
-". . . . . . . . . . + @ # % * ).).( 3 +.u f f f f u +.3 ( : - * % # @ + . . . . . . . . . . . . ",
-". . . ).).. ).).. ).+ ).).$ * ).).: ).).+.).b ).).2 3 / ).).).& $ ).).. ).).. ).. ).).. . . . . ",
-". . . ).).. ).).. ).).+ ).).% ).).).)./ d ).).2 ).).( ).).= ).).# ).).).).).. ).).. ).).. . . . ",
-". . . ).).. ).).. ).).+ ).).$ ).).).> : _ ).).( ).).: ).).* ).).@ ).).).).).. ).).. ).).. . . . ",
-". . . ).).. ).).. ).).. ).).# ).).).).; > ).)., ).).- ).).% ).).@ ).).).).).. ).).. ).).. . . . ",
-". . . . ).).. ).. ).).. ).).@ ).).% ).).= ).).- ).).* & ).).).@ + . ).. ).. . ).).. ).).. . . . ",
-". . . . . . . . . . . . . + + @ # $ $ % & & * * & & % $ # @ @ + . . . . . . . . . . . . . . . . ",
-". . . . . . . . . . . . . . + + @ @ # # $ $ $ $ $ $ # # @ + + . . . . . . . . . . . . . . . . . "};
diff --git a/src/icons/marker.xpm b/src/icons/marker.xpm
new file mode 100644 (file)
index 0000000..8f0460d
--- /dev/null
@@ -0,0 +1,38 @@
+/* XPM */
+static char * marker_xpm[] = {
+"26 32 3 1",
+"      c None",
+".     c #000000",
+"+     c #FF0000",
+"           ....           ",
+"           .++.           ",
+"           .++.           ",
+"           .++.           ",
+"           .++.           ",
+"           .++.           ",
+"           .++.           ",
+"           .++.           ",
+"           .++.           ",
+"    ..     .++.     ..    ",
+"    .+.    .++.    .+.    ",
+"    .++.   .++.   .++.    ",
+"    .+++.  .++.  .+++.    ",
+".....++++. .++. .++++.....",
+".+++++++++..++..+++++++++.",
+".++++++++++.++.++++++++++.",
+".+++++++++..++..+++++++++.",
+".....++++. .++. .++++.....",
+"    .+++.  .++.  .+++.    ",
+"    .++.   .++.   .++.    ",
+"    .+.    .++.    .+.    ",
+"    ..     .++.     ..    ",
+"           .++.           ",
+"           .++.           ",
+"           .++.           ",
+"           .++.           ",
+"           .++.           ",
+"           .++.           ",
+"           .++.           ",
+"           .++.           ",
+"           .++.           ",
+"           ....           "};
diff --git a/src/icons/scroller.png b/src/icons/scroller.png
new file mode 100644 (file)
index 0000000..a484791
Binary files /dev/null and b/src/icons/scroller.png differ
diff --git a/src/icons/sheet_broken.png b/src/icons/sheet_broken.png
new file mode 100644 (file)
index 0000000..8bd2bfe
Binary files /dev/null and b/src/icons/sheet_broken.png differ
diff --git a/src/icons/tools.xpm b/src/icons/tools.xpm
new file mode 100644 (file)
index 0000000..ddedfbc
--- /dev/null
@@ -0,0 +1,740 @@
+/* XPM */
+static char * tools_xpm[] = {
+"48 48 689 2",
+"      c None",
+".     c #000000",
+"+     c #A5A5A5",
+"@     c #7A7A7A",
+"#     c #D1D1D1",
+"$     c #5E5E5E",
+"%     c #F4F4F4",
+"&     c #F3F3F3",
+"*     c #F2F2F2",
+"=     c #F1F1F1",
+"-     c #F0F0F0",
+";     c #EFEFEF",
+">     c #EEEEEE",
+",     c #EDEDED",
+"'     c #ECECEC",
+")     c #EBEBEB",
+"!     c #9E9E9E",
+"~     c #030200",
+"{     c #EAEAEA",
+"]     c #0A0A0A",
+"^     c #313131",
+"/     c #383838",
+"(     c #302F2F",
+"_     c #0A0907",
+":     c #020100",
+"<     c #070707",
+"[     c #2F2F2F",
+"}     c #2C2C2C",
+"|     c #353535",
+"1     c #303030",
+"2     c #202020",
+"3     c #0C0C0C",
+"4     c #111111",
+"5     c #494949",
+"6     c #1F1F1F",
+"7     c #050505",
+"8     c #151515",
+"9     c #090909",
+"0     c #191919",
+"a     c #212121",
+"b     c #131313",
+"c     c #141414",
+"d     c #060606",
+"e     c #1D1D1D",
+"f     c #010101",
+"g     c #161616",
+"h     c #020500",
+"i     c #010200",
+"j     c #010100",
+"k     c #2B2B2B",
+"l     c #4C4C4C",
+"m     c #1B1B1B",
+"n     c #1C1B1B",
+"o     c #4E4E4C",
+"p     c #4D4D4C",
+"q     c #030303",
+"r     c #1C1C1C",
+"s     c #040404",
+"t     c #0E0D0D",
+"u     c #474243",
+"v     c #504C4D",
+"w     c #3B3839",
+"x     c #040303",
+"y     c #323232",
+"z     c #151414",
+"A     c #010001",
+"B     c #020001",
+"C     c #122100",
+"D     c #0B1400",
+"E     c #060900",
+"F     c #0D0E0B",
+"G     c #0A0A07",
+"H     c #111007",
+"I     c #252214",
+"J     c #191814",
+"K     c #0B0B0B",
+"L     c #080808",
+"M     c #343434",
+"N     c #1E1E1E",
+"O     c #0E0E0E",
+"P     c #3A3A3A",
+"Q     c #252525",
+"R     c #262626",
+"S     c #0D0304",
+"T     c #401113",
+"U     c #3A1416",
+"V     c #240F11",
+"W     c #0A0102",
+"X     c #100D0D",
+"Y     c #0B0507",
+"Z     c #0E0006",
+"`     c #16000B",
+" .    c #324920",
+"..    c #3D5D27",
+"+.    c #406327",
+"@.    c #3C5623",
+"#.    c #3E4923",
+"$.    c #433C23",
+"%.    c #4A3123",
+"&.    c #512D23",
+"*.    c #563127",
+"=.    c #553A2F",
+"-.    c #302622",
+";.    c #191410",
+">.    c #110C06",
+",.    c #292826",
+"'.    c #292929",
+").    c #272727",
+"!.    c #2E2E2E",
+"~.    c #121212",
+"{.    c #201818",
+"].    c #1A0705",
+"^.    c #3E2218",
+"/.    c #484123",
+"(.    c #475328",
+"_.    c #3E4F24",
+":.    c #404523",
+"<.    c #443B23",
+"[.    c #4A3023",
+"}.    c #532924",
+"|.    c #582B2C",
+"1.    c #583137",
+"2.    c #4C3238",
+"3.    c #331C28",
+"4.    c #203910",
+"5.    c #3E5D32",
+"6.    c #61934B",
+"7.    c #7DBE58",
+"8.    c #7FB351",
+"9.    c #8C9E50",
+"0.    c #9A8750",
+"a.    c #A86E50",
+"b.    c #B25F50",
+"c.    c #B25E5B",
+"d.    c #A4696D",
+"e.    c #6A4F55",
+"f.    c #423333",
+"g.    c #25180F",
+"h.    c #0A0603",
+"i.    c #282726",
+"j.    c #393939",
+"k.    c #434343",
+"l.    c #131010",
+"m.    c #190B06",
+"n.    c #332514",
+"o.    c #445E36",
+"p.    c #659A4D",
+"q.    c #7DBC57",
+"r.    c #7FB150",
+"s.    c #8E9B50",
+"t.    c #9C8450",
+"u.    c #AA6C50",
+"v.    c #B35D50",
+"w.    c #B0605D",
+"x.    c #9D666A",
+"y.    c #634C52",
+"z.    c #3D2937",
+"A.    c #270E22",
+"B.    c #0E1D00",
+"C.    c #325623",
+"D.    c #5E9F4F",
+"E.    c #5DB34C",
+"F.    c #69BC4F",
+"G.    c #7ABB53",
+"H.    c #85AB51",
+"I.    c #939551",
+"J.    c #A17E51",
+"K.    c #AE6751",
+"L.    c #B35956",
+"M.    c #AE5465",
+"N.    c #A1567C",
+"O.    c #895088",
+"P.    c #7B5681",
+"Q.    c #685564",
+"R.    c #251714",
+"S.    c #130C09",
+"T.    c #0D0D0D",
+"U.    c #110F0F",
+"V.    c #180404",
+"W.    c #3D4826",
+"X.    c #629C4F",
+"Y.    c #5DB54C",
+"Z.    c #6BBC50",
+"`.    c #7BB952",
+" +    c #87A951",
+".+    c #959251",
+"++    c #A37B51",
+"@+    c #AF6451",
+"#+    c #B35757",
+"$+    c #AD5468",
+"%+    c #9E567D",
+"&+    c #864F89",
+"*+    c #795681",
+"=+    c #624D65",
+"-+    c #1E0A1E",
+";+    c #29002D",
+">+    c #37003E",
+",+    c #325426",
+"'+    c #4A873F",
+")+    c #66CB5A",
+"!+    c #66CD53",
+"~+    c #6FC451",
+"{+    c #7DB551",
+"]+    c #8BA351",
+"^+    c #998D51",
+"/+    c #A77551",
+"(+    c #B45E51",
+"_+    c #B2555C",
+":+    c #AA516E",
+"<+    c #9D5187",
+"[+    c #8E519D",
+"}+    c #8459A7",
+"|+    c #765E9B",
+"1+    c #4C4054",
+"2+    c #2C1E1F",
+"3+    c #1B0E09",
+"4+    c #262524",
+"5+    c #101010",
+"6+    c #181818",
+"7+    c #060704",
+"8+    c #333B24",
+"9+    c #538843",
+"0+    c #66CB59",
+"a+    c #66CD52",
+"b+    c #71C251",
+"c+    c #8DA151",
+"d+    c #9B8A51",
+"e+    c #A97251",
+"f+    c #B55C52",
+"g+    c #B2545E",
+"h+    c #A95171",
+"i+    c #9B5189",
+"j+    c #8C51A0",
+"k+    c #835BA7",
+"l+    c #705994",
+"m+    c #443854",
+"n+    c #33143D",
+"o+    c #2C0033",
+"p+    c #162F00",
+"q+    c #4B8342",
+"r+    c #5FBC59",
+"s+    c #5CD851",
+"t+    c #68CC51",
+"u+    c #75BE51",
+"v+    c #83AE51",
+"w+    c #919B51",
+"x+    c #9F8451",
+"y+    c #AD6C51",
+"z+    c #B85652",
+"A+    c #B15262",
+"B+    c #A65177",
+"C+    c #975190",
+"D+    c #8951A5",
+"E+    c #7B51B7",
+"F+    c #7054BE",
+"G+    c #6D649D",
+"H+    c #4B3847",
+"I+    c #32180F",
+"J+    c #434140",
+"K+    c #2C2A2A",
+"L+    c #0C0F08",
+"M+    c #4D844A",
+"N+    c #5FC058",
+"O+    c #5ED751",
+"P+    c #6ACA51",
+"Q+    c #77BC51",
+"R+    c #84AB51",
+"S+    c #929951",
+"T+    c #A18151",
+"U+    c #AE6951",
+"V+    c #B85453",
+"W+    c #B05265",
+"X+    c #A4517A",
+"Y+    c #965192",
+"Z+    c #8751A8",
+"`+    c #7951B9",
+" @    c #6F56BA",
+".@    c #6C6698",
+"+@    c #3C2950",
+"@@    c #1D0024",
+"#@    c #0B1800",
+"$@    c #419A3C",
+"%@    c #5BD455",
+"&@    c #60D451",
+"*@    c #6CC751",
+"=@    c #7AB851",
+"-@    c #88A651",
+";@    c #969251",
+">@    c #A47A51",
+",@    c #B06552",
+"'@    c #B85354",
+")@    c #AD5169",
+"!@    c #9F5181",
+"~@    c #915199",
+"{@    c #8451AD",
+"]@    c #7751BD",
+"^@    c #6B52C8",
+"/@    c #695AC5",
+"(@    c #3E2E5E",
+"_@    c #150603",
+":@    c #0E0D0C",
+"<@    c #0F0808",
+"[@    c #181208",
+"}@    c #4AA644",
+"|@    c #5CD454",
+"1@    c #61D251",
+"2@    c #6EC551",
+"3@    c #7CB651",
+"4@    c #8AA451",
+"5@    c #989051",
+"6@    c #A67751",
+"7@    c #B16252",
+"8@    c #B85256",
+"9@    c #AB516C",
+"0@    c #9D5184",
+"a@    c #8F519B",
+"b@    c #8251AF",
+"c@    c #7551BF",
+"d@    c #6B53C8",
+"e@    c #685BC4",
+"f@    c #312458",
+"g@    c #0E0013",
+"h@    c #040900",
+"i@    c #3D9D39",
+"j@    c #5BD952",
+"k@    c #65CF51",
+"l@    c #71C151",
+"m@    c #7FB151",
+"n@    c #8E9F51",
+"o@    c #9C8951",
+"p@    c #A97151",
+"q@    c #B25E54",
+"r@    c #B5525C",
+"s@    c #A85173",
+"t@    c #9A518B",
+"u@    c #8B51A2",
+"v@    c #7E51B4",
+"w@    c #7151C3",
+"x@    c #6652CF",
+"y@    c #5F55D6",
+"z@    c #312A67",
+"A@    c #110B09",
+"B@    c #282827",
+"C@    c #1E1A1A",
+"D@    c #111307",
+"E@    c #46AE40",
+"F@    c #5CD752",
+"G@    c #66CD51",
+"H@    c #73C051",
+"I@    c #81AF51",
+"J@    c #909C51",
+"K@    c #9E8651",
+"L@    c #AB6E51",
+"M@    c #B25C55",
+"N@    c #B4515E",
+"O@    c #A65176",
+"P@    c #98518E",
+"Q@    c #7D51B6",
+"R@    c #7051C5",
+"S@    c #6552D0",
+"T@    c #5E55D7",
+"U@    c #282159",
+"V@    c #050008",
+"W@    c #000100",
+"X@    c #3C9A38",
+"Y@    c #5DD650",
+"Z@    c #77BB51",
+"`@    c #85AA51",
+" #    c #939751",
+".#    c #A27F51",
+"+#    c #AE6851",
+"@#    c #B45856",
+"##    c #B05165",
+"$#    c #A3517D",
+"%#    c #945194",
+"&#    c #8551AB",
+"*#    c #7851BB",
+"=#    c #6C51C9",
+"-#    c #6051D5",
+";#    c #5652DD",
+">#    c #28276B",
+",#    c #131212",
+"'#    c #333333",
+")#    c #081307",
+"!#    c #44AD3F",
+"~#    c #5FD550",
+"{#    c #6BC851",
+"]#    c #78BA51",
+"^#    c #87A851",
+"/#    c #959451",
+"(#    c #A37C51",
+"_#    c #AF6551",
+":#    c #B35758",
+"<#    c #AF5167",
+"[#    c #A15180",
+"}#    c #935197",
+"|#    c #7751BC",
+"1#    c #6A51CA",
+"2#    c #5F52D6",
+"3#    c #5452DF",
+"4#    c #212058",
+"5#    c #000001",
+"6#    c #409738",
+"7#    c #62D250",
+"8#    c #7CB551",
+"9#    c #998E51",
+"0#    c #B36051",
+"a#    c #B65259",
+"b#    c #AC516E",
+"c#    c #9D5186",
+"d#    c #7F51B1",
+"e#    c #7351C0",
+"f#    c #6752CD",
+"g#    c #5D53D9",
+"h#    c #5352E0",
+"i#    c #27276C",
+"j#    c #091307",
+"k#    c #48AA3F",
+"l#    c #64D050",
+"m#    c #70C351",
+"n#    c #7EB351",
+"o#    c #8CA051",
+"p#    c #9A8A51",
+"q#    c #A87251",
+"r#    c #B45D51",
+"s#    c #AA5171",
+"t#    c #8C519F",
+"u#    c #7E51B3",
+"v#    c #7151C1",
+"w#    c #5C53DA",
+"x#    c #5252E1",
+"y#    c #1F2059",
+"z#    c #47943A",
+"A#    c #69CB53",
+"B#    c #73BF51",
+"C#    c #82AF51",
+"D#    c #909A51",
+"E#    c #9E8451",
+"F#    c #AB6D51",
+"G#    c #B35B54",
+"H#    c #B25160",
+"I#    c #97518F",
+"J#    c #6E51C5",
+"K#    c #6352D2",
+"L#    c #5953DC",
+"M#    c #5854DD",
+"N#    c #30296A",
+"O#    c #110808",
+"P#    c #222121",
+"Q#    c #1B1617",
+"R#    c #131208",
+"S#    c #50A442",
+"T#    c #6ACA53",
+"U#    c #75BD51",
+"V#    c #84AD51",
+"W#    c #929851",
+"X#    c #A08151",
+"Y#    c #AD6A51",
+"Z#    c #B45955",
+"`#    c #B15163",
+" $    c #955192",
+".$    c #8751A7",
+"+$    c #6D51C7",
+"@$    c #6152D3",
+"#$    c #5755DD",
+"$$    c #25215D",
+"%$    c #05000A",
+"&$    c #0F1700",
+"*$    c #4E8A40",
+"=$    c #6FBC57",
+"-$    c #79B951",
+";$    c #B06451",
+">$    c #B35759",
+",$    c #AE5168",
+"'$    c #A05181",
+")$    c #915198",
+"!$    c #8351AC",
+"~$    c #7651BE",
+"{$    c #6A51CB",
+"]$    c #5E52D7",
+"^$    c #5654DD",
+"/$    c #5E58CE",
+"($    c #3C2B61",
+"_$    c #170100",
+":$    c #030000",
+"<$    c #D3D3D3",
+"[$    c #0C0002",
+"}$    c #22100B",
+"|$    c #589448",
+"1$    c #70BC57",
+"2$    c #7BB751",
+"3$    c #89A651",
+"4$    c #978F51",
+"5$    c #A57851",
+"6$    c #B26151",
+"7$    c #B3565A",
+"8$    c #AC516B",
+"9$    c #9E5184",
+"0$    c #90519B",
+"a$    c #6851CD",
+"b$    c #5D52D8",
+"c$    c #5754DB",
+"d$    c #5F59CC",
+"e$    c #2E235E",
+"f$    c #0D0019",
+"g$    c #1C2A00",
+"h$    c #537249",
+"i$    c #729F5F",
+"j$    c #B65B51",
+"k$    c #B3535E",
+"l$    c #6452D0",
+"m$    c #5455DA",
+"n$    c #655DA9",
+"o$    c #4D2F4B",
+"p$    c #330300",
+"q$    c #D2D2D2",
+"r$    c #360D10",
+"s$    c #5E7253",
+"t$    c #74A25D",
+"u$    c #81B051",
+"v$    c #8F9E51",
+"w$    c #9D8751",
+"x$    c #AB6F51",
+"y$    c #B85851",
+"z$    c #B25360",
+"A$    c #A85174",
+"B$    c #9A518C",
+"C$    c #8A51A3",
+"D$    c #7C51B5",
+"E$    c #6F51C5",
+"F$    c #6353D2",
+"G$    c #5853DD",
+"H$    c #5756D4",
+"I$    c #675EA3",
+"J$    c #392559",
+"K$    c #1A002E",
+"L$    c #324124",
+"M$    c #546942",
+"N$    c #85A065",
+"O$    c #929555",
+"P$    c #AE6A51",
+"Q$    c #B75653",
+"R$    c #B05264",
+"S$    c #A3517B",
+"T$    c #955193",
+"U$    c #7A51B9",
+"V$    c #6D51C8",
+"W$    c #6051D4",
+"X$    c #6157D2",
+"Y$    c #6357B6",
+"Z$    c #453155",
+"`$    c #3B1C2A",
+" %    c #3B322B",
+".%    c #5E6A49",
+"+%    c #869F63",
+"@%    c #949453",
+"#%    c #A27E51",
+"$%    c #AF6752",
+"%%    c #AE5267",
+"&%    c #A1517E",
+"*%    c #935196",
+"=%    c #8651AA",
+"-%    c #6B51CA",
+";%    c #5F51D6",
+">%    c #6258D0",
+",%    c #5D52AD",
+"'%    c #382B57",
+")%    c #2A1842",
+"!%    c #121600",
+"~%    c #3A4128",
+"{%    c #6A7254",
+"]%    c #7E764E",
+"^%    c #987051",
+"/%    c #B06457",
+"(%    c #B65458",
+"_%    c #AC516C",
+":%    c #8F519C",
+"<%    c #8251AE",
+"[%    c #7852BD",
+"}%    c #6F53C6",
+"|%    c #5B4CBB",
+"1%    c #594AA0",
+"2%    c #5A4376",
+"3%    c #2E121E",
+"4%    c #D0D0D0",
+"5%    c #CFCFCF",
+"6%    c #1C0007",
+"7%    c #473C34",
+"8%    c #6E6D56",
+"9%    c #81764E",
+"0%    c #9C6F52",
+"a%    c #B16257",
+"b%    c #B75158",
+"c%    c #AA516F",
+"d%    c #9C5187",
+"e%    c #8D519F",
+"f%    c #8151B0",
+"g%    c #7752BE",
+"h%    c #6C53C5",
+"i%    c #584CB9",
+"j%    c #5849A0",
+"k%    c #4F3D79",
+"l%    c #180828",
+"m%    c #21200A",
+"n%    c #443C36",
+"o%    c #7D5554",
+"p%    c #B06264",
+"q%    c #B25261",
+"r%    c #A75074",
+"s%    c #99508D",
+"t%    c #8950A5",
+"u%    c #7E4FB3",
+"v%    c #7A53BC",
+"w%    c #7A59BC",
+"x%    c #544376",
+"y%    c #392537",
+"z%    c #270807",
+"A%    c #CECECE",
+"B%    c #220610",
+"C%    c #2A1119",
+"D%    c #493D3D",
+"E%    c #865857",
+"F%    c #B16064",
+"G%    c #B25061",
+"H%    c #A55077",
+"I%    c #975090",
+"J%    c #8850A7",
+"K%    c #7C4FB5",
+"L%    c #7A54BD",
+"M%    c #7556B3",
+"N%    c #4F406E",
+"O%    c #2D1E40",
+"P%    c #160426",
+"Q%    c #D6D6D6",
+"R%    c #382D16",
+"S%    c #452F1E",
+"T%    c #4E2C24",
+"U%    c #472123",
+"V%    c #3F1E2A",
+"W%    c #371D33",
+"X%    c #311D3C",
+"Y%    c #311D41",
+"Z%    c #372044",
+"`%    c #422443",
+" &    c #431D29",
+".&    c #3C1619",
+"+&    c #CDCDCD",
+"@&    c #3C172A",
+"#&    c #481F2E",
+"$&    c #4D232D",
+"%&    c #461D27",
+"&&    c #3D1D2C",
+"*&    c #361D34",
+"=&    c #311D3D",
+"-&    c #301D45",
+";&    c #331E4F",
+">&    c #381F55",
+",&    c #311748",
+"'&    c #270F3A",
+")&    c #312500",
+"!&    c #261B00",
+"~&    c #170E00",
+"{&    c #0B0600",
+"]&    c #040200",
+"^&    c #070100",
+"/&    c #120300",
+"(&    c #210600",
+"_&    c #390800",
+":&    c #35001E",
+"<&    c #260017",
+"[&    c #15000E",
+"}&    c #090006",
+"|&    c #030002",
+"1&    c #040006",
+"2&    c #0C0011",
+"3&    c #150020",
+"4&    c #210035",
+"5&    c #CACACA",
+"6&    c #CCCCCC",
+"7&    c #CBCBCB",
+"8&    c #C9C9C9",
+"9&    c #C8C8C8",
+"0&    c #C7C7C7",
+"a&    c #C6C6C6",
+"b&    c #C5C5C5",
+"c&    c #C4C4C4",
+"d&    c #C3C3C3",
+"e&    c #C2C2C2",
+"f&    c #C1C1C1",
+"                                                                                                ",
+"      . . . . . . . . . . . . . . . . . . . . .                                                 ",
+"      . + + + + + + + + + + + + + + + + + + + .                                                 ",
+"      . + @ @ @ @ @ + + @ @ @ @ @ + + @ @ @ + .                                                 ",
+"      . # # + # # + # # # + # # # + # # + # # .                                                 ",
+"      . $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ .                                                 ",
+"      . + + @ + @ + + @ + + + + + + + + + + + .                                                 ",
+"      . $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ .                                                 ",
+"      . + + + + + @ @ @ + + + + + + + + + + + .                                                 ",
+"      . + + + @ @ + + + + @ @ @ @ + + + + + + .                                                 ",
+"      . $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ .                                                 ",
+"      . % % & & * * = = - - ; > > , , ' ' ) ) .                                                 ",
+"      . & & * * ! ! ! ! ; > > , , ! . . ~ ! { .         . . .                                   ",
+"      . * ! ! ! ! ! ! ! ! ! ! . . ] ^ / ( _ : .     . < [ / ^ ] . .                             ",
+"      . = ! ! ! ! ! ! ! ' ' ! . . < } | 1 2 3 .   . 3 2 1 | } < . .                             ",
+"      . ; ; > > , , ' ' . . . . . . . . 4 5 6 .   . 6 5 4 . . . . . . . .                       ",
+"      . > ! ! ! ! ! . . . . . . . . . . 7 8 9 . . . 9 8 7 . . . . . . . . . .                   ",
+"      . , ! ! ! ! 0 a a 3 3 a a b . . . . . c a a ] . . . . d e a 0 f g a 2 9 .                 ",
+"      . ' ) h i j k l l m n o p k f 7 q f d ^ l l r s f 7 q t u v w x y l 5 z A B               ",
+"      . ! ! C D E F c c G H I J K L M N O P Q c c y R 7 ^ a S T U V W X c b Y Z `               ",
+"      . !  ...+.@.#.$.%.&.*.=.-.;.>.,.'.).!.~.. . 2 k Q } {.].^./.(._.:.<.[.}.|.1.2.3.          ",
+"      . 4.5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.d . . . . e k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.        ",
+"    B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.f . . . . d U.V.W.X.Y.Z.`. +.+++@+#+$+%+&+*+=+-+;+>+  ",
+"    ,+'+)+!+~+{+]+^+/+(+_+:+<+[+}+|+1+2+3+4+5+. . r 6+7+8+9+0+a+b+8.c+d+e+f+g+h+i+j+k+l+m+n+o+  ",
+"  p+q+r+s+t+u+v+w+x+y+z+A+B+C+D+E+F+G+H+I+J+m . . ^ K+L+M+N+O+P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@@@  ",
+"  #@$@%@&@*@=@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@7 . . 9 <@[@}@|@1@2@3@4@5@6@7@8@9@0@a@b@c@d@e@f@g@  ",
+"  h@i@j@k@l@m@n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@4 . . N C@D@E@F@G@H@I@J@K@L@M@N@O@P@D+Q@R@S@T@U@V@  ",
+"  W@X@Y@P+Z@`@ #.#+#@###$#%#&#*#=#-#;#>#,#l 2 . . P '#)#!#~#{#]#^#/#(#_#:#<#[#}#{@|#1#2#3#4#5#  ",
+"  W@6#7#2@8#]+9#/+0#a#b#c#[+d#e#f#g#h#i#,#l 2 . . P '#j#k#l#m#n#o#p#q#r#r@s#i+t#u#v#x@w#x#y#5#  ",
+"  E z#A#B#C#D#E#F#G#H#B+I#D+E+J#K#L#M#N#O#P#g .   6 Q#R#S#T#U#V#W#X#Y#Z#`#X+ $.$`++$@$L##$$$%$  ",
+"  &$*$=$-$^#;@++;$>$,$'$)$!$~${$]$^$/$($_$:$<$.   . [$}$|$1$2$3$4$5$6$7$8$9$0$b@c@a$b$c$d$e$f$  ",
+"  g$h$i$8.c+d+e+j$k$h+i+j+u#w@l$L#m$n$o$p$q$q$.       r$s$t$u$v$w$x$y$z$A$B$C$D$E$F$G$H$I$J$K$  ",
+"    L$M$N$O$T+P$Q$R$S$T$Z+U$V$W$X$Y$Z$`$q$# # .          %.%+%@%#%$%V+%%&%*%=%*#-%;%>%,%'%)%    ",
+"    !%~%{%]%^%/%(%_%0@:%<%[%}%|%1%2%3%! 4%4%5%.         6%7%8%9%0%a%b%c%d%e%f%g%h%i%j%k%l%      ",
+"      . m%n%o%p%q%r%s%t%u%v%w%x%y%z%4%4%5%5%A%.           B%C%D%E%F%G%H%I%J%K%L%M%N%O%P%        ",
+"      . Q%R%S%T%U%V%W%X%Y%Z%`% &.&4%5%A%A%+&+&.               @&#&$&%&&&*&=&-&;&>&,&'&          ",
+"      . ! )&!&~&{&]&. . ^&/&(&_&! ! ! ! ! ! ! .               :&<&[&}&|&. . 1&2&3&4&            ",
+"      . ! <$! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 5&.                                                 ",
+"      . <$q$q$# # 4%4%5%A%A%+&+&6&6&7&7&5&5&8&.                                                 ",
+"      . q$# 4%4%5%5%A%A%+&+&6&6&7&5&5&8&8&9&9&.                                                 ",
+"      . ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! 0&.                                                 ",
+"      . ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! a&b&.                                                 ",
+"      . A%+&+&6&6&7&5&5&8&8&9&9&0&0&a&a&b&b&c&.                                                 ",
+"      . ! ! ! ! ! ! ! 8&9&9&0&! ! ! ! ! ! d&d&.                                                 ",
+"      . ! ! ! ! 8&8&! ! ! ! ! ! ! c&c&d&d&e&e&.                                                 ",
+"      . 5&8&8&9&9&0&0&a&a&b&b&c&c&d&e&e&f&f&f&.                                                 ",
+"      . . . . . . . . . . . . . . . . . . . . .                                                 ",
+"                                                                                                "};
diff --git a/src/icons/view.xpm b/src/icons/view.xpm
new file mode 100644 (file)
index 0000000..ac37983
--- /dev/null
@@ -0,0 +1,705 @@
+/* XPM */
+static char * view_xpm[] = {
+"48 48 654 2",
+"      c None",
+".     c #000000",
+"+     c #030200",
+"@     c #0A0A0A",
+"#     c #313131",
+"$     c #383838",
+"%     c #302F2F",
+"&     c #0A0907",
+"*     c #020100",
+"=     c #070707",
+"-     c #2F2F2F",
+";     c #2C2C2C",
+">     c #353535",
+",     c #303030",
+"'     c #202020",
+")     c #0C0C0C",
+"!     c #111111",
+"~     c #494949",
+"{     c #1F1F1F",
+"]     c #050505",
+"^     c #151515",
+"/     c #090909",
+"(     c #191919",
+"_     c #212121",
+":     c #131313",
+"<     c #141414",
+"[     c #060606",
+"}     c #1D1D1D",
+"|     c #010101",
+"1     c #161616",
+"2     c #020500",
+"3     c #010200",
+"4     c #010100",
+"5     c #2B2B2B",
+"6     c #4C4C4C",
+"7     c #1B1B1B",
+"8     c #1C1B1B",
+"9     c #4E4E4C",
+"0     c #4D4D4C",
+"a     c #030303",
+"b     c #1C1C1C",
+"c     c #040404",
+"d     c #0E0D0D",
+"e     c #474243",
+"f     c #504C4D",
+"g     c #3B3839",
+"h     c #040303",
+"i     c #323232",
+"j     c #151414",
+"k     c #010001",
+"l     c #020001",
+"m     c #122100",
+"n     c #0B1400",
+"o     c #060900",
+"p     c #0D0E0B",
+"q     c #0A0A07",
+"r     c #111007",
+"s     c #252214",
+"t     c #191814",
+"u     c #0B0B0B",
+"v     c #080808",
+"w     c #343434",
+"x     c #1E1E1E",
+"y     c #0E0E0E",
+"z     c #3A3A3A",
+"A     c #252525",
+"B     c #262626",
+"C     c #0D0304",
+"D     c #401113",
+"E     c #3A1416",
+"F     c #240F11",
+"G     c #0A0102",
+"H     c #100D0D",
+"I     c #0B0507",
+"J     c #0E0006",
+"K     c #16000B",
+"L     c #324920",
+"M     c #3D5D27",
+"N     c #406327",
+"O     c #3C5623",
+"P     c #3E4923",
+"Q     c #433C23",
+"R     c #4A3123",
+"S     c #512D23",
+"T     c #563127",
+"U     c #553A2F",
+"V     c #302622",
+"W     c #191410",
+"X     c #110C06",
+"Y     c #292826",
+"Z     c #292929",
+"`     c #272727",
+" .    c #2E2E2E",
+"..    c #121212",
+"+.    c #201818",
+"@.    c #1A0705",
+"#.    c #3E2218",
+"$.    c #484123",
+"%.    c #475328",
+"&.    c #3E4F24",
+"*.    c #404523",
+"=.    c #443B23",
+"-.    c #4A3023",
+";.    c #532924",
+">.    c #582B2C",
+",.    c #583137",
+"'.    c #4C3238",
+").    c #331C28",
+"!.    c #203910",
+"~.    c #3E5D32",
+"{.    c #61934B",
+"].    c #7DBE58",
+"^.    c #7FB351",
+"/.    c #8C9E50",
+"(.    c #9A8750",
+"_.    c #A86E50",
+":.    c #B25F50",
+"<.    c #B25E5B",
+"[.    c #A4696D",
+"}.    c #6A4F55",
+"|.    c #423333",
+"1.    c #25180F",
+"2.    c #0A0603",
+"3.    c #282726",
+"4.    c #393939",
+"5.    c #434343",
+"6.    c #131010",
+"7.    c #190B06",
+"8.    c #332514",
+"9.    c #445E36",
+"0.    c #659A4D",
+"a.    c #7DBC57",
+"b.    c #7FB150",
+"c.    c #8E9B50",
+"d.    c #9C8450",
+"e.    c #AA6C50",
+"f.    c #B35D50",
+"g.    c #B0605D",
+"h.    c #9D666A",
+"i.    c #634C52",
+"j.    c #3D2937",
+"k.    c #270E22",
+"l.    c #0E1D00",
+"m.    c #325623",
+"n.    c #5E9F4F",
+"o.    c #5DB34C",
+"p.    c #69BC4F",
+"q.    c #7ABB53",
+"r.    c #85AB51",
+"s.    c #939551",
+"t.    c #A17E51",
+"u.    c #AE6751",
+"v.    c #B35956",
+"w.    c #AE5465",
+"x.    c #A1567C",
+"y.    c #895088",
+"z.    c #7B5681",
+"A.    c #685564",
+"B.    c #251714",
+"C.    c #130C09",
+"D.    c #0D0D0D",
+"E.    c #110F0F",
+"F.    c #180404",
+"G.    c #3D4826",
+"H.    c #629C4F",
+"I.    c #5DB54C",
+"J.    c #6BBC50",
+"K.    c #7BB952",
+"L.    c #87A951",
+"M.    c #959251",
+"N.    c #A37B51",
+"O.    c #AF6451",
+"P.    c #B35757",
+"Q.    c #AD5468",
+"R.    c #9E567D",
+"S.    c #864F89",
+"T.    c #795681",
+"U.    c #624D65",
+"V.    c #1E0A1E",
+"W.    c #29002D",
+"X.    c #37003E",
+"Y.    c #325426",
+"Z.    c #4A873F",
+"`.    c #66CB5A",
+" +    c #66CD53",
+".+    c #6FC451",
+"++    c #7DB551",
+"@+    c #8BA351",
+"#+    c #998D51",
+"$+    c #A77551",
+"%+    c #B45E51",
+"&+    c #B2555C",
+"*+    c #AA516E",
+"=+    c #9D5187",
+"-+    c #8E519D",
+";+    c #8459A7",
+">+    c #765E9B",
+",+    c #4C4054",
+"'+    c #2C1E1F",
+")+    c #1B0E09",
+"!+    c #262524",
+"~+    c #101010",
+"{+    c #181818",
+"]+    c #060704",
+"^+    c #333B24",
+"/+    c #538843",
+"(+    c #66CB59",
+"_+    c #66CD52",
+":+    c #71C251",
+"<+    c #8DA151",
+"[+    c #9B8A51",
+"}+    c #A97251",
+"|+    c #B55C52",
+"1+    c #B2545E",
+"2+    c #A95171",
+"3+    c #9B5189",
+"4+    c #8C51A0",
+"5+    c #835BA7",
+"6+    c #705994",
+"7+    c #443854",
+"8+    c #33143D",
+"9+    c #2C0033",
+"0+    c #162F00",
+"a+    c #4B8342",
+"b+    c #5FBC59",
+"c+    c #5CD851",
+"d+    c #68CC51",
+"e+    c #75BE51",
+"f+    c #83AE51",
+"g+    c #919B51",
+"h+    c #9F8451",
+"i+    c #AD6C51",
+"j+    c #B85652",
+"k+    c #B15262",
+"l+    c #A65177",
+"m+    c #975190",
+"n+    c #8951A5",
+"o+    c #7B51B7",
+"p+    c #7054BE",
+"q+    c #6D649D",
+"r+    c #4B3847",
+"s+    c #32180F",
+"t+    c #434140",
+"u+    c #2C2A2A",
+"v+    c #0C0F08",
+"w+    c #4D844A",
+"x+    c #5FC058",
+"y+    c #5ED751",
+"z+    c #6ACA51",
+"A+    c #77BC51",
+"B+    c #84AB51",
+"C+    c #929951",
+"D+    c #A18151",
+"E+    c #AE6951",
+"F+    c #B85453",
+"G+    c #B05265",
+"H+    c #A4517A",
+"I+    c #965192",
+"J+    c #8751A8",
+"K+    c #7951B9",
+"L+    c #6F56BA",
+"M+    c #6C6698",
+"N+    c #3C2950",
+"O+    c #1D0024",
+"P+    c #0B1800",
+"Q+    c #419A3C",
+"R+    c #5BD455",
+"S+    c #60D451",
+"T+    c #6CC751",
+"U+    c #7AB851",
+"V+    c #88A651",
+"W+    c #969251",
+"X+    c #A47A51",
+"Y+    c #B06552",
+"Z+    c #B85354",
+"`+    c #AD5169",
+" @    c #9F5181",
+".@    c #915199",
+"+@    c #8451AD",
+"@@    c #7751BD",
+"#@    c #6B52C8",
+"$@    c #695AC5",
+"%@    c #3E2E5E",
+"&@    c #150603",
+"*@    c #0E0D0C",
+"=@    c #0F0808",
+"-@    c #181208",
+";@    c #4AA644",
+">@    c #5CD454",
+",@    c #61D251",
+"'@    c #6EC551",
+")@    c #7CB651",
+"!@    c #8AA451",
+"~@    c #989051",
+"{@    c #A67751",
+"]@    c #B16252",
+"^@    c #B85256",
+"/@    c #AB516C",
+"(@    c #9D5184",
+"_@    c #8F519B",
+":@    c #8251AF",
+"<@    c #7551BF",
+"[@    c #6B53C8",
+"}@    c #685BC4",
+"|@    c #312458",
+"1@    c #0E0013",
+"2@    c #040900",
+"3@    c #3D9D39",
+"4@    c #5BD952",
+"5@    c #65CF51",
+"6@    c #71C151",
+"7@    c #7FB151",
+"8@    c #8E9F51",
+"9@    c #9C8951",
+"0@    c #A97151",
+"a@    c #B25E54",
+"b@    c #B5525C",
+"c@    c #A85173",
+"d@    c #9A518B",
+"e@    c #8B51A2",
+"f@    c #7E51B4",
+"g@    c #7151C3",
+"h@    c #6652CF",
+"i@    c #5F55D6",
+"j@    c #312A67",
+"k@    c #110B09",
+"l@    c #282827",
+"m@    c #1E1A1A",
+"n@    c #111307",
+"o@    c #46AE40",
+"p@    c #5CD752",
+"q@    c #66CD51",
+"r@    c #73C051",
+"s@    c #81AF51",
+"t@    c #909C51",
+"u@    c #9E8651",
+"v@    c #AB6E51",
+"w@    c #B25C55",
+"x@    c #B4515E",
+"y@    c #A65176",
+"z@    c #98518E",
+"A@    c #7D51B6",
+"B@    c #7051C5",
+"C@    c #6552D0",
+"D@    c #5E55D7",
+"E@    c #282159",
+"F@    c #050008",
+"G@    c #000100",
+"H@    c #3C9A38",
+"I@    c #5DD650",
+"J@    c #77BB51",
+"K@    c #85AA51",
+"L@    c #939751",
+"M@    c #A27F51",
+"N@    c #AE6851",
+"O@    c #B45856",
+"P@    c #B05165",
+"Q@    c #A3517D",
+"R@    c #945194",
+"S@    c #8551AB",
+"T@    c #7851BB",
+"U@    c #6C51C9",
+"V@    c #6051D5",
+"W@    c #5652DD",
+"X@    c #28276B",
+"Y@    c #131212",
+"Z@    c #333333",
+"`@    c #081307",
+" #    c #44AD3F",
+".#    c #5FD550",
+"+#    c #6BC851",
+"@#    c #78BA51",
+"##    c #87A851",
+"$#    c #959451",
+"%#    c #A37C51",
+"&#    c #AF6551",
+"*#    c #B35758",
+"=#    c #AF5167",
+"-#    c #A15180",
+";#    c #935197",
+">#    c #7751BC",
+",#    c #6A51CA",
+"'#    c #5F52D6",
+")#    c #5452DF",
+"!#    c #212058",
+"~#    c #000001",
+"{#    c #409738",
+"]#    c #62D250",
+"^#    c #7CB551",
+"/#    c #998E51",
+"(#    c #B36051",
+"_#    c #B65259",
+":#    c #AC516E",
+"<#    c #9D5186",
+"[#    c #7F51B1",
+"}#    c #7351C0",
+"|#    c #6752CD",
+"1#    c #5D53D9",
+"2#    c #5352E0",
+"3#    c #27276C",
+"4#    c #091307",
+"5#    c #48AA3F",
+"6#    c #64D050",
+"7#    c #70C351",
+"8#    c #7EB351",
+"9#    c #8CA051",
+"0#    c #9A8A51",
+"a#    c #A87251",
+"b#    c #B45D51",
+"c#    c #AA5171",
+"d#    c #8C519F",
+"e#    c #7E51B3",
+"f#    c #7151C1",
+"g#    c #5C53DA",
+"h#    c #5252E1",
+"i#    c #1F2059",
+"j#    c #47943A",
+"k#    c #69CB53",
+"l#    c #73BF51",
+"m#    c #82AF51",
+"n#    c #909A51",
+"o#    c #9E8451",
+"p#    c #AB6D51",
+"q#    c #B35B54",
+"r#    c #B25160",
+"s#    c #97518F",
+"t#    c #6E51C5",
+"u#    c #6352D2",
+"v#    c #5953DC",
+"w#    c #5854DD",
+"x#    c #30296A",
+"y#    c #110808",
+"z#    c #222121",
+"A#    c #1B1617",
+"B#    c #131208",
+"C#    c #50A442",
+"D#    c #6ACA53",
+"E#    c #75BD51",
+"F#    c #84AD51",
+"G#    c #929851",
+"H#    c #A08151",
+"I#    c #AD6A51",
+"J#    c #B45955",
+"K#    c #B15163",
+"L#    c #955192",
+"M#    c #8751A7",
+"N#    c #6D51C7",
+"O#    c #6152D3",
+"P#    c #5755DD",
+"Q#    c #25215D",
+"R#    c #05000A",
+"S#    c #0F1700",
+"T#    c #4E8A40",
+"U#    c #6FBC57",
+"V#    c #79B951",
+"W#    c #B06451",
+"X#    c #B35759",
+"Y#    c #AE5168",
+"Z#    c #A05181",
+"`#    c #915198",
+" $    c #8351AC",
+".$    c #7651BE",
+"+$    c #6A51CB",
+"@$    c #5E52D7",
+"#$    c #5654DD",
+"$$    c #5E58CE",
+"%$    c #3C2B61",
+"&$    c #170100",
+"*$    c #030000",
+"=$    c #0C0002",
+"-$    c #22100B",
+";$    c #589448",
+">$    c #70BC57",
+",$    c #7BB751",
+"'$    c #89A651",
+")$    c #978F51",
+"!$    c #A57851",
+"~$    c #B26151",
+"{$    c #B3565A",
+"]$    c #AC516B",
+"^$    c #9E5184",
+"/$    c #90519B",
+"($    c #6851CD",
+"_$    c #5D52D8",
+":$    c #5754DB",
+"<$    c #5F59CC",
+"[$    c #2E235E",
+"}$    c #0D0019",
+"|$    c #1C2A00",
+"1$    c #537249",
+"2$    c #729F5F",
+"3$    c #B65B51",
+"4$    c #B3535E",
+"5$    c #6452D0",
+"6$    c #5455DA",
+"7$    c #655DA9",
+"8$    c #4D2F4B",
+"9$    c #330300",
+"0$    c #360D10",
+"a$    c #5E7253",
+"b$    c #74A25D",
+"c$    c #81B051",
+"d$    c #8F9E51",
+"e$    c #9D8751",
+"f$    c #AB6F51",
+"g$    c #B85851",
+"h$    c #B25360",
+"i$    c #A85174",
+"j$    c #9A518C",
+"k$    c #8A51A3",
+"l$    c #7C51B5",
+"m$    c #6F51C5",
+"n$    c #6353D2",
+"o$    c #5853DD",
+"p$    c #5756D4",
+"q$    c #675EA3",
+"r$    c #392559",
+"s$    c #1A002E",
+"t$    c #324124",
+"u$    c #546942",
+"v$    c #85A065",
+"w$    c #929555",
+"x$    c #AE6A51",
+"y$    c #B75653",
+"z$    c #B05264",
+"A$    c #A3517B",
+"B$    c #955193",
+"C$    c #7A51B9",
+"D$    c #6D51C8",
+"E$    c #6051D4",
+"F$    c #6157D2",
+"G$    c #6357B6",
+"H$    c #453155",
+"I$    c #3B1C2A",
+"J$    c #3B322B",
+"K$    c #5E6A49",
+"L$    c #869F63",
+"M$    c #949453",
+"N$    c #A27E51",
+"O$    c #AF6752",
+"P$    c #AE5267",
+"Q$    c #A1517E",
+"R$    c #935196",
+"S$    c #8651AA",
+"T$    c #6B51CA",
+"U$    c #5F51D6",
+"V$    c #6258D0",
+"W$    c #5D52AD",
+"X$    c #382B57",
+"Y$    c #2A1842",
+"Z$    c #121600",
+"`$    c #3A4128",
+" %    c #6A7254",
+".%    c #7E764E",
+"+%    c #987051",
+"@%    c #B06457",
+"#%    c #B65458",
+"$%    c #AC516C",
+"%%    c #8F519C",
+"&%    c #8251AE",
+"*%    c #7852BD",
+"=%    c #6F53C6",
+"-%    c #5B4CBB",
+";%    c #594AA0",
+">%    c #5A4376",
+",%    c #2E121E",
+"'%    c #1C0007",
+")%    c #473C34",
+"!%    c #6E6D56",
+"~%    c #81764E",
+"{%    c #9C6F52",
+"]%    c #B16257",
+"^%    c #B75158",
+"/%    c #AA516F",
+"(%    c #9C5187",
+"_%    c #8D519F",
+":%    c #8151B0",
+"<%    c #7752BE",
+"[%    c #6C53C5",
+"}%    c #584CB9",
+"|%    c #5849A0",
+"1%    c #4F3D79",
+"2%    c #180828",
+"3%    c #21200A",
+"4%    c #443C36",
+"5%    c #7D5554",
+"6%    c #B06264",
+"7%    c #B25261",
+"8%    c #A75074",
+"9%    c #99508D",
+"0%    c #8950A5",
+"a%    c #7E4FB3",
+"b%    c #7A53BC",
+"c%    c #7A59BC",
+"d%    c #544376",
+"e%    c #392537",
+"f%    c #270807",
+"g%    c #220610",
+"h%    c #2A1119",
+"i%    c #493D3D",
+"j%    c #865857",
+"k%    c #B16064",
+"l%    c #B25061",
+"m%    c #A55077",
+"n%    c #975090",
+"o%    c #8850A7",
+"p%    c #7C4FB5",
+"q%    c #7A54BD",
+"r%    c #7556B3",
+"s%    c #4F406E",
+"t%    c #2D1E40",
+"u%    c #160426",
+"v%    c #382D16",
+"w%    c #452F1E",
+"x%    c #4E2C24",
+"y%    c #472123",
+"z%    c #3F1E2A",
+"A%    c #371D33",
+"B%    c #311D3C",
+"C%    c #311D41",
+"D%    c #372044",
+"E%    c #422443",
+"F%    c #431D29",
+"G%    c #3C1619",
+"H%    c #3C172A",
+"I%    c #481F2E",
+"J%    c #4D232D",
+"K%    c #461D27",
+"L%    c #3D1D2C",
+"M%    c #361D34",
+"N%    c #311D3D",
+"O%    c #301D45",
+"P%    c #331E4F",
+"Q%    c #381F55",
+"R%    c #311748",
+"S%    c #270F3A",
+"T%    c #312500",
+"U%    c #261B00",
+"V%    c #170E00",
+"W%    c #0B0600",
+"X%    c #040200",
+"Y%    c #070100",
+"Z%    c #120300",
+"`%    c #210600",
+" &    c #390800",
+".&    c #35001E",
+"+&    c #260017",
+"@&    c #15000E",
+"#&    c #090006",
+"$&    c #030002",
+"%&    c #040006",
+"&&    c #0C0011",
+"*&    c #150020",
+"=&    c #210035",
+"                                                                                                ",
+"                                                                                                ",
+"    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     ",
+"    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                             . . +               . . .                           . .     ",
+"    . .                       . . @ # $ % & *       . = - $ # @ . .                     . .     ",
+"    . .                       . . = ; > , ' ) .   . ) ' , > ; = . .                     . .     ",
+"    . .                 . . . . . . . . ! ~ { .   . { ~ ! . . . . . . . .               . .     ",
+"    . .             . . . . . . . . . . ] ^ / . . . / ^ ] . . . . . . . . . .           . .     ",
+"    .             ( _ _ ) ) _ _ : . . . . . < _ _ @ . . . . [ } _ ( | 1 _ ' / .           .     ",
+"            2 3 4 5 6 6 7 8 9 0 5 | ] a | [ # 6 6 b c | ] a d e f g h i 6 ~ j k l               ",
+"            m n o p < < q r s t u v w x y z A < < i B ] # _ C D E F G H < : I J K               ",
+"          L M N O P Q R S T U V W X Y Z `  .... . ' 5 A ; +.@.#.$.%.&.*.=.-.;.>.,.'.).          ",
+"        !.~.{.].^./.(._.:.<.[.}.|.1.2.3.4.[ . . . . } 5.6.7.8.9.0.a.b.c.d.e.f.g.h.i.j.k.        ",
+"    l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.| . . . . [ E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.  ",
+"    Y.Z.`. +.+++@+#+$+%+&+*+=+-+;+>+,+'+)+!+~+. . b {+]+^+/+(+_+:+^.<+[+}+|+1+2+3+4+5+6+7+8+9+  ",
+"  0+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+7 . . # u+v+w+x+y+z+A+B+C+D+E+F+G+H+I+J+K+L+M+N+O+  ",
+"  P+Q+R+S+T+U+V+W+X+Y+Z+`+ @.@+@@@#@$@%@&@*@] . . / =@-@;@>@,@'@)@!@~@{@]@^@/@(@_@:@<@[@}@|@1@  ",
+"  2@3@4@5@6@7@8@9@0@a@b@c@d@e@f@g@h@i@j@k@l@! . . x m@n@o@p@q@r@s@t@u@v@w@x@y@z@n+A@B@C@D@E@F@  ",
+"  G@H@I@z+J@K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@6 ' . . z Z@`@ #.#+#@###$#%#&#*#=#-#;#+@>#,#'#)#!#~#  ",
+"  G@{#]#'@^#@+/#$+(#_#:#<#-+[#}#|#1#2#3#Y@6 ' . . z Z@4#5#6#7#8#9#0#a#b#b@c#3+d#e#f#h@g#h#i#~#  ",
+"  o j#k#l#m#n#o#p#q#r#l+s#n+o+t#u#v#w#x#y#z#1     { A#B#C#D#E#F#G#H#I#J#K#H+L#M#K+N#O#v#P#Q#R#  ",
+"  S#T#U#V###W+N.W#X#Y#Z#`# $.$+$@$#$$$%$&$*$      . =$-$;$>$,$'$)$!$~${$]$^$/$:@<@($_$:$<$[$}$  ",
+"  |$1$2$^.<+[+}+3$4$2+3+4+e#g@5$v#6$7$8$9$            0$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$  ",
+"    t$u$v$w$D+x$y$z$A$B$J+C$D$E$F$G$H$I$                J$K$L$M$N$O$F+P$Q$R$S$T@T$U$V$W$X$Y$    ",
+"    Z$`$ %.%+%@%#%$%(@%%&%*%=%-%;%>%,%                  '%)%!%~%{%]%^%/%(%_%:%<%[%}%|%1%2%      ",
+"        3%4%5%6%7%8%9%0%a%b%c%d%e%f%                      g%h%i%j%k%l%m%n%o%p%q%r%s%t%u%        ",
+"          v%w%x%y%z%A%B%C%D%E%F%G%                            H%I%J%K%L%M%N%O%P%Q%R%S%          ",
+"          T%U%V%W%X%. . Y%Z%`% &                              .&+&@&#&$&. . %&&&*&=&            ",
+"    .                                                                                     .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . .                                                                                 . .     ",
+"    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     ",
+"    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     ",
+"                                                                                                ",
+"                                                                                                "};
diff --git a/src/image-load.c b/src/image-load.c
new file mode 100644 (file)
index 0000000..094ded4
--- /dev/null
@@ -0,0 +1,482 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "image-load.h"
+
+#include "ui_fileops.h"
+
+#include <fcntl.h>
+
+
+/* bytes to read from file per read() */
+#define IMAGE_LOADER_BUFFER_SIZE 512
+
+/* the number of bytes to read per idle call (define x IMAGE_LOADER_BUFFER_SIZE) */
+#define IMAGE_LOADER_BUFFER_DEFAULT_COUNT 1
+
+static void image_loader_sync_pixbuf(ImageLoader *il)
+{
+       GdkPixbuf *pb;
+
+       if (!il->loader) return;
+
+       pb = gdk_pixbuf_loader_get_pixbuf(il->loader);
+
+       if (pb == il->pixbuf) return;
+
+       if (il->pixbuf) gdk_pixbuf_unref(il->pixbuf);
+       il->pixbuf = pb;
+       if (il->pixbuf) gdk_pixbuf_ref(il->pixbuf);
+}
+
+static void image_loader_area_cb(GdkPixbufLoader *loader,
+                                guint x, guint y, guint w, guint h,
+                                gpointer data)
+{
+       ImageLoader *il = data;
+
+       if (il->func_area_ready)
+               {
+               if (!il->pixbuf)
+                       {
+                       image_loader_sync_pixbuf(il);
+                       if (!il->pixbuf)
+                               {
+                               printf("critical: area_ready signal with NULL pixbuf (out of mem?)\n");
+                               }
+                       }
+               il->func_area_ready(il, x, y, w, h, il->data_area_ready);
+               }
+}
+
+static void image_loader_size_cb(GdkPixbufLoader *loader,
+                                gint width, gint height, gpointer data)
+{
+       ImageLoader *il = data;
+       GdkPixbufFormat *format;
+       gchar **mime_types;
+       gint scale = FALSE;
+       gint n;
+
+       if (il->requested_width < 1 || il->requested_height < 1) return;
+
+       format = gdk_pixbuf_loader_get_format(loader);
+       if (!format) return;
+
+       mime_types = gdk_pixbuf_format_get_mime_types(format);
+       n = 0;
+       while (mime_types[n])
+               {
+               if (strstr(mime_types[n], "jpeg")) scale = TRUE;
+               n++;
+               }
+       g_strfreev(mime_types);
+       
+       if (!scale) return;
+
+       if (width > il->requested_width || height > il->requested_height)
+               {
+               gint nw, nh;
+
+               if (((gdouble)il->requested_width / width) < ((gdouble)il->requested_height / height))
+                       {
+                       nw = il->requested_width;
+                       nh = (gdouble)nw / width * height;
+                       if (nh < 1) nh = 1;
+                       }
+               else
+                       {
+                       nh = il->requested_height;
+                       nw = (gdouble)nh / height * width;
+                       if (nw < 1) nw = 1;
+                       }
+               
+               gdk_pixbuf_loader_set_size(loader, nw, nh);
+               }
+}
+
+static void image_loader_stop(ImageLoader *il)
+{
+       if (!il) return;
+
+       if (il->idle_id != -1)
+               {
+               g_source_remove(il->idle_id);
+               il->idle_id = -1;
+               }
+
+       if (il->loader)
+               {
+               /* some loaders do not have a pixbuf till close, order is important here */
+               gdk_pixbuf_loader_close(il->loader, NULL);
+               image_loader_sync_pixbuf(il);
+               g_object_unref(G_OBJECT(il->loader));
+               il->loader = NULL;
+               }
+
+       if (il->load_fd != -1)
+               {
+               close(il->load_fd);
+               il->load_fd = -1;
+               }
+
+       il->done = TRUE;
+}
+
+static void image_loader_done(ImageLoader *il)
+{
+       image_loader_stop(il);
+
+       if (il->func_done) il->func_done(il, il->data_done);
+}
+
+static gint image_loader_done_delay_cb(gpointer data)
+{
+       ImageLoader *il = data;
+
+       il->idle_done_id = -1;
+       image_loader_done(il);
+       return FALSE;
+}
+
+static void image_loader_done_delay(ImageLoader *il)
+{
+       if (il->idle_done_id == -1) il->idle_done_id = g_idle_add_full(il->idle_priority,
+                                                                      image_loader_done_delay_cb, il, NULL);
+}
+
+static void image_loader_error(ImageLoader *il)
+{
+       image_loader_stop(il);
+
+       if (debug) printf("pixbuf_loader reported load error for: %s\n", il->path);
+
+       if (il->func_error) il->func_error(il, il->data_error);
+}
+
+static gint image_loader_idle_cb(gpointer data)
+{
+       ImageLoader *il = data;
+       guchar buf[IMAGE_LOADER_BUFFER_SIZE];
+       gint b;
+       gint c;
+
+       if (!il) return FALSE;
+
+       if (il->idle_id == -1) return FALSE;
+
+       c = il->buffer_size ? il->buffer_size : 1;
+       while (c > 0)
+               {
+               b = read(il->load_fd, &buf, sizeof(buf));
+
+               if (b == 0)
+                       {
+                       image_loader_done(il);
+                       return FALSE;
+                       }
+
+               if (b < 0 || (b > 0 && !gdk_pixbuf_loader_write(il->loader, buf, b, NULL)))
+                       {
+                       image_loader_error(il);
+                       return FALSE;
+                       }
+
+               il->bytes_read += b;
+
+               c--;
+               }
+
+       if (il->func_percent && il->bytes_total > 0)
+               {
+               il->func_percent(il, (gdouble)il->bytes_read / il->bytes_total, il->data_percent);
+               }
+
+       return TRUE;
+}
+
+static gint image_loader_begin(ImageLoader *il)
+{
+       guchar buf[IMAGE_LOADER_BUFFER_SIZE];
+       int b;
+
+       if (!il->loader || il->pixbuf) return FALSE;
+
+       b = read(il->load_fd, &buf, sizeof(buf));
+
+       if (b < 1)
+               {
+               image_loader_stop(il);
+               return FALSE;
+               }
+
+       if (gdk_pixbuf_loader_write(il->loader, buf, b, NULL))
+               {
+               il->bytes_read += b;
+
+               if (b < sizeof(buf))
+                       {
+                       /* end of file already */
+
+                       image_loader_stop(il);
+
+                       if (!il->pixbuf) return FALSE;
+
+                       image_loader_done_delay(il);
+                       return TRUE;
+                       }
+               else
+                       {
+                       /* larger file */
+
+                       /* read until size is known */
+                       while(il->loader && !gdk_pixbuf_loader_get_pixbuf(il->loader) && b > 0)
+                               {
+                               b = read(il->load_fd, &buf, sizeof(buf));
+                               if (b < 0 || (b > 0 && !gdk_pixbuf_loader_write(il->loader, buf, b, NULL)))
+                                       {
+                                       image_loader_stop(il);
+                                       return FALSE;
+                                       }
+                               il->bytes_read += b;
+                               }
+                       if (!il->pixbuf) image_loader_sync_pixbuf(il);
+
+                       if (il->bytes_read == il->bytes_total || b < sizeof(buf))
+                               {
+                               /* done, handle (broken) loaders that do not have pixbuf till close */
+                               image_loader_stop(il);
+
+                               if (!il->pixbuf) return FALSE;
+
+                               image_loader_done_delay(il);
+                               return TRUE;
+                               }
+
+                       if (!il->pixbuf)
+                               {
+                               image_loader_stop(il);
+                               return FALSE;
+                               }
+
+                       /* finally, progressive loading :) */
+                       il->idle_id = g_idle_add_full(il->idle_priority, image_loader_idle_cb, il, NULL);
+                       return TRUE;
+                       }
+               }
+       else
+               {
+               image_loader_stop(il);
+               return FALSE;
+               }
+
+       return TRUE;
+}
+
+static gint image_loader_setup(ImageLoader *il)
+{
+       struct stat st;
+       gchar *pathl;
+
+       if (!il || il->load_fd != -1 || il->loader) return FALSE;
+
+       pathl = path_from_utf8(il->path);
+       il->load_fd = open(pathl, O_RDONLY | O_NONBLOCK);
+       g_free(pathl);
+       if (il->load_fd == -1) return FALSE;
+
+       if (fstat(il->load_fd, &st) == 0)
+               {
+               il->bytes_total = st.st_size;
+               }
+
+       il->loader = gdk_pixbuf_loader_new();
+       g_signal_connect(G_OBJECT(il->loader), "area_updated",
+                        G_CALLBACK(image_loader_area_cb), il);
+       g_signal_connect(G_OBJECT(il->loader), "size_prepared",
+                        G_CALLBACK(image_loader_size_cb), il);
+
+       return image_loader_begin(il);
+}
+
+ImageLoader *image_loader_new(const gchar *path)
+{
+       ImageLoader *il;
+
+       if (!path) return NULL;
+
+       il = g_new0(ImageLoader, 1);
+       if (path) il->path = g_strdup(path);
+       il->pixbuf = NULL;
+       il->idle_id = -1;
+       il->idle_priority = G_PRIORITY_DEFAULT_IDLE;
+       il->done = FALSE;
+       il->loader = NULL;
+       il->load_fd = -1;
+
+       il->bytes_read = 0;
+       il->bytes_total = 0;
+
+       il->idle_done_id = -1;
+
+       il->buffer_size = IMAGE_LOADER_BUFFER_DEFAULT_COUNT;
+
+       il->requested_width = 0;
+       il->requested_height = 0;
+
+       return il;
+}
+
+void image_loader_free(ImageLoader *il)
+{
+       if (!il) return;
+
+       image_loader_stop(il);
+       if (il->idle_done_id != -1) g_source_remove(il->idle_done_id);
+       if (il->pixbuf) gdk_pixbuf_unref(il->pixbuf);
+       g_free(il->path);
+       g_free(il);
+}
+
+/* don't forget to gdk_pixbuf_ref() it if you want to use it after image_loader_free() */
+GdkPixbuf *image_loader_get_pixbuf(ImageLoader *il)
+{
+       if (!il) return NULL;
+
+       return il->pixbuf;
+}
+
+gchar *image_loader_get_format(ImageLoader *il)
+{
+       GdkPixbufFormat *format;
+       gchar **mimev;
+       gchar *mime;
+
+       if (!il || !il->loader) return NULL;
+
+       format = gdk_pixbuf_loader_get_format(il->loader);
+       if (!format) return NULL;
+
+       mimev = gdk_pixbuf_format_get_mime_types(format);
+       if (!mimev) return NULL;
+
+       /* return first member of mimev, as GdkPixbufLoader has no way to tell us which exact one ? */
+       mime = g_strdup(mimev[0]);
+       g_strfreev(mimev);
+
+       return mime;
+}
+
+void image_loader_set_area_ready_func(ImageLoader *il,
+                                     void (*func_area_ready)(ImageLoader *, guint, guint, guint, guint, gpointer),
+                                     gpointer data_area_ready)
+{
+       if (!il) return;
+
+       il->func_area_ready = func_area_ready;
+       il->data_area_ready = data_area_ready;
+}
+
+void image_loader_set_error_func(ImageLoader *il,
+                                void (*func_error)(ImageLoader *, gpointer),
+                                gpointer data_error)
+{
+       if (!il) return;
+
+       il->func_error = func_error;
+       il->data_error = data_error;
+}
+
+void image_loader_set_percent_func(ImageLoader *il,
+                                  void (*func_percent)(ImageLoader *, gdouble, gpointer),
+                                  gpointer data_percent)
+{
+       if (!il) return;
+
+       il->func_percent = func_percent;
+       il->data_percent = data_percent;
+}
+
+void image_loader_set_requested_size(ImageLoader *il, gint width, gint height)
+{
+       if (!il) return;
+
+       il->requested_width = width;
+       il->requested_height = height;
+}
+
+void image_loader_set_buffer_size(ImageLoader *il, guint size)
+{
+       if (!il) return;
+
+       il->buffer_size = size ? size : 1;
+}
+
+void image_loader_set_priority(ImageLoader *il, gint priority)
+{
+       if (!il) return;
+
+       il->idle_priority = priority;
+}
+
+gint image_loader_start(ImageLoader *il, void (*func_done)(ImageLoader *, gpointer), gpointer data_done)
+{
+       if (!il) return FALSE;
+
+       if (!il->path) return FALSE;
+
+       il->func_done = func_done;
+       il->data_done = data_done;
+
+       return image_loader_setup(il);
+}
+
+gdouble image_loader_get_percent(ImageLoader *il)
+{
+       if (!il || il->bytes_total == 0) return 0.0;
+
+       return (gdouble)il->bytes_read / il->bytes_total;
+}
+
+gint image_loader_get_is_done(ImageLoader *il)
+{
+       if (!il) return FALSE;
+
+       return il->done;
+}
+
+gint image_load_dimensions(const gchar *path, gint *width, gint *height)
+{
+       ImageLoader *il;
+       gint success;
+
+       il = image_loader_new(path);
+
+       success = image_loader_start(il, NULL, NULL);
+
+       if (success && il->pixbuf)
+               {
+               if (width) *width = gdk_pixbuf_get_width(il->pixbuf);
+               if (height) *height = gdk_pixbuf_get_height(il->pixbuf);;
+               }
+       else
+               {
+               if (width) *width = -1;
+               if (height) *height = -1;
+               }
+
+       image_loader_free(il);
+
+       return success;
+}
+
diff --git a/src/image-load.h b/src/image-load.h
new file mode 100644 (file)
index 0000000..1ac7040
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef IMAGE_LOAD_H
+#define IMAGE_LOAD_H
+
+
+ImageLoader *image_loader_new(const gchar *path);
+void image_loader_free(ImageLoader *il);
+
+void image_loader_set_area_ready_func(ImageLoader *il,
+                                     void (*func_area_ready)(ImageLoader *, guint, guint, guint, guint, gpointer),
+                                     gpointer data_area_ready);
+void image_loader_set_error_func(ImageLoader *il,
+                                void (*func_error)(ImageLoader *, gpointer),
+                                gpointer data_error);
+void image_loader_set_percent_func(ImageLoader *il,
+                                  void (*func_percent)(ImageLoader *, gdouble, gpointer),
+                                  gpointer data_percent);
+
+/* Speed up loading when you only need at most width x height size image,
+ * only the jpeg GdkPixbuf loader benefits from it - so there is no
+ * guarantee that the image will scale down to the requested size..
+ */
+void image_loader_set_requested_size(ImageLoader *il, gint width, gint height);
+
+void image_loader_set_buffer_size(ImageLoader *il, guint size);
+
+/* this only has effect if used before image_loader_start()
+ * default is G_PRIORITY_DEFAULT_IDLE
+ */
+void image_loader_set_priority(ImageLoader *il, gint priority);
+
+gint image_loader_start(ImageLoader *il, void (*func_done)(ImageLoader *, gpointer), gpointer data_done);
+
+
+GdkPixbuf *image_loader_get_pixbuf(ImageLoader *il);
+gchar *image_loader_get_format(ImageLoader *il);
+gdouble image_loader_get_percent(ImageLoader *il);
+gint image_loader_get_is_done(ImageLoader *il);
+
+gint image_load_dimensions(const gchar *path, gint *width, gint *height);
+
+#endif
+
diff --git a/src/image-overlay.c b/src/image-overlay.c
new file mode 100644 (file)
index 0000000..bc68932
--- /dev/null
@@ -0,0 +1,248 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#include "gqview.h"
+#include "image-overlay.h"
+
+#include "collect.h"
+#include "filelist.h"
+#include "image.h"
+#include "img-view.h"
+#include "layout.h"
+#include "pixbuf_util.h"
+
+
+/*
+ *----------------------------------------------------------------------------
+ * image overlay
+ *----------------------------------------------------------------------------
+ */
+
+typedef struct _OverlayUpdate OverlayUpdate;
+struct _OverlayUpdate {
+       ImageWindow *imd;
+       gint id;
+       gint idle_id;
+       gulong destroy_id;
+};
+
+#define IMAGE_OVERLAY_UPDATE_KEY "image-overlay-update"
+
+#define IMAGE_OVERLAY_X 10
+#define IMAGE_OVERLAY_Y -10
+
+
+static GdkPixbuf *image_overlay_info_render(ImageWindow *imd)
+{
+       GdkPixbuf *pixbuf;
+       gint width, height;
+       PangoLayout *layout;
+       const gchar *name;
+       gchar *name_escaped;
+       gchar *text;
+       gchar *size;
+       gint n, t;
+       CollectionData *cd;
+       CollectInfo *info;
+       gchar *ct;
+
+       name = image_get_name(imd);
+       if (name)
+               {
+               name_escaped = g_markup_escape_text(name, -1);
+               }
+       else
+               {
+               name_escaped = NULL;
+               }
+
+       cd = image_get_collection(imd, &info);
+       if (cd)
+               {
+               gchar *buf;
+
+               t = g_list_length(cd->list);
+               n = g_list_index(cd->list, info) + 1;
+               buf = g_markup_escape_text((cd->name) ? cd->name : _("Untitled"), -1);
+               ct = g_strdup_printf("<i>%s</i>\n", buf);
+               g_free(buf);
+               }
+       else
+               {
+               LayoutWindow *lw;
+
+               lw = layout_find_by_image(imd);
+               if (lw)
+                       {
+                       if (lw->slideshow)
+                               {
+                               n = g_list_length(lw->slideshow->list_done);
+                               t = n + g_list_length(lw->slideshow->list);
+                               }
+                       else
+                               {
+                               t = layout_list_count(lw, NULL);
+                               n = layout_list_get_index(lw, image_get_path(lw->image)) + 1;
+                               }
+                       }
+               else if (view_window_find_image(imd, &n, &t))
+                       {
+                       n++;
+                       }
+               else
+                       {
+                       t = 1;
+                       n = 1;
+                       }
+
+               if (n < 1) n = 1;
+               if (t < 1) t = 1;
+
+               ct = g_strdup("");
+               }
+
+       size = text_from_size_abrev(imd->size);
+       if (!name_escaped)
+               {
+               text = g_strdup_printf(_("Untitled"));
+               }
+       else if (imd->unknown)
+               {
+               text = g_strdup_printf("%s(%d/%d) <b>%s</b>\n%s - %s", ct,
+                                      n, t, name_escaped,
+                                      text_from_time(imd->mtime), size);
+               }
+       else
+               {
+               gint w, h;
+
+               if (imd->delay_flip &&
+                   imd->il && imd->il->pixbuf &&
+                   imd->pixbuf != imd->il->pixbuf)
+                       {
+                       w = gdk_pixbuf_get_width(imd->il->pixbuf);
+                       h = gdk_pixbuf_get_height(imd->il->pixbuf);
+                       }
+               else
+                       {
+                       w = imd->image_width;
+                       h = imd->image_height;
+                       }
+
+               text = g_strdup_printf("%s(%d/%d) <b>%s</b>\n%d x %d - %s - %s", ct,
+                                      n, t, name_escaped,
+                                      w, h,
+                                      text_from_time(imd->mtime), size);
+               }
+       g_free(size);
+       g_free(ct);
+       g_free(name_escaped);
+
+       layout = gtk_widget_create_pango_layout(imd->image, NULL);
+       pango_layout_set_markup(layout, text, -1);
+       g_free(text);
+
+       pango_layout_get_pixel_size(layout, &width, &height);
+
+       width += 10;
+       height += 10;
+
+       pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height);
+       pixbuf_set_rect_fill(pixbuf, 3, 3, width-6, height-6, 240, 240, 240, 210);
+       pixbuf_set_rect(pixbuf, 0, 0, width, height, 240, 240, 240, 80, 1, 1, 1, 1);
+       pixbuf_set_rect(pixbuf, 1, 1, width-2, height-2, 240, 240, 240, 130, 1, 1, 1, 1);
+       pixbuf_set_rect(pixbuf, 2, 2, width-4, height-4, 240, 240, 240, 180, 1, 1, 1, 1);
+       pixbuf_pixel_set(pixbuf, 0, 0, 0, 0, 0, 0);
+       pixbuf_pixel_set(pixbuf, width - 1, 0, 0, 0, 0, 0);
+       pixbuf_pixel_set(pixbuf, 0, height - 1, 0, 0, 0, 0);
+       pixbuf_pixel_set(pixbuf, width - 1, height - 1, 0, 0, 0, 0);
+
+       pixbuf_draw_layout(pixbuf, layout, imd->image, 5, 5, 0, 0, 0, 255);
+
+       g_object_unref(G_OBJECT(layout));
+
+       return pixbuf;
+}
+
+static void image_overlay_update_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       OverlayUpdate *ou = data;
+
+       g_source_remove(ou->idle_id);
+       g_free(ou);
+}
+
+static gint image_overlay_update_cb(gpointer data)
+{
+       OverlayUpdate *ou = data;
+       GdkPixbuf *pixbuf;
+
+       pixbuf = image_overlay_info_render(ou->imd);
+       image_overlay_set(ou->imd, ou->id, pixbuf, IMAGE_OVERLAY_X, IMAGE_OVERLAY_Y);
+       g_object_unref(pixbuf);
+
+       g_object_set_data(G_OBJECT(ou->imd->image), IMAGE_OVERLAY_UPDATE_KEY, NULL);
+       g_signal_handler_disconnect(ou->imd->image, ou->destroy_id);
+       g_free(ou);
+
+       return FALSE;
+}
+
+static void image_overlay_update_schedule(ImageWindow *imd, gint id)
+{
+       OverlayUpdate *ou;
+
+       ou = g_object_get_data(G_OBJECT(imd->image), IMAGE_OVERLAY_UPDATE_KEY);
+       if (ou) return;
+
+       ou = g_new0(OverlayUpdate, 1);
+       ou->imd = imd;
+       ou->id = id;
+       ou->idle_id = g_idle_add_full(G_PRIORITY_HIGH, image_overlay_update_cb, ou, NULL);
+       ou->destroy_id = g_signal_connect(G_OBJECT(imd->image), "destroy",
+                                         G_CALLBACK(image_overlay_update_destroy_cb), ou);
+       g_object_set_data(G_OBJECT(imd->image), IMAGE_OVERLAY_UPDATE_KEY, ou);
+}
+
+void image_overlay_update(ImageWindow *imd, gint id)
+{
+       if (id < 0) return;
+       image_overlay_update_schedule(imd, id);
+}
+
+static void image_overlay_upate_cb(ImageWindow *imd, gpointer data)
+{
+       gint id;
+
+       id = GPOINTER_TO_INT(data);
+       image_overlay_update_schedule(imd, id);
+}
+
+gint image_overlay_info_enable(ImageWindow *imd)
+{
+       gint id;
+       GdkPixbuf *pixbuf;
+
+       pixbuf = image_overlay_info_render(imd);
+       id = image_overlay_add(imd, pixbuf, IMAGE_OVERLAY_X, IMAGE_OVERLAY_Y, TRUE, FALSE);
+       g_object_unref(pixbuf);
+
+       image_set_new_func(imd, image_overlay_upate_cb, GINT_TO_POINTER(id));
+
+       return id;
+}
+
+void image_overlay_info_disable(ImageWindow *imd, gint id)
+{
+       image_set_new_func(imd, NULL, NULL);
+       image_overlay_remove(imd, id);
+}
+
diff --git a/src/image-overlay.h b/src/image-overlay.h
new file mode 100644 (file)
index 0000000..8b2c2cf
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifndef IMAGE_OVERLAY_H
+#define IMAGE_OVERLAY_H
+
+
+gint image_overlay_info_enable(ImageWindow *imd);
+void image_overlay_info_disable(ImageWindow *imd, gint id);
+
+void image_overlay_update(ImageWindow *imd, gint id);
+
+
+#endif
+
+
index cba6ee9..ae38505 100644 (file)
 /*
- * GQview image viewer
- * (C)2000 John Ellis
+ * GQview
+ * (C) 2004 John Ellis
  *
  * Author: John Ellis
  *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
  */
 
+
 #include "gqview.h"
 #include "image.h"
-#include "icons/img_unknown.xpm"
-#include <gdk/gdkx.h>
 
-static gchar *zoom_as_text(gint zoom, gfloat scale);
-static void set_zoom_label(GtkWidget *label, gint zoom, gfloat scale);
-static void set_info_label(GtkWidget *label, gint width, gint height, gint size, gint unknown);
-static void set_window_title(ImageWindow *imd, gchar *text);
 
-static gint image_area_size_top_window(ImageWindow *imd, gint w, gint h);
+#include "image-load.h"
+#include "collect.h"
+#include "exif.h"
+#include "pixbuf_util.h"
+#include "ui_fileops.h"
 
-static void image_area_recalc_size(ImageWindow *imd, GtkAllocation *allocation);
+#include <math.h>
 
-static void image_area_redraw(ImageWindow *imd);
-static gint image_area_size_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data);
-static gint image_area_update_cb(GtkWidget *widget, GdkEventConfigure *event, gpointer data);
 
-static void set_mouse_cursor (GdkWindow *window, gint icon);
-static void image_area_mouse_moved(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
-static void image_area_mouse_pressed(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
-static void image_area_mouse_released(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
-static void image_area_mouse_drag(GtkWidget *widget, GdkDragContext *context, gpointer data);
+#define IMAGE_TILE_SIZE 128
+#define IMAGE_ZOOM_MIN -32.0
+#define IMAGE_ZOOM_MAX 32.0
 
-/*
- *-----------------------------------------------------------------------------
- * image status widget update routines (private)
- *-----------------------------------------------------------------------------
+/* size of the image loader buffer (512 bytes x defined number) */
+#define IMAGE_LOAD_BUFFER_COUNT 8
+
+/* define this so that more bytes are read per idle loop on larger images (> 1MB) */
+#define IMAGE_THROTTLE_LARGER_IMAGES 1
+
+/* throttle factor to increase read bytes by (2 is double, 3 is triple, etc.) */
+#define IMAGE_THROTTLE_FACTOR 4
+
+/* the file size at which throttling take place */
+#define IMAGE_THROTTLE_THRESHOLD 1048576
+
+/* distance to drag mouse to disable image flip */
+#define IMAGE_DRAG_SCROLL_THRESHHOLD 4
+
+/* alpha channel checkerboard background (same as gimp) */
+#define IMAGE_ALPHA_CHECK1 0x00999999
+#define IMAGE_ALPHA_CHECK2 0x00666666
+#define IMAGE_ALPHA_CHECK_SIZE 16
+
+#define IMAGE_AUTO_REFRESH_TIME 3000
+
+/* when scaling image to below this size, use nearest pixel for scaling
+ * (below about 4, the other scale types become slow generating their conversion tables)
  */
+#define IMAGE_MIN_SCALE_SIZE 8
+
 
-static gchar *zoom_as_text(gint zoom, gfloat scale)
+typedef enum {
+       TILE_RENDER_NONE = 0,   /* do nothing */
+       TILE_RENDER_AREA,       /* render an area of the tile */
+       TILE_RENDER_ALL         /* render the whole tile */
+} TileRenderType;
+
+typedef struct _ImageTile ImageTile;
+struct _ImageTile
 {
-       gint l = 1;
-       gint r = 1;
-       gchar *approx = " ";
-       if (zoom > 1) l = zoom;
-       if (zoom < -1) r = -zoom;
-       if (zoom == 0 && scale != 0)
+       GdkPixmap *pixmap;      /* off screen buffer */
+       GdkPixbuf *pixbuf;      /* pixbuf area for zooming */
+       gint x;                 /* x offset into image */
+       gint y;                 /* y offset into image */
+       gint w;                 /* width that is visible (may be less if at edge of image) */
+       gint h;                 /* height '' */
+
+       gint blank;
+
+/* render_todo: (explanation)
+       NONE    do nothing
+       AREA    render area of tile, usually only used when loading an image
+               note: will jump to an ALL if render_done is not ALL.
+       ALL     render entire tile, if never done before w/ ALL, for expose events *only*
+*/
+
+       TileRenderType render_todo;     /* what to do (see above) */
+       TileRenderType render_done;     /* highest that has been done before on tile */
+};
+
+typedef struct _QueueData QueueData;
+struct _QueueData
+{
+       ImageTile *it;
+       gint x;
+       gint y;
+       gint w;
+       gint h;
+       gint new_data;
+};
+
+typedef struct _CacheData CacheData;
+struct _CacheData
+{
+       GdkPixmap *pixmap;
+       GdkPixbuf *pixbuf;
+       ImageTile *it;
+       guint size;
+};
+
+typedef struct _OverlayData OverlayData;
+struct _OverlayData
+{
+       gint id;
+
+       GdkPixbuf *pixbuf;
+
+       gint x;
+       gint y;
+       gint relative;  /* x,y coordinates are relative, negative values start bottom right */
+
+       gint visible;
+       gint always;    /* hide temporarily when scrolling */
+};
+
+
+static void image_queue_clear(ImageWindow *imd);
+
+static void image_update_title(ImageWindow *imd);
+static void image_update_util(ImageWindow *imd);
+static void image_complete_util(ImageWindow *imd, gint preload);
+
+static void image_button_do(ImageWindow *imd, GdkEventButton *bevent);
+
+static void image_overlay_draw(ImageWindow *imd, gint x, gint y, gint w, gint h);
+static void image_overlay_queue_all(ImageWindow *imd);
+
+static void image_scroller_timer_set(ImageWindow *imd, gint start);
+
+
+static gint util_clip_region(gint x, gint y, gint w, gint h,
+                            gint clip_x, gint clip_y, gint clip_w, gint clip_h,
+                            gint *rx, gint *ry, gint *rw, gint *rh)
+{
+       if (clip_x + clip_w <= x ||
+           clip_x >= x + w ||
+           clip_y + clip_h <= y ||
+           clip_y >= y + h)
                {
-               if (scale < 1) r = 1 / scale + 0.5;
-               approx = " ~";
+               return FALSE;
                }
-       return g_strdup_printf("%d :%s%d", l, approx, r);
+
+       *rx = MAX(x, clip_x);
+       *rw = MIN((x + w), (clip_x + clip_w)) - *rx;
+
+       *ry = MAX(y, clip_y);
+       *rh = MIN((y + h), (clip_y + clip_h)) - *ry;
+
+       return TRUE;
 }
 
-static void set_zoom_label(GtkWidget *label, gint zoom, gfloat scale)
+
+/*
+ *-------------------------------------------------------------------
+ * tile cache
+ *-------------------------------------------------------------------
+ */
+
+static gint pixmap_calc_size(GdkPixmap *pixmap)
 {
-       gchar *buf;
-       buf = zoom_as_text(zoom, scale);
-       gtk_label_set(GTK_LABEL(label), buf);
-       g_free(buf);
+       gint w, h, d;
+
+       d = gdk_drawable_get_depth(pixmap);
+       gdk_drawable_get_size(pixmap, &w, &h);
+       return w * h * (d / 8);
 }
 
-static void set_info_label(GtkWidget *label, gint width, gint height, gint size, gint unknown)
+static void image_tile_cache_remove(ImageWindow *imd, ImageTile *it)
 {
-       gchar buf[64];
-       if (unknown)
-               sprintf(buf, _("( ? x ? ) %d bytes"), size);
-       else
-               sprintf(buf, _("( %d x %d ) %d bytes"), width, height, size);
-       gtk_label_set(GTK_LABEL(label), buf);
+       GList *work;
+
+       work = imd->tile_cache;
+       while(work)
+               {
+               CacheData *cd = work->data;
+               work = work->next;
+
+               if (cd->it == it)
+                       {
+                       imd->tile_cache = g_list_remove(imd->tile_cache, cd);
+                       imd->tile_cache_size -= cd->size;
+                       g_free(cd);
+                       }
+               }
 }
 
-static void set_window_title(ImageWindow *imd, gchar *text)
+static void image_tile_cache_free(ImageWindow *imd, CacheData *cd)
 {
-       gchar *title = NULL;
-       if (!imd->top_window) return;
-
-       if (imd->title)
+       imd->tile_cache = g_list_remove(imd->tile_cache, cd);
+       if (cd->pixmap)
                {
-               title = g_strconcat(imd->title, imd->image_name, text, NULL);
+               g_object_unref(cd->it->pixmap);
+               cd->it->pixmap = NULL;
+               cd->it->render_done = TILE_RENDER_NONE;
                }
-       else
+       if (cd->pixbuf)
                {
-               title = g_strconcat(imd->image_name, text, NULL);
+               gdk_pixbuf_unref(cd->it->pixbuf);
+               cd->it->pixbuf = NULL;
                }
-
-       gtk_window_set_title(GTK_WINDOW(imd->top_window), title);
-       g_free(title);
+       imd->tile_cache_size -= cd->size;
+       g_free(cd);
 }
 
-/*
- *-----------------------------------------------------------------------------
- * fit window to image utility (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static gint image_area_size_top_window(ImageWindow *imd, gint w, gint h)
+static void image_tile_cache_free_space(ImageWindow *imd, gint space, ImageTile *it)
 {
-       if (!imd->top_window) return FALSE;
-       if (imd == full_screen_image) return FALSE;
-       if (imd == normal_image && !toolwindow) return FALSE;
-       if (!fit_window) return FALSE;
+       GList *work = g_list_last(imd->tile_cache);
 
-       if (imd == normal_image)
+       while (work && imd->tile_cache_size > 0 && imd->tile_cache_size + space > tile_cache_max * 1048576)
                {
-               /* account for border frame */
-               w += 4;
-               h += 4;
+               CacheData *cd = work->data;
+               work = work->prev;
+               if (cd->it != it) image_tile_cache_free(imd, cd);
                }
+}
 
-       if (limit_window_size)
+static void image_tile_cache_add(ImageWindow *imd, ImageTile *it,
+                                GdkPixmap *pixmap, GdkPixbuf *pixbuf, guint size)
+{
+       CacheData *cd;
+
+       cd = g_new(CacheData, 1);
+       cd->pixmap = pixmap;
+       cd->pixbuf = pixbuf;
+       cd->it = it;
+       cd->size = size;
+
+       imd->tile_cache = g_list_prepend(imd->tile_cache, cd);
+
+       imd->tile_cache_size += cd->size;
+}
+
+static void image_tile_prepare(ImageWindow *imd, ImageTile *it)
+{
+       if (!it->pixmap)
                {
-               gint sw = gdk_screen_width() * max_window_size / 100;
-               gint sh = gdk_screen_height() * max_window_size / 100;
+               GdkPixmap *pixmap;
+               guint size;
 
-               if (w > sw) w = sw;
-               if (h > sh) h = sh;
-               }
+               pixmap = gdk_pixmap_new(imd->image->window, imd->tile_width, imd->tile_height, -1);
 
-       /* to cheat on a prob a little, don't resize if within 1 either way...
-          ...dumb off by 1 errors! ;) */
+               size = pixmap_calc_size(pixmap);
+               image_tile_cache_free_space(imd, size, it);
 
-/*     if (w >= (imd->top_window)->allocation.width - 1 &&
-           w <= (imd->top_window)->allocation.width + 1 &&
-           h >= (imd->top_window)->allocation.height - 1 &&
-           h <= (imd->top_window)->allocation.height + 1)
-               return FALSE;
-*/
-       if (debug) printf("auto sized to %d x %d\n", w, h);
+               it->pixmap = pixmap;
+               image_tile_cache_add(imd, it, pixmap, NULL, size);
+               }
+       
+       if ((imd->zoom != 1.0 || gdk_pixbuf_get_has_alpha(imd->pixbuf)) &&
+           !it->pixbuf)
+               {
+               GdkPixbuf *pixbuf;
+               guint size;
 
-       gdk_window_resize(imd->top_window->window, w, h);
-       gtk_widget_set_usize(imd->top_window, w, h);
+               pixbuf = gdk_pixbuf_new(gdk_pixbuf_get_colorspace(imd->pixbuf),
+                                       gdk_pixbuf_get_has_alpha(imd->pixbuf),
+                                       gdk_pixbuf_get_bits_per_sample(imd->pixbuf),
+                                       imd->tile_width, imd->tile_height);
 
-       return TRUE;
+               size = gdk_pixbuf_get_rowstride(pixbuf) * imd->tile_height;
+               image_tile_cache_free_space(imd, size, it);
+
+               it->pixbuf = pixbuf;
+               image_tile_cache_add(imd, it, NULL, pixbuf, size);
+               }
 }
 
 /*
- *-----------------------------------------------------------------------------
- * image widget zoom/recalc routines
- *-----------------------------------------------------------------------------
- */ 
+ *-------------------------------------------------------------------
+ * tiles
+ *-------------------------------------------------------------------
+ */
 
-void image_area_scroll(ImageWindow *imd, gint x, gint y)
+static ImageTile *image_tile_new(gint w, gint h)
 {
-       if (x != 0)
-               {
-               GtkAdjustment *h = gtk_viewport_get_hadjustment(GTK_VIEWPORT(imd->viewport));
-               gfloat val = h->value + x;
-               if (val < h->lower) val = h->lower;
-               if (val > h->upper - h->page_size) val = h->upper - h->page_size;
-               gtk_adjustment_set_value(GTK_ADJUSTMENT(h), val);
-               }
-
-       if (y != 0)
-               {
-               GtkAdjustment *v = gtk_viewport_get_vadjustment(GTK_VIEWPORT(imd->viewport));
-               gfloat val = v->value + y;
-               if (val < v->lower) val = v->lower;
-               if (val > v->upper - v->page_size) val = v->upper - v->page_size;
-               gtk_adjustment_set_value(GTK_ADJUSTMENT(v), val);
-               }
+       ImageTile *it;
+
+       it = g_new0(ImageTile, 1);
+       it->w = w;
+       it->h = h;
+       it->pixmap = NULL;
+       it->pixbuf = NULL;
+       it->blank = TRUE;
+       it->render_todo = TILE_RENDER_NONE;
+       it->render_done = TILE_RENDER_NONE;
+
+       return it;
 }
 
-gint image_area_get_zoom(ImageWindow *imd)
+static void image_tile_free(ImageTile *it)
 {
-       return imd->zoom;
+       if (!it) return;
+
+       if (it->pixbuf) gdk_pixbuf_unref(it->pixbuf);
+       if (it->pixmap) g_object_unref(it->pixmap);
+
+       g_free(it);
 }
 
-void image_area_adjust_zoom(ImageWindow *imd, gint increment)
+static void image_tile_sync_count(ImageWindow *imd, gint n)
 {
-       gint zoom = imd->zoom;
-       if (increment < 0)
+       gint l;
+
+       l = g_list_length(imd->tiles);
+
+       if (l == n) return;
+
+       if (l < n)
                {
-               while (increment < 0)
+               while (l < n)
                        {
-                       zoom--;
-                       if (zoom == 0 || zoom == -1) zoom = -2;
-                       increment++;
+                       imd->tiles = g_list_prepend(imd->tiles, image_tile_new(imd->tile_width, imd->tile_height));
+                       l++;
                        }
-               if (zoom < -8) zoom = -8;
                }
        else
                {
-               while (increment > 0)
+               /* This should remove from the tail of the GList, but with large images there are many tiles,
+                * making this significantly faster for those cases.
+                */
+               while (l > n && imd->tiles)
                        {
-                       zoom++;
-                       if (zoom == -1) zoom = 1;
-                       increment--;
+                       ImageTile *it = imd->tiles->data;
+                       imd->tiles = g_list_remove(imd->tiles, it);
+                       image_tile_cache_remove(imd, it);
+                       image_tile_free(it);
+                       l--;
                        }
-               if (zoom > 3) zoom = 3;
                }
-       if (zoom != imd->zoom)
-               image_area_set_zoom(imd, zoom);
 }
 
-void image_area_set_zoom(ImageWindow *imd, gint zoom)
+static void image_tile_sync(ImageWindow *imd, gint width, gint height, gint blank)
 {
-       if (zoom == imd->zoom && imd->width > 0 && imd->height > 0) return;
+       gint rows;
+       gint x, y;
+       GList *work;
 
-       imd->zoom = zoom;
-       image_area_recalc_size(imd, NULL);
+       imd->tile_cols = (width + imd->tile_width - 1) / imd->tile_width;
 
-       gtk_widget_set_usize (imd->table, imd->width, imd->height);
-       gtk_drawing_area_size(GTK_DRAWING_AREA(imd->image), imd->width, imd->height);
+       rows = (height + imd->tile_height - 1) / imd->tile_height;
+
+       image_tile_sync_count(imd, imd->tile_cols * rows);
+
+       x = y = 0;
+       work = imd->tiles;
+       while(work)
+               {
+               ImageTile *it = work->data;
+               work = work->next;
+
+               it->x = x;
+               it->y = y;
+               if (x + imd->tile_width > width)
+                       {
+                       it->w = width - x;
+                       }       
+               else
+                       {
+                       it->w = imd->tile_width;
+                       }
+               if (y + imd->tile_height > height)
+                       {
+                       it->h = height - y;
+                       }
+               else
+                       {
+                       it->h = imd->tile_height;
+                       }
+
+               it->blank = blank;
+               it->render_todo = TILE_RENDER_NONE;
+               it->render_done = TILE_RENDER_NONE;
+
+               x += imd->tile_width;
+               if (x >= width)
+                       {
+                       x = 0;
+                       y += imd->tile_height;
+                       }
+               }
+
+       /* all it's are now useless in queue */
+       image_queue_clear(imd);
 }
 
-static void image_area_recalc_size(ImageWindow *imd, GtkAllocation *allocation)
+static void image_tile_render(ImageWindow *imd, ImageTile *it,
+                             gint x, gint y, gint w, gint h,
+                             gint new_data, gint fast)
 {
-       gint w, h, ww, wh;
-       gfloat scale_factor = 1;
+       gint has_alpha;
+       gint draw = FALSE;
+
+       if (it->render_todo == TILE_RENDER_NONE && it->pixmap) return;
 
-       w = imd->image_data->rgb_width;
-       h = imd->image_data->rgb_height;
-       if (allocation)
+       if (it->render_done != TILE_RENDER_ALL)
                {
-               ww = allocation->width;
-               wh = allocation->height;
+               x = 0;
+               y = 0;
+               w = it->w;
+               h = it->h;
+               if (!fast) it->render_done = TILE_RENDER_ALL;
                }
-       else
+       else if (it->render_todo != TILE_RENDER_AREA)
                {
-               ww = (imd->eventbox)->allocation.width;
-               wh = (imd->eventbox)->allocation.height;
+               if (!fast) it->render_todo = TILE_RENDER_NONE;
+               return;
                }
 
-       if (imd == normal_image)
+       if (!fast) it->render_todo = TILE_RENDER_NONE;
+
+       if (new_data) it->blank = FALSE;
+
+       image_tile_prepare(imd, it);
+       has_alpha = gdk_pixbuf_get_has_alpha(imd->pixbuf);
+
+       /* FIXME checker colors for alpha should be configurable,
+        * also should be drawn for blank = TRUE
+        */
+
+       if (it->blank)
                {
-               /* account for frame */
-               ww -= 4;
-               wh -= 4;
+               /* no data, do fast rect fill */
+               gdk_draw_rectangle(it->pixmap, imd->image->style->black_gc, TRUE,
+                                  0, 0, it->w, it->h);
                }
-
-       if (imd->zoom == 0) /* zoom to fit */
+       else if (imd->zoom == 1.0 || imd->scale == 1.0)
                {
-               if (imd == normal_image && imd->width == 0 && imd->height == 0 &&
-                   fit_window && toolwindow)
+               if (has_alpha)
                        {
-                       if (limit_window_size)
-                               {
-                               ww = (gdk_screen_width() * max_window_size / 100) - 4;
-                               wh = (gdk_screen_height() * max_window_size / 100) - 4;
-                               }
-                       else
-                               {
-                               ww = w;
-                               wh = h;
-                               }
+                       gdk_pixbuf_composite_color(imd->pixbuf, it->pixbuf, x, y, w, h,
+                                        (double) 0.0 - it->x,
+                                        (double) 0.0 - it->y,
+                                        1.0, 1.0, GDK_INTERP_NEAREST,
+                                        255, it->x + x, it->y + y,
+                                        IMAGE_ALPHA_CHECK_SIZE, IMAGE_ALPHA_CHECK1, IMAGE_ALPHA_CHECK2);
+                       draw = TRUE;
                        }
-               if (w > ww || h > wh)
+               else
                        {
-                       if ((gfloat)ww / w > (gfloat)wh / h)
-                               {
-                               scale_factor = (gfloat) wh / h;
-                               h = wh;
-                               w = w * scale_factor + 0.5;
-                               if (w > ww) w = ww;
-                               }
-                       else
-                               {
-                               scale_factor = (gfloat)ww / w;
-                               w = ww;
-                               h = h * scale_factor + 0.5;
-                               if (h > wh) h = wh;
-                               }
-                       if (w < 1) w = 1;
-                       if (h < 1) h = 1;
+                       /* faster, simple */
+                       gdk_draw_pixbuf(it->pixmap,
+                                       imd->image->style->fg_gc[GTK_WIDGET_STATE(imd->image)],
+                                       imd->pixbuf,
+                                       it->x + x, it->y + y,
+                                       x, y,
+                                       w, h,
+                                       (GdkRgbDither)dither_quality, it->x + x, it->y + y);
                        }
                }
-       else if (imd->zoom > 0) /* zoom orig, in */
-               {
-               scale_factor = imd->zoom;
-               w = w * scale_factor;
-               h = h * scale_factor;
-               }
-       else if (imd->zoom < -1) /* zoom out */
+       else
                {
-               scale_factor = (- imd->zoom);
-               w = w / scale_factor;
-               h = h / scale_factor;
-               }
-
-       imd->width = w;
-       imd->height = h;
+               double scale_x, scale_y;
 
-       if (debug) printf("recalc %d x %d @ %f\n", w, h, scale_factor);
+               if (imd->image_width == 0 || imd->image_height == 0) return;
+               scale_x = (double)imd->width / imd->image_width;
+               scale_y = (double)imd->height / imd->image_height;
 
-       if (imd->zoom_label)
-               {
-               set_zoom_label(imd->zoom_label, imd->zoom, scale_factor);
-               }
+               /* HACK: The pixbuf scalers get kinda buggy(crash) with extremely
+                * small sizes for anything but GDK_INTERP_NEAREST
+                */
+               if (imd->width < IMAGE_MIN_SCALE_SIZE || imd->height < IMAGE_MIN_SCALE_SIZE) fast = TRUE;
 
-/* this is causing problems with resizing
-       if (imd->top_window && imd->show_title_zoom)
-               {
-               gchar *buf = zoom_as_text(imd->zoom, scale_factor);
-               gchar *zbuf = g_strconcat(" [ ", buf, "]", NULL);
-               g_free(buf);
-               set_window_title(imd, zbuf);
-               g_free(zbuf);
+               if (!has_alpha)
+                       {
+                       gdk_pixbuf_scale(imd->pixbuf, it->pixbuf, x, y, w, h,
+                                        (double) 0.0 - it->x,
+                                        (double) 0.0 - it->y,
+                                        scale_x, scale_y,
+                                        (fast) ? GDK_INTERP_NEAREST : (GdkInterpType)zoom_quality);
+                       }
+               else
+                       {
+                       gdk_pixbuf_composite_color(imd->pixbuf, it->pixbuf, x, y, w, h,
+                                        (double) 0.0 - it->x,
+                                        (double) 0.0 - it->y,
+                                        scale_x, scale_y,
+                                        (fast) ? GDK_INTERP_NEAREST : (GdkInterpType)zoom_quality,
+                                        255, it->x + x, it->y + y,
+                                        IMAGE_ALPHA_CHECK_SIZE, IMAGE_ALPHA_CHECK1, IMAGE_ALPHA_CHECK2);
+                       }
+               draw = TRUE;
                }
-*/
 
-       if (image_area_size_top_window(imd, w, h))
+       if (draw && it->pixbuf && !it->blank)
                {
-               /* this is hacky */
-               imd->artificial_size = TRUE;
-               gtk_grab_add (info_zoom);
-               while(gtk_events_pending()) gtk_main_iteration();
-               gtk_grab_remove(info_zoom);
-               imd->artificial_size = FALSE;
+               gdk_draw_pixbuf(it->pixmap,
+                               imd->image->style->fg_gc[GTK_WIDGET_STATE(imd->image)],
+                               it->pixbuf,
+                               x, y,
+                               x, y,
+                               w, h,
+                               (GdkRgbDither)dither_quality, it->x + x, it->y + y);
                }
 }
 
-/*
- *-----------------------------------------------------------------------------
- * image widget set/get image information
- *-----------------------------------------------------------------------------
- */ 
-
-void image_area_set_path(ImageWindow *imd, gchar *newpath)
+static void image_tile_expose(ImageWindow *imd, ImageTile *it,
+                             gint x, gint y, gint w, gint h,
+                             gint new_data, gint fast)
 {
-       if (!imd->image_path || !newpath) return;
+       image_tile_render(imd, it, x, y, w, h, new_data, fast);
 
-       g_free(imd->image_path);
-       imd->image_path = g_strdup(newpath);
-       imd->image_name = filename_from_path(imd->image_path);
+       gdk_draw_drawable(imd->image->window, imd->image->style->fg_gc[GTK_WIDGET_STATE(imd->image)],
+                         it->pixmap, x, y,
+                         imd->x_offset + (it->x - imd->x_scroll) + x, imd->y_offset + (it->y - imd->y_scroll) + y, w, h);
 
-       if (imd->top_window)
+       if (imd->overlay_list)
                {
-               set_window_title(imd, NULL);
+               image_overlay_draw(imd, imd->x_offset + (it->x - imd->x_scroll) + x,
+                                       imd->y_offset + (it->y - imd->y_scroll) + y,
+                                       w, h);
                }
 }
 
-gchar *image_area_get_path(ImageWindow *imd)
+static gint image_tile_is_visible(ImageWindow *imd, ImageTile *it)
 {
-       return imd->image_path;
+       return (it->x + it->w >= imd->x_scroll && it->x <= imd->x_scroll + imd->window_width - imd->x_offset * 2 &&
+               it->y + it->h >= imd->y_scroll && it->y <= imd->y_scroll + imd->window_height - imd->y_offset * 2);
 }
 
-gchar *image_area_get_name(ImageWindow *imd)
-{
-       return imd->image_name;
-}
+/*
+ *-------------------------------------------------------------------
+ * render queue
+ *-------------------------------------------------------------------
+ */
+
 
-void image_area_set_image(ImageWindow *imd, gchar *path, gint zoom)
+static gint image_queue_draw_idle_cb(gpointer data)
 {
-       if (path && imd->image_path && !strcmp(path, imd->image_path)) return;
+       ImageWindow *imd = data;
+       QueueData *qd;
+       gint fast;
 
-       g_free(imd->image_path);
-       if (path)
+       if (!imd->pixbuf || (!imd->draw_queue && !imd->draw_queue_2pass) || imd->draw_idle_id == -1)
+               {
+               if (!imd->completed) image_complete_util(imd, FALSE);
+
+               imd->draw_idle_id = -1;
+               return FALSE;
+               }
+
+       if (imd->draw_queue)
                {
-               imd->image_path = g_strdup(path);
-               imd->image_name = filename_from_path(imd->image_path);
+               qd = imd->draw_queue->data;
+               fast = (two_pass_zoom && (GdkInterpType)zoom_quality != GDK_INTERP_NEAREST && imd->scale != 1.0);
                }
        else
                {
-               imd->image_path = NULL;
-               imd->image_name = " ";
-               zoom = 1;
+               if (imd->il)
+                       {
+                       /* still loading, wait till done (also drops the higher priority) */
+
+                       imd->draw_idle_id = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,
+                                                           image_queue_draw_idle_cb, imd, NULL);
+                       imd->draw_idle_high = FALSE;
+                       return FALSE;
+                       }
+               qd = imd->draw_queue_2pass->data;
+               fast = FALSE;
+               }
+
+       if (GTK_WIDGET_REALIZED(imd->image))
+               {
+               if (image_tile_is_visible(imd, qd->it))
+                       {
+                       image_tile_expose(imd, qd->it, qd->x, qd->y, qd->w, qd->h, qd->new_data, fast);
+                       }
+               else if (qd->new_data)
+                       {
+                       /* if new pixel data, and we already have a pixmap, update the tile */
+                       qd->it->blank = FALSE;
+                       if (qd->it->pixmap && qd->it->render_done == TILE_RENDER_ALL)
+                               {
+                               image_tile_render(imd, qd->it, qd->x, qd->y, qd->w, qd->h, qd->new_data, fast);
+                               }
+                       }
                }
 
-       if (imd->image_data) gdk_imlib_destroy_image(imd->image_data);
-       if (path && isfile(path))
+       if (imd->draw_queue)
                {
-               imd->image_data = gdk_imlib_load_image(path);
-               if (!imd->image_data)
+               imd->draw_queue = g_list_remove(imd->draw_queue, qd);
+               if (fast)
                        {
-                       imd->image_data = gdk_imlib_create_image_from_xpm_data((gchar **)img_unknown_xpm);
-                       imd->unknown = TRUE;
+                       imd->draw_queue_2pass = g_list_append(imd->draw_queue_2pass, qd);
                        }
                else
                        {
-                       imd->unknown = FALSE;
+                       g_free(qd);
                        }
-               imd->size = filesize(path);
                }
        else
                {
-               if (path)
-                       imd->image_data = gdk_imlib_create_image_from_xpm_data((gchar **)img_unknown_xpm);
-               else
-                       imd->image_data = gdk_imlib_create_image_from_data((char *)logo, NULL, logo_width, logo_height);
-               imd->unknown = TRUE;
-               imd->size = 0;
+               imd->draw_queue_2pass = g_list_remove(imd->draw_queue_2pass, qd);
+               g_free(qd);
                }
 
-       imd->width = imd->old_width = 0;
-       imd->height = imd->old_height = 0;
-
-       if (imd->top_window)
+       if (!imd->draw_queue && !imd->draw_queue_2pass)
                {
-               set_window_title(imd, NULL);
+               if (!imd->completed) image_complete_util(imd, FALSE);
+
+               imd->draw_idle_id = -1;
+               return FALSE;
                }
-       if (imd->info_label)
+
+       return TRUE;
+}
+
+static QueueData *image_queue_combine(ImageWindow *imd, QueueData *qd)
+{
+       QueueData *found = NULL;
+       GList *work;
+
+       work = imd->draw_queue;
+       while (work && !found)
                {
-               set_info_label(imd->info_label, imd->image_data->rgb_width, imd->image_data->rgb_height, imd->size, imd->unknown);
+               found = work->data;
+               work = work->next;
+
+               if (found->it != qd->it) found = NULL;
                }
 
-       /* do info area updates here */
+       if (found)
+               {
+               if (found->x + found->w < qd->x + qd->w) found->w += (qd->x + qd->w) - (found->x + found->w);
+               if (found->x > qd->x)
+                       {
+                       found->w += found->x - qd->x;
+                       found->x = qd->x;
+                       }
 
-       imd->new_img = TRUE;
-       image_area_set_zoom(imd, zoom);
-}
+               if (found->y + found->h < qd->y + qd->h) found->h += (qd->y + qd->h) - (found->y + found->h);
+               if (found->y > qd->y)
+                       {
+                       found->h += found->y - qd->y;
+                       found->y = qd->y;
+                       }
+               found->new_data |= qd->new_data;
+               }
 
-/*
- *-----------------------------------------------------------------------------
- * image widget redraw/callbacks (private)
- *-----------------------------------------------------------------------------
- */ 
+       return found;
+}
 
-static void image_area_redraw(ImageWindow *imd)
+static gint image_clamp_to_visible(ImageWindow *imd, gint *x, gint *y, gint *w, gint *h)
 {
-       GdkBitmap *mask = NULL;
+       gint nx, ny;
+       gint nw, nh;
+       gint vx, vy;
+       gint vw, vh;
 
-       if (debug) printf("redrawn %d x %d\n", imd->width, imd->height);
+       vw = imd->vis_width;
+       vh = imd->vis_height;
 
-       if (!imd->image_data) return;
+       vx = imd->x_scroll;
+       vy = imd->y_scroll;
 
-       if (imd->width == imd->old_width && imd->height == imd->old_height)
-               {
-               if (debug) printf("redraw cancelled\n");
-               return;
-               }
+       if (*x + *w < vx || *x > vx + vw || *y + *h < vy || *y > vy + vh) return FALSE;
 
-       if (imd->image_pixmap) gdk_imlib_free_pixmap(imd->image_pixmap);
-       imd->image_pixmap = NULL;
+       /* now clamp it */
+       nx = CLAMP(*x, vx, vx + vw);
+       nw = CLAMP(*w - (nx - *x), 1, vw);
 
-       gdk_imlib_render(imd->image_data, imd->width, imd->height);
-       imd->image_pixmap = gdk_imlib_move_image(imd->image_data);
-       mask = gdk_imlib_move_mask(imd->image_data);
+       ny = CLAMP(*y, vy, vy + vh);
+       nh = CLAMP(*h - (ny - *y), 1, vh);
 
-       gdk_window_set_back_pixmap(imd->image->window, imd->image_pixmap, FALSE);
-       gdk_window_shape_combine_mask (imd->image->window, mask, 0, 0);
-       gdk_window_clear(imd->image->window);
-       gdk_flush();
+       *x = nx;
+       *y = ny;
+       *w = nw;
+       *h = nh;
 
-       imd->old_width = imd->width;
-       imd->old_height = imd->height;
+       return TRUE;
 }
 
-static gint image_area_size_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data)
+static gint image_queue_to_tiles(ImageWindow *imd, gint x, gint y, gint w, gint h,
+                                gint clamp, TileRenderType render, gint new_data)
 {
-       ImageWindow *imd = data;
-       gint old_w, old_h;
-       GtkAdjustment *h;
-       GtkAdjustment *v;
-       gfloat h_pos;
-       gfloat v_pos;
-       gfloat h_max;
-       gfloat v_max;
+       gint i, j;
+       gint x1, x2;
+       gint y1, y2;
+       GList *work;
 
-       if (imd->artificial_size) return FALSE;
+       if (clamp && !image_clamp_to_visible(imd, &x, &y, &w, &h)) return FALSE;
 
-       h = gtk_viewport_get_hadjustment(GTK_VIEWPORT(imd->viewport));
-       v = gtk_viewport_get_vadjustment(GTK_VIEWPORT(imd->viewport));
+       x1 = (gint)floor(x / imd->tile_width) * imd->tile_width;
+       x2 = (gint)ceil((x + w) / imd->tile_width) * imd->tile_width;
 
-       h_pos = h->value;
-       h_max = allocation->width;
-       v_pos = v->value;
-       v_max = allocation->height;
+       y1 = (gint)floor(y / imd->tile_height) * imd->tile_height;
+       y2 = (gint)ceil((y + h) / imd->tile_height) * imd->tile_height;
 
-       if (imd == normal_image)
+       work = g_list_nth(imd->tiles, y1 / imd->tile_height * imd->tile_cols + (x1 / imd->tile_width));
+       for (j = y1; j <= y2; j += imd->tile_height)
                {
-               h_max -= 4.0;
-               v_max -= 4.0;
+               GList *tmp;
+               tmp = work;
+               for (i = x1; i <= x2; i += imd->tile_width)
+                       {
+                       if (tmp)
+                               {
+                               ImageTile *it = tmp->data;
+                               QueueData *qd;
+
+                               if ((render == TILE_RENDER_ALL && it->render_done != TILE_RENDER_ALL) ||
+                                   (render == TILE_RENDER_AREA && it->render_todo != TILE_RENDER_ALL))
+                                       {
+                                       it->render_todo = render;
+                                       }
+
+                               qd = g_new(QueueData, 1);
+                               qd->it = it;
+                               qd->new_data = new_data;
+
+                               if (i < x)
+                                       {
+                                       qd->x = x - i;
+                                       }
+                               else
+                                       {
+                                       qd->x = 0;
+                                       }
+                               qd->w = x + w - i - qd->x;
+                               if (qd->x + qd->w > imd->tile_width) qd->w = imd->tile_width - qd->x;
+
+
+                               if (j < y)
+                                       {
+                                       qd->y = y - j;
+                                       }
+                               else
+                                       {
+                                       qd->y = 0;
+                                       }
+                               qd->h = y + h - j - qd->y;
+                               if (qd->y + qd->h > imd->tile_height) qd->h = imd->tile_height - qd->y;
+
+                               if (qd->w < 1 || qd->h < 1 || /* <--- sanity checks, rare cases cause this */
+                                   image_queue_combine(imd, qd))
+                                       {
+                                       g_free(qd);
+                                       }
+                               else
+                                       {
+                                       imd->draw_queue = g_list_append(imd->draw_queue, qd);
+                                       }
+
+                               tmp = tmp->next;
+                               }
+                       }
+               work = g_list_nth(work, imd->tile_cols);        /* step 1 row */
                }
 
-       if (h_pos > h->upper - h_max) h_pos = h->upper - h_max;
-       if (v_pos > v->upper - v_max) v_pos = v->upper - v_max;
+       return TRUE;
+}
 
-       if (imd->new_img)
-               {
-               imd->new_img = FALSE;
-               gtk_adjustment_clamp_page(h, 0.0, h_max);
-               gtk_adjustment_clamp_page(v, 0.0, v_max);
-               }
-       else
+static void image_queue(ImageWindow *imd, gint x, gint y, gint w, gint h,
+                       gint clamp, TileRenderType render, gint new_data)
+{
+       gint nx, ny;
+
+       nx = CLAMP(x, 0, imd->width - 1);
+       ny = CLAMP(y, 0, imd->height - 1);
+       w -= (nx - x);
+       h -= (ny - y);
+       w = CLAMP(w, 0, imd->width - nx);
+       h = CLAMP(h, 0, imd->height - ny);
+       if (w < 1 || h < 1) return;
+
+       if (image_queue_to_tiles(imd, nx, ny, w, h, clamp, render, new_data) &&
+           ((!imd->draw_queue && !imd->draw_queue_2pass) || imd->draw_idle_id == -1 || !imd->draw_idle_high))
                {
-               gtk_adjustment_clamp_page(h, h_pos, h_max);
-               gtk_adjustment_clamp_page(v, v_pos, v_max);
+               if (imd->draw_idle_id != -1) g_source_remove(imd->draw_idle_id);
+               imd->draw_idle_id = g_idle_add_full(GDK_PRIORITY_REDRAW,
+                                                   image_queue_draw_idle_cb, imd, NULL);
+               imd->draw_idle_high = TRUE;
                }
+}
 
-        gtk_adjustment_changed(h);
-        gtk_adjustment_changed(v);
-
-       if (!imd->image_data || imd->zoom != 0) return FALSE;
+static void image_queue_list_free(GList *list)
+{
+       GList *work;
 
-       old_w = imd->width;
-       old_h = imd->height;
-       image_area_recalc_size(imd, allocation);
-       if (old_w != imd->width || old_h != imd->height)
+       work = list;
+       while (work)
                {
-               gtk_widget_set_usize (imd->table, imd->width, imd->height);
-               gtk_drawing_area_size(GTK_DRAWING_AREA(imd->image), imd->width, imd->height);
-               }
+               QueueData *qd;
 
-       if (debug) printf("sized %d x %d (%d x %d)\n", allocation->width, allocation->height, imd->width, imd->height);
+               qd = work->data;
+               work = work->next;
+               g_free(qd);
+               }
 
-       return FALSE;
+       g_list_free(list);
 }
 
-static gint image_area_update_cb(GtkWidget *widget, GdkEventConfigure *event, gpointer data)
+static void image_queue_clear(ImageWindow *imd)
 {
-       ImageWindow *imd = data;
-
-       if (imd->artificial_size) return FALSE;
+       image_queue_list_free(imd->draw_queue);
+       imd->draw_queue = NULL;
 
-       image_area_redraw(imd);
+       image_queue_list_free(imd->draw_queue_2pass);
+       imd->draw_queue_2pass = NULL;
 
-       return FALSE;
+       if (imd->draw_idle_id != -1) g_source_remove(imd->draw_idle_id);
+       imd->draw_idle_id = -1;
 }
 
 /*
- *-----------------------------------------------------------------------------
- * image widget mouse routines (private)
- *-----------------------------------------------------------------------------
- */ 
+ *-------------------------------------------------------------------
+ * core calculations
+ *-------------------------------------------------------------------
+ */
 
-static void set_mouse_cursor (GdkWindow *window, gint icon)
+static gint image_top_window_sizable(ImageWindow *imd)
 {
-       GdkCursor *cursor;
-
-       if (icon == -1)
-               {
-               cursor = NULL;
-               }
-       else
-               {
-               cursor = gdk_cursor_new (icon);
-               }
-
-       gdk_window_set_cursor (window, cursor);
+       if (!imd->top_window) return FALSE;
+       if (!fit_window) return FALSE;
+       if (!imd->top_window_sync) return FALSE;
+       if (!imd->image->window) return FALSE;
+       if (window_maximized(imd->top_window)) return FALSE;
 
-       if (cursor) gdk_cursor_destroy (cursor);
+       return TRUE;
 }
 
-static void image_area_mouse_moved(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+static gint image_size_top_window(ImageWindow *imd, gint w, gint h)
 {
-       ImageWindow *imd = data;
-       GtkAdjustment* h;
-       GtkAdjustment* v;
-       gfloat x, y;
-       gfloat val;
+       gint ww, wh;
 
-       if (!imd->in_drag || !gdk_pointer_is_grabbed()) return;
+       if (!image_top_window_sizable(imd)) return FALSE;
 
-       if (imd->drag_moved < 4)
-               {
-               imd->drag_moved++;
-               }
-       else
+       if (limit_window_size)
                {
-               set_mouse_cursor (imd->eventbox->window, GDK_FLEUR);
+               gint sw = gdk_screen_width() * max_window_size / 100;
+               gint sh = gdk_screen_height() * max_window_size / 100;
+
+               if (w > sw) w = sw;
+               if (h > sh) h = sh;
+               }
+
+       w += (imd->top_window->allocation.width - imd->image->allocation.width);
+       h += (imd->top_window->allocation.height - imd->image->allocation.height);
+
+       gdk_drawable_get_size(imd->top_window->window, &ww, &wh);
+       if (w == ww && h == wh) return FALSE;
+
+       gdk_window_resize(imd->top_window->window, w, h);
+
+       return TRUE;
+}
+
+static void image_redraw(ImageWindow *imd, gint new_data)
+{
+       image_queue_clear(imd);
+       image_queue(imd, 0, 0, imd->width, imd->height, TRUE, TILE_RENDER_ALL, new_data);
+}
+
+static void image_border_draw(ImageWindow *imd, gint x, gint y, gint w, gint h)
+{
+       gint rx, ry, rw, rh;
+
+       if (!imd->image->window) return;
+
+       if (!imd->pixbuf)
+               {
+               if (util_clip_region(x, y, w, h,
+                       0, 0,
+                       imd->window_width, imd->window_height,
+                       &rx, &ry, &rw, &rh))
+                       {
+                       gdk_window_clear_area(imd->image->window, rx, ry, rw, rh);
+                       image_overlay_draw(imd, rx, ry, rw, rh);
+                       }
+               return;
+               }
+
+       if (imd->vis_width < imd->window_width)
+               {
+               if (imd->x_offset > 0 &&
+                   util_clip_region(x, y, w, h,
+                       0, 0,
+                       imd->x_offset, imd->window_height,
+                       &rx, &ry, &rw, &rh))
+                       {
+                       gdk_window_clear_area(imd->image->window, rx, ry, rw, rh);
+                       image_overlay_draw(imd, rx, ry, rw, rh);
+                       }
+               if (imd->window_width - imd->vis_width - imd->x_offset > 0 &&
+                   util_clip_region(x, y, w, h,
+                       imd->x_offset + imd->vis_width, 0,
+                       imd->window_width - imd->vis_width - imd->x_offset, imd->window_height,
+                       &rx, &ry, &rw, &rh))
+                       {
+                       gdk_window_clear_area(imd->image->window, rx, ry, rw, rh);
+                       image_overlay_draw(imd, rx, ry, rw, rh);
+                       }
+               }
+       if (imd->vis_height < imd->window_height)
+               {
+               if (imd->y_offset > 0 &&
+                   util_clip_region(x, y, w, h,
+                       imd->x_offset, 0,
+                       imd->vis_width, imd->y_offset,
+                       &rx, &ry, &rw, &rh))
+                       {
+                       gdk_window_clear_area(imd->image->window, rx, ry, rw, rh);
+                       image_overlay_draw(imd, rx, ry, rw, rh);
+                       }
+               if (imd->window_height - imd->vis_height - imd->y_offset > 0 &&
+                   util_clip_region(x, y, w, h,
+                       imd->x_offset, imd->y_offset + imd->vis_height,
+                       imd->vis_width, imd->window_height - imd->vis_height - imd->y_offset,
+                       &rx, &ry, &rw, &rh))
+                       {
+                       gdk_window_clear_area(imd->image->window, rx, ry, rw, rh);
+                       image_overlay_draw(imd, rx, ry, rw, rh);
+                       }
+               }
+}
+
+static void image_border_clear(ImageWindow *imd)
+{
+       image_border_draw(imd, 0, 0, imd->window_width, imd->window_height);
+}
+
+static gint image_scroll_clamp(ImageWindow *imd)
+{
+       gint old_xs;
+       gint old_ys;
+
+       if (imd->zoom == 0.0)
+               {
+               imd->x_scroll = 0;
+               imd->y_scroll = 0;
+               return FALSE;
+               }
+
+       old_xs = imd->x_scroll;
+       old_ys = imd->y_scroll;
+
+       if (imd->x_offset > 0)
+               {
+               imd->x_scroll = 0;
+               }
+       else
+               {
+               imd->x_scroll = CLAMP(imd->x_scroll, 0, imd->width - imd->vis_width);
+               }
+
+       if (imd->y_offset > 0)
+               {
+               imd->y_scroll = 0;
+               }
+       else
+               {
+               imd->y_scroll = CLAMP(imd->y_scroll, 0, imd->height - imd->vis_height);
+               }
+
+       return (old_xs != imd->x_scroll || old_ys != imd->y_scroll);
+}
+
+static gint image_zoom_clamp(ImageWindow *imd, gdouble zoom, gint force, gint new)
+{
+       gint w, h;
+       gdouble scale;
+
+       zoom = CLAMP(zoom, IMAGE_ZOOM_MIN, IMAGE_ZOOM_MAX);
+
+       if (imd->zoom == zoom && !force) return FALSE;
+
+       w = imd->image_width;
+       h = imd->image_height;
+
+       if (zoom == 0.0 && !imd->pixbuf)
+               {
+               scale = 1.0;
+               }
+       else if (zoom == 0.0)
+               {
+               gint max_w;
+               gint max_h;
+               gint sizeable;
+
+               sizeable = (new && image_top_window_sizable(imd));
+
+               if (sizeable)
+                       {
+                       max_w = gdk_screen_width();
+                       max_h = gdk_screen_height();
+
+                       if (limit_window_size)
+                               {
+                               max_w = max_w * max_window_size / 100;
+                               max_h = max_h * max_window_size / 100;
+                               }
+                       }
+               else
+                       {
+                       max_w = imd->window_width;
+                       max_h = imd->window_height;
+                       }
+
+               if ((zoom_to_fit_expands && !sizeable) || w > max_w || h > max_h)
+                       {
+                       if ((gdouble)max_w / w > (gdouble)max_h / h)
+                               {
+                               scale = (gdouble)max_h / h;
+                               h = max_h;
+                               w = w * scale + 0.5;
+                               if (w > max_w) w = max_w;
+                               }
+                       else
+                               {
+                               scale = (gdouble)max_w / w;
+                               w = max_w;
+                               h = h * scale + 0.5;
+                               if (h > max_h) h = max_h;
+                               }
+                       if (w < 1) w = 1;
+                       if (h < 1) h = 1;
+                       }
+               else
+                       {
+                       scale = 1.0;
+                       }
+               }
+       else if (zoom > 0.0) /* zoom orig, in */
+               {
+               scale = zoom;
+               w = w * scale;
+               h = h * scale;
+               }
+       else /* zoom out */
+               {
+               scale = 1.0 / (0.0 - zoom);
+               w = w * scale;
+               h = h * scale;
+               }
+
+       imd->zoom = zoom;
+       imd->width = w;
+       imd->height = h;
+       imd->scale = scale;
+
+       return TRUE;
+}
+
+static gint image_size_clamp(ImageWindow *imd)
+{
+       gint old_vw, old_vh;
+
+       old_vw = imd->vis_width;
+       old_vh = imd->vis_height;
+
+       if (imd->width < imd->window_width)
+               {
+               imd->vis_width = imd->width;
+               imd->x_offset = (imd->window_width - imd->width) / 2;
+               }
+       else
+               {
+               imd->vis_width = imd->window_width;
+               imd->x_offset = 0;
+               }
+
+       if (imd->height < imd->window_height)
+               {
+               imd->vis_height = imd->height;
+               imd->y_offset = (imd->window_height - imd->height) / 2;
+               }
+       else
+               {
+               imd->vis_height = imd->window_height;
+               imd->y_offset = 0;
+               }
+
+       return (old_vw != imd->vis_width || old_vh != imd->vis_height);
+}
+
+static void image_size_sync(ImageWindow *imd, gint new_width, gint new_height)
+{
+       if (imd->window_width == new_width && imd->window_height == new_height) return;
+
+       imd->window_width = new_width;
+       imd->window_height = new_height;
+
+       if (imd->zoom == 0.0) image_zoom_clamp(imd, 0.0, TRUE, FALSE);
+
+       image_size_clamp(imd);
+       image_scroll_clamp(imd);
+
+       gtk_widget_set_size_request(imd->image, imd->window_width, imd->window_height);
+
+       /* ensure scroller remains visible */
+       if (imd->scroller_overlay != -1)
+               {
+               gint update = FALSE;
+
+               if (imd->scroller_x > new_width)
+                       {
+                       imd->scroller_x = new_width;
+                       imd->scroller_xpos = new_width;
+                       update = TRUE;
+                       }
+               if (imd->scroller_y > new_height)
+                       {
+                       imd->scroller_y = new_height;
+                       imd->scroller_ypos = new_height;
+                       update = TRUE;
+                       }
+
+               if (update)
+                       {
+                       GdkPixbuf *pixbuf;
+
+                       if (image_overlay_get(imd, imd->scroller_overlay, &pixbuf, NULL, NULL))
+                               {
+                               gint w, h;
+
+                               w = gdk_pixbuf_get_width(pixbuf);
+                               h = gdk_pixbuf_get_height(pixbuf);
+                               image_overlay_set(imd, imd->scroller_overlay, pixbuf,
+                                                 imd->scroller_x - w / 2, imd->scroller_y - h / 2);
+                               }
+                       }
+               }
+
+       /* clear any borders */
+       image_border_clear(imd);
+       
+       image_tile_sync(imd, imd->width, imd->height, FALSE);
+#if 0
+       /* no longer needed? (expose event should be doing this for us) */
+       image_redraw(imd, FALSE);
+#endif
+
+       if (imd->title_show_zoom) image_update_title(imd);
+       image_update_util(imd);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * misc
+ *-------------------------------------------------------------------
+ */
+
+static void image_update_title(ImageWindow *imd)
+{
+       gchar *title = NULL;
+       gchar *zoom = NULL;
+       gchar *collection = NULL;
+
+       if (!imd->top_window) return;
+
+       if (imd->collection && collection_to_number(imd->collection) >= 0)
+               {
+               const gchar *name;
+               name = imd->collection->name;
+               if (!name) name = _("Untitled");
+               collection = g_strdup_printf(" (Collection %s)", name);
+               }
+
+       if (imd->title_show_zoom)
+               {
+               gchar *buf = image_zoom_get_as_text(imd);
+               zoom = g_strconcat(" [", buf, "]", NULL);
+               g_free(buf);
+               }
+
+       title = g_strdup_printf("%s%s%s%s%s%s",
+               imd->title ? imd->title : "",
+               imd->image_name ? imd->image_name : "",
+               zoom ? zoom : "",
+               collection ? collection : "",
+               imd->image_name ? " - " : "",
+               imd->title_right ? imd->title_right : "");
+
+       gtk_window_set_title(GTK_WINDOW(imd->top_window), title);
+
+       g_free(title);
+       g_free(zoom);
+       g_free(collection);
+}
+
+static void image_update_util(ImageWindow *imd)
+{
+       if (imd->func_update) imd->func_update(imd, imd->data_update);
+}
+
+static void image_complete_util(ImageWindow *imd, gint preload)
+{
+       if (imd->il && imd->pixbuf != image_loader_get_pixbuf(imd->il)) return;
+
+       if (debug) printf("image load completed \"%s\" (%s)\n",
+                         (preload) ? imd->read_ahead_path : imd->image_path,
+                         (preload) ? "preload" : "current");
+
+       if (!preload) imd->completed = TRUE;
+       if (imd->func_complete) imd->func_complete(imd, preload, imd->data_complete);
+}
+
+static void image_new_util(ImageWindow *imd)
+{
+       if (imd->func_new) imd->func_new(imd, imd->data_new);
+}
+
+static void image_scroll_real(ImageWindow *imd, gint x, gint y)
+{
+       gint old_x, old_y;
+       gint x_off, y_off;
+       gint w, h;
+
+       if (!imd->pixbuf) return;
+
+       old_x = imd->x_scroll;
+       old_y = imd->y_scroll;
+
+       imd->x_scroll += x;
+       imd->y_scroll += y;
+
+       image_scroll_clamp(imd);
+       if (imd->x_scroll == old_x && imd->y_scroll == old_y) return;
+
+       if (imd->overlay_list)
+               {
+               gint new_x, new_y;
+
+               new_x = imd->x_scroll;
+               new_y = imd->y_scroll;
+               imd->x_scroll = old_x;
+               imd->y_scroll = old_y;
+               image_overlay_queue_all(imd);
+               imd->x_scroll = new_x;
+               imd->y_scroll = new_y;
+               }
+
+       x_off = imd->x_scroll - old_x;
+       y_off = imd->y_scroll - old_y;
+
+       w = imd->vis_width - abs(x_off);
+       h = imd->vis_height - abs(y_off);
+
+       if (w < 1 || h < 1)
+               {
+               /* scrolled completely to new material */
+               image_queue(imd, 0, 0, imd->width, imd->height, TRUE, TILE_RENDER_ALL, FALSE);
+               return;
+               }
+       else
+               {
+               gint x1, y1;
+               gint x2, y2;
+               GdkGC *gc;
+
+               if (x_off < 0)
+                       {
+                       x1 = abs(x_off);
+                       x2 = 0;
+                       }
+               else
+                       {
+                       x1 = 0;
+                       x2 = abs(x_off);
+                       }
+
+               if (y_off < 0)
+                       {
+                       y1 = abs(y_off);
+                       y2 = 0;
+                       }
+               else
+                       {
+                       y1 = 0;
+                       y2 = abs(y_off);
+                       }
+
+               gc = gdk_gc_new(imd->image->window);
+               gdk_gc_set_exposures(gc, TRUE);
+               gdk_draw_drawable(imd->image->window, gc,
+                                 imd->image->window,
+                                 x2 + imd->x_offset, y2 + imd->y_offset,
+                                 x1 + imd->x_offset, y1 + imd->y_offset, w, h);
+               g_object_unref(gc);
+
+               if (imd->overlay_list)
+                       {
+                       image_overlay_queue_all(imd);
+                       }
+
+               w = imd->vis_width - w;
+               h = imd->vis_height - h;
+
+               if (w > 0)
+                       {
+                       image_queue(imd,
+                                   x_off > 0 ? imd->x_scroll + (imd->vis_width - w) : imd->x_scroll, imd->y_scroll,
+                                   w, imd->vis_height, TRUE, TILE_RENDER_ALL, FALSE);
+                       }
+               if (h > 0)
+                       {
+                       /* FIXME, to optimize this, remove overlap */
+                       image_queue(imd,
+                                   imd->x_scroll, y_off > 0 ? imd->y_scroll + (imd->vis_height - h) : imd->y_scroll,
+                                   imd->vis_width, h, TRUE, TILE_RENDER_ALL, FALSE);
+                       }
+               }
+}
+
+static void widget_set_cursor(GtkWidget *widget, gint icon)
+{
+       GdkCursor *cursor;
+
+       if (!widget->window) return;
+
+       if (icon == -1)
+               {
+               cursor = NULL;
+               }
+       else
+               {
+               cursor = gdk_cursor_new (icon);
+               }
+
+       gdk_window_set_cursor(widget->window, cursor);
+
+       if (cursor) gdk_cursor_unref(cursor);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * image pixbuf handling
+ *-------------------------------------------------------------------
+ */
+
+static void image_zoom_sync(ImageWindow *imd, gdouble zoom,
+                           gint force, gint blank, gint new,
+                           gint center_point, gint px, gint py)
+{
+       gdouble old_scale;
+       gint old_cx, old_cy;
+       gint clamped;
+       gint sized;
+
+       old_scale = imd->scale;
+       if (center_point)
+               {
+               px = CLAMP(px, 0, imd->width);
+               py = CLAMP(py, 0, imd->height);
+               old_cx = imd->x_scroll + (px - imd->x_offset);
+               old_cy = imd->y_scroll + (py - imd->y_offset);
+               }
+       else
+               {
+               px = py = 0;
+               old_cx = imd->x_scroll + imd->vis_width / 2;
+               old_cy = imd->y_scroll + imd->vis_height / 2;
+               }
+
+       if (!image_zoom_clamp(imd, zoom, force, new)) return;
+
+       clamped = image_size_clamp(imd);
+       sized = image_size_top_window(imd, imd->width, imd->height);
+
+       if (force)
+               {
+               /* force means new image, so update scroll offset per options */
+               switch (scroll_reset_method)
+                       {
+                       case SCROLL_RESET_NOCHANGE:
+                               /* maintain old scroll position, do nothing */
+                               break;
+                       case SCROLL_RESET_CENTER:
+                               /* center new image */
+                               imd->x_scroll = ((double)imd->image_width / 2.0 * imd->scale) - imd->vis_width / 2;
+                               imd->y_scroll = ((double)imd->image_height / 2.0 * imd->scale) - imd->vis_height / 2;
+                               break;
+                       case SCROLL_RESET_TOPLEFT:
+                       default:
+                               /* reset to upper left */
+                               imd->x_scroll = 0;
+                               imd->y_scroll = 0;
+                               break;
+                       }
+               }
+       else
+               {
+               /* user zoom does not force, so keep visible center point */
+               if (center_point)
+                       {
+                       imd->x_scroll = old_cx / old_scale * imd->scale - (px - imd->x_offset);
+                       imd->y_scroll = old_cy / old_scale * imd->scale - (py - imd->y_offset);
+                       }
+               else
+                       {
+                       imd->x_scroll = old_cx / old_scale * imd->scale - (imd->vis_width / 2);
+                       imd->y_scroll = old_cy / old_scale * imd->scale - (imd->vis_height / 2);
+                       }
+               }
+       image_scroll_clamp(imd);
+
+       image_tile_sync(imd, imd->width, imd->height, blank);
+
+       /* If the window was not sized, redraw the image - we know there will be no size/expose signal.
+        * But even if a size is claimed, there is no guarantee that the window manager will allow it,
+        * so redraw the window anyway :/
+        */
+       if (sized || clamped) image_border_clear(imd);
+       image_redraw(imd, FALSE);
+
+       if (imd->title_show_zoom) image_update_title(imd);
+       image_update_util(imd);
+}
+
+static void image_pixbuf_sync(ImageWindow *imd, gdouble zoom, gint blank, gint new)
+{
+       if (!imd->pixbuf)
+               {
+               /* no pixbuf so just clear the window */
+               imd->image_width = 0;
+               imd->image_height = 0;
+               imd->scale = 1.0;
+
+               if (imd->image->window)
+                       {
+                       gdk_window_clear(imd->image->window);
+                       image_overlay_draw(imd, 0, 0, imd->window_width, imd->window_height);
+                       }
+
+               image_update_util(imd);
+               
+               return;
+               }
+
+       imd->image_width = gdk_pixbuf_get_width(imd->pixbuf);
+       imd->image_height = gdk_pixbuf_get_height(imd->pixbuf);
+
+#if 0
+       /* reset scrolling */
+       imd->x_scroll = 0;
+       imd->y_scroll = 0;
+#endif
+
+       image_zoom_sync(imd, zoom, TRUE, blank, new, FALSE, 0, 0);
+}
+
+static void image_set_pixbuf(ImageWindow *imd, GdkPixbuf *pixbuf, gdouble zoom, gint new)
+{
+       if (pixbuf) g_object_ref(pixbuf);
+       if (imd->pixbuf) g_object_unref(imd->pixbuf);
+       imd->pixbuf = pixbuf;
+
+       image_pixbuf_sync(imd, zoom, FALSE, new);
+}
+
+static void image_alter_real(ImageWindow *imd, AlterType type, gint clamp)
+{
+       GdkPixbuf *new = NULL;
+       gint x, y;
+       gint t;
+
+       imd->delay_alter_type = ALTER_NONE;
+
+       if (!imd->pixbuf) return;
+
+       x = imd->x_scroll + (imd->vis_width / 2);
+       y = imd->y_scroll + (imd->vis_height / 2);
+
+       switch (type)
+               {
+               case ALTER_ROTATE_90:
+                       new = pixbuf_copy_rotate_90(imd->pixbuf, FALSE);
+                       t = x;
+                       x = imd->height - y;
+                       y = t;
+                       break;
+               case ALTER_ROTATE_90_CC:
+                       new = pixbuf_copy_rotate_90(imd->pixbuf, TRUE);
+                       t = x;
+                       x = y;
+                       y = imd->width - t;
+                       break;
+               case ALTER_ROTATE_180:
+                       new = pixbuf_copy_mirror(imd->pixbuf, TRUE, TRUE);
+                       x = imd->width - x;
+                       y = imd->height - y;
+                       break;
+               case ALTER_MIRROR:
+                       new = pixbuf_copy_mirror(imd->pixbuf, TRUE, FALSE);
+                       x = imd->width - x;
+                       break;
+               case ALTER_FLIP:
+                       new = pixbuf_copy_mirror(imd->pixbuf, FALSE, TRUE);
+                       y = imd->height - y;
+                       break;
+               case ALTER_NONE:
+               default:
+                       return;
+                       break;
+               }
+
+       if (!new) return;
+
+       if (clamp)
+               {
+               image_set_pixbuf(imd, new, imd->zoom, TRUE);
+               g_object_unref(new);
+
+               if (imd->zoom != 0.0)
+                       {
+                       image_scroll(imd, x - (imd->vis_width / 2), y - (imd->vis_height / 2));
+                       }
+               }
+       else
+               {
+               g_object_unref(imd->pixbuf);
+               imd->pixbuf = new;
+               }
+}
+
+static void image_post_process(ImageWindow *imd, gint clamp)
+{
+       if (exif_rotate_enable && imd->pixbuf)
+               {
+               ExifData *ed;
+               gint orientation;
+
+               ed = exif_read(imd->image_path);
+               if (ed && exif_get_integer(ed, "Orientation", &orientation))
+                       {
+                       /* see http://jpegclub.org/exif_orientation.html 
+                         1        2       3      4         5            6           7          8
+
+                       888888  888888      88  88      8888888888  88                  88  8888888888
+                       88          88      88  88      88  88      88  88          88  88      88  88
+                       8888      8888    8888  8888    88          8888888888  8888888888          88
+                       88          88      88  88
+                       88          88  888888  888888
+                       */
+
+                       switch (orientation)
+                               {
+                               case EXIF_ORIENTATION_TOP_LEFT:
+                                       /* normal -- nothing to do */
+                                       break;
+                               case EXIF_ORIENTATION_TOP_RIGHT:
+                                       /* mirrored */
+                                       imd->delay_alter_type = ALTER_MIRROR;
+                                       break;
+                               case EXIF_ORIENTATION_BOTTOM_RIGHT:
+                                       /* upside down */
+                                       imd->delay_alter_type = ALTER_ROTATE_180;
+                                       break;
+                               case EXIF_ORIENTATION_BOTTOM_LEFT:
+                                       /* flipped */
+                                       imd->delay_alter_type = ALTER_FLIP;
+                                       break;
+                               case EXIF_ORIENTATION_LEFT_TOP:
+                                       /* not implemented -- too wacky to fix in one step */
+                                       break;
+                               case EXIF_ORIENTATION_RIGHT_TOP:
+                                       /* rotated -90 (270) */
+                                       imd->delay_alter_type = ALTER_ROTATE_90;
+                                       break;
+                               case EXIF_ORIENTATION_RIGHT_BOTTOM:
+                                       /* not implemented -- too wacky to fix in one step */
+                                       break;
+                               case EXIF_ORIENTATION_LEFT_BOTTOM:
+                                       /* rotated 90 */
+                                       imd->delay_alter_type = ALTER_ROTATE_90_CC;
+                                       break;
+                               default:
+                                       /* The other values are out of range */
+                                       break;
+                               }
+                       }
+               exif_free(ed);
+               }
+
+       if (imd->delay_alter_type != ALTER_NONE)
+               {
+               image_alter_real(imd, imd->delay_alter_type, clamp);
+               }
+}
+
+/*
+ *-------------------------------------------------------------------
+ * read ahead (prebuffer)
+ *-------------------------------------------------------------------
+ */
+
+static void image_read_ahead_cancel(ImageWindow *imd)
+{
+       if (debug) printf("read ahead cancelled for :%s\n", imd->read_ahead_path);
+
+       image_loader_free(imd->read_ahead_il);
+       imd->read_ahead_il = NULL;
+
+       if (imd->read_ahead_pixbuf) g_object_unref(imd->read_ahead_pixbuf);
+       imd->read_ahead_pixbuf = NULL;
+
+       g_free(imd->read_ahead_path);
+       imd->read_ahead_path = NULL;
+}
+
+static void image_read_ahead_done_cb(ImageLoader *il, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       if (debug) printf("read ahead done for :%s\n", imd->read_ahead_path);
+
+       imd->read_ahead_pixbuf = image_loader_get_pixbuf(imd->read_ahead_il);
+       if (imd->read_ahead_pixbuf)
+               {
+               g_object_ref(imd->read_ahead_pixbuf);
+               }
+       else
+               {
+               imd->read_ahead_pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN);
+               }
+       image_loader_free(imd->read_ahead_il);
+       imd->read_ahead_il = NULL;
+
+       image_complete_util(imd, TRUE);
+}
+
+static void image_read_ahead_error_cb(ImageLoader *il, gpointer data)
+{
+       /* we even treat errors as success, maybe at least some of the file was ok */
+       image_read_ahead_done_cb(il, data);
+}
+
+static void image_read_ahead_start(ImageWindow *imd)
+{
+       /* already started ? */
+       if (!imd->read_ahead_path || imd->read_ahead_il || imd->read_ahead_pixbuf) return;
+
+       /* still loading ?, do later */
+       if (imd->il) return;
+
+       if (debug) printf("read ahead started for :%s\n", imd->read_ahead_path);
+
+       imd->read_ahead_il = image_loader_new(imd->read_ahead_path);
+
+       image_loader_set_error_func(imd->read_ahead_il, image_read_ahead_error_cb, imd);
+       if (!image_loader_start(imd->read_ahead_il, image_read_ahead_done_cb, imd))
+               {
+               image_read_ahead_cancel(imd);
+               image_complete_util(imd, TRUE);
+               }
+}
+
+static void image_read_ahead_set(ImageWindow *imd, const gchar *path)
+{
+       if (imd->read_ahead_path && path && strcmp(imd->read_ahead_path, path) == 0) return;
+
+       image_read_ahead_cancel(imd);
+
+       imd->read_ahead_path = g_strdup(path);
+
+       if (debug) printf("read ahead set to :%s\n", imd->read_ahead_path);
+
+       image_read_ahead_start(imd);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * post buffering
+ *-------------------------------------------------------------------
+ */
+
+static void image_post_buffer_set(ImageWindow *imd, const gchar *path, GdkPixbuf *pixbuf)
+{
+       g_free(imd->prev_path);
+       if (imd->prev_pixbuf) g_object_unref(imd->prev_pixbuf);
+
+       if (path && pixbuf)
+               {
+               imd->prev_path = g_strdup(path);
+                       
+               g_object_ref(pixbuf);
+               imd->prev_pixbuf = pixbuf;
+               }
+       else
+               {
+               imd->prev_path = NULL;
+               imd->prev_pixbuf = NULL;
+               }
+
+       if (debug) printf("post buffer set: %s\n", path);
+}
+
+static gint image_post_buffer_get(ImageWindow *imd)
+{
+       gint success;
+
+       if (imd->prev_pixbuf &&
+           imd->image_path && imd->prev_path && strcmp(imd->image_path, imd->prev_path) == 0)
+               {
+               if (imd->pixbuf) g_object_unref(imd->pixbuf);
+               imd->pixbuf = imd->prev_pixbuf;
+               success = TRUE;
+               }
+       else
+               {
+               if (imd->prev_pixbuf) g_object_unref(imd->prev_pixbuf);
+               success = FALSE;
+               }
+
+       imd->prev_pixbuf = NULL;
+
+       g_free(imd->prev_path);
+       imd->prev_path = NULL;
+
+       return success;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * loading
+ *-------------------------------------------------------------------
+ */
+
+static void image_load_pixbuf_ready(ImageWindow *imd)
+{
+       if (imd->pixbuf || !imd->il) return;
+
+       imd->pixbuf = image_loader_get_pixbuf(imd->il);
+
+       if (imd->pixbuf) g_object_ref(imd->pixbuf);
+
+       image_pixbuf_sync(imd, imd->zoom, TRUE, TRUE);
+}
+
+static void image_load_area_cb(ImageLoader *il, guint x, guint y, guint w, guint h, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       if (imd->delay_flip &&
+           imd->pixbuf != image_loader_get_pixbuf(il))
+               {
+               return;
+               }
+
+       if (!imd->pixbuf) image_load_pixbuf_ready(imd);
+
+       if (imd->scale != 1.0)
+               {
+               x = (guint) floor((double)x * imd->scale);
+               y = (guint) floor((double)y * imd->scale);
+               w = (guint) ceil((double)w * imd->scale);
+               h = (guint) ceil((double)h * imd->scale);
+
+               if (w == 0) w = 1;
+               if (h == 0) h = 1;
+
+               if ((GdkInterpType)zoom_quality != GDK_INTERP_NEAREST)
+                       {
+                       /* some scaling types use surrounding pixels to smooth the image,
+                        * this will expand the new area to cover up for faint black
+                        * lines caused by previous renders with non-complete image
+                        */
+                       y -= 1;
+                       h += 2;
+                       }
+
+               }
+
+       image_queue(imd, (gint) x, (gint) y, (gint) w, (gint) h, FALSE, TILE_RENDER_AREA, TRUE);
+}
+
+static void image_load_done_cb(ImageLoader *il, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       if (debug) printf ("image done\n");
+
+       if (imd->delay_flip &&
+           imd->pixbuf != image_loader_get_pixbuf(imd->il))
+               {
+               if (imd->pixbuf) g_object_unref(imd->pixbuf);
+               imd->pixbuf = image_loader_get_pixbuf(imd->il);
+               if (imd->pixbuf) g_object_ref(imd->pixbuf);
+               image_pixbuf_sync(imd, imd->zoom, FALSE, TRUE);
+               }
+
+       image_loader_free(imd->il);
+       imd->il = NULL;
+
+       image_post_process(imd, TRUE);
+
+       image_read_ahead_start(imd);
+}
+
+static void image_load_error_cb(ImageLoader *il, gpointer data)
+{
+       if (debug) printf ("image error\n");
+
+       /* even on error handle it like it was done,
+        * since we have a pixbuf with _something_ */
+
+       image_load_done_cb(il, data);
+}
+
+#ifdef IMAGE_THROTTLE_LARGER_IMAGES
+static void image_load_buffer_throttle(ImageLoader *il)
+{
+       if (!il || il->bytes_total < IMAGE_THROTTLE_THRESHOLD) return;
+
+       /* Larger image files usually have larger chunks of data per pixel...
+        * So increase the buffer read size so that the rendering chunks called
+        * are also larger.
+        */
+
+       image_loader_set_buffer_size(il, IMAGE_LOAD_BUFFER_COUNT * IMAGE_THROTTLE_FACTOR);
+}
+#endif
+
+/* this read ahead is located here merely for the callbacks, above */
+
+static gint image_read_ahead_check(ImageWindow *imd)
+{
+       if (!imd->read_ahead_path) return FALSE;
+       if (imd->il) return FALSE;
+
+       if (!imd->image_path || strcmp(imd->read_ahead_path, imd->image_path) != 0)
+               {
+               image_read_ahead_cancel(imd);
+               return FALSE;
+               }
+
+       if (imd->read_ahead_il)
+               {
+               imd->il = imd->read_ahead_il;
+               imd->read_ahead_il = NULL;
+
+               /* override the old signals */
+               image_loader_set_area_ready_func(imd->il, image_load_area_cb, imd);
+               image_loader_set_error_func(imd->il, image_load_error_cb, imd);
+               image_loader_set_buffer_size(imd->il, IMAGE_LOAD_BUFFER_COUNT);
+
+#ifdef IMAGE_THROTTLE_LARGER_IMAGES
+               image_load_buffer_throttle(imd->il);
+#endif
+
+               /* do this one directly (probably should add a set func) */
+               imd->il->func_done = image_load_done_cb;
+
+               if (!imd->delay_flip)
+                       {
+                       if (imd->pixbuf) g_object_unref(imd->pixbuf);
+                       imd->pixbuf = image_loader_get_pixbuf(imd->il);
+                       if (imd->pixbuf) g_object_ref(imd->pixbuf);
+                       }
+
+               image_read_ahead_cancel(imd);
+               return TRUE;
+               }
+       else if (imd->read_ahead_pixbuf)
+               {
+               if (imd->pixbuf) g_object_unref(imd->pixbuf);
+               imd->pixbuf = imd->read_ahead_pixbuf;
+               imd->read_ahead_pixbuf = NULL;
+
+               image_read_ahead_cancel(imd);
+
+               image_post_process(imd, FALSE);
+               return TRUE;
+               }
+
+       image_read_ahead_cancel(imd);
+       return FALSE;
+}
+
+static gint image_load_begin(ImageWindow *imd, const gchar *path)
+{
+       if (debug) printf ("image begin \n");
+
+       if (imd->il) return FALSE;
+
+       imd->completed = FALSE;
+
+       if (image_post_buffer_get(imd))
+               {
+               if (debug) printf("from post buffer: %s\n", imd->image_path);
+
+               image_pixbuf_sync(imd, imd->zoom, FALSE, TRUE);
+               return TRUE;
+               }
+
+       if (image_read_ahead_check(imd))
+               {
+               if (debug) printf("from read ahead buffer: %s\n", imd->image_path);
+
+               if (!imd->delay_flip || !imd->il) image_pixbuf_sync(imd, imd->zoom, FALSE, TRUE);
+               return TRUE;
+               }
+
+       if (!imd->delay_flip && imd->pixbuf)
+               {
+               g_object_unref(imd->pixbuf);
+               imd->pixbuf = NULL;
+               }
+
+       imd->il = image_loader_new(path);
+
+       image_loader_set_area_ready_func(imd->il, image_load_area_cb, imd);
+       image_loader_set_error_func(imd->il, image_load_error_cb, imd);
+       image_loader_set_buffer_size(imd->il, IMAGE_LOAD_BUFFER_COUNT);
+
+       if (!image_loader_start(imd->il, image_load_done_cb, imd))
+               {
+               if (debug) printf("image start error\n");
+
+               image_loader_free(imd->il);
+               imd->il = NULL;
+
+               image_complete_util(imd, FALSE);
+
+               return FALSE;
+               }
+
+#ifdef IMAGE_THROTTLE_LARGER_IMAGES
+       image_load_buffer_throttle(imd->il);
+#endif
+
+       if (!imd->delay_flip && !imd->pixbuf) image_load_pixbuf_ready(imd);
+
+       return TRUE;
+}
+
+static void image_reset(ImageWindow *imd)
+{
+       /* stops anything currently being done */
+
+       if (debug) printf("image reset\n");
+
+       image_loader_free(imd->il);
+       imd->il = NULL;
+
+       image_queue_clear(imd);
+       imd->delay_alter_type = ALTER_NONE;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * image changer
+ *-------------------------------------------------------------------
+ */
+
+static void image_change_complete(ImageWindow *imd, gdouble zoom, gint new)
+{
+       gint sync = TRUE;
+
+       imd->zoom = zoom;       /* store the zoom, needed by the loader */
+
+       image_reset(imd);
+
+       if (imd->image_path && isfile(imd->image_path))
+               {
+               if (image_load_begin(imd, imd->image_path))
+                       {
+                       imd->unknown = FALSE;
+                       sync = FALSE;
+                       }
+               else
+                       {
+                       if (imd->pixbuf) g_object_unref(imd->pixbuf);
+                       imd->pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN);
+                       imd->unknown = TRUE;
+                       }
+               imd->size = filesize(imd->image_path);
+               imd->mtime = filetime(imd->image_path);
+               }
+       else
+               {
+               if (imd->pixbuf) g_object_unref(imd->pixbuf);
+               imd->pixbuf = NULL;
+
+               if (imd->image_path)
+                       {
+                       imd->pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN);
+                       imd->mtime = filetime(imd->image_path);
+                       }
+               else
+                       {
+                       imd->pixbuf = NULL;
+                       imd->mtime = 0;
+                       }
+               imd->unknown = TRUE;
+               imd->size = 0;
+               }
+
+       if (sync)
+               {
+               image_pixbuf_sync(imd, zoom, FALSE, new);
+               }
+       else
+               {
+               image_update_util(imd);
+               }
+}
+
+static void image_change_real(ImageWindow *imd, const gchar *path,
+                             CollectionData *cd, CollectInfo *info, gdouble zoom)
+{
+       GdkPixbuf *prev_pixbuf = NULL;
+       gchar *prev_path = NULL;
+       gint prev_clear = FALSE;
+
+       imd->collection = cd;
+       imd->collection_info = info;
+
+       if (enable_read_ahead && imd->image_path && imd->pixbuf)
+               {
+               if (imd->il)
+                       {
+                       /* current image is not finished */
+                       prev_clear = TRUE;
+                       }
+               else
+                       {
+                       prev_path = g_strdup(imd->image_path);
+                       prev_pixbuf = imd->pixbuf;
+                       g_object_ref(prev_pixbuf);
+                       }
+               }
+
+       g_free(imd->image_path);
+       imd->image_path = g_strdup(path);
+       imd->image_name = filename_from_path(imd->image_path);
+
+       image_change_complete(imd, zoom, TRUE);
+
+       if (prev_pixbuf)
+               {
+               image_post_buffer_set(imd, prev_path, prev_pixbuf);
+               g_free(prev_path);
+               g_object_unref(prev_pixbuf);
+               }
+       else if (prev_clear)
+               {
+               image_post_buffer_set(imd, NULL, NULL);
+               }
+
+       image_update_title(imd);
+       image_new_util(imd);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * callbacks
+ *-------------------------------------------------------------------
+ */
+
+static gint image_expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
+{
+       gint x, y;
+
+       ImageWindow *imd = data;
+
+       image_border_draw(imd, event->area.x, event->area.y,
+                         event->area.width, event->area.height);
+
+       /* image */
+       x = MAX(0, (gint)event->area.x - imd->x_offset + imd->x_scroll);
+       y = MAX(0, (gint)event->area.y - imd->y_offset + imd->y_scroll);
+
+       image_queue(imd, x, y,
+                   MIN((gint)event->area.width, imd->width - x),
+                   MIN((gint)event->area.height, imd->height - y),
+                   FALSE, TILE_RENDER_ALL, FALSE);
+
+       return TRUE;
+}
+
+static void image_size_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       image_size_sync(imd, allocation->width, allocation->height);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * focus stuff
+ *-------------------------------------------------------------------
+ */
+
+static void image_focus_paint(ImageWindow *imd, gint has_focus, GdkRectangle *area)
+{
+       GtkWidget *widget;
+
+       widget = imd->widget;
+       if (!widget->window) return;
+
+       if (has_focus)
+               {
+               gtk_paint_focus (widget->style, widget->window, GTK_STATE_ACTIVE,
+                                area, widget, "image_window",
+                                widget->allocation.x, widget->allocation.y,
+                                widget->allocation.width - 1, widget->allocation.height - 1);  
+               }
+       else
+               {
+               gtk_paint_shadow (widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_IN,
+                                 area, widget, "image_window",
+                                 widget->allocation.x, widget->allocation.y,
+                                 widget->allocation.width - 1, widget->allocation.height - 1);
+               }
+}
+
+static gint image_focus_expose(GtkWidget *widget, GdkEventExpose *event, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       image_focus_paint(imd, GTK_WIDGET_HAS_FOCUS(widget), &event->area);
+       return TRUE;
+}
+
+static gint image_focus_in_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       GTK_WIDGET_SET_FLAGS(imd->widget, GTK_HAS_FOCUS);
+       image_focus_paint(imd, TRUE, NULL);
+
+       return TRUE;
+}
+
+static gint image_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       GTK_WIDGET_UNSET_FLAGS(imd->widget, GTK_HAS_FOCUS);
+       image_focus_paint(imd, FALSE, NULL);
+
+       return TRUE;
+}
+
+
+/*
+ *-------------------------------------------------------------------
+ * overlays
+ *-------------------------------------------------------------------
+ */
+
+static void image_overlay_draw(ImageWindow *imd, gint x, gint y, gint w, gint h)
+{
+       GList *work;
+
+       work = imd->overlay_list;
+       while (work)
+               {
+               OverlayData *od;
+               gint px, py, pw, ph;
+               gint rx, ry, rw, rh;
+
+               od = work->data;
+               work = work->next;
+
+               if (!od->visible) continue;
+
+               pw = gdk_pixbuf_get_width(od->pixbuf);
+               ph = gdk_pixbuf_get_height(od->pixbuf);
+               px = od->x;
+               py = od->y;
+
+               if (od->relative)
+                       {
+                       if (px < 0) px = imd->window_width - pw + px;
+                       if (py < 0) py = imd->window_height - ph + py;
+                       }
+
+               if (util_clip_region(x, y, w, h, px, py, pw, ph, &rx, &ry, &rw, &rh))
+                       {
+                       gdk_draw_pixbuf(imd->image->window,
+                                       imd->image->style->fg_gc[GTK_WIDGET_STATE(imd->image)],
+                                       od->pixbuf,
+                                       rx - px, ry - py,
+                                       rx, ry, rw, rh,
+                                       (GdkRgbDither)dither_quality, rx, ry);
+                       }
+               }
+}
+
+static void image_overlay_queue_draw(ImageWindow *imd, OverlayData *od, gint hidden)
+{
+       gint x, y, w, h;
+       gint old_vis;
+
+       w = gdk_pixbuf_get_width(od->pixbuf);
+       h = gdk_pixbuf_get_height(od->pixbuf);
+       x = od->x;
+       y = od->y;
+
+       if (od->relative)
+               {
+               if (x < 0) x = imd->window_width - w + x;
+               if (y < 0) y = imd->window_height - h + y;
+               }
+
+       image_queue(imd, imd->x_scroll - imd->x_offset + x,
+                        imd->y_scroll - imd->y_offset + y,
+                        w, h,
+                        FALSE, TILE_RENDER_ALL, FALSE);
+
+       old_vis = od->visible;
+       if (hidden) od->visible = FALSE;
+       image_border_draw(imd, x, y, w, h);
+       od->visible = old_vis;
+}
+
+static void image_overlay_queue_all(ImageWindow *imd)
+{
+       GList *work;
+
+       work = imd->overlay_list;
+       while (work)
+               {
+               OverlayData *od = work->data;
+               work = work->next;
+
+               image_overlay_queue_draw(imd, od, FALSE);
+               }
+}
+
+static OverlayData *image_overlay_find(ImageWindow *imd, gint id)
+{
+       GList *work;
+
+       work = imd->overlay_list;
+       while (work)
+               {
+               OverlayData *od = work->data;
+               work = work->next;
+
+               if (od->id == id) return od;
+               }
+
+       return NULL;
+}
+
+gint image_overlay_add(ImageWindow *imd, GdkPixbuf *pixbuf, gint x, gint y,
+                      gint relative, gint always)
+{
+       OverlayData *od;
+       gint id;
+
+       if (!imd || !pixbuf) return -1;
+
+       id = 1;
+       while (image_overlay_find(imd, id)) id++;
+
+       od = g_new0(OverlayData, 1);
+       od->id = id;
+       od->pixbuf = pixbuf;
+       g_object_ref(G_OBJECT(od->pixbuf));
+       od->x = x;
+       od->y = y;
+       od->relative = relative;
+       od->visible = TRUE;
+       od->always = always;
+
+       imd->overlay_list = g_list_append(imd->overlay_list, od);
+
+       image_overlay_queue_draw(imd, od, FALSE);
+
+       return od->id;
+}
+
+static void image_overlay_free(ImageWindow *imd, OverlayData *od)
+{
+       imd->overlay_list = g_list_remove(imd->overlay_list, od);
+
+       if (od->pixbuf) g_object_unref(G_OBJECT(od->pixbuf));
+       g_free(od);
+}
+
+static void image_overlay_list_clear(ImageWindow *imd)
+{
+       while (imd->overlay_list)
+               {
+               OverlayData *od;
+
+               od = imd->overlay_list->data;
+               image_overlay_free(imd, od);
+               }
+}
+
+void image_overlay_set(ImageWindow *imd, gint id, GdkPixbuf *pixbuf, gint x, gint y)
+{
+       OverlayData *od;
+
+       if (!imd) return;
+
+       od = image_overlay_find(imd, id);
+       if (!od) return;
+
+       if (pixbuf)
+               {
+               image_overlay_queue_draw(imd, od, TRUE);
+
+               g_object_ref(G_OBJECT(pixbuf));
+               g_object_unref(G_OBJECT(od->pixbuf));
+               od->pixbuf = pixbuf;
+
+               od->x = x;
+               od->y = y;
+
+               image_overlay_queue_draw(imd, od, FALSE);
+               }
+       else
+               {
+               image_overlay_queue_draw(imd, od, TRUE);
+               image_overlay_free(imd, od);
+               }
+}
+
+gint image_overlay_get(ImageWindow *imd, gint id, GdkPixbuf **pixbuf, gint *x, gint *y)
+{
+       OverlayData *od;
+
+       if (!imd) return FALSE;
+
+       od = image_overlay_find(imd, id);
+       if (!od) return FALSE;
+
+       if (pixbuf) *pixbuf = od->pixbuf;
+       if (x) *x = od->x;
+       if (y) *y = od->y;
+
+       return TRUE;
+}
+
+void image_overlay_remove(ImageWindow *imd, gint id)
+{
+       image_overlay_set(imd, id, NULL, 0, 0);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * scroller
+ *-------------------------------------------------------------------
+ */
+
+#define SCROLLER_UPDATES_PER_SEC 30
+#define SCROLLER_DEAD_ZONE 6
+
+
+static gboolean image_scroller_update_cb(gpointer data)
+{
+       ImageWindow *imd = data;
+       gint x, y;
+       gint xinc, yinc;
+
+       /* this was a simple scroll by difference between scroller and mouse position,
+        * but all this math results in a smoother result and accounts for a dead zone.
+        */
+
+       if (abs(imd->scroller_xpos - imd->scroller_x) < SCROLLER_DEAD_ZONE)
+               {
+               x = 0;
+               }
+       else
+               {
+               gint shift = SCROLLER_DEAD_ZONE / 2 * SCROLLER_UPDATES_PER_SEC;
+               x = (imd->scroller_xpos - imd->scroller_x) / 2 * SCROLLER_UPDATES_PER_SEC;
+               x += (x > 0) ? -shift : shift;
+               }
+
+       if (abs(imd->scroller_ypos - imd->scroller_y) < SCROLLER_DEAD_ZONE)
+               {
+               y = 0;
+               }
+       else
+               {
+               gint shift = SCROLLER_DEAD_ZONE / 2 * SCROLLER_UPDATES_PER_SEC;
+               y = (imd->scroller_ypos - imd->scroller_y) / 2 * SCROLLER_UPDATES_PER_SEC;
+               y += (y > 0) ? -shift : shift;
+               }
+
+       if (abs(x) < SCROLLER_DEAD_ZONE * SCROLLER_UPDATES_PER_SEC)
+               {
+               xinc = x;
+               }
+       else
+               {
+               xinc = imd->scroller_xinc;
+
+               if (x >= 0)
+                       {
+                       if (xinc < 0) xinc = 0;
+                       if (x < xinc) xinc = x;
+                       if (x > xinc) xinc = MIN(xinc + x / SCROLLER_UPDATES_PER_SEC, x);
+                       }
+               else
+                       {
+                       if (xinc > 0) xinc = 0;
+                       if (x > xinc) xinc = x;
+                       if (x < xinc) xinc = MAX(xinc + x / SCROLLER_UPDATES_PER_SEC, x);
+                       }
+               }
+
+       if (abs(y) < SCROLLER_DEAD_ZONE * SCROLLER_UPDATES_PER_SEC)
+               {
+               yinc = y;
+               }
+       else
+               {
+               yinc = imd->scroller_yinc;
+
+               if (y >= 0)
+                       {
+                       if (yinc < 0) yinc = 0;
+                       if (y < yinc) yinc = y;
+                       if (y > yinc) yinc = MIN(yinc + y / SCROLLER_UPDATES_PER_SEC, y);
+                       }
+               else
+                       {
+                       if (yinc > 0) yinc = 0;
+                       if (y > yinc) yinc = y;
+                       if (y < yinc) yinc = MAX(yinc + y / SCROLLER_UPDATES_PER_SEC, y);
+                       }
+               }
+
+       imd->scroller_xinc = xinc;
+       imd->scroller_yinc = yinc;
+
+       xinc = xinc / SCROLLER_UPDATES_PER_SEC;
+       yinc = yinc / SCROLLER_UPDATES_PER_SEC;
+
+       image_scroll(imd, xinc, yinc);
+
+       return TRUE;
+}
+
+static void image_scroller_timer_set(ImageWindow *imd, gint start)
+{
+       if (imd->scroller_id != -1)
+               {
+               g_source_remove(imd->scroller_id);
+               imd->scroller_id = -1;
+               }
+
+       if (start)
+               {
+               imd->scroller_id = g_timeout_add(1000 / SCROLLER_UPDATES_PER_SEC,
+                                                  image_scroller_update_cb, imd);
+               }
+}
+
+static void image_scroller_start(ImageWindow *imd, gint x, gint y)
+{
+       if (imd->scroller_overlay == -1)
+               {
+               GdkPixbuf *pixbuf;
+               gint w, h;
+
+               pixbuf = pixbuf_inline(PIXBUF_INLINE_SCROLLER);
+               w = gdk_pixbuf_get_width(pixbuf);
+               h = gdk_pixbuf_get_height(pixbuf);
+
+               imd->scroller_overlay = image_overlay_add(imd, pixbuf, x - w / 2, y - h / 2, FALSE, TRUE);
+               }
+
+       imd->scroller_x = x;
+       imd->scroller_y = y;
+       imd->scroller_xpos = x;
+       imd->scroller_ypos = y;
+
+       image_scroller_timer_set(imd, TRUE);
+}
+
+static void image_scroller_stop(ImageWindow *imd)
+{
+       if (imd->scroller_id == -1) return;
+
+       image_overlay_remove(imd, imd->scroller_overlay);
+       imd->scroller_overlay = -1;
+
+       image_scroller_timer_set(imd, FALSE);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * mouse stuff
+ *-------------------------------------------------------------------
+ */
+
+static gint image_mouse_motion_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       if (imd->scroller_id != -1)
+               {
+               imd->scroller_xpos = bevent->x;
+               imd->scroller_ypos = bevent->y;
+               }
+
+       if (!imd->in_drag || !gdk_pointer_is_grabbed()) return FALSE;
+
+       if (imd->drag_moved < IMAGE_DRAG_SCROLL_THRESHHOLD)
+               {
+               imd->drag_moved++;
+               }
+       else
+               {
+               widget_set_cursor (imd->image, GDK_FLEUR);
+               }
+
+       /* do the scroll */
+       image_scroll_real(imd, imd->drag_last_x - bevent->x, imd->drag_last_y - bevent->y);
+
+       imd->drag_last_x = bevent->x;
+       imd->drag_last_y = bevent->y;
+
+       return FALSE;
+}
+
+static gint image_mouse_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       if (imd->scroller_id != -1) return TRUE;
+
+       switch (bevent->button)
+               {
+               case 1:
+                       imd->in_drag = TRUE;
+                       imd->drag_last_x = bevent->x;
+                       imd->drag_last_y = bevent->y;
+                       imd->drag_moved = 0;
+                       gdk_pointer_grab(imd->image->window, FALSE,
+                                GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
+                                NULL, NULL, bevent->time);
+                       gtk_grab_add(imd->image);
+                       break;
+               case 2:
+                       imd->drag_moved = 0;
+                       break;
+               case 3:
+                       image_button_do(imd, bevent);
+                       break;
+               default:
+                       break;
+               }
+
+       gtk_widget_grab_focus(imd->widget);
+
+       return FALSE;
+}
+
+static gint image_mouse_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       if (imd->scroller_id != -1)
+               {
+               image_scroller_stop(imd);
+               return TRUE;
+               }
+
+       if (gdk_pointer_is_grabbed() && GTK_WIDGET_HAS_GRAB(imd->image))
+               {
+               gtk_grab_remove(imd->image);
+               gdk_pointer_ungrab(bevent->time);
+               widget_set_cursor(imd->image, -1);
+               }
+
+       if (bevent->button == 1 && (bevent->state & GDK_SHIFT_MASK))
+               {
+               image_scroller_start(imd, bevent->x, bevent->y);
+               }
+       else if (bevent->button == 1 || bevent->button == 2)
+               {
+               if (imd->drag_moved < IMAGE_DRAG_SCROLL_THRESHHOLD) image_button_do(imd, bevent);
+               }
+
+       imd->in_drag = FALSE;
+
+       return FALSE;
+}
+
+static gint image_mouse_leave_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       if (imd->scroller_id != -1)
+               {
+               imd->scroller_xpos = imd->scroller_x;
+               imd->scroller_ypos = imd->scroller_y;
+               imd->scroller_xinc = 0;
+               imd->scroller_yinc = 0;
+               }
+
+       return FALSE;
+}
+
+static gint image_scroll_cb(GtkWidget *widget, GdkEventScroll *event, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       if (imd->func_scroll &&
+           event && event->type == GDK_SCROLL)
+               {
+               imd->func_scroll(imd, event->direction, event->time,
+                                event->x, event->y, event->state, imd->data_scroll);
+               return TRUE;
                }
 
-       h = gtk_viewport_get_hadjustment(GTK_VIEWPORT(imd->viewport));
-       v = gtk_viewport_get_vadjustment(GTK_VIEWPORT(imd->viewport));
+       return FALSE;
+}
+
+static void image_mouse_drag_cb(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       ImageWindow *imd = data;
+
+       imd->drag_moved = IMAGE_DRAG_SCROLL_THRESHHOLD;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * drag and drop
+ *-------------------------------------------------------------------
+ */
+
+/*
+ *-------------------------------------------------------------------
+ * public interface
+ *-------------------------------------------------------------------
+ */
+
+void image_attach_window(ImageWindow *imd, GtkWidget *window,
+                        const gchar *title, const gchar *title_right, gint show_zoom)
+{
+       imd->top_window = window;
+       g_free(imd->title);
+       imd->title = g_strdup(title);
+       g_free(imd->title_right);
+       imd->title_right = g_strdup(title_right);
+       imd->title_show_zoom = show_zoom;
+
+       image_update_title(imd);
+}
+
+void image_set_update_func(ImageWindow *imd,
+                          void (*func)(ImageWindow *imd, gpointer data),
+                          gpointer data)
+{
+       imd->func_update = func;
+       imd->data_update = data;
+}
+
+void image_set_complete_func(ImageWindow *imd,
+                            void (*func)(ImageWindow *, gint preload, gpointer),
+                            gpointer data)
+{
+       imd->func_complete = func;
+       imd->data_complete = data;
+}
+
+void image_set_new_func(ImageWindow *imd,
+                       void (*func)(ImageWindow *, gpointer),
+                       gpointer data)
+{
+       imd->func_new = func;
+       imd->data_new = data;
+}
+
+
+static void image_button_do(ImageWindow *imd, GdkEventButton *bevent)
+{
+       if (imd->func_button &&
+           bevent &&
+           (bevent->type == GDK_BUTTON_PRESS || bevent->type == GDK_BUTTON_RELEASE))
+               {
+               imd->func_button(imd, bevent->button, bevent->time,
+                                bevent->x, bevent->y, bevent->state, imd->data_button);
+               }
+}
+
+void image_set_button_func(ImageWindow *imd,
+                          void (*func)(ImageWindow *, gint button, guint32 time, gdouble x, gdouble y, guint state, gpointer),
+                          gpointer data)
+{
+       imd->func_button = func;
+       imd->data_button = data;
+}
+
+void image_set_scroll_func(ImageWindow *imd,
+                          void (*func)(ImageWindow *, GdkScrollDirection direction, guint32 time, gdouble x, gdouble y, guint state, gpointer),
+                          gpointer data)
+{
+       imd->func_scroll = func;
+       imd->data_scroll = data;
+}
+
+/* path, name */
+
+const gchar *image_get_path(ImageWindow *imd)
+{
+       return imd->image_path;
+}
+
+const gchar *image_get_name(ImageWindow *imd)
+{
+       return imd->image_name;
+}
+
+/* merely changes path string, does not change the image! */
+void image_set_path(ImageWindow *imd, const gchar *newpath)
+{
+       g_free(imd->image_path);
+       imd->image_path = g_strdup(newpath);
+       imd->image_name = filename_from_path(imd->image_path);
+
+       image_update_title(imd);
+       image_new_util(imd);
+}
+
+/* load a new image */
+
+void image_change_path(ImageWindow *imd, const gchar *path, gdouble zoom)
+{
+       if (imd->image_path == path ||
+           (path && imd->image_path && !strcmp(path, imd->image_path)) ) return;
+
+       image_change_real(imd, path, NULL, NULL, zoom);
+}
+
+void image_change_pixbuf(ImageWindow *imd, GdkPixbuf *pixbuf, gdouble zoom)
+{
+       image_set_pixbuf(imd, pixbuf, zoom, TRUE);
+       image_new_util(imd);
+}
+
+void image_change_from_collection(ImageWindow *imd, CollectionData *cd, CollectInfo *info, gdouble zoom)
+{
+       if (!cd || !info || !g_list_find(cd->list, info)) return;
 
-       x = imd->drag_last_x - bevent->x;
-       y = imd->drag_last_y - bevent->y;
+       image_change_real(imd, info->path, cd, info, zoom);
+}
 
-       /* x */
-       if (h->upper - h->page_size > 0)
+CollectionData *image_get_collection(ImageWindow *imd, CollectInfo **info)
+{
+       if (collection_to_number(imd->collection) >= 0)
                {
-               val = (float)h->value + x;
-               if (val < 0 ) val = 0;
-               if (val > h->upper - h->page_size) val = h->upper - h->page_size;
-               h->value = val;
-               gtk_adjustment_set_value (GTK_ADJUSTMENT(h), val);
+               if (g_list_find(imd->collection->list, imd->collection_info) != NULL)
+                       {
+                       if (info) *info = imd->collection_info;
+                       }
+               else
+                       {
+                       if (info) *info = NULL;
+                       }
+               return imd->collection;
                }
 
-       /* y */
-       if (v->upper - v->page_size > 0)
+       if (info) *info = NULL;
+       return NULL;
+}
+
+static void image_loader_sync_data(ImageLoader *il, gpointer data)
+{
+       /* change data for the callbacks directly */
+
+       il->data_area_ready = data;
+       il->data_error = data;
+       il->data_done = data;
+       il->data_percent = data;
+}
+
+/* this is more like a move function
+ * it moves most data from source to imd, source does keep a ref on the pixbuf
+ */
+void image_change_from_image(ImageWindow *imd, ImageWindow *source)
+{
+       if (imd == source) return;
+
+       imd->unknown = source->unknown;
+
+       image_set_pixbuf(imd, source->pixbuf, image_zoom_get(source), TRUE);
+
+       imd->collection = source->collection;
+       imd->collection_info = source->collection_info;
+       imd->size = source->size;
+       imd->mtime = source->mtime;
+
+       image_set_path(imd, image_get_path(source));
+
+       image_loader_free(imd->il);
+       imd->il = NULL;
+
+       if (imd->pixbuf && source->il)
                {
-               val = v->value + y;
-               if (val < 0 ) val = 0;
-               if (val > v->upper - v->page_size) val = v->upper - v->page_size;
-               v->value = val;
-               gtk_adjustment_set_value (GTK_ADJUSTMENT(v), val);
+               imd->il = source->il;
+               source->il = NULL;
+
+               image_loader_sync_data(imd->il, imd);
+
+               imd->delay_alter_type = source->delay_alter_type;
+               source->delay_alter_type = ALTER_NONE;
                }
 
-       gtk_adjustment_value_changed(h);
-       gtk_adjustment_value_changed(v);
+       image_loader_free(imd->read_ahead_il);
+       imd->read_ahead_il = source->read_ahead_il;
+       source->read_ahead_il = NULL;
+       if (imd->read_ahead_il) image_loader_sync_data(imd->read_ahead_il, imd);
 
-       imd->drag_last_x = bevent->x;
-       imd->drag_last_y = bevent->y;
+       if (imd->read_ahead_pixbuf) g_object_unref(imd->read_ahead_pixbuf);
+       imd->read_ahead_pixbuf = source->read_ahead_pixbuf;
+       source->read_ahead_pixbuf = NULL;
+
+       g_free(imd->read_ahead_path);
+       imd->read_ahead_path = source->read_ahead_path;
+       source->read_ahead_path = NULL;
+
+       if (imd->prev_pixbuf) g_object_unref(imd->prev_pixbuf);
+       imd->prev_pixbuf = source->prev_pixbuf;
+       source->prev_pixbuf = NULL;
+
+       g_free(imd->prev_path);
+       imd->prev_path = source->prev_path;
+       source->prev_path = NULL;
+
+       imd->completed = source->completed;
+
+       imd->x_scroll = source->x_scroll;
+       imd->y_scroll = source->y_scroll;
+
+       image_scroll_clamp(imd);
 }
 
-static void image_area_mouse_pressed(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+/* manipulation */
+
+void image_area_changed(ImageWindow *imd, gint x, gint y, gint width, gint height)
 {
-       ImageWindow *imd = data;
-       switch (bevent->button)
+       gint sx, sy, sw, sh;
+
+       sx = (gint)floor((double)x * imd->scale);
+       sy = (gint)floor((double)y * imd->scale);
+       sw = (gint)ceil((double)width * imd->scale);
+       sh = (gint)ceil((double)height * imd->scale);
+
+       image_queue(imd, sx, sy, sw, sh, FALSE, TILE_RENDER_AREA, TRUE);
+}
+
+void image_reload(ImageWindow *imd)
+{
+       image_change_complete(imd, imd->zoom, FALSE);
+}
+
+void image_scroll(ImageWindow *imd, gint x, gint y)
+{
+       image_scroll_real(imd, x, y);
+}
+
+void image_alter(ImageWindow *imd, AlterType type)
+{
+       if (imd->il)
                {
-               case 1:
-                       imd->in_drag = TRUE;
-                       imd->drag_last_x = bevent->x;
-                       imd->drag_last_y = bevent->y;
-                       imd->drag_moved = 0;
-                       gdk_pointer_grab (imd->eventbox->window, FALSE,
-                                GDK_POINTER_MOTION_MASK |
-                                GDK_BUTTON_RELEASE_MASK,
-                                NULL, NULL, bevent->time);
-                       gtk_grab_add (imd->eventbox);
-                       break;
-               case 2:
-                       imd->drag_moved = 0;
-                       break;
-               case 3:
-                       if (imd->func_btn3)
-                               imd->func_btn3(imd, bevent, imd->data_btn3);
-                       break;
-               case 4:
-                       if (imd->func_btn4)
-                               imd->func_btn4(imd, bevent, imd->data_btn4);
-                       break;
-               case 5:
-                       if (imd->func_btn5)
-                               imd->func_btn5(imd, bevent, imd->data_btn5);
-                       break;
-               default:
-                       break;
+               /* still loading, wait till done */
+               imd->delay_alter_type = type;
+               return;
                }
-       gtk_widget_grab_focus(imd->viewport);
+
+       image_alter_real(imd, type, TRUE);
 }
 
-static void image_area_mouse_released(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+/* zoom */
+
+static void image_zoom_adjust_real(ImageWindow *imd, gdouble increment,
+                                  gint center_point, gint x, gint y)
 {
-       ImageWindow *imd = data;
-       if (gdk_pointer_is_grabbed() && GTK_WIDGET_HAS_GRAB (imd->eventbox))
+       gdouble zoom = imd->zoom;
+
+       if (increment == 0.0) return; /* avoid possible div by zero, a no-op anyway... */
+
+       if (zoom == 0.0)
                {
-               gtk_grab_remove (imd->eventbox);
-               gdk_pointer_ungrab (bevent->time);
-               set_mouse_cursor (imd->eventbox->window, -1);
+               if (imd->scale < 1.0)
+                       {
+                       zoom = 0.0 - 1.0 / imd->scale;
+                       }
+               else
+                       {
+                       zoom = imd->scale;
+                       }
                }
 
-       if (bevent->button == 1)
+       if (increment < 0.0)
                {
-               if (imd->drag_moved < 4 && imd->func_btn1)
-                       imd->func_btn1(imd, bevent, imd->data_btn1);
+               if (zoom >= 1.0 && zoom + increment < 1.0)
+                       {
+                       zoom = zoom + increment - 2.0;
+                       }
+               else
+                       {
+                       zoom = zoom + increment;
+                       }
                }
-
-       if (bevent->button == 2)
+       else
                {
-               if (imd->drag_moved < 4 && imd->func_btn2)
-                       imd->func_btn2(imd, bevent, imd->data_btn2);
+               if (zoom <= -1.0 && zoom + increment > -1.0)
+                       {
+                       zoom = zoom + increment + 2.0;
+                       }
+               else
+                       {
+                       zoom = zoom + increment;
+                       }
                }
 
-       imd->in_drag = FALSE;
+       image_zoom_sync(imd, zoom, FALSE, FALSE, FALSE, center_point, x, y);
 }
 
-static void image_area_mouse_drag(GtkWidget *widget, GdkDragContext *context, gpointer data)
+void image_zoom_adjust(ImageWindow *imd, gdouble increment)
 {
-       ImageWindow *imd = data;
-       imd->drag_moved = 4;
+       image_zoom_adjust_real(imd, increment, FALSE, 0, 0);
 }
 
-/*
- *-----------------------------------------------------------------------------
- * image widget setup routines
- *-----------------------------------------------------------------------------
- */ 
+void image_zoom_adjust_at_point(ImageWindow *imd, gdouble increment, gint x, gint y)
+{
+       image_zoom_adjust_real(imd, increment, TRUE, x, y);
+}
 
-void image_area_set_topwindow(ImageWindow *imd, GtkWidget *window, gchar *title, gint show_zoom)
+void image_zoom_set(ImageWindow *imd, gdouble zoom)
 {
-       imd->top_window = window;
-       imd->show_title_zoom = show_zoom;
+       image_zoom_sync(imd, zoom, FALSE, FALSE, FALSE, FALSE, 0, 0);
+}
 
-       g_free(imd->title);
-       if (title)
-               imd->title = g_strdup(title);
+void image_zoom_set_fill_geometry(ImageWindow *imd, gint vertical)
+{
+       gdouble zoom;
+
+       if (!imd->pixbuf || imd->image_width < 1 || imd->image_height < 1) return;
+
+       if (vertical)
+               {
+               zoom = (gdouble)imd->window_height / imd->image_height;
+               }
        else
-               imd->title = NULL;
+               {
+               zoom = (gdouble)imd->window_width / imd->image_width;
+               }
+
+       if (zoom < 1.0)
+               {
+               zoom = 0.0 - 1.0 / zoom;
+               }
+
+       image_zoom_set(imd, zoom);
+}
+
+gdouble image_zoom_get(ImageWindow *imd)
+{
+       return imd->zoom;
 }
 
-void image_area_set_labels(ImageWindow *imd, GtkWidget *info, GtkWidget *zoom)
+gdouble image_zoom_get_real(ImageWindow *imd)
 {
-       imd->info_label = info;
-       imd->zoom_label = zoom;
+       return imd->scale;
 }
 
-void image_area_set_button(ImageWindow *imd, gint button,
-       void (*func)(ImageWindow *, GdkEventButton *, gpointer), gpointer data)
+gchar *image_zoom_get_as_text(ImageWindow *imd)
 {
-       switch (button)
+       gdouble l = 1.0;
+       gdouble r = 1.0;
+       gint pl = 0;
+       gint pr = 0;
+       gchar *approx = " ";
+
+       if (imd->zoom > 0.0)
                {
-               case 1:
-                       imd->func_btn1 = func;
-                       imd->data_btn1 = data;
-                       break;
-               case 2:
-                       imd->func_btn2 = func;
-                       imd->data_btn2 = data;
-                       break;
-               case 3:
-                       imd->func_btn3 = func;
-                       imd->data_btn3 = data;
-                       break;
-               case 4:
-                       imd->func_btn4 = func;
-                       imd->data_btn4 = data;
-                       break;
-               case 5:
-                       imd->func_btn5 = func;
-                       imd->data_btn5 = data;
-                       break;
+               l = imd->zoom;
+               }
+       else if (imd->zoom < 0.0)
+               {
+               r = 0.0 - imd->zoom;
+               }
+       else if (imd->zoom == 0.0 && imd->scale != 0.0)
+               {
+               if (imd->scale >= 1.0)
+                       {
+                       l = imd->scale;
+                       }
+               else
+                       {
+                       r = 1.0 / imd->scale;
+                       }
+               approx = " ~";
                }
+
+       if (rint(l) != l) pl = 1;
+       if (rint(r) != r) pr = 1;
+
+       return g_strdup_printf("%.*f :%s%.*f", pl, l, approx, pr, r);
 }
 
-ImageWindow *image_area_new(GtkWidget *top_window)
+gdouble image_zoom_get_default(ImageWindow *imd, gint mode)
 {
-        GtkObject *h_adj;
-        GtkObject *v_adj;
-       ImageWindow *imd;
+       gdouble zoom;
 
-       imd = g_new0(ImageWindow, 1);
-       imd->zoom = 0;
+       if (mode == ZOOM_RESET_ORIGINAL)
+               {
+               zoom = 1.0;
+               }
+       else if (mode == ZOOM_RESET_FIT_WINDOW)
+               {
+               zoom = 0.0;
+               }
+       else
+               {
+               if (imd)
+                       {
+                       zoom = image_zoom_get(imd);
+                       }
+               else
+                       {
+                       zoom = 1.0;
+                       }
+               }
+
+       return zoom;
+}
+
+/* read ahead */
+
+void image_prebuffer_set(ImageWindow *imd, const gchar *path)
+{
+       if (path)
+               {
+               image_read_ahead_set(imd, path);
+               }
+       else
+               {
+               image_read_ahead_cancel(imd);
+               }
+}
 
-       imd->top_window = top_window;
-       imd->title = g_strdup("GQview - ");
-       imd->show_title_zoom = FALSE;
-       imd->new_img = FALSE;
+static gint image_auto_refresh_cb(gpointer data)
+{
+       ImageWindow *imd = data;
+       time_t newtime;
+       
+       if (!imd || !imd->pixbuf ||
+           imd->il || !imd->image_path ||
+           !update_on_time_change) return TRUE;
+
+       newtime = filetime(imd->image_path);
+       if (newtime > 0 && newtime != imd->mtime)
+               {
+               imd->mtime = newtime;
+               image_reload(imd);
+               }
 
-       imd->eventbox = gtk_event_box_new();
+       return TRUE;
+}
 
-       gtk_signal_connect(GTK_OBJECT(imd->eventbox),"motion_notify_event",
-                          GTK_SIGNAL_FUNC(image_area_mouse_moved), imd);
-       gtk_signal_connect(GTK_OBJECT(imd->eventbox),"button_press_event",
-                          GTK_SIGNAL_FUNC(image_area_mouse_pressed), imd);
-       gtk_signal_connect(GTK_OBJECT(imd->eventbox),"button_release_event",
-                          GTK_SIGNAL_FUNC(image_area_mouse_released), imd);
-       gtk_widget_set_events(imd->eventbox, GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK);
+/* image auto refresh on time stamp change, in 1/1000's second, -1 disables */
 
-       /* viewer */
-       h_adj = gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0);
-       v_adj = gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0);
+void image_auto_refresh(ImageWindow *imd, gint interval)
+{
+       if (!imd) return;
 
-       imd->viewport = gtk_viewport_new (GTK_ADJUSTMENT(h_adj), GTK_ADJUSTMENT(v_adj));
-       gtk_container_add(GTK_CONTAINER(imd->eventbox), imd->viewport);
+       if (imd->auto_refresh_id > -1)
+               {
+               g_source_remove(imd->auto_refresh_id);
+               imd->auto_refresh_id = -1;
+               imd->auto_refresh_interval = -1;
+               }
 
-       /* table for resize */
-       imd->table = gtk_table_new (1,1,TRUE);
-       gtk_container_add(GTK_CONTAINER (imd->viewport), imd->table);
+       if (interval < 0) return;
 
-       /* imagewindow */
-       imd->image = gtk_drawing_area_new();
-       gtk_table_attach(GTK_TABLE (imd->table),imd->image,0,1,0,1,GTK_EXPAND,GTK_EXPAND,0,0);
+       if (interval == 0) interval = IMAGE_AUTO_REFRESH_TIME;
 
-       gtk_signal_connect(GTK_OBJECT(imd->eventbox),"size_allocate",GTK_SIGNAL_FUNC(image_area_size_cb), imd);
-       gtk_signal_connect(GTK_OBJECT(imd->image),"configure_event",GTK_SIGNAL_FUNC(image_area_update_cb), imd);
+       imd->auto_refresh_id = g_timeout_add((guint32)interval, image_auto_refresh_cb, imd);
+       imd->auto_refresh_interval = interval;
+}
 
-       gtk_signal_connect(GTK_OBJECT(imd->viewport),"drag_begin",
-                          GTK_SIGNAL_FUNC(image_area_mouse_drag), imd);
+/* allow top window to be resized ? */
 
-       return imd;
+void image_top_window_set_sync(ImageWindow *imd, gint allow_sync)
+{
+       imd->top_window_sync = allow_sync;
 }
 
-void image_area_free(ImageWindow *imd)
+/* background colors */
+
+void image_background_set_black(ImageWindow *imd, gint black)
 {
-       g_free(imd->image_path);
-       g_free(imd->title);
+       GtkStyle *style;
 
-       if (imd->image_pixmap) gdk_imlib_free_pixmap(imd->image_pixmap);
-       if (imd->image_data) gdk_imlib_destroy_image(imd->image_data);
+       if (!imd) return;
 
-       g_free(imd);
+       style = gtk_style_copy(gtk_widget_get_style(imd->widget));
+       g_object_ref(G_OBJECT(style));
+
+       if (black)
+               {
+               style->bg[GTK_STATE_NORMAL] = style->black;
+               }
+
+       gtk_widget_set_style(imd->image, style);
+       g_object_unref(G_OBJECT(style));
+
+       if (GTK_WIDGET_VISIBLE(imd->widget)) image_border_clear(imd);
 }
 
-gint get_default_zoom(ImageWindow *imd)
+void image_background_set_color(ImageWindow *imd, GdkColor *color)
 {
-       gint zoom;
+       GtkStyle *style;
 
-       if (zoom_mode == ZOOM_RESET_ORIGINAL)
-               {
-               zoom = 1;
-               }
-       else if (zoom_mode == ZOOM_RESET_FIT_WINDOW)
+       if (!imd) return;
+
+       style = gtk_style_copy(gtk_widget_get_style(imd->widget));
+       g_object_ref(G_OBJECT(style));
+
+       if (color)
                {
-               zoom = 0;
+               GdkColor *slot;
+
+               slot = &style->bg[GTK_STATE_NORMAL];
+
+               slot->red = color->red;
+               slot->green = color->green;
+               slot->blue = color->blue;
                }
-       else
+
+       gtk_widget_set_style(imd->image, style);
+       g_object_unref(G_OBJECT(style));
+
+       if (GTK_WIDGET_VISIBLE(imd->widget)) image_border_clear(imd);
+}
+
+void image_set_delay_flip(ImageWindow *imd, gint delay)
+{
+       if (!imd ||
+           imd->delay_flip == delay) return;
+
+       imd->delay_flip = delay;
+       if (!imd->delay_flip && imd->il)
                {
-               if (imd)
-                       {
-                       zoom = image_area_get_zoom(imd);
-                       }
-               else
-                       {
-                       zoom = 1;
-                       }
-               }
+               if (imd->pixbuf) g_object_unref(imd->pixbuf);
+               imd->pixbuf = NULL;
+               image_load_pixbuf_ready(imd);
 
-       return zoom;
+               image_queue_clear(imd);
+               image_queue(imd, 0, 0, imd->width, imd->height, FALSE, TILE_RENDER_AREA, TRUE);
+               }
 }
 
-/*
- *-----------------------------------------------------------------------------
- * image widget misc utils
- *-----------------------------------------------------------------------------
- */ 
-
-void image_area_to_root(ImageWindow *imd, gint scaled)
-{                                                                               
-       GdkVisual *gdkvisual;
+/* wallpaper util */
+
+void image_to_root_window(ImageWindow *imd, gint scaled)
+{
+       GdkScreen *screen;
        GdkWindow *rootwindow;
        GdkPixmap *pixmap;
+       GdkPixbuf *pb;
 
-       if (!imd || !imd->image_data) return;
+       if (!imd || !imd->pixbuf) return;
 
 
-       rootwindow = (GdkWindow *) &gdk_root_parent;    /* hmm, don't know, correct? */
-       gdkvisual = gdk_window_get_visual(rootwindow);
-       if (gdkvisual != gdk_imlib_get_visual()) return;
+       screen = gtk_widget_get_screen(imd->image);
+       rootwindow = gdk_screen_get_root_window(screen);
+       if (gdk_drawable_get_visual(rootwindow) != gdk_visual_get_system()) return;
 
        if (scaled)
                {
-               gdk_imlib_render(imd->image_data, gdk_screen_width(), gdk_screen_height());
+               pb = gdk_pixbuf_scale_simple(imd->pixbuf, gdk_screen_width(), gdk_screen_height(), (GdkInterpType)zoom_quality);
                }
        else
                {
-               gdk_imlib_render(imd->image_data, imd->width, imd->height);
+               pb = gdk_pixbuf_scale_simple(imd->pixbuf, imd->width, imd->height, (GdkInterpType)zoom_quality);
                }
 
-       pixmap = gdk_imlib_move_image(imd->image_data);
+       gdk_pixbuf_render_pixmap_and_mask (pb, &pixmap, NULL, 128);
        gdk_window_set_back_pixmap(rootwindow, pixmap, FALSE);
        gdk_window_clear(rootwindow);
-       gdk_imlib_free_pixmap(pixmap);
+       g_object_unref(pb);
+       g_object_unref(pixmap);
 
        gdk_flush();
 }
 
 
+/*
+ *-------------------------------------------------------------------
+ * init / destroy
+ *-------------------------------------------------------------------
+ */
+
+static void image_free(ImageWindow *imd)
+{
+       image_read_ahead_cancel(imd);
+       image_post_buffer_set(imd, NULL, NULL);
+       image_auto_refresh(imd, -1);
+
+       g_free(imd->image_path);
+       g_free(imd->title);
+       g_free(imd->title_right);
+
+       image_reset(imd);
+       image_tile_sync_count(imd, 0);
+       if (imd->pixbuf) g_object_unref(imd->pixbuf);
+
+       image_scroller_timer_set(imd, FALSE);
+
+       image_overlay_list_clear(imd);
+
+       g_free(imd);
+}
+
+static void image_destroy_cb(GtkObject *widget, gpointer data)
+{
+       ImageWindow *imd = data;
+       image_free(imd);
+}
+
+ImageWindow *image_new(gint frame)
+{
+       ImageWindow *imd;
+
+       imd = g_new0(ImageWindow, 1);
+       imd->zoom = 1.0;
+       imd->scale = 1.0;
+
+       imd->draw_idle_id = -1;
+
+       imd->tile_width = IMAGE_TILE_SIZE;
+       imd->tile_height = IMAGE_TILE_SIZE;
+
+       imd->top_window = NULL;
+       imd->title = NULL;
+       imd->title_right = NULL;
+       imd->title_show_zoom = FALSE;
+
+       imd->unknown = TRUE;
+
+       imd->pixbuf = NULL;
+
+       imd->has_frame = frame;
+       imd->top_window_sync = FALSE;
+
+       imd->tile_cache = NULL;
+       imd->tile_cache_size = 0;
+
+       imd->delay_alter_type = ALTER_NONE;
+
+       imd->read_ahead_il = NULL;
+       imd->read_ahead_pixbuf = NULL;
+       imd->read_ahead_path = NULL;
+
+       imd->completed = FALSE;
+
+       imd->auto_refresh_id = -1;
+       imd->auto_refresh_interval = -1;
+
+       imd->delay_flip = FALSE;
+
+       imd->func_update = NULL;
+       imd->func_complete = NULL;
+
+       imd->func_button = NULL;
+       imd->func_scroll = NULL;
+
+       imd->scroller_id = -1;
+       imd->scroller_overlay = -1;
+
+       imd->image = gtk_drawing_area_new();
+       gtk_widget_set_double_buffered(imd->image, FALSE);
+
+       if (imd->has_frame)
+               {
+               imd->widget = gtk_frame_new(NULL);
+               gtk_frame_set_shadow_type(GTK_FRAME(imd->widget), GTK_SHADOW_IN);
+               gtk_container_add(GTK_CONTAINER(imd->widget), imd->image);
+               gtk_widget_show(imd->image);
+
+               GTK_WIDGET_SET_FLAGS(imd->widget, GTK_CAN_FOCUS);
+               g_signal_connect(G_OBJECT(imd->widget), "focus_in_event",
+                                G_CALLBACK(image_focus_in_cb), imd);
+               g_signal_connect(G_OBJECT(imd->widget), "focus_out_event",
+                                G_CALLBACK(image_focus_out_cb), imd);
+
+               g_signal_connect_after(G_OBJECT(imd->widget), "expose_event",
+                                      G_CALLBACK(image_focus_expose), imd);
+               }
+       else
+               {
+               imd->widget = imd->image;
+               }
+
+       g_signal_connect(G_OBJECT(imd->image), "motion_notify_event",
+                        G_CALLBACK(image_mouse_motion_cb), imd);
+       g_signal_connect(G_OBJECT(imd->image), "button_press_event",
+                        G_CALLBACK(image_mouse_press_cb), imd);
+       g_signal_connect(G_OBJECT(imd->image), "button_release_event",
+                        G_CALLBACK(image_mouse_release_cb), imd);
+       g_signal_connect(G_OBJECT(imd->image), "leave_notify_event",
+                        G_CALLBACK(image_mouse_leave_cb), imd);
+       gtk_widget_set_events(imd->image, GDK_POINTER_MOTION_MASK |
+                                         GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK |
+                                         GDK_LEAVE_NOTIFY_MASK);
+
+       g_signal_connect(G_OBJECT(imd->image), "expose_event",
+                        G_CALLBACK(image_expose_cb), imd);
+       g_signal_connect_after(G_OBJECT(imd->image), "size_allocate",
+                        G_CALLBACK(image_size_cb), imd);
+
+       g_signal_connect(G_OBJECT(imd->image), "drag_begin",
+                        G_CALLBACK(image_mouse_drag_cb), imd);
+       g_signal_connect(G_OBJECT(imd->image), "scroll_event",
+                        G_CALLBACK(image_scroll_cb), imd);
+
+       g_signal_connect(G_OBJECT(imd->widget), "destroy",
+                        G_CALLBACK(image_destroy_cb), imd);
+
+       return imd;
+}
+
index d52a171..cb87f46 100644 (file)
@@ -1,44 +1,98 @@
 /*
- * GQview image viewer
- * (C)2000 John Ellis
+ * GQview
+ * (C) 2004 John Ellis
  *
  * Author: John Ellis
  *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
  */
 
-ImageWindow *image_area_new(GtkWidget *top_window);
-void image_area_free(ImageWindow *imd);
 
-/* for attaching the top window for resizing */
-void image_area_set_topwindow(ImageWindow *imd, GtkWidget *window, gchar *title, gint show_zoom);
+#ifndef IMAGE_H
+#define IMAGE_H
 
-/* attach labels to be updated */
-void image_area_set_labels(ImageWindow *imd, GtkWidget *info, GtkWidget *zoom);
 
-/* set the current image to a different path */
-void image_area_set_path(ImageWindow *imd, gchar *newpath);
+ImageWindow *image_new(gint frame);
 
-/* attach handler functions for mouse buttons (1-3) */
-void image_area_set_button(ImageWindow *imd, gint button,
-       void (*func)(ImageWindow *, GdkEventButton *, gpointer), gpointer data);
+/* additional setup */
+void image_attach_window(ImageWindow *imd, GtkWidget *window,
+                        const gchar *title, const gchar *title_right, gint show_zoom);
+void image_set_update_func(ImageWindow *imd,
+                          void (*func)(ImageWindow *imd, gpointer data),
+                          gpointer data);
+void image_set_button_func(ImageWindow *imd,
+       void (*func)(ImageWindow *, gint button, guint32 time, gdouble x, gdouble y, guint state, gpointer),
+       gpointer data);
+void image_set_scroll_func(ImageWindow *imd,
+       void (*func)(ImageWindow *, GdkScrollDirection direction, guint32 time, gdouble x, gdouble y, guint state, gpointer),
+        gpointer data);
+void image_set_complete_func(ImageWindow *imd,
+                            void (*func)(ImageWindow *, gint preload, gpointer),
+                            gpointer data);
+void image_set_new_func(ImageWindow *imd,
+                       void (*func)(ImageWindow *, gpointer),
+                       gpointer data);
 
-/* get the current image's path, etc. */
-gchar *image_area_get_path(ImageWindow *imd);
-gchar *image_area_get_name(ImageWindow *imd);
+/* path, name */
+const gchar *image_get_path(ImageWindow *imd);
+const gchar *image_get_name(ImageWindow *imd);
 
-/* load a new image, or NULL sets to logo */
-void image_area_set_image(ImageWindow *imd, gchar *path, gint zoom);
+/* merely changes path string, does not change the image! */
+void image_set_path(ImageWindow *imd, const gchar *newpath);
 
-/* image manipulation */
-void image_area_scroll(ImageWindow *imd, gint x, gint y);
-gint image_area_get_zoom(ImageWindow *imd);
-void image_area_adjust_zoom(ImageWindow *imd, gint increment);
-void image_area_set_zoom(ImageWindow *imd, gint zoom);
+/* load a new image */
+void image_change_path(ImageWindow *imd, const gchar *path, gdouble zoom);
+void image_change_pixbuf(ImageWindow *imd, GdkPixbuf *pixbuf, gdouble zoom);
+void image_change_from_collection(ImageWindow *imd, CollectionData *cd, CollectInfo *info, gdouble zoom);
+CollectionData *image_get_collection(ImageWindow *imd, CollectInfo **info);
+void image_change_from_image(ImageWindow *imd, ImageWindow *source);
 
-/* get the default zoom for an image */
-gint get_default_zoom(ImageWindow *imd);
+/* manipulation */
+void image_area_changed(ImageWindow *imd, gint x, gint y, gint width, gint height);
+void image_reload(ImageWindow *imd);
+void image_scroll(ImageWindow *imd, gint x, gint y);
+void image_alter(ImageWindow *imd, AlterType type);
+
+/* zoom */
+void image_zoom_adjust(ImageWindow *imd, gdouble increment);
+void image_zoom_adjust_at_point(ImageWindow *imd, gdouble increment, gint x, gint y);
+void image_zoom_set(ImageWindow *imd, gdouble zoom);
+void image_zoom_set_fill_geometry(ImageWindow *imd, gint vertical);
+gdouble image_zoom_get(ImageWindow *imd);
+gdouble image_zoom_get_real(ImageWindow *imd);
+gchar *image_zoom_get_as_text(ImageWindow *imd);
+gdouble image_zoom_get_default(ImageWindow *imd, gint mode);
+
+/* read ahead, pass NULL to cancel */
+void image_prebuffer_set(ImageWindow *imd, const gchar *path);
+
+/* auto refresh, interval is 1/1000 sec, 0 uses default, -1 disables */
+void image_auto_refresh(ImageWindow *imd, gint interval);
+
+/* allow top window to be resized ? */
+void image_top_window_set_sync(ImageWindow *imd, gint allow_sync);
+
+/* background of image */
+void image_background_set_black(ImageWindow *imd, gint black);
+void image_background_set_color(ImageWindow *imd, GdkColor *color);
+
+/* set delayed page flipping */
+void image_set_delay_flip(ImageWindow *imd, gint delay);
+
+/* wallpaper util */
+void image_to_root_window(ImageWindow *imd, gint scaled);
+
+/* overlays */
+gint image_overlay_add(ImageWindow *imd, GdkPixbuf *pixbuf, gint x, gint y,
+                      gint relative, gint always);
+void image_overlay_set(ImageWindow *imd, gint id, GdkPixbuf *pixbuf, gint x, gint y);
+gint image_overlay_get(ImageWindow *imd, gint id, GdkPixbuf **pixbuf, gint *x, gint *y);
+void image_overlay_remove(ImageWindow *imd, gint id);
+
+
+#endif
 
-/* set the root window to the current image */
-void image_area_to_root(ImageWindow *imd, gint scaled);
 
 
diff --git a/src/img-main.c b/src/img-main.c
deleted file mode 100644 (file)
index 8b3cf00..0000000
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- * GQview image viewer
- * (C)2000 John Ellis
- *
- * Author: John Ellis
- *
- */
-
-#include "gqview.h"
-#include "image.h"
-#include <gdk/gdkkeysyms.h> /* for keyboard values */
-
-#define BLACK_BACKGROUND 1
-
-/*
- *-----------------------------------------------------------------------------
- * full screen keyboard
- *-----------------------------------------------------------------------------
- */
-
-static gint full_screen_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
-{
-       ImageWindow *imd = data;
-       gint stop_signal = FALSE;
-       gint x = 0;
-       gint y = 0;
-
-       switch (event->keyval)
-               {
-               case GDK_Left:
-                       x -= 1;
-                       stop_signal = TRUE;
-                       break;
-               case GDK_Right:
-                       x += 1;
-                       stop_signal = TRUE;
-                       break;
-               case GDK_Up:
-                       y -= 1;
-                       stop_signal = TRUE;
-                       break;
-               case GDK_Down:
-                       y += 1;
-                       stop_signal = TRUE;
-                       break;
-               case '+': case '=':
-                       image_area_adjust_zoom(imd, 1);
-                       break;
-               case '-':
-                       image_area_adjust_zoom(imd, -1);
-                       break;
-               case 'x':
-                       image_area_set_zoom(imd, 0);
-                       break;
-               case 'z':
-                       image_area_set_zoom(imd, 1);
-                       break;
-               case GDK_Page_Up:
-               case GDK_BackSpace:
-                       file_prev_image();
-                       stop_signal = TRUE;
-                       break;
-               case GDK_Page_Down:
-               case GDK_space:
-                       file_next_image();
-                       stop_signal = TRUE;
-                       break;
-               case GDK_Home:
-                       file_first_image();
-                       stop_signal = TRUE;
-                       break;
-               case GDK_End:
-                       file_last_image();
-                       stop_signal = TRUE;
-                       break;
-               case GDK_Delete:
-                       full_screen_stop();
-                       file_util_delete(image_area_get_path(imd), NULL);
-                       stop_signal = TRUE;
-                       break;
-               case GDK_Escape:
-                       full_screen_stop();
-                       stop_signal = TRUE;
-                       break;
-               case 'Q': case 'q':
-                       exit_gqview();
-                       return FALSE;
-                        break;
-               case 'S': case 's':
-                       slideshow_toggle();
-                       break;
-               case 'V': case 'v':
-                       full_screen_stop();
-                       break;
-               }
-
-       if (event->state & GDK_CONTROL_MASK)
-               {
-               gint n = -1;
-               switch (event->keyval)
-                       {
-                       case '1':
-                               n = 0;
-                               break;
-                       case '2':
-                               n = 1;
-                               break;
-                       case '3':
-                               n = 2;
-                               break;
-                       case '4':
-                               n = 3;
-                               break;
-                       case '5':
-                               n = 4;
-                               break;
-                       case '6':
-                               n = 5;
-                               break;
-                       case '7':
-                               n = 6;
-                               break;
-                       case '8':
-                               n = 7;
-                               break;
-                       case 'C': case 'c':
-                               full_screen_stop();
-                               file_util_copy(image_area_get_path(imd), NULL, current_path);
-                               break;
-                       case 'M': case 'm':
-                               full_screen_stop();
-                               file_util_move(image_area_get_path(imd), NULL, current_path);
-                               break;
-                       case 'R': case 'r':
-                               full_screen_stop();
-                               file_util_rename(image_area_get_path(imd), NULL);
-                               break;
-                       case 'D': case 'd':
-                               full_screen_stop();
-                               file_util_delete(image_area_get_path(imd), NULL);
-                               break;
-                       }
-               if (n != -1)
-                       {
-                       full_screen_stop();
-                       start_editor_from_file(n, image_area_get_path(imd));
-                       }
-               }
-
-       if (event->state & GDK_SHIFT_MASK)
-               {
-               x *= 3;
-               y *= 3;
-               }
-
-       if (x != 0 || y!= 0)
-               {
-               keyboard_scroll_calc(&x, &y, event);
-               image_area_scroll(imd, x, y);
-               }
-
-       return stop_signal;
-}
-
-/*
- *----------------------------------------------------------------------------
- * mouse button callbacks
- *----------------------------------------------------------------------------
- */
-
-static void button1_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
-{
-       file_next_image();
-}
-
-static void button2_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
-{
-       file_prev_image();
-}
-
-static void button3_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
-{
-       if (main_image == normal_image)
-               {
-               gtk_menu_popup (GTK_MENU(menu_image_popup), NULL, NULL, NULL, NULL,
-                       bevent->button, bevent->time);
-               }
-       else
-               {
-               gtk_menu_popup (GTK_MENU(menu_window_full), NULL, NULL, NULL, NULL,
-                       bevent->button, bevent->time);
-               }
-}
-
-static void button4_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
-{
-       if (mousewheel_scrolls)
-               image_area_scroll(imd, 0, -MOUSEWHEEL_SCROLL_SIZE);
-       else
-               file_prev_image();
-}
-
-static void button5_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
-{
-       if (mousewheel_scrolls)
-               image_area_scroll(imd, 0, MOUSEWHEEL_SCROLL_SIZE);
-       else
-               file_next_image();
-}
-
-/*
- *----------------------------------------------------------------------------
- * full screen functions
- *----------------------------------------------------------------------------
- */
-
-static gint full_screen_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
-{
-       full_screen_stop();
-       return TRUE;
-}
-
-static gint full_screen_destroy_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
-{
-       image_area_free(full_screen_image);
-       full_screen_image = NULL;
-
-       return FALSE;
-}
-
-void full_screen_start()
-{
-       GtkWidget *window;
-       gint w;
-       gint h;
-
-       if (full_screen_window) return;
-
-       w = gdk_screen_width();
-       h = gdk_screen_height();
-
-       window = gtk_window_new(GTK_WINDOW_POPUP);
-       gtk_container_border_width(GTK_CONTAINER(window), 0);
-       gtk_signal_connect(GTK_OBJECT(window), "delete_event", (GtkSignalFunc)full_screen_delete_cb, NULL);
-       gtk_signal_connect(GTK_OBJECT(window), "destroy_event", (GtkSignalFunc)full_screen_destroy_cb, NULL);
-
-       gtk_window_set_title(GTK_WINDOW(window), _("GQview full screen"));
-       gtk_widget_set_usize(window, w, h);
-
-       full_screen_image = image_area_new(NULL);
-
-       gtk_viewport_set_shadow_type (GTK_VIEWPORT(full_screen_image->viewport), GTK_SHADOW_NONE);
-       gtk_container_add(GTK_CONTAINER(window), full_screen_image->eventbox);
-
-       /* set background to black */
-       if (BLACK_BACKGROUND)
-               {
-               GtkStyle *style;
-               style = gtk_style_copy(gtk_widget_get_style(full_screen_image->eventbox));
-               gtk_style_ref(style);
-               style->bg[GTK_STATE_NORMAL] = style->black;
-               gtk_widget_set_style(full_screen_image->viewport, style);
-               gtk_style_unref(style);
-               }
-
-       gtk_widget_show_all(full_screen_image->eventbox);
-
-       gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(full_screen_key_press_cb), full_screen_image);
-
-       image_area_set_image(full_screen_image, image_get_path(), image_area_get_zoom(normal_image));
-
-       gtk_widget_show(window);
-       gdk_keyboard_grab(window->window, TRUE, GDK_CURRENT_TIME);
-
-       /* hide normal window
-        * FIXME: properly restore this window on show
-        */
-       gtk_widget_hide(mainwindow);
-       image_area_set_image(normal_image, NULL, image_area_get_zoom(normal_image));
-
-       full_screen_window = window;
-
-       image_area_set_button(full_screen_image, 1, button1_cb, NULL);
-       image_area_set_button(full_screen_image, 2, button2_cb, NULL);
-       image_area_set_button(full_screen_image, 3, button3_cb, NULL);
-       /* for wheel mice */
-       image_area_set_button(full_screen_image, 4, button4_cb, NULL);
-       image_area_set_button(full_screen_image, 5, button5_cb, NULL);
-
-       main_image = full_screen_image;
-}
-
-void full_screen_stop()
-{
-       if (!full_screen_window) return;
-
-       gdk_keyboard_ungrab (GDK_CURRENT_TIME);
-
-       image_area_set_image(normal_image, image_get_path(), image_area_get_zoom(full_screen_image));
-       main_image = normal_image;
-
-       gtk_widget_destroy(full_screen_window);
-       full_screen_window = NULL;
-
-       image_area_free(full_screen_image);
-       full_screen_image = NULL;
-
-       gtk_widget_show(mainwindow);
-
-}
-
-void full_screen_toggle()
-{
-       if (full_screen_window)
-               {
-               full_screen_stop();
-               }
-       else
-               {
-               full_screen_start();
-               }
-}
-
-/*
- *----------------------------------------------------------------------------
- * main image manipulation
- *----------------------------------------------------------------------------
- */
-
-void image_scroll(gint x, gint y)
-{
-       image_area_scroll(main_image, x, y);
-}
-
-void image_adjust_zoom(gint increment)
-{
-       image_area_adjust_zoom(main_image, increment);
-}
-
-void image_set_zoom(gint zoom)
-{
-       image_area_set_zoom(main_image, zoom);
-}
-
-void image_set_path(gchar *path)
-{
-       image_area_set_path(main_image, path);
-}
-
-gchar *image_get_path()
-{
-       return image_area_get_path(main_image);
-}
-
-gchar *image_get_name()
-{
-       return image_area_get_name(main_image);
-}
-
-void image_change_to(gchar *path)
-{
-       image_area_set_image(main_image, path, get_default_zoom(main_image));
-}
-
-void image_set_labels(GtkWidget *info, GtkWidget *zoom)
-{
-       image_area_set_labels(normal_image, info, zoom);
-}
-
-GtkWidget *image_create()
-{
-       normal_image = image_area_new(mainwindow);
-
-       main_image = normal_image;
-
-       image_area_set_button(main_image, 1, button1_cb, NULL);
-       image_area_set_button(main_image, 2, button2_cb, NULL);
-       image_area_set_button(main_image, 3, button3_cb, NULL);
-       /* for wheel mice */
-       image_area_set_button(main_image, 4, button4_cb, NULL);
-       image_area_set_button(main_image, 5, button5_cb, NULL);
-
-       return main_image->eventbox;
-}
-
-void image_to_root()
-{
-       image_area_to_root(main_image, (image_area_get_zoom(main_image) == 0));
-}
-
index f769b16..7681ae7 100644 (file)
 /*
- * GQview image viewer
- * (C)2000 John Ellis
+ * GQview
+ * (C) 2004 John Ellis
  *
  * Author: John Ellis
  *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
  */
 
+
 #include "gqview.h"
+#include "img-view.h"
+
+#include "collect.h"
+#include "collect-io.h"
+#include "dnd.h"
+#include "editors.h"
+#include "filelist.h"
+#include "fullscreen.h"
 #include "image.h"
+#include "image-overlay.h"
+#include "info.h"
+#include "menu.h"
+#include "slideshow.h"
+#include "utilops.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+
 #include <gdk/gdkkeysyms.h> /* for keyboard values */
 
+#include "icons/view.xpm"
+
+
+typedef struct _ViewWindow ViewWindow;
+struct _ViewWindow
+{
+       GtkWidget *window;
+       ImageWindow *imd;
+       FullScreenData *fs;
+       SlideShowData *ss;
+
+       GList *list;
+       GList *list_pointer;
+
+       gint overlay_id;
+};
+
+
+static GList *view_window_list = NULL;
+
+
+static GtkWidget *view_popup_menu(ViewWindow *vw);
+static void view_fullscreen_toggle(ViewWindow *vw, gint force_off);
+static void view_overlay_toggle(ViewWindow *vw);
+
+static void view_slideshow_next(ViewWindow *vw);
+static void view_slideshow_prev(ViewWindow *vw);
+static void view_slideshow_start(ViewWindow *vw);
+static void view_slideshow_stop(ViewWindow *vw);
+
+static void view_window_close(ViewWindow *vw);
+
+static void view_window_dnd_init(ViewWindow *vw);
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * misc
+ *-----------------------------------------------------------------------------
+ */ 
+
+static ImageWindow *view_window_active_image(ViewWindow *vw)
+{
+       if (vw->fs) return vw->fs->imd;
+
+       return vw->imd;
+}
+
+static void view_window_set_list(ViewWindow *vw, GList *list)
+{
+
+       path_list_free(vw->list);
+       vw->list = NULL;
+       vw->list_pointer = NULL;
+
+       vw->list = path_list_copy(list);
+}
+
+static gint view_window_contains_collection(ViewWindow *vw)
+{
+       CollectionData *cd;
+       CollectInfo *info;
+
+       cd = image_get_collection(view_window_active_image(vw), &info);
+
+       return (cd && info);
+}
+
+static void view_collection_step(ViewWindow *vw, gint next)
+{
+       ImageWindow *imd = view_window_active_image(vw);
+       CollectionData *cd;
+       CollectInfo *info;
+       CollectInfo *read_ahead_info = NULL;
+
+       cd = image_get_collection(imd, &info);
+
+       if (!cd || !info) return;
+
+       if (next)
+               {
+               info = collection_next_by_info(cd, info);
+               if (enable_read_ahead)
+                       {
+                       read_ahead_info = collection_next_by_info(cd, info);
+                       if (!read_ahead_info) read_ahead_info = collection_prev_by_info(cd, info);
+                       }
+               }
+       else
+               {
+               info = collection_prev_by_info(cd, info);
+               if (enable_read_ahead)
+                       {
+                       read_ahead_info = collection_prev_by_info(cd, info);
+                       if (!read_ahead_info) read_ahead_info = collection_next_by_info(cd, info);
+                       }
+               }
+
+       if (info)
+               {
+               image_change_from_collection(imd, cd, info, image_zoom_get_default(imd, zoom_mode));
+
+               if (read_ahead_info) image_prebuffer_set(imd, read_ahead_info->path);
+               }
+       
+}
+
+static void view_collection_step_to_end(ViewWindow *vw, gint last)
+{
+       ImageWindow *imd = view_window_active_image(vw);
+       CollectionData *cd;
+       CollectInfo *info;
+       CollectInfo *read_ahead_info = NULL;
+
+       cd = image_get_collection(imd, &info);
+
+       if (!cd || !info) return;
+
+       if (last)
+               {
+               info = collection_get_last(cd);
+               if (enable_read_ahead) read_ahead_info = collection_prev_by_info(cd, info);
+               }
+       else
+               {
+               info = collection_get_first(cd);
+               if (enable_read_ahead) read_ahead_info = collection_next_by_info(cd, info);
+               }
+
+       if (info)
+               {
+               image_change_from_collection(imd, cd, info, image_zoom_get_default(imd, zoom_mode));
+               if (read_ahead_info) image_prebuffer_set(imd, read_ahead_info->path);
+               }
+}
+
+static void view_list_step(ViewWindow *vw, gint next)
+{
+       ImageWindow *imd = view_window_active_image(vw);
+       const gchar *path;
+       GList *work;
+       GList *work_ahead;
+
+       if (!vw->list) return;
+
+       path = image_get_path(imd);
+       if (!path) return;
+
+       if (g_list_position(vw->list, vw->list_pointer) >= 0)
+               {
+               work = vw->list_pointer;
+               }
+       else
+               {
+               gint found = FALSE;
+
+               work = vw->list;
+               while (work && !found)
+                       {
+                       gchar *temp;
+
+                       temp = work->data;
+
+                       if (strcmp(path, temp) == 0)
+                               {
+                               found = TRUE;
+                               }
+                       else
+                               {
+                               work = work->next;
+                               }
+                       }
+               }
+       if (!work) return;
+
+       work_ahead = NULL;
+       if (next)
+               {
+               work = work->next;
+               if (work) work_ahead = work->next;
+               }
+       else
+               {
+               work = work->prev;
+               if (work) work_ahead = work->prev;
+               }
+       if (!work) return;
+
+       vw->list_pointer = work;
+       path = work->data;
+       image_change_path(imd, path, image_zoom_get_default(imd, zoom_mode));
+
+       if (enable_read_ahead && work_ahead)
+               {
+               const gchar *next_path = work_ahead->data;
+               image_prebuffer_set(imd, next_path);
+               }
+}
+
+static void view_list_step_to_end(ViewWindow *vw, gint last)
+{
+       ImageWindow *imd = view_window_active_image(vw);
+       const gchar *path;
+       GList *work;
+       GList *work_ahead;
+
+       if (!vw->list) return;
+
+       if (last)
+               {
+               work = g_list_last(vw->list);
+               work_ahead = work->prev;
+               }
+       else
+               {
+               work = vw->list;
+               work_ahead = work->next;
+               }
+
+       vw->list_pointer = work;
+       path = work->data;
+       image_change_path(imd, path, image_zoom_get_default(imd, zoom_mode));
+
+       if (enable_read_ahead && work_ahead)
+               {
+               const gchar *next_path = work_ahead->data;
+               image_prebuffer_set(imd, next_path);
+               }
+}
+
+static void view_step_next(ViewWindow *vw)
+{
+       if (vw->ss)
+               {
+               view_slideshow_next(vw);
+               }
+       else if (vw->list)
+               {
+               view_list_step(vw, TRUE);
+               }
+       else
+               {
+               view_collection_step(vw, TRUE);
+               }
+}
+
+static void view_step_prev(ViewWindow *vw)
+{
+       if (vw->ss)
+               {
+               view_slideshow_prev(vw);
+               }
+       else if (vw->list)
+               {
+               view_list_step(vw, FALSE);
+               }
+       else
+               {
+               view_collection_step(vw, FALSE);
+               }
+}
+
+static void view_step_to_end(ViewWindow *vw, gint last)
+{
+       if (vw->list)
+               {
+               view_list_step_to_end(vw, last);
+               }
+       else
+               {
+               view_collection_step_to_end(vw, last);
+               }
+}
+
 /*
  *-----------------------------------------------------------------------------
  * view window keyboard
  *-----------------------------------------------------------------------------
  */
 
+static void view_window_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
+{
+       ViewWindow *vw = data;
+       ImageWindow *imd;
+
+       imd = view_window_active_image(vw);
+       gdk_window_get_origin(imd->image->window, x, y);
+       popup_menu_position_clamp(menu, x, y, 0);
+}
+
 static gint view_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
 {
-       ImageWindow *imd = data;
+       ViewWindow *vw = data;
+       ImageWindow *imd;
        gint stop_signal = FALSE;
+       GtkWidget *menu;
        gint x = 0;
        gint y = 0;
 
+       imd = view_window_active_image(vw);
+
        switch (event->keyval)
                {
-               case GDK_Left:
+               case GDK_Left: case GDK_KP_Left:
                        x -= 1;
                        stop_signal = TRUE;
                        break;
-               case GDK_Right:
+               case GDK_Right: case GDK_KP_Right:
                        x += 1;
                        stop_signal = TRUE;
                        break;
-               case GDK_Up:
+               case GDK_Up: case GDK_KP_Up:
                        y -= 1;
                        stop_signal = TRUE;
                        break;
-               case GDK_Down:
+               case GDK_Down: case GDK_KP_Down:
                        y += 1;
                        stop_signal = TRUE;
                        break;
-               case '+': case '=':
-                       image_area_adjust_zoom(imd, 1);
+               }
+
+       if ( !(event->state & GDK_CONTROL_MASK) )
+           switch (event->keyval)
+               {
+               case GDK_Page_Up: case GDK_KP_Page_Up:
+               case GDK_BackSpace:
+               case 'B': case 'b':
+                       view_step_prev(vw);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Page_Down: case GDK_KP_Page_Down:
+               case GDK_space:
+               case 'N': case 'n':
+                       view_step_next(vw);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Home: case GDK_KP_Home:
+                       view_step_to_end(vw, FALSE);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_End: case GDK_KP_End:
+                       view_step_to_end(vw, TRUE);
+                       stop_signal = TRUE;
+                       break;
+               case '+': case '=': case GDK_KP_Add:
+                       image_zoom_adjust(imd, get_zoom_increment());
+                       break;
+               case '-': case GDK_KP_Subtract:
+                       image_zoom_adjust(imd, -get_zoom_increment());
+                       break;
+               case 'X': case 'x': case GDK_KP_Multiply:
+                       image_zoom_set(imd, 0.0);
+                       break;
+               case 'Z': case 'z': case GDK_KP_Divide: case '1':
+                       image_zoom_set(imd, 1.0);
+                       break;
+               case '2':
+                       image_zoom_set(imd, 2.0);
+                       break;
+               case '3':
+                       image_zoom_set(imd, 3.0);
+                       break;
+               case '4':
+                       image_zoom_set(imd, 4.0);
+                       break;
+               case '7':
+                       image_zoom_set(imd, -4.0);
+                       break;
+               case '8':
+                       image_zoom_set(imd, -3.0);
+                       break;
+               case '9':
+                       image_zoom_set(imd, -2.0);
+                       break;
+               case 'W': case 'w':
+                       image_zoom_set_fill_geometry(imd, FALSE);
+                       break;
+               case 'H': case 'h':
+                       image_zoom_set_fill_geometry(imd, TRUE);
+                       break;
+               case 'R': case 'r':
+                       image_reload(imd);
+                       break;
+               case 'S': case 's':
+                       if (vw->ss)
+                               view_slideshow_stop(vw);
+                       else
+                               view_slideshow_start(vw);
+                       stop_signal = TRUE;
+                       break;
+               case 'P': case 'p':
+                       slideshow_pause_toggle(vw->ss);
                        break;
-               case '-':
-                       image_area_adjust_zoom(imd, -1);
+               case 'F': case 'f':
+               case 'V': case 'v':
+                       view_fullscreen_toggle(vw, FALSE);
+                       stop_signal = TRUE;
                        break;
-               case 'x':
-                       image_area_set_zoom(imd, 0);
+               case 'I': case 'i':
+                       view_overlay_toggle(vw);
                        break;
-               case 'z':
-                       image_area_set_zoom(imd, 1);
+               case ']':
+                       image_alter(imd, ALTER_ROTATE_90);
+                       stop_signal = TRUE;
                        break;
-               case GDK_Delete:
-                       file_util_delete(image_area_get_path(imd), NULL);
+               case '[':
+                       image_alter(imd, ALTER_ROTATE_90_CC);
                        stop_signal = TRUE;
                        break;
+               case GDK_Delete: case GDK_KP_Delete:
+                       if (enable_delete_key)
+                               {
+                               file_util_delete(image_get_path(imd), NULL, imd->widget);
+                               stop_signal = TRUE;
+                               }
+                       break;
                case GDK_Escape:
-                       gtk_widget_destroy(imd->top_window);
+                       if (vw->fs)
+                               {
+                               view_fullscreen_toggle(vw, TRUE);
+                               }
+                       else
+                               {
+                               gtk_widget_destroy(vw->window);
+                               }
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Menu:
+               case GDK_F10:
+                       menu = view_popup_menu(vw);
+                       gtk_menu_popup(GTK_MENU(menu), NULL, NULL, view_window_menu_pos_cb, vw, 0, GDK_CURRENT_TIME);
                        stop_signal = TRUE;
                        break;
                }
@@ -92,15 +495,61 @@ static gint view_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpoi
                        case '8':
                                n = 7;
                                break;
+                       case '9':
+                               n = 8;
+                               break;
+                       case '0':
+                               n = 9;
+                               break;
+                       case 'C': case 'c':
+                               file_util_copy(image_get_path(imd), NULL, NULL, imd->widget);
+                               stop_signal = TRUE;
+                               break;
+                       case 'M': case 'm':
+                               file_util_move(image_get_path(imd), NULL, NULL, imd->widget);
+                               stop_signal = TRUE;
+                               break;
+                       case 'R': case 'r':
+                               file_util_rename(image_get_path(imd), NULL, imd->widget);
+                               stop_signal = TRUE;
+                               break;
+                       case 'D': case 'd':
+                               file_util_delete(image_get_path(imd), NULL, imd->widget);
+                               stop_signal = TRUE;
+                               break;
+                       case 'P': case 'p':
+                               info_window_new(image_get_path(imd), NULL);
+                               stop_signal = TRUE;
+                               break;
+                       case 'W': case 'w':
+                               view_window_close(vw);
+                               break;
                        }
                if (n != -1)
                        {
-                       start_editor_from_file(n, image_area_get_path(imd));
+                       view_fullscreen_toggle(vw, TRUE);
+                       start_editor_from_file(n, image_get_path(imd));
                        }
                }
-
-       if (event->state & GDK_SHIFT_MASK)
+       else if (event->state & GDK_SHIFT_MASK)
                {
+               switch (event->keyval)
+                       {
+                       case 'R': case 'r':
+                               image_alter(imd, ALTER_ROTATE_180);
+                               stop_signal = TRUE;
+                               break;
+                       case 'M': case 'm':
+                               image_alter(imd, ALTER_MIRROR);
+                               stop_signal = TRUE;
+                               break;
+                       case 'F': case 'f':
+                               image_alter(imd, ALTER_FLIP);
+                               stop_signal = TRUE;
+                               break;
+                       default:
+                               break;
+                       }
                x *= 3;
                y *= 3;
                }
@@ -108,7 +557,7 @@ static gint view_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpoi
        if (x != 0 || y!= 0)
                {
                keyboard_scroll_calc(&x, &y, event);
-               image_area_scroll(imd, x, y);
+               image_scroll(imd, x, y);
                }
 
        return stop_signal;
@@ -120,204 +569,1082 @@ static gint view_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpoi
  *-----------------------------------------------------------------------------
  */ 
 
-static void button3_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
+static void button_cb(ImageWindow *imd, gint button, guint32 time,
+                     gdouble x, gdouble y, guint state, gpointer data)
 {
-       gtk_object_set_data(GTK_OBJECT(menu_window_view), "view_active", imd);
-       gtk_menu_popup (GTK_MENU(menu_window_view), NULL, NULL, NULL, NULL,
-               bevent->button, bevent->time);
-}
+       ViewWindow *vw = data;
+       GtkWidget *menu;
 
-static void button4_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
-{
-       if (mousewheel_scrolls)
-               image_area_scroll(imd, 0, -MOUSEWHEEL_SCROLL_SIZE);
+       switch (button)
+               {
+               case 1:
+                       view_step_next(vw);
+                       break;
+               case 2:
+                       view_step_prev(vw);
+                       break;
+               case 3:
+                       menu = view_popup_menu(vw);
+                       gtk_menu_popup (GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, time);
+                       break;
+               default:
+                       break;
+               }
 }
 
-static void button5_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
+static void scroll_cb(ImageWindow *imd, GdkScrollDirection direction, guint32 time,
+                     gdouble x, gdouble y, guint state, gpointer data)
 {
-       if (mousewheel_scrolls)
-               image_area_scroll(imd, 0, MOUSEWHEEL_SCROLL_SIZE);
+       ViewWindow *vw = data;
+
+       if (state & GDK_CONTROL_MASK)
+               {
+               switch (direction)
+                       {
+                       case GDK_SCROLL_UP:
+                               image_zoom_adjust_at_point(imd, get_zoom_increment(), x, y);
+                               break;
+                       case GDK_SCROLL_DOWN:
+                               image_zoom_adjust_at_point(imd, -get_zoom_increment(), x, y);
+                               break;
+                       default:
+                               break;
+                       }
+               }
+       else if ( (state & GDK_SHIFT_MASK) != (mousewheel_scrolls))
+               {
+               switch (direction)
+                       {
+                       case GDK_SCROLL_UP:
+                               image_scroll(imd, 0, -MOUSEWHEEL_SCROLL_SIZE);
+                               break;
+                       case GDK_SCROLL_DOWN:
+                               image_scroll(imd, 0, MOUSEWHEEL_SCROLL_SIZE);
+                               break;
+                       case GDK_SCROLL_LEFT:
+                               image_scroll(imd, -MOUSEWHEEL_SCROLL_SIZE, 0);
+                               break;
+                       case GDK_SCROLL_RIGHT:
+                               image_scroll(imd, MOUSEWHEEL_SCROLL_SIZE, 0);
+                               break;
+                       default:
+                               break;
+                       }
+               }
+       else
+               {
+               switch (direction)
+                       {
+                       case GDK_SCROLL_UP:
+                               view_step_prev(vw);
+                               break;
+                       case GDK_SCROLL_DOWN:
+                               view_step_next(vw);
+                               break;
+                       default:
+                               break;
+                       }
+               }
 }
 
-static gint view_window_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
+static void view_image_set_buttons(ViewWindow *vw, ImageWindow *imd)
 {
-       gtk_widget_destroy(w);
-       return TRUE;
+       image_set_button_func(imd, button_cb, vw);
+       image_set_scroll_func(imd, scroll_cb, vw);
 }
 
-static gint view_window_destroy_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
+static void view_fullscreen_stop_func(FullScreenData *fs, gpointer data)
 {
-       ImageWindow *imd = data;
-       image_area_free(imd);
-       return FALSE;
+       ViewWindow *vw = data;
+
+       vw->fs = NULL;
+
+       if (vw->ss) vw->ss->imd = vw->imd;
 }
 
-void view_window_new(gchar *path)
+static void view_fullscreen_toggle(ViewWindow *vw, gint force_off)
 {
-       GtkWidget *window;
-       ImageWindow *imd;
-       GtkAllocation req_size;
-       gint w, h;
-       if (!path) return;
+       if (force_off && !vw->fs) return;
 
-       window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-       gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
-       gtk_window_set_title (GTK_WINDOW (window), "GQview");
-        gtk_window_set_wmclass(GTK_WINDOW (window), "view", "GQview");
-        gtk_container_border_width (GTK_CONTAINER (window), 0);
+       if (vw->fs)
+               {
+               fullscreen_stop(vw->fs);
 
-       imd = image_area_new(NULL);
-       image_area_set_topwindow(imd, window, NULL, TRUE);
-       gtk_container_add(GTK_CONTAINER(window), imd->eventbox);
-       gtk_viewport_set_shadow_type (GTK_VIEWPORT(imd->viewport), GTK_SHADOW_NONE);
-        gtk_container_border_width (GTK_CONTAINER (imd->viewport), 0);
-       gtk_widget_show_all(imd->eventbox);
+               if (vw->overlay_id != -1) vw->overlay_id = image_overlay_info_enable(vw->imd);
+               }
+       else
+               {
+               vw->fs = fullscreen_start(vw->window, vw->imd, view_fullscreen_stop_func, vw);
 
-       image_dnd_init(imd);
+               view_image_set_buttons(vw, vw->fs->imd);
+               g_signal_connect(G_OBJECT(vw->fs->window), "key_press_event",
+                                G_CALLBACK(view_window_key_press_cb), vw);
 
-       image_area_set_button(imd, 3, button3_cb, NULL);
-       /* for wheel mice */
-       image_area_set_button(imd, 4, button4_cb, NULL);
-       image_area_set_button(imd, 5, button5_cb, NULL);
+               if (vw->ss) vw->ss->imd = vw->fs->imd;
 
+               if (vw->overlay_id != -1)
+                       {
+                       image_overlay_info_disable(vw->imd, vw->overlay_id);
+                       vw->overlay_id = image_overlay_info_enable(vw->fs->imd);
+                       }
+               }
+}
 
-       gtk_signal_connect(GTK_OBJECT(window), "delete_event", (GtkSignalFunc) view_window_delete_cb, NULL);
-       gtk_signal_connect(GTK_OBJECT(window), "destroy_event", (GtkSignalFunc) view_window_destroy_cb, imd);
-       gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(view_window_key_press_cb), imd);
+static void view_overlay_toggle(ViewWindow *vw)
+{
+       ImageWindow *imd;
 
-       image_area_set_image(imd, path, get_default_zoom(NULL));
+       imd = view_window_active_image(vw);
 
-       w = imd->width;
-       h = imd->height;
-       if (limit_window_size)
+       if (vw->overlay_id == -1)
                {
-               gint mw = gdk_screen_width() * max_window_size / 100;
-               gint mh = gdk_screen_height() * max_window_size / 100;
-
-               if (w > mw) w = mw;
-               if (h > mh) h = mh;
+               vw->overlay_id = image_overlay_info_enable(imd);
+               }
+       else
+               {
+               image_overlay_info_disable(imd, vw->overlay_id);
+               vw->overlay_id = -1;
                }
+}
 
-       gtk_window_set_default_size (GTK_WINDOW(window), w, h);
-       req_size.x = req_size.y = 0;
-       req_size.width = w;
-       req_size.height = h;
-       gtk_widget_size_allocate(GTK_WIDGET(window), &req_size);
+static void view_slideshow_next(ViewWindow *vw)
+{
+       if (vw->ss) slideshow_next(vw->ss);
+}
+
+static void view_slideshow_prev(ViewWindow *vw)
+{
+       if (vw->ss) slideshow_prev(vw->ss);
+}
 
-       gtk_widget_set_usize(imd->eventbox, w, h);
+static void view_slideshow_stop_func(SlideShowData *fs, gpointer data)
+{
+       ViewWindow *vw = data;
 
-       gtk_widget_show(window);
+       vw->ss = NULL;
 }
 
-/*
+static void view_slideshow_start(ViewWindow *vw)
+{
+       if (!vw->ss)
+               {
+               CollectionData *cd;
+               CollectInfo *info;
+
+               if (vw->list)
+                       {
+                       vw->ss = slideshow_start_from_path_list(view_window_active_image(vw),
+                                                               path_list_copy(vw->list),
+                                                               view_slideshow_stop_func, vw);
+                       vw->list_pointer = NULL;
+                       return;
+                       }
+
+               cd = image_get_collection(view_window_active_image(vw), &info);
+               if (cd && info)
+                       {
+                       vw->ss = slideshow_start_from_collection(view_window_active_image(vw), cd,
+                                                                view_slideshow_stop_func, vw, info);
+                       }
+               }
+}
+
+static void view_slideshow_stop(ViewWindow *vw)
+{
+       if (vw->ss) slideshow_free(vw->ss);
+}
+
+static void view_window_close(ViewWindow *vw)
+{
+       view_window_list = g_list_remove(view_window_list, vw);
+
+       view_slideshow_stop(vw);
+       view_fullscreen_toggle(vw, TRUE);
+       gtk_widget_destroy(vw->window);
+       path_list_free(vw->list);
+       g_free(vw);
+}
+
+static gint view_window_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
+{
+       ViewWindow *vw = data;
+
+       view_window_close(vw);
+       return TRUE;
+}
+
+static ViewWindow *real_view_window_new(const gchar *path, GList *list, CollectionData *cd, CollectInfo *info)
+{
+       ViewWindow *vw;
+       GtkAllocation req_size;
+       GdkGeometry geometry;
+       gint w, h;
+
+       if (!path && !list && (!cd || !info)) return NULL;
+
+       vw = g_new0(ViewWindow, 1);
+       vw->fs = NULL;
+       vw->ss = NULL;
+       vw->list = NULL;
+       vw->list_pointer = NULL;
+
+       vw->overlay_id = -1;
+
+       vw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+       geometry.min_width = 8;
+       geometry.min_height = 8;
+       gtk_window_set_geometry_hints(GTK_WINDOW(vw->window), NULL, &geometry, GDK_HINT_MIN_SIZE);
+
+       gtk_window_set_resizable(GTK_WINDOW(vw->window), TRUE);
+       gtk_window_set_title (GTK_WINDOW(vw->window), "GQview");
+        gtk_window_set_wmclass(GTK_WINDOW(vw->window), "view", "GQview");
+        gtk_container_set_border_width(GTK_CONTAINER(vw->window), 0);
+
+       window_set_icon(vw->window, (const gchar **)view_xpm, NULL);
+
+       vw->imd = image_new(FALSE);
+
+       if (black_window_background) image_background_set_black(vw->imd, TRUE);
+
+       image_attach_window(vw->imd, vw->window, NULL, "GQview", TRUE);
+
+       image_auto_refresh(vw->imd, 0);
+       image_top_window_set_sync(vw->imd, TRUE);
+
+       gtk_container_add(GTK_CONTAINER(vw->window), vw->imd->widget);
+       gtk_widget_show(vw->imd->widget);
+
+       view_window_dnd_init(vw);
+
+       view_image_set_buttons(vw, vw->imd);
+
+       g_signal_connect(G_OBJECT(vw->window), "delete_event",
+                        G_CALLBACK(view_window_delete_cb), vw);
+       g_signal_connect(G_OBJECT(vw->window), "key_press_event",
+                        G_CALLBACK(view_window_key_press_cb), vw);
+       if (cd && info)
+               {
+               image_change_from_collection(vw->imd, cd, info, image_zoom_get_default(NULL, zoom_mode));
+               if (enable_read_ahead)
+                       {
+                       CollectInfo * r_info = collection_next_by_info(cd, info);
+                       if (!r_info) r_info = collection_prev_by_info(cd, info);
+                       if (r_info) image_prebuffer_set(vw->imd, r_info->path);
+                       }
+               }
+       else if (list)
+               {
+               view_window_set_list(vw, list);
+               vw->list_pointer = vw->list;
+               image_change_path(vw->imd, (gchar *)vw->list->data, image_zoom_get_default(NULL, zoom_mode));
+
+               if (enable_read_ahead)
+                       {
+                       GList *work = vw->list->next;
+                       if (work) image_prebuffer_set(vw->imd, (gchar *)work->data);
+                       }
+               }
+       else
+               {
+               image_change_path(vw->imd, path, image_zoom_get_default(NULL, zoom_mode));
+               }
+
+       if (image_zoom_get(vw->imd) == 0.0)
+               {
+               w = vw->imd->image_width;
+               h = vw->imd->image_height;
+               }
+       else
+               {
+               w = vw->imd->width;
+               h = vw->imd->height;
+               }
+       if (limit_window_size)
+               {
+               gint mw = gdk_screen_width() * max_window_size / 100;
+               gint mh = gdk_screen_height() * max_window_size / 100;
+
+               if (w > mw) w = mw;
+               if (h > mh) h = mh;
+               }
+
+       gtk_window_set_default_size(GTK_WINDOW(vw->window), w, h);
+       req_size.x = req_size.y = 0;
+       req_size.width = w;
+       req_size.height = h;
+       gtk_widget_size_allocate(GTK_WIDGET(vw->window), &req_size);
+
+       gtk_widget_set_size_request(vw->imd->image, w, h);
+
+       gtk_widget_show(vw->window);
+
+       view_window_list = g_list_append(view_window_list, vw);
+
+       return vw;
+}
+
+static void view_window_collection_unref_cb(GtkWidget *widget, gpointer data)
+{
+       CollectionData *cd = data;
+
+       collection_unref(cd);
+}
+
+void view_window_new(const gchar *path)
+{
+       if (file_extension_match(path, ".gqv"))
+               {
+               ViewWindow *vw;
+               CollectionData *cd;
+               CollectInfo *info;
+
+               cd = collection_new(path);
+               if (collection_load(cd, path, FALSE))
+                       {
+                       info = collection_get_first(cd);
+                       }
+               else
+                       {
+                       collection_unref(cd);
+                       cd = NULL;
+                       info = NULL;
+                       }
+               vw = real_view_window_new(NULL, NULL, cd, info);
+               if (vw && cd)
+                       {
+                       g_signal_connect(G_OBJECT(vw->window), "destroy",
+                                        G_CALLBACK(view_window_collection_unref_cb), cd);
+                       }
+               }
+       else if (isdir(path))
+               {
+               GList *list = NULL;
+
+               if (path_list(path, &list, NULL))
+                       {
+                       list = path_list_sort(list);
+                       list = path_list_filter(list, FALSE);
+                       }
+               real_view_window_new(NULL, list, NULL, NULL);
+               path_list_free(list);
+               }
+       else
+               {
+               real_view_window_new(path, NULL, NULL, NULL);
+               }
+}
+
+void view_window_new_from_list(GList *list)
+{
+       real_view_window_new(NULL, list, NULL, NULL);
+}
+
+void view_window_new_from_collection(CollectionData *cd, CollectInfo *info)
+{
+       real_view_window_new(NULL, NULL, cd, info);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * public
+ *-----------------------------------------------------------------------------
+ */
+
+void view_window_colors_update(void)
+{
+       GList *work;
+
+       work = view_window_list;
+       while (work)
+               {
+               ViewWindow *vw = work->data;
+               work = work->next;
+
+               image_background_set_black(vw->imd, black_window_background);
+               }
+}
+
+gint view_window_find_image(ImageWindow *imd, gint *index, gint *total)
+{
+       GList *work;
+
+       work = view_window_list;
+       while (work)
+               {
+               ViewWindow *vw = work->data;
+               work = work->next;
+
+               if (vw->imd == imd ||
+                   (vw->fs && vw->fs->imd == imd))
+                       {
+                       if (vw->ss)
+                               {
+                               gint n;
+                               n = g_list_length(vw->ss->list_done);
+                               if (index) *index = n - 1;
+                               if (total) *total = n + g_list_length(vw->ss->list);
+                               }
+                       else
+                               {
+                               if (index) *index = g_list_position(vw->list, vw->list_pointer);
+                               if (total) *total = g_list_length(vw->list);
+                               }
+                       return TRUE;
+                       }
+               }
+
+       return FALSE;
+}
+
+/*
  *-----------------------------------------------------------------------------
  * view window menu routines and callbacks
  *-----------------------------------------------------------------------------
  */ 
 
-static ImageWindow *view_window_get_active()
+static void view_new_window_cb(GtkWidget *widget, gpointer data)
+{
+       ViewWindow *vw = data;
+       CollectionData *cd;
+       CollectInfo *info;
+
+       cd = image_get_collection(vw->imd, &info);
+
+       if (cd && info)
+               {
+               view_window_new_from_collection(cd, info);
+               }
+       else
+               {
+               view_window_new(image_get_path(vw->imd));
+               }
+}
+
+static void view_edit_cb(GtkWidget *widget, gpointer data)
 {
-       return gtk_object_get_data(GTK_OBJECT(menu_window_view), "view_active");
+       ViewWindow *vw;
+       gint n;
+
+       vw = submenu_item_get_data(widget);
+       n = GPOINTER_TO_INT(data);
+       if (!vw) return;
+
+       view_fullscreen_toggle(vw, TRUE);
+       start_editor_from_file(n, image_get_path(vw->imd));
 }
 
-void view_window_active_edit(gint n)
+static void view_alter_cb(GtkWidget *widget, gpointer data)
 {
-       ImageWindow *imd = view_window_get_active();
-       if (!imd) return;
-       start_editor_from_file(n, image_area_get_path(imd));
+       ViewWindow *vw;
+       AlterType type;
+
+       vw = submenu_item_get_data(widget);
+       type = GPOINTER_TO_INT(data);
+
+       if (!vw) return;
+       image_alter(vw->imd, type);
 }
 
-void view_window_active_to_root(gint n)
+static void view_info_cb(GtkWidget *widget, gpointer data)
 {
-       ImageWindow *imd = view_window_get_active();
-       if (!imd) return;
-       image_area_to_root(imd, (image_area_get_zoom(imd) == 0));
+       ViewWindow *vw = data;
+       ImageWindow *imd;
+
+       imd = view_window_active_image(vw);
+       info_window_new(image_get_path(imd), NULL);
+}
+
+static void view_wallpaper_cb(GtkWidget *widget, gpointer data)
+{
+       ViewWindow *vw = data;
+       ImageWindow *imd;
+
+       imd = view_window_active_image(vw);
+       image_to_root_window(imd, (image_zoom_get(imd) == 0.0));
 }
 
 static void view_zoom_in_cb(GtkWidget *widget, gpointer data)
 {
-       ImageWindow *imd = view_window_get_active();
-       if (!imd) return;
-       image_area_adjust_zoom(imd, 1);
+       ViewWindow *vw = data;
+
+       image_zoom_adjust(view_window_active_image(vw), get_zoom_increment());
 }
 
 static void view_zoom_out_cb(GtkWidget *widget, gpointer data)
 {
-       ImageWindow *imd = view_window_get_active();
-       if (!imd) return;
-       image_area_adjust_zoom(imd, -1);
+       ViewWindow *vw = data;
+
+       image_zoom_adjust(view_window_active_image(vw), -get_zoom_increment());
 }
 
 static void view_zoom_1_1_cb(GtkWidget *widget, gpointer data)
 {
-       ImageWindow *imd = view_window_get_active();
-       if (!imd) return;
-       image_area_set_zoom(imd, 1);
+       ViewWindow *vw = data;
+
+       image_zoom_set(view_window_active_image(vw), 1.0);
 }
 
 static void view_zoom_fit_cb(GtkWidget *widget, gpointer data)
 {
-       ImageWindow *imd = view_window_get_active();
-       if (!imd) return;
-       image_area_set_zoom(imd, 0);
+       ViewWindow *vw = data;
+
+       image_zoom_set(view_window_active_image(vw), 0.0);
 }
 
 static void view_copy_cb(GtkWidget *widget, gpointer data)
 {
-       ImageWindow *imd = view_window_get_active();
-       if (!imd) return;
-       file_util_copy(image_area_get_path(imd), NULL, current_path);
+       ViewWindow *vw = data;
+       ImageWindow *imd;
+
+       imd = view_window_active_image(vw);
+       file_util_copy(image_get_path(imd), NULL, NULL, imd->widget);
 }
 
 static void view_move_cb(GtkWidget *widget, gpointer data)
 {
-       ImageWindow *imd = view_window_get_active();
-       if (!imd) return;
-       file_util_move(image_area_get_path(imd), NULL, current_path);
+       ViewWindow *vw = data;
+       ImageWindow *imd;
+
+       imd = view_window_active_image(vw);
+       file_util_move(image_get_path(imd), NULL, NULL, imd->widget);
 }
 
 static void view_rename_cb(GtkWidget *widget, gpointer data)
 {
-       ImageWindow *imd = view_window_get_active();
-       if (!imd) return;
-       file_util_rename(image_area_get_path(imd), NULL);
+       ViewWindow *vw = data;
+       ImageWindow *imd;
+
+       imd = view_window_active_image(vw);
+       file_util_rename(image_get_path(imd), NULL, imd->widget);
 }
 
 static void view_delete_cb(GtkWidget *widget, gpointer data)
 {
-       ImageWindow *imd = view_window_get_active();
-       if (!imd) return;
-       file_util_delete(image_area_get_path(imd), NULL);
+       ViewWindow *vw = data;
+       ImageWindow *imd;
+
+       imd = view_window_active_image(vw);
+       file_util_delete(image_get_path(imd), NULL, imd->widget);
+}
+
+static void view_fullscreen_cb(GtkWidget *widget, gpointer data)
+{
+       ViewWindow *vw = data;
+
+       view_fullscreen_toggle(vw, FALSE);
+}
+
+static void view_slideshow_start_cb(GtkWidget *widget, gpointer data)
+{
+       ViewWindow *vw = data;
+
+       view_slideshow_start(vw);
+}
+
+static void view_slideshow_stop_cb(GtkWidget *widget, gpointer data)
+{
+       ViewWindow *vw = data;
+
+       view_slideshow_stop(vw);
+}
+
+static void view_slideshow_pause_cb(GtkWidget *widget, gpointer data)
+{
+       ViewWindow *vw = data;
+
+       slideshow_pause_toggle(vw->ss);
 }
 
 static void view_close_cb(GtkWidget *widget, gpointer data)
 {
-       ImageWindow *imd = view_window_get_active();
-       if (!imd) return;
-       gtk_widget_destroy(imd->top_window);
+       ViewWindow *vw = data;
+
+       view_window_close(vw);
+}
+
+static GtkWidget *view_popup_menu(ViewWindow *vw)
+{
+       GtkWidget *menu;
+       GtkWidget *item;
+
+       menu = popup_menu_short_lived();
+
+       menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(view_zoom_in_cb), vw);
+       menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(view_zoom_out_cb), vw);
+       menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(view_zoom_1_1_cb), vw);
+       menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(view_zoom_fit_cb), vw);
+       menu_item_add_divider(menu);
+
+       item = submenu_add_edit(menu, NULL, G_CALLBACK(view_edit_cb), vw);
+       menu_item_add_divider(item);
+       menu_item_add(item, _("Set as _wallpaper"), G_CALLBACK(view_wallpaper_cb), vw);
+
+       submenu_add_alter(menu, G_CALLBACK(view_alter_cb), vw);
+
+       menu_item_add_stock(menu, _("_Properties"), GTK_STOCK_PROPERTIES, G_CALLBACK(view_info_cb), vw);
+
+       menu_item_add_stock(menu, _("View in _new window"), GTK_STOCK_NEW, G_CALLBACK(view_new_window_cb), vw);
+
+       menu_item_add_divider(menu);
+       menu_item_add_stock(menu, _("_Copy..."), GTK_STOCK_COPY, G_CALLBACK(view_copy_cb), vw);
+       menu_item_add(menu, _("_Move..."), G_CALLBACK(view_move_cb), vw);
+       menu_item_add(menu, _("_Rename..."), G_CALLBACK(view_rename_cb), vw);
+       menu_item_add_stock(menu, _("_Delete..."), GTK_STOCK_DELETE, G_CALLBACK(view_delete_cb), vw);
+
+       menu_item_add_divider(menu);
+
+       if (vw->ss)
+               {
+               menu_item_add(menu, _("_Stop slideshow"), G_CALLBACK(view_slideshow_stop_cb), vw);
+               if (slideshow_paused(vw->ss))
+                       {
+                       item = menu_item_add(menu, _("Continue slides_how"),
+                                            G_CALLBACK(view_slideshow_pause_cb), vw);
+                       }
+               else
+                       {
+                       item = menu_item_add(menu, _("Pause slides_how"),
+                                            G_CALLBACK(view_slideshow_pause_cb), vw);
+                       }
+               }
+       else
+               {
+               item = menu_item_add(menu, _("_Start slideshow"), G_CALLBACK(view_slideshow_start_cb), vw);
+               gtk_widget_set_sensitive(item, (vw->list != NULL) || view_window_contains_collection(vw));
+               item = menu_item_add(menu, _("Pause slides_how"), G_CALLBACK(view_slideshow_pause_cb), vw);
+               gtk_widget_set_sensitive(item, FALSE);
+               }
+
+       if (vw->fs)
+               {
+               menu_item_add(menu, _("Exit _full screen"), G_CALLBACK(view_fullscreen_cb), vw);
+               }
+       else
+               {
+               menu_item_add(menu, _("_Full screen"), G_CALLBACK(view_fullscreen_cb), vw);
+               }
+
+       menu_item_add_divider(menu);
+       menu_item_add_stock(menu, _("C_lose window"), GTK_STOCK_CLOSE, G_CALLBACK(view_close_cb), vw);
+
+       return menu;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * dnd confirm dir
+ *-------------------------------------------------------------------
+ */
+
+typedef struct {
+       ViewWindow *vw;
+       GList *list;
+} CViewConfirmD;
+
+static void view_dir_list_cancel(GtkWidget *widget, gpointer data)
+{
+       /* do nothing */
+}
+
+static void view_dir_list_do(ViewWindow *vw, GList *list, gint skip, gint recurse)
+{
+       GList *work;
+
+       view_window_set_list(vw, NULL);
+
+       work = list;
+       while (work)
+               {
+               gchar *path = work->data;
+               work = work->next;
+
+               if (isdir(path))
+                       {
+                       if (!skip)
+                               {
+                               GList *list = NULL;
+
+                               if (recurse)
+                                       {
+                                       list = path_list_recursive(path);
+                                       }
+                               else
+                                       {
+                                       path_list(path, &list, NULL);
+                                       list = path_list_sort(list);
+                                       list = path_list_filter(list, FALSE);
+                                       }
+                               if (list) vw->list = g_list_concat(vw->list, list);
+                               }
+                       }
+               else
+                       {
+                       /* FIXME: no filtering here */
+                       vw->list = g_list_append(vw->list, g_strdup(path));
+                       }
+               }
+
+       if (vw->list)
+               {
+               gchar *path;
+
+               vw->list_pointer = vw->list;
+               path = vw->list->data;
+               image_change_path(vw->imd, path, image_zoom_get_default(vw->imd, zoom_mode));
+
+               work = vw->list->next;
+               if (enable_read_ahead && work)
+                       {
+                       path = work->data;
+                       image_prebuffer_set(vw->imd, path);
+                       }
+               }
+       else
+               {
+               image_change_path(vw->imd, NULL, image_zoom_get_default(vw->imd, zoom_mode));
+               }
+}
+
+static void view_dir_list_add(GtkWidget *widget, gpointer data)
+{
+       CViewConfirmD *d = data;
+       view_dir_list_do(d->vw, d->list, FALSE, FALSE);
+}
+
+static void view_dir_list_recurse(GtkWidget *widget, gpointer data)
+{
+       CViewConfirmD *d = data;
+       view_dir_list_do(d->vw, d->list, FALSE, TRUE);
+}
+
+static void view_dir_list_skip(GtkWidget *widget, gpointer data)
+{
+       CViewConfirmD *d = data;
+       view_dir_list_do(d->vw, d->list, TRUE, FALSE);
+}
+
+static void view_dir_list_destroy(GtkWidget *widget, gpointer data)
+{
+       CViewConfirmD *d = data;
+        path_list_free(d->list);
+        g_free(d);
+}
+
+static GtkWidget *view_confirm_dir_list(ViewWindow *vw, GList *list)
+{
+       GtkWidget *menu;
+       CViewConfirmD *d;
+
+       d = g_new(CViewConfirmD, 1);
+       d->vw = vw;
+       d->list = list;
+
+       menu = popup_menu_short_lived();
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(view_dir_list_destroy), d);
+
+       menu_item_add_stock(menu, _("Dropped list includes folders."), GTK_STOCK_DND_MULTIPLE, NULL, NULL);
+       menu_item_add_divider(menu);
+       menu_item_add_stock(menu, _("_Add contents"), GTK_STOCK_OK, G_CALLBACK(view_dir_list_add), d);
+       menu_item_add_stock(menu, _("Add contents _recursive"), GTK_STOCK_ADD, G_CALLBACK(view_dir_list_recurse), d);
+       menu_item_add_stock(menu, _("_Skip folders"), GTK_STOCK_REMOVE, G_CALLBACK(view_dir_list_skip), d);
+       menu_item_add_divider(menu);
+       menu_item_add_stock(menu, _("Cancel"), GTK_STOCK_CANCEL, G_CALLBACK(view_dir_list_cancel), d);
+
+       return menu;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * image drag and drop routines
+ *-----------------------------------------------------------------------------
+ */
+
+static void view_window_get_dnd_data(GtkWidget *widget, GdkDragContext *context,
+                                    gint x, gint y,
+                                    GtkSelectionData *selection_data, guint info,
+                                    guint time, gpointer data)
+{
+       ViewWindow *vw = data;
+       ImageWindow *imd;
+
+       if (gtk_drag_get_source_widget(context) == vw->imd->image) return;
+
+       imd = vw->imd;
+
+       if (info == TARGET_URI_LIST || info == TARGET_APP_COLLECTION_MEMBER)
+               {
+               CollectionData *source;
+               GList *list;
+               GList *info_list;
+
+               if (info == TARGET_URI_LIST)
+                       {
+                       GList *work;
+
+                       list = uri_list_from_text(selection_data->data, TRUE);
+
+                       work = list;
+                       while (work)
+                               {
+                               if (isdir((gchar *)work->data))
+                                       {
+                                       GtkWidget *menu;
+                                       menu = view_confirm_dir_list(vw, list);
+                                       gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, time);
+                                       return;
+                                       }
+                               work = work->next;
+                               }
+
+                       list = path_list_filter(list, FALSE);
+
+                       source = NULL;
+                       info_list = NULL;
+                       }
+               else
+                       {
+                       source = collection_from_dnd_data((gchar *)selection_data->data, &list, &info_list);
+                       }
+
+               if (list)
+                       {
+                       gchar *path;
+
+                       path = list->data;
+                       if (isfile(path))
+                               {
+                               view_slideshow_stop(vw);
+                               view_window_set_list(vw, NULL);
+
+                               if (source && info_list)
+                                       {
+                                       image_change_from_collection(imd, source, info_list->data, image_zoom_get_default(imd, zoom_mode));
+                                       }
+                               else
+                                       {
+                                       if (list->next)
+                                               {
+                                               vw->list = list;
+                                               list = NULL;
+
+                                               vw->list_pointer = vw->list;
+                                               }
+                                       image_change_path(imd, path, image_zoom_get_default(imd, zoom_mode));
+                                       }
+                               }
+                       }
+               path_list_free(list);
+               g_list_free(info_list);
+               }
+}
+
+static void view_window_set_dnd_data(GtkWidget *widget, GdkDragContext *context,
+                                    GtkSelectionData *selection_data, guint info,
+                                    guint time, gpointer data)
+{
+       ViewWindow *vw = data;
+       const gchar *path;
+
+       path = image_get_path(vw->imd);
+
+       if (path)
+               {
+               gchar *text = NULL;
+               gint len;
+               gint plain_text;
+               GList *list;
+
+               switch (info)
+                       {
+                       case TARGET_URI_LIST:
+                               plain_text = FALSE;
+                               break;
+                       case TARGET_TEXT_PLAIN:
+                       default:
+                               plain_text = TRUE;
+                               break;
+                       }
+               list = g_list_append(NULL, (gchar *)path);
+               text = uri_text_from_list(list, &len, plain_text);
+               g_list_free(list);
+               if (text)
+                       {
+                       gtk_selection_data_set (selection_data, selection_data->target,
+                                               8, text, len);
+                       g_free(text);
+                       }
+               }
+       else
+               {
+               gtk_selection_data_set (selection_data, selection_data->target,
+                                       8, NULL, 0);
+               }
+}
+
+static void view_window_dnd_init(ViewWindow *vw)
+{
+       ImageWindow *imd;
+
+       imd = vw->imd;
+
+       gtk_drag_source_set(imd->image, GDK_BUTTON2_MASK,
+                           dnd_file_drag_types, dnd_file_drag_types_count,
+                           GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+       g_signal_connect(G_OBJECT(imd->image), "drag_data_get",
+                        G_CALLBACK(view_window_set_dnd_data), vw);
+
+       gtk_drag_dest_set(imd->image,
+                         GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
+                         dnd_file_drop_types, dnd_file_drop_types_count,
+                          GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+       g_signal_connect(G_OBJECT(imd->image), "drag_data_received",
+                        G_CALLBACK(view_window_get_dnd_data), vw);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * maintenance (for rename, move, remove)
+ *-----------------------------------------------------------------------------
+ */
+
+static void view_real_removed(ViewWindow *vw, const gchar *path, GList *ignore_list)
+{
+       ImageWindow *imd;
+       const gchar *image_path;
+
+       imd = view_window_active_image(vw);
+       image_path = image_get_path(imd);
+
+       if (image_path && strcmp(image_path, path) == 0)
+               {
+               if (vw->list)
+                       {
+                       view_list_step(vw, TRUE);
+                       if (image_get_path(imd) == image_path)
+                               {
+                               view_list_step(vw, FALSE);
+                               }
+                       }
+               else if (view_window_contains_collection(vw))
+                       {
+                       view_collection_step(vw, TRUE);
+                       if (image_get_path(imd) == image_path)
+                               {
+                               view_collection_step(vw, FALSE);
+                               }
+                       }
+               if (image_get_path(imd) == image_path)
+                       {
+                       image_change_path(imd, NULL, image_zoom_get_default(imd, zoom_mode));
+                       }
+               }
+
+       if (vw->list)
+               {
+               GList *work;
+               GList *old;
+
+               old = vw->list_pointer;
+
+               work = vw->list;
+               while (work)
+                       {
+                       gchar *chk_path;
+                       GList *chk_link;
+
+                       chk_path = work->data;
+                       chk_link = work;
+                       work = work->next;
+
+                       if (strcmp(chk_path, path) == 0)
+                               {
+                               if (vw->list_pointer == chk_link)
+                                       {
+                                       vw->list_pointer = (chk_link->next) ? chk_link->next : chk_link->prev;
+                                       }
+                               vw->list = g_list_remove(vw->list, chk_path);
+                               g_free(chk_path);
+                               }
+                       }
+
+               /* handles stepping correctly when same image is in the list more than once */
+               if (old && old != vw->list_pointer)
+                       {
+                       gchar *path;
+
+                       if (vw->list_pointer)
+                               {
+                               path = vw->list_pointer->data;
+                               }
+                       else
+                               {
+                               path = NULL;
+                               }
+
+                       image_change_path(imd, path, image_zoom_get_default(imd, zoom_mode));
+                       }
+               }
+
+       if (vw->overlay_id != -1) image_overlay_update(imd, vw->overlay_id);
 }
 
-void create_menu_view_popup()
+static void view_real_moved(ViewWindow *vw, const gchar *source, const gchar *dest)
 {
-       menu_window_view = gtk_menu_new();
-       add_menu_popup_item(menu_window_view, _("Zoom in"), view_zoom_in_cb, NULL);
-       add_menu_popup_item(menu_window_view, _("Zoom out"), view_zoom_out_cb, NULL);
-       add_menu_popup_item(menu_window_view, _("Zoom 1:1"), view_zoom_1_1_cb, NULL);
-       add_menu_popup_item(menu_window_view, _("Fit image to window"), view_zoom_fit_cb, NULL);
-       add_menu_divider(menu_window_view);
+       ImageWindow *imd;
+       const gchar *image_path;
+
+       imd = view_window_active_image(vw);
+       image_path = image_get_path(imd);
+
+       if (image_path && strcmp(image_path, source) == 0)
+               {
+               image_set_path(imd, dest);
+               }
+
+       if (vw->list)
+               {
+               GList *work;
+               work = vw->list;
+               while (work)
+                       {
+                       gchar *chk_path;
+
+                       chk_path = work->data;
+
+                       if (strcmp(chk_path, source) == 0)
+                               {
+                               work->data = g_strdup(dest);
+                               g_free(chk_path);
+                               }
 
-       menu_window_view_edit = gtk_menu_item_new_with_label(_("Edit"));
-       gtk_menu_append(GTK_MENU(menu_window_view), menu_window_view_edit);
-       gtk_widget_show(menu_window_view_edit);
+                       work = work->next;
+                       }
+               }
+}
 
-       add_menu_divider(menu_window_view);
-       add_menu_popup_item(menu_window_view, _("Copy..."), view_copy_cb, NULL);
-       add_menu_popup_item(menu_window_view, _("Move..."), view_move_cb, NULL);
-       add_menu_popup_item(menu_window_view, _("Rename..."), view_rename_cb, NULL);
-       add_menu_popup_item(menu_window_view, _("Delete..."), view_delete_cb, NULL);
+void view_window_maint_removed(const gchar *path, GList *ignore_list)
+{
+       GList *work = view_window_list;
+       while (work)
+               {
+               ViewWindow *vw = work->data;
+               work = work->next;
 
-       add_menu_divider(menu_window_view);
-       add_menu_popup_item(menu_window_view, _("Close window"), view_close_cb, NULL);
+               view_real_removed(vw, path, ignore_list);
+               }
 }
 
+void view_window_maint_moved(const gchar *source, const gchar *dest)
+{
+       GList *work = view_window_list;
+       while (work)
+               {
+               ViewWindow *vw = work->data;
+               work = work->next;
+
+               view_real_moved(vw, source, dest);
+               }
+}
 
diff --git a/src/img-view.h b/src/img-view.h
new file mode 100644 (file)
index 0000000..d73ca24
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef IMG_VIEW_H
+#define IMG_VIEW_H
+
+
+void view_window_new(const gchar *path);
+void view_window_new_from_list(GList *list);
+void view_window_new_from_collection(CollectionData *cd, CollectInfo *info);
+
+void view_window_colors_update(void);
+
+gint view_window_find_image(ImageWindow *imd, gint *index, gint *total);
+
+void view_window_maint_removed(const gchar *path, GList *ignore_list);
+void view_window_maint_moved(const gchar *source, const gchar *dest);
+
+
+#endif
diff --git a/src/info.c b/src/info.c
new file mode 100644 (file)
index 0000000..d5bab4b
--- /dev/null
@@ -0,0 +1,765 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "info.h"
+
+#include "bar_info.h"
+#include "bar_exif.h"
+#include "dnd.h"
+#include "filelist.h"
+#include "image.h"
+#include "image-load.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_misc.h"
+
+#include <pwd.h>
+#include <grp.h>
+
+
+#define IMAGE_SIZE_W 200
+#define IMAGE_SIZE_H 200
+
+#define DEF_PROPERTY_WIDTH  510
+#define DEF_PROPERTY_HEIGHT 390
+
+typedef struct _TabData TabData;
+struct _TabData
+{
+       void (*func_free)(gpointer data);
+       void (*func_sync)(InfoData *id, gpointer data);
+       void (*func_image)(InfoData *id, gpointer data);
+       gpointer data;
+};
+
+
+/*
+ *-------------------------------------------------------------------
+ * table utils
+ *-------------------------------------------------------------------
+ */
+
+GtkWidget *table_add_line(GtkWidget *table, gint x, gint y,
+                         const gchar *description, const gchar *text)
+{
+       GtkWidget *label;
+
+       if (!text) text = "";
+
+       label = pref_table_label(table, x, y, description, 1.0);
+       pref_label_bold(label, TRUE, FALSE);
+
+       label = pref_table_label(table, x + 1, y, text, 0.0);
+       return label;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * EXIF tab
+ *-------------------------------------------------------------------
+ */
+
+static void info_tab_exif_image(InfoData *id, gpointer data)
+{
+       GtkWidget *bar = data;
+       const gchar *path;
+
+       if (id->image->unknown)
+               {
+               path = NULL;
+               }
+       else
+                       {
+               path = id->image->image_path;
+               }
+
+       bar_exif_set(bar, path);
+}
+
+static void info_tab_exif_sync(InfoData *id, gpointer data)
+{
+       GtkWidget *bar = data;
+
+       bar_exif_set(bar, NULL);
+}
+
+static TabData *info_tab_exif_new(InfoData *id)
+{
+       TabData *td;
+       GtkWidget *bar;
+       GtkWidget *label;
+
+       bar = bar_exif_new(FALSE, NULL, FALSE, NULL);
+       gtk_container_set_border_width(GTK_CONTAINER(bar), PREF_PAD_BORDER);
+
+       label = gtk_label_new(_("Exif"));
+       gtk_notebook_append_page(GTK_NOTEBOOK(id->notebook), bar, label);
+       gtk_widget_show(bar);
+
+       /* register */
+       td = g_new0(TabData, 1);
+       td->func_free = NULL;
+       td->func_sync = info_tab_exif_sync;
+       td->func_image = info_tab_exif_image;
+       td->data = bar;
+
+       return td;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * file attributes tab
+ *-------------------------------------------------------------------
+ */
+
+typedef struct _InfoTabMeta InfoTabMeta;
+struct _InfoTabMeta
+{
+       GtkWidget *bar_info;
+};
+
+static void info_tab_meta_free(gpointer data)
+{
+       InfoTabMeta *tab = data;
+
+       g_free(tab);
+}
+
+static void info_tab_meta_sync(InfoData *id, gpointer data)
+{
+       InfoTabMeta *tab = data;
+
+       bar_info_set(tab->bar_info, id->path);
+}
+
+static GList *info_tab_meta_list_cb(gpointer data)
+{
+       InfoData *id = data;
+
+       return path_list_copy(id->list);
+}
+
+static TabData *info_tab_meta_new(InfoData *id)
+{
+       TabData *td;
+       InfoTabMeta *tab;
+       GtkWidget *label;
+
+       tab = g_new0(InfoTabMeta, 1);
+
+       tab->bar_info = bar_info_new(NULL, TRUE, NULL);
+       bar_info_set_selection_func(tab->bar_info, info_tab_meta_list_cb, id);
+       bar_info_selection(tab->bar_info, g_list_length(id->list) - 1);
+
+       gtk_container_set_border_width(GTK_CONTAINER(tab->bar_info), PREF_PAD_BORDER);
+
+       label = gtk_label_new(_("Keywords"));
+       gtk_notebook_append_page(GTK_NOTEBOOK(id->notebook), tab->bar_info, label);
+       gtk_widget_show(tab->bar_info);
+
+       /* register */
+       td = g_new0(TabData, 1);
+       td->func_free = info_tab_meta_free;
+       td->func_sync = info_tab_meta_sync;
+       td->func_image = NULL;
+       td->data = tab;
+
+       return td;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * general tab
+ *-------------------------------------------------------------------
+ */
+
+typedef struct _InfoTabGeneral InfoTabGeneral;
+struct _InfoTabGeneral
+{
+       GtkWidget *label_file_time;
+       GtkWidget *label_file_size;
+       GtkWidget *label_dimensions;
+       GtkWidget *label_transparent;
+       GtkWidget *label_image_size;
+       GtkWidget *label_compression;
+       GtkWidget *label_mime_type;
+
+       GtkWidget *label_user;
+       GtkWidget *label_group;
+       GtkWidget *label_perms;
+
+       gint compression_done;
+       gint64 byte_size;
+};
+
+static void info_tab_general_image(InfoData *id, gpointer data)
+{
+       InfoTabGeneral *tab = data;
+       gchar *buf;
+       guint mem_size;
+       gint has_alpha;
+
+       if (id->image->unknown) return;
+
+       buf = g_strdup_printf("%d x %d", id->image->image_width, id->image->image_height);
+       gtk_label_set_text(GTK_LABEL(tab->label_dimensions), buf);
+       g_free(buf);
+
+       if (id->image->pixbuf)
+               {
+               has_alpha = gdk_pixbuf_get_has_alpha(id->image->pixbuf);
+               }
+       else
+               {
+               has_alpha = FALSE;
+               }
+       gtk_label_set_text(GTK_LABEL(tab->label_transparent), has_alpha ? _("yes") : _("no"));
+
+       mem_size = id->image->image_width * id->image->image_height * ((has_alpha) ? 4 : 3);
+       buf = text_from_size_abrev(mem_size);
+       gtk_label_set_text(GTK_LABEL(tab->label_image_size), buf);
+       g_free(buf);
+
+       if (!tab->compression_done && mem_size > 0)
+               {
+               buf = g_strdup_printf("%.1f%%", (float)tab->byte_size / mem_size * 100.0);
+               gtk_label_set_text(GTK_LABEL(tab->label_compression), buf);
+               g_free(buf);
+
+               tab->compression_done = TRUE;
+               }
+
+       buf = image_loader_get_format(id->image->il);
+       if (buf)
+       gtk_label_set_text(GTK_LABEL(tab->label_mime_type), buf);
+       g_free(buf);
+}
+
+static gchar *mode_number(mode_t m)
+{
+       int mb, mu, mg, mo;
+
+       mb = mu = mg = mo = 0;
+
+       if (m & S_ISUID) mb |= 4;
+       if (m & S_ISGID) mb |= 2;
+       if (m & S_ISVTX) mb |= 1;
+
+       if (m & S_IRUSR) mu |= 4;
+       if (m & S_IWUSR) mu |= 2;
+       if (m & S_IXUSR) mu |= 1;
+
+       if (m & S_IRGRP) mg |= 4;
+       if (m & S_IWGRP) mg |= 2;
+       if (m & S_IXGRP) mg |= 1;
+
+       if (m & S_IROTH) mo |= 4;
+       if (m & S_IWOTH) mo |= 2;
+       if (m & S_IXOTH) mo |= 1;
+
+       return g_strdup_printf("%d%d%d%d", mb, mu, mg, mo);
+}
+
+static void info_tab_general_sync_perm(InfoTabGeneral *tab, InfoData *id)
+{
+       struct stat st;
+
+       if (!stat_utf8(id->path, &st))
+               {
+               gtk_label_set_text(GTK_LABEL(tab->label_user), "");
+               gtk_label_set_text(GTK_LABEL(tab->label_group), "");
+               gtk_label_set_text(GTK_LABEL(tab->label_perms), "");
+               }
+       else
+               {
+               struct passwd *user;
+               struct group *grp;
+               gchar pbuf[12];
+               gchar *pmod;
+               gchar *buf;
+
+               user = getpwuid(st.st_uid);
+               gtk_label_set_text(GTK_LABEL(tab->label_user), (user) ? user->pw_name : "");
+
+               grp = getgrgid(st.st_gid);
+               gtk_label_set_text(GTK_LABEL(tab->label_group), (grp) ? grp->gr_name : "");
+
+               pbuf[0] = (st.st_mode & S_IRUSR) ? 'r' : '-';
+               pbuf[1] = (st.st_mode & S_IWUSR) ? 'w' : '-';
+               pbuf[2] = (st.st_mode & S_IXUSR) ? 'x' : '-';
+               pbuf[3] = (st.st_mode & S_IRGRP) ? 'r' : '-';
+               pbuf[4] = (st.st_mode & S_IWGRP) ? 'w' : '-';
+               pbuf[5] = (st.st_mode & S_IXGRP) ? 'x' : '-';
+               pbuf[6] = (st.st_mode & S_IROTH) ? 'r' : '-';
+               pbuf[7] = (st.st_mode & S_IWOTH) ? 'w' : '-';
+               pbuf[8] = (st.st_mode & S_IXOTH) ? 'x' : '-';
+               pbuf[9] = '\0';
+
+               pmod = mode_number(st.st_mode);
+               buf = g_strdup_printf("%s (%s)", pbuf, pmod);
+               gtk_label_set_text(GTK_LABEL(tab->label_perms), buf);
+               g_free(buf);
+               g_free(pmod);
+               }
+}
+
+static void info_tab_general_sync(InfoData *id, gpointer data)
+{
+       InfoTabGeneral *tab = data;
+       gchar *buf;
+
+       gtk_label_set_text(GTK_LABEL(tab->label_file_time), text_from_time(filetime(id->path)));
+
+       tab->byte_size = filesize(id->path);
+
+       buf = text_from_size(tab->byte_size);
+       gtk_label_set_text(GTK_LABEL(tab->label_file_size), buf);
+       g_free(buf);
+
+       gtk_label_set_text(GTK_LABEL(tab->label_dimensions), "");
+       gtk_label_set_text(GTK_LABEL(tab->label_transparent), "");
+       gtk_label_set_text(GTK_LABEL(tab->label_image_size), "");
+
+       gtk_label_set_text(GTK_LABEL(tab->label_compression), "");
+       gtk_label_set_text(GTK_LABEL(tab->label_mime_type), "");
+
+       info_tab_general_sync_perm(tab, id);
+
+       tab->compression_done = FALSE;
+}
+
+static void info_tab_general_free(gpointer data)
+{
+       InfoTabGeneral *tab = data;
+
+       g_free(tab);
+}
+
+static TabData *info_tab_general_new(InfoData *id)
+{
+       TabData *td;
+       InfoTabGeneral *tab;
+       GtkWidget *table;
+       GtkWidget *label;
+
+       tab = g_new0(InfoTabGeneral, 1);
+
+       table = pref_table_new(NULL, 2, 11, FALSE, FALSE);
+       gtk_container_set_border_width(GTK_CONTAINER(table), PREF_PAD_BORDER);
+
+       tab->label_file_time = table_add_line(table, 0, 0, _("File date:"), NULL);
+       tab->label_file_size = table_add_line(table, 0, 1, _("File size:"), NULL);
+
+       tab->label_dimensions = table_add_line(table, 0, 2, _("Dimensions:"), NULL);
+       tab->label_transparent = table_add_line(table, 0, 3, _("Transparent:"), NULL);
+       tab->label_image_size = table_add_line(table, 0, 4, _("Image size:"), NULL);
+
+       tab->label_compression = table_add_line(table, 0, 5, _("Compress ratio:"), NULL);
+       tab->label_mime_type = table_add_line(table, 0, 6, _("File type:"), NULL);
+
+       tab->label_user = table_add_line(table, 0, 7, _("Owner:"), NULL);
+       tab->label_group = table_add_line(table, 0, 8, _("Group:"), NULL);
+       tab->label_perms = table_add_line(table, 0, 9, "", NULL);
+
+       label = gtk_label_new(_("General"));
+       gtk_notebook_append_page(GTK_NOTEBOOK(id->notebook), table, label);
+       gtk_widget_show(table);
+
+       /* register */
+       td = g_new0(TabData, 1);
+       td->func_free = info_tab_general_free;
+       td->func_sync = info_tab_general_sync;
+       td->func_image = info_tab_general_image;
+       td->data = tab;
+
+       return td;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * tabs
+ *-------------------------------------------------------------------
+ */
+
+static void info_tabs_sync(InfoData *id, gint image)
+{
+       GList *work;
+
+       work = id->tab_list;
+       while (work)
+               {
+               TabData *td = work->data;
+               work = work->next;
+
+               if (image)
+                       {
+                       if (td->func_image) td->func_image(id, td->data);
+                       }
+               else
+                       {
+                       if (td->func_sync) td->func_sync(id, td->data);
+                       }
+               }
+}
+
+static void info_tabs_free(InfoData *id)
+{
+       GList *work;
+
+       work = id->tab_list;
+       while (work)
+               {
+               TabData *td = work->data;
+               work = work->next;
+
+               if (td->func_free) td->func_free(td->data);
+               g_free(td);
+               }
+       g_list_free(id->tab_list);
+       id->tab_list = NULL;
+}
+
+static void info_tabs_init(InfoData *id)
+{
+       id->tab_list = g_list_append(id->tab_list, info_tab_general_new(id));
+       id->tab_list = g_list_append(id->tab_list, info_tab_meta_new(id));
+       id->tab_list = g_list_append(id->tab_list, info_tab_exif_new(id));
+}
+
+/*
+ *-------------------------------------------------------------------
+ * sync
+ *-------------------------------------------------------------------
+ */
+
+static void info_window_sync(InfoData *id, const gchar *path)
+{
+
+       if (!path) return;
+
+       gtk_entry_set_text(GTK_ENTRY(id->name_entry), filename_from_path(path));
+
+       if (id->label_count)
+               {
+               gchar *buf;
+               buf = g_strdup_printf(_("Image %d of %d"),
+                                     g_list_index(id->list, (gpointer)path) + 1,
+                                     g_list_length(id->list));
+               gtk_label_set_text(GTK_LABEL(id->label_count), buf);
+               g_free(buf);
+               }
+
+       info_tabs_sync(id, FALSE);
+
+       id->updated = FALSE;
+       image_change_path(id->image, path, 0.0);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * drag n drop (dropping not supported!)
+ *-------------------------------------------------------------------
+ */
+
+static void info_window_dnd_data_set(GtkWidget *widget, GdkDragContext *context,
+                                    GtkSelectionData *selection_data, guint info,
+                                    guint time, gpointer data)
+{
+       InfoData *id = data;
+       const gchar *path;
+
+       path = image_get_path(id->image);
+       if (path)
+               {
+               gchar *text;
+               gint len;
+               GList *list;
+               gint plain_text;
+
+               switch (info)
+                       {
+                       case TARGET_URI_LIST:
+                               plain_text = FALSE;
+                               break;
+                       case TARGET_TEXT_PLAIN:
+                       default:
+                               plain_text = TRUE;
+                               break;
+                       }
+               list = g_list_append(NULL, (gchar *)path);
+               text = uri_text_from_list(list, &len, plain_text);
+               g_list_free(list);
+
+               gtk_selection_data_set(selection_data, selection_data->target,
+                                      8, text, len);
+               g_free(text);
+               }
+}
+
+static void info_window_dnd_init(InfoData *id)
+{
+       ImageWindow *imd;
+
+       imd = id->image;
+
+       gtk_drag_source_set(imd->image, GDK_BUTTON2_MASK,
+                           dnd_file_drag_types, dnd_file_drag_types_count,
+                           GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+       g_signal_connect(G_OBJECT(imd->image), "drag_data_get",
+                        G_CALLBACK(info_window_dnd_data_set), id);
+
+#if 0
+       gtk_drag_dest_set(imd->image,
+                         GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
+                         dnd_file_drop_types, dnd_file_drop_types_count,
+                         GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+       g_signal_connect(G_OBJECT(imd->image), "drag_data_received",
+                        G_CALLBACK(info_window_dnd_data_get), id);
+#endif
+}
+
+/*
+ *-------------------------------------------------------------------
+ * base window
+ *-------------------------------------------------------------------
+ */
+
+static gint info_window_last_width = DEF_PROPERTY_WIDTH;
+static gint info_window_last_height = DEF_PROPERTY_HEIGHT;
+
+static void info_window_image_update_cb(ImageWindow *imd, gpointer data)
+{
+       InfoData *id = data;
+
+       /* only do this once after when loading a new image,
+        * for tabs that depend on image data (exif)
+        * Subsequent updates are ignored, as the image
+        * should not really changed if id->updated is TRUE.
+        */
+
+       if (id->updated) return;
+       if (imd->unknown) return;
+
+       info_tabs_sync(id, TRUE);
+       id->updated = TRUE;
+}
+
+static void info_window_back_cb(GtkWidget *widget, gpointer data)
+{
+       InfoData *id = data;
+       GList *work;
+
+       work = g_list_find(id->list, (gpointer)id->path);
+       if (!work || !work->prev) return;
+
+       work = work->prev;
+       id->path = work->data;
+
+       info_window_sync(id, id->path);
+
+       gtk_widget_set_sensitive(id->button_back, (work->prev != NULL));
+       gtk_widget_set_sensitive(id->button_next, TRUE);
+}
+
+static void info_window_next_cb(GtkWidget *widget, gpointer data)
+{
+       InfoData *id = data;
+       GList *work;
+
+       work = g_list_find(id->list, (gpointer)id->path);
+       if (!work || !work->next) return;
+
+       work = work->next;
+       id->path = work->data;
+
+       info_window_sync(id, id->path);
+
+       gtk_widget_set_sensitive(id->button_next, (work->next != NULL));
+       gtk_widget_set_sensitive(id->button_back, TRUE);
+}
+
+static void info_window_image_button_cb(ImageWindow *imd, gint button, guint32 time,
+                                       gdouble x, gdouble y, guint state, gpointer data)
+{
+       if (button == 1)
+               {
+               info_window_next_cb(NULL, data);
+               }
+       else if (button == 2 || button == 3)
+               {
+               info_window_back_cb(NULL, data);
+               }
+}
+
+static void info_window_image_scroll_cb(ImageWindow *imd, GdkScrollDirection direction, guint32 time,
+                                       gdouble x, gdouble y, guint state, gpointer data)
+{
+       if (direction == GDK_SCROLL_UP)
+               {
+               info_window_back_cb(NULL, data);
+               }
+       else if (direction == GDK_SCROLL_DOWN)
+               {
+               info_window_next_cb(NULL, data);
+               }
+}
+
+static void info_window_close(InfoData *id)
+{
+       gdk_drawable_get_size(id->window->window, &info_window_last_width, &info_window_last_height);
+       info_window_last_width = MAX(info_window_last_width, DEF_PROPERTY_WIDTH);
+       info_window_last_height = MAX(info_window_last_height, DEF_PROPERTY_HEIGHT);
+
+       gtk_widget_destroy(id->window);
+}
+
+static void info_window_close_cb(GtkWidget *widget, gpointer data)
+{
+       InfoData *id = data;
+
+       info_window_close(id);
+}
+
+static gint info_window_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
+{
+       InfoData *id = data;
+
+       info_window_close(id);
+       return TRUE;
+}
+
+static void info_window_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       InfoData *id = data;
+
+       info_tabs_free(id);
+       path_list_free(id->list);
+       g_free(id);
+}
+
+void info_window_new(const gchar *path, GList *list)
+{
+       InfoData *id;
+       GtkWidget *main_vbox;
+       GtkWidget *paned;
+       GtkWidget *hbox;
+       GtkWidget *button;
+       GtkWidget *label;
+       GdkGeometry geometry;
+
+       if (!path && !list) return;
+
+       if (!list)
+               {
+               list = g_list_append(NULL, g_strdup(path));
+               }
+
+       id = g_new0(InfoData, 1);
+
+       id->list = list;
+       id->path = (gchar *)id->list->data;
+       id->updated = FALSE;
+
+       id->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+       gtk_window_set_type_hint(GTK_WINDOW(id->window), GDK_WINDOW_TYPE_HINT_DIALOG);
+       window_set_icon(id->window, NULL, NULL);
+
+       gtk_window_set_resizable(GTK_WINDOW(id->window), TRUE);
+       gtk_window_set_title(GTK_WINDOW(id->window), _("Image properties - GQview"));
+       gtk_window_set_wmclass(GTK_WINDOW(id->window), "properties", "GQview");
+
+       geometry.min_width = 32;
+       geometry.min_height = 32;
+       geometry.base_width = DEF_PROPERTY_WIDTH;
+       geometry.base_height = DEF_PROPERTY_HEIGHT;
+       gtk_window_set_geometry_hints(GTK_WINDOW(id->window), NULL, &geometry,
+                                     GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE);
+
+
+       gtk_window_set_default_size(GTK_WINDOW(id->window), info_window_last_width, info_window_last_height);
+       gtk_container_set_border_width(GTK_CONTAINER(id->window), PREF_PAD_BORDER);
+
+       g_signal_connect(G_OBJECT(id->window), "delete_event",
+                        G_CALLBACK(info_window_delete_cb), id);
+       g_signal_connect(G_OBJECT(id->window), "destroy",
+                        G_CALLBACK(info_window_destroy_cb), id);
+
+       paned = gtk_hpaned_new();
+       gtk_container_add(GTK_CONTAINER(id->window), paned);
+       gtk_widget_show(paned);
+
+       id->image = image_new(FALSE);
+       image_set_update_func(id->image, info_window_image_update_cb, id);
+
+       image_set_button_func(id->image, info_window_image_button_cb, id);
+       image_set_scroll_func(id->image, info_window_image_scroll_cb, id);
+
+       gtk_widget_set_size_request(id->image->widget, IMAGE_SIZE_W, IMAGE_SIZE_H);
+       gtk_paned_pack1(GTK_PANED(paned), id->image->widget, FALSE, TRUE);
+       gtk_widget_show(id->image->widget);
+
+       main_vbox = gtk_vbox_new(FALSE, 0);
+       gtk_paned_pack2(GTK_PANED(paned), main_vbox, TRUE, TRUE);
+       gtk_widget_show(main_vbox);
+
+       hbox = pref_box_new(main_vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+       label = pref_label_new(hbox, _("Filename:"));
+       pref_label_bold(label, TRUE, FALSE);
+
+       id->name_entry = gtk_entry_new();
+       gtk_editable_set_editable(GTK_EDITABLE(id->name_entry), FALSE);
+       gtk_box_pack_start(GTK_BOX(hbox), id->name_entry, TRUE, TRUE, 0);
+       gtk_widget_show(id->name_entry);
+
+       id->notebook = gtk_notebook_new();
+       gtk_notebook_set_tab_pos(GTK_NOTEBOOK(id->notebook), GTK_POS_TOP);
+       gtk_box_pack_start(GTK_BOX(main_vbox), id->notebook, TRUE, TRUE, 5);
+       gtk_widget_show(id->notebook);
+
+       pref_spacer(main_vbox, PREF_PAD_GAP);
+
+       hbox = pref_box_new(main_vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+
+       id->button_back = pref_button_new(hbox, GTK_STOCK_GO_BACK, NULL, TRUE,
+                                         G_CALLBACK(info_window_back_cb), id);
+       gtk_widget_set_sensitive(id->button_back, FALSE);
+
+       id->button_next = pref_button_new(hbox, GTK_STOCK_GO_FORWARD, NULL, TRUE,
+                                         G_CALLBACK(info_window_next_cb), id);
+       gtk_widget_set_sensitive(id->button_next, (id->list->next != NULL));
+
+       if (id->list->next)
+               {
+               id->label_count = pref_label_new(hbox, "");
+               }
+
+       button = pref_button_new(NULL, GTK_STOCK_CLOSE, NULL, FALSE,
+                                G_CALLBACK(info_window_close_cb), id);
+       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       /* set up tabs */
+
+       info_tabs_init(id);
+
+       /* fill it */
+
+       info_window_sync(id, id->path);
+
+       /* finish */
+
+       info_window_dnd_init(id);
+
+       gtk_widget_show(id->window);
+}
+
diff --git a/src/info.h b/src/info.h
new file mode 100644 (file)
index 0000000..b1aef11
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef INFO_H
+#define INFO_H
+
+
+typedef struct _InfoData InfoData;
+struct _InfoData
+{
+       GtkWidget *window;
+       ImageWindow *image;
+
+       GList *list;
+
+       const gchar *path;
+
+       GtkWidget *notebook;
+       GtkWidget *name_entry;
+
+       GtkWidget *button_next;
+       GtkWidget *button_back;
+       GtkWidget *label_count;
+
+       GList *tab_list;
+
+       gint updated;
+};
+
+
+void info_window_new(const gchar *path, GList *list);
+
+GtkWidget *table_add_line(GtkWidget *table, gint x, gint y,
+                         const gchar *description, const gchar *text);
+
+
+#endif
+
+
index 0f172d7..ca3882f 100644 (file)
@@ -17,6 +17,7 @@
 #  define dgettext(Domain,String) (String)
 #  define dcgettext(Domain,String,Type) (String)
 #  define bindtextdomain(Domain,Directory) (Domain) 
+#  define bind_textdomain_codeset(Domain,String) (Domain)
 #endif /* ENABLE_NLS */
 
-#endif /* __INTL_H__ */
+#endif
diff --git a/src/layout.c b/src/layout.c
new file mode 100644 (file)
index 0000000..5027cb8
--- /dev/null
@@ -0,0 +1,1835 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#include "gqview.h"
+#include "layout.h"
+
+#include "image.h"
+#include "layout_config.h"
+#include "layout_image.h"
+#include "layout_util.h"
+#include "menu.h"
+#include "pixbuf_util.h"
+#include "view_dir_list.h"
+#include "view_dir_tree.h"
+#include "view_file_list.h"
+#include "view_file_icon.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_misc.h"
+#include "ui_tabcomp.h"
+
+#include "icons/tools.xpm"
+
+#define MAINWINDOW_DEF_WIDTH 620
+#define MAINWINDOW_DEF_HEIGHT 400
+
+#define MAIN_WINDOW_DIV_HPOS -1
+#define MAIN_WINDOW_DIV_VPOS 200
+
+#define TOOLWINDOW_DEF_WIDTH 260
+#define TOOLWINDOW_DEF_HEIGHT 450
+#define PROGRESS_WIDTH 150
+#define ZOOM_LABEL_WIDTH 64
+
+#define PANE_DIVIDER_SIZE 10
+
+
+GList *layout_window_list = NULL;
+
+
+static void layout_list_scroll_to_subpart(LayoutWindow *lw, const gchar *needle);
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * misc
+ *-----------------------------------------------------------------------------
+ */
+
+gint layout_valid(LayoutWindow **lw)
+{
+       if (*lw == NULL)
+               {
+               if (layout_window_list) *lw = layout_window_list->data;
+               return (*lw != NULL);
+               }
+
+       return (g_list_find(layout_window_list, *lw) != NULL);
+}
+
+LayoutWindow *layout_find_by_image(ImageWindow *imd)
+{
+       GList *work;
+
+       work = layout_window_list;
+       while (work)
+               {
+               LayoutWindow *lw = work->data;
+               work = work->next;
+
+               if (lw->image == imd) return lw;
+               }
+
+       return NULL;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * menu, toolbar, and dir view
+ *-----------------------------------------------------------------------------
+ */
+
+static void layout_path_entry_changed_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+       gchar *buf;
+
+       if (gtk_combo_box_get_active(GTK_COMBO_BOX(widget)) < 0) return;
+
+       buf = g_strdup(gtk_entry_get_text(GTK_ENTRY(lw->path_entry)));
+       if (!buf || (lw->path && strcmp(buf, lw->path) == 0))
+               {
+               g_free(buf);
+               return;
+               }
+
+       layout_set_path(lw, buf);
+
+        g_free(buf);
+}
+
+static void layout_path_entry_tab_cb(const gchar *path, gpointer data)
+{
+       LayoutWindow *lw = data;
+       gchar *buf;
+       gchar *base;
+
+       buf = g_strdup(path);
+       parse_out_relatives(buf);
+       base = remove_level_from_path(buf);
+
+       if (isdir(buf))
+               {
+               if ((!lw->path || strcmp(lw->path, buf) != 0) && layout_set_path(lw, buf))
+                       {
+                       gint pos = -1;
+                       /* put the '/' back, if we are in tab completion for a dir and result was path change */
+                       gtk_editable_insert_text(GTK_EDITABLE(lw->path_entry), "/", -1, &pos);
+                       gtk_editable_set_position(GTK_EDITABLE(lw->path_entry),
+                                                 strlen(gtk_entry_get_text(GTK_ENTRY(lw->path_entry))));
+                       }
+               }
+       else if (lw->path && strcmp(lw->path, base) == 0)
+               {
+               layout_list_scroll_to_subpart(lw, filename_from_path(buf));
+               }
+
+       g_free(base);
+       g_free(buf);
+}
+
+static void layout_path_entry_cb(const gchar *path, gpointer data)
+{
+       LayoutWindow *lw = data;
+       gchar *buf;
+
+       buf = g_strdup(path);
+       parse_out_relatives(buf);
+
+       layout_set_path(lw, buf);
+
+       g_free(buf);
+}
+
+static void layout_vdlist_select_cb(ViewDirList *vdl, const gchar *path, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_set_path(lw, path);
+}
+
+static void layout_vdtree_select_cb(ViewDirTree *vdt, const gchar *path, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_set_path(lw, path);
+}
+
+static GtkWidget *layout_tool_setup(LayoutWindow *lw)
+{
+       GtkWidget *box;
+       GtkWidget *menu_bar;
+       GtkWidget *tabcomp;
+#if 0
+       GtkWidget *popwin;
+#endif
+
+       box = gtk_vbox_new(FALSE, 0);
+
+       menu_bar = layout_actions_menu_bar(lw);
+       gtk_box_pack_start(GTK_BOX(box), menu_bar, FALSE, FALSE, 0);
+       gtk_widget_show(menu_bar);
+
+       lw->toolbar = layout_button_bar(lw);
+       gtk_box_pack_start(GTK_BOX(box), lw->toolbar, FALSE, FALSE, 0);
+       if (!lw->toolbar_hidden) gtk_widget_show(lw->toolbar);
+
+       tabcomp = tab_completion_new_with_history(&lw->path_entry, NULL, "path_list", -1,
+                                                 layout_path_entry_cb, lw);
+       tab_completion_add_tab_func(lw->path_entry, layout_path_entry_tab_cb, lw);
+       gtk_box_pack_start(GTK_BOX(box), tabcomp, FALSE, FALSE, 0);
+       gtk_widget_show(tabcomp);
+
+#if 0
+       popwin = gtk_widget_get_toplevel(GTK_COMBO(tabcomp)->list);
+#endif
+       g_signal_connect(G_OBJECT(lw->path_entry->parent), "changed",
+                        G_CALLBACK(layout_path_entry_changed_cb), lw);
+
+       if (lw->tree_view)
+               {
+               lw->vdt = vdtree_new(lw->path, TRUE);
+               vdtree_set_layout(lw->vdt, lw);
+               vdtree_set_select_func(lw->vdt, layout_vdtree_select_cb, lw);
+
+               lw->dir_view = lw->vdt->widget;
+               }
+       else
+               {
+               lw->vdl = vdlist_new(lw->path);
+               vdlist_set_layout(lw->vdl, lw);
+               vdlist_set_select_func(lw->vdl, layout_vdlist_select_cb, lw);
+
+               lw->dir_view = lw->vdl->widget;
+               }
+
+       gtk_box_pack_start(GTK_BOX(box), lw->dir_view, TRUE, TRUE, 0);
+       gtk_widget_show(lw->dir_view);
+
+       gtk_widget_show(box);
+
+       return box;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * sort button (and menu)
+ *-----------------------------------------------------------------------------
+ */
+
+static void layout_sort_menu_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw;
+       SortType type;
+
+       lw = submenu_item_get_data(widget);
+       if (!lw) return;
+
+       type = (SortType)GPOINTER_TO_INT(data);
+
+       layout_sort_set(lw, type, lw->sort_ascend);
+}
+
+static void layout_sort_menu_ascend_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_sort_set(lw, lw->sort_method, !lw->sort_ascend);
+}
+
+static void layout_sort_menu_hide_cb(GtkWidget *widget, gpointer data)
+{
+       /* destroy the menu */
+       gtk_widget_unref(GTK_WIDGET(widget));
+}
+
+static void layout_sort_button_press_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+       GtkWidget *menu;
+       GdkEvent *event;
+       guint32 etime;
+
+       menu = submenu_add_sort(NULL, G_CALLBACK(layout_sort_menu_cb), lw, FALSE, FALSE, TRUE, lw->sort_method);
+
+       /* apparently the menu is never sunk, even on a popup */
+       g_object_ref(G_OBJECT(menu));
+       gtk_object_sink(GTK_OBJECT(menu));
+
+        /* ascending option */
+       menu_item_add_divider(menu);
+       menu_item_add_check(menu, _("Ascending"), lw->sort_ascend, G_CALLBACK(layout_sort_menu_ascend_cb), lw);
+
+       g_signal_connect(G_OBJECT(menu), "selection_done",
+                        G_CALLBACK(layout_sort_menu_hide_cb), NULL);
+
+       event = gtk_get_current_event();
+       if (event)
+               {
+               etime = gdk_event_get_time(event);
+               gdk_event_free(event);
+               }
+       else
+               {
+               etime = 0;
+               }
+
+       gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, etime);
+}
+
+static GtkWidget *layout_sort_button(LayoutWindow *lw)
+{
+       GtkWidget *button;
+
+       button = gtk_button_new_with_label(sort_type_get_text(lw->sort_method));
+        g_signal_connect(G_OBJECT(button), "clicked",
+                        G_CALLBACK(layout_sort_button_press_cb), lw);
+        gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
+
+        return button;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * status bar
+ *-----------------------------------------------------------------------------
+ */
+
+void layout_status_update_progress(LayoutWindow *lw, gdouble val, const gchar *text)
+{
+       if (!layout_valid(&lw)) return;
+       if (!lw->info_progress_bar) return;
+
+       gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(lw->info_progress_bar), val);
+       gtk_progress_bar_set_text(GTK_PROGRESS_BAR(lw->info_progress_bar), (text) ? text : " ");
+}
+
+void layout_status_update_info(LayoutWindow *lw, const gchar *text)
+{
+       gchar *buf = NULL;
+
+       if (!layout_valid(&lw)) return;
+
+       if (!text)
+               {
+               gint n;
+               gint64 n_bytes = 0;
+               gint s;
+               gint64 s_bytes = 0;
+               const gchar *ss;
+               gchar *b;
+               gchar *sb;
+
+               if (layout_image_slideshow_active(lw))
+                       {
+                       if (!layout_image_slideshow_paused(lw))
+                               {
+                               ss = _(" Slideshow");
+                               }
+                       else
+                               {
+                               ss = _(" Paused");
+                               }
+                       }
+               else
+                       {
+                       ss = "";
+                       }
+
+               n = layout_list_count(lw, &n_bytes);
+               s = layout_selection_count(lw, &s_bytes);
+
+               layout_bars_new_selection(lw, s);
+
+               if (s > 0)
+                       {
+                       b = text_from_size_abrev(n_bytes);
+                       sb = text_from_size_abrev(s_bytes);
+                       buf = g_strdup_printf(_("%s, %d files (%s, %d)%s"), b, n, sb, s, ss);
+                       g_free(b);
+                       g_free(sb);
+                       }
+               else if (n > 0)
+                       {
+                       b = text_from_size_abrev(n_bytes);
+                       buf = g_strdup_printf(_("%s, %d files%s"), b, n, ss);
+                       g_free(b);
+                       }
+               else
+                       {
+                       buf = g_strdup_printf(_("%d files%s"), n, ss);
+                       }
+
+               text = buf;
+
+               layout_image_overlay_update(lw);
+               }
+
+       gtk_label_set_text(GTK_LABEL(lw->info_status), text);
+       g_free(buf);
+}
+
+void layout_status_update_image(LayoutWindow *lw)
+{
+       gchar *text;
+       gchar *b;
+
+       if (!layout_valid(&lw) || !lw->image) return;
+
+       text = image_zoom_get_as_text(lw->image);
+       gtk_label_set_text(GTK_LABEL(lw->info_zoom), text);
+       g_free(text);
+
+       b = text_from_size(lw->image->size);
+
+       if (lw->image->unknown)
+               {
+               if (image_get_path(lw->image) && !access_file(image_get_path(lw->image), R_OK))
+                       {
+                       text = g_strdup_printf(_("(no read permission) %s bytes"), b);
+                       }
+               else
+                       {
+                       text = g_strdup_printf(_("( ? x ? ) %s bytes"), b);
+                       }
+               }
+       else
+               {
+               text = g_strdup_printf(_("( %d x %d ) %s bytes"),
+                                      lw->image->image_width, lw->image->image_height, b);
+               }
+
+       gtk_label_set_text(GTK_LABEL(lw->info_details), text);
+
+       g_free(b);
+       g_free(text);
+}
+
+void layout_status_update_all(LayoutWindow *lw)
+{
+       layout_status_update_progress(lw, 0.0, NULL);
+       layout_status_update_info(lw, NULL);
+       layout_status_update_image(lw);
+}
+
+static GtkWidget *layout_status_label(gchar *text, GtkWidget *box, gint start, gint size, gint expand)
+{
+       GtkWidget *label;
+       GtkWidget *frame;
+
+       frame = gtk_frame_new(NULL);
+       if (size) gtk_widget_set_size_request(frame, size, -1);
+       gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
+       if (start)
+               {
+               gtk_box_pack_start(GTK_BOX(box), frame, expand, expand, 0);
+               }
+       else
+               {
+               gtk_box_pack_end(GTK_BOX(box), frame, expand, expand, 0);
+               }
+       gtk_widget_show(frame);
+
+       label = gtk_label_new(text ? text : "");
+       gtk_container_add(GTK_CONTAINER(frame), label);
+       gtk_widget_show(label);
+
+       return label;
+}
+
+static void layout_status_setup(LayoutWindow *lw, GtkWidget *box, gint small_format)
+{
+       GtkWidget *hbox;
+
+       if (lw->info_box) return;
+
+       if (small_format)
+               {
+               lw->info_box = gtk_vbox_new(FALSE, 0);
+               }
+       else
+               {
+               lw->info_box = gtk_hbox_new(FALSE, 0);
+               }
+       gtk_box_pack_end(GTK_BOX(box), lw->info_box, FALSE, FALSE, 0);
+       gtk_widget_show(lw->info_box);
+
+       if (small_format)
+               {
+               hbox = gtk_hbox_new(FALSE, 0);
+               gtk_box_pack_start(GTK_BOX(lw->info_box), hbox, FALSE, FALSE, 0);
+               gtk_widget_show(hbox);
+               }
+       else
+               {
+               hbox = lw->info_box;
+               }
+       lw->info_progress_bar = gtk_progress_bar_new();
+       gtk_widget_set_size_request(lw->info_progress_bar, PROGRESS_WIDTH, -1);
+       gtk_box_pack_start(GTK_BOX(hbox), lw->info_progress_bar, FALSE, FALSE, 0);
+       gtk_widget_show(lw->info_progress_bar);
+
+       lw->info_sort = layout_sort_button(lw);
+       gtk_box_pack_start(GTK_BOX(hbox), lw->info_sort, FALSE, FALSE, 0);
+       gtk_widget_show(lw->info_sort);
+
+       lw->info_status = layout_status_label(NULL, lw->info_box, TRUE, 0, (!small_format));
+
+       if (small_format)
+               {
+               hbox = gtk_hbox_new(FALSE, 0);
+               gtk_box_pack_start(GTK_BOX(lw->info_box), hbox, FALSE, FALSE, 0);
+               gtk_widget_show(hbox);
+               }
+       else
+               {
+               hbox = lw->info_box;
+               }
+       lw->info_details = layout_status_label(NULL, hbox, TRUE, 0, TRUE);
+       lw->info_zoom = layout_status_label(NULL, hbox, FALSE, ZOOM_LABEL_WIDTH, FALSE);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * views
+ *-----------------------------------------------------------------------------
+ */
+
+static GtkWidget *layout_tools_new(LayoutWindow *lw)
+{
+       lw->dir_view = layout_tool_setup(lw);
+       return lw->dir_view;
+}
+
+static void layout_list_status_cb(ViewFileList *vfl, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_status_update_info(lw, NULL);
+}
+
+static void layout_list_thumb_cb(ViewFileList *vfl, gdouble val, const gchar *text, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_status_update_progress(lw, val, text);
+}
+
+static void layout_icon_status_cb(ViewFileIcon *vfi, gpointer data)
+{
+        LayoutWindow *lw = data;
+
+        layout_status_update_info(lw, NULL);
+}
+
+static void layout_icon_thumb_cb(ViewFileIcon *vfi, gdouble val, const gchar *text, gpointer data)
+{
+        LayoutWindow *lw = data;
+
+        layout_status_update_progress(lw, val, text);
+}
+
+static GtkWidget *layout_list_new(LayoutWindow *lw)
+{
+       if (lw->icon_view)
+               {
+               lw->vfi = vficon_new(NULL);
+               vficon_set_layout(lw->vfi, lw);
+
+               vficon_set_status_func(lw->vfi, layout_icon_status_cb, lw);
+               vficon_set_thumb_status_func(lw->vfi, layout_icon_thumb_cb, lw);
+
+               return lw->vfi->widget;
+               }
+
+       lw->vfl = vflist_new(NULL, lw->thumbs_enabled);
+       vflist_set_layout(lw->vfl, lw);
+
+       vflist_set_status_func(lw->vfl, layout_list_status_cb, lw);
+       vflist_set_thumb_status_func(lw->vfl, layout_list_thumb_cb, lw);
+
+       return lw->vfl->widget;
+}
+
+static void layout_list_sync_thumb(LayoutWindow *lw)
+{
+       if (lw->vfl) vflist_thumb_set(lw->vfl, lw->thumbs_enabled);
+}
+
+static void layout_list_scroll_to_subpart(LayoutWindow *lw, const gchar *needle)
+{
+       if (!lw) return;
+#if 0
+       if (lw->vfl) vflist_scroll_to_subpart(lw->vfl, needle);
+       if (lw->vfi) vficon_scroll_to_subpart(lw->vfi, needle);
+#endif
+}
+
+GList *layout_list(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return NULL;
+
+       if (lw->vfl) return vflist_get_list(lw->vfl);
+       if (lw->vfi) return vficon_get_list(lw->vfi);
+
+       return NULL;
+}
+
+gint layout_list_count(LayoutWindow *lw, gint64 *bytes)
+{
+       if (!layout_valid(&lw)) return 0;
+
+       if (lw->vfl) return vflist_count(lw->vfl, bytes);
+       if (lw->vfi) return vficon_count(lw->vfi, bytes);
+
+       return 0;
+}
+
+const gchar *layout_list_get_path(LayoutWindow *lw, gint index)
+{
+       if (!layout_valid(&lw)) return NULL;
+
+       if (lw->vfl) return vflist_index_get_path(lw->vfl, index);
+       if (lw->vfi) return vficon_index_get_path(lw->vfi, index);
+
+       return NULL;
+}
+
+gint layout_list_get_index(LayoutWindow *lw, const gchar *path)
+{
+       if (!layout_valid(&lw)) return -1;
+
+       if (lw->vfl) return vflist_index_by_path(lw->vfl, path);
+       if (lw->vfi) return vficon_index_by_path(lw->vfi, path);
+
+       return -1;
+}
+
+void layout_list_sync_path(LayoutWindow *lw, const gchar *path)
+{
+       if (!layout_valid(&lw)) return;
+
+       if (lw->vfl) vflist_select_by_path(lw->vfl, path);
+       if (lw->vfi) vficon_select_by_path(lw->vfi, path);
+}
+
+static void layout_list_sync_sort(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return;
+
+       if (lw->vfl) vflist_sort_set(lw->vfl, lw->sort_method, lw->sort_ascend);
+       if (lw->vfi) vficon_sort_set(lw->vfi, lw->sort_method, lw->sort_ascend);
+}
+
+GList *layout_selection_list(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return NULL;
+
+       if (layout_image_get_collection(lw, NULL))
+               {
+               const gchar *path;
+
+               path = layout_image_get_path(lw);
+               if (path) return g_list_append(NULL, g_strdup(path));
+               return NULL;
+               }
+
+       if (lw->vfl) return vflist_selection_get_list(lw->vfl);
+       if (lw->vfi) return vficon_selection_get_list(lw->vfi);
+
+       return NULL;
+}
+
+GList *layout_selection_list_by_index(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return NULL;
+
+       if (lw->vfl) return vflist_selection_get_list_by_index(lw->vfl);
+       if (lw->vfi) return vficon_selection_get_list_by_index(lw->vfi);
+
+       return NULL;
+}
+
+gint layout_selection_count(LayoutWindow *lw, gint64 *bytes)
+{
+       if (!layout_valid(&lw)) return 0;
+
+       if (lw->vfl) return vflist_selection_count(lw->vfl, bytes);
+       if (lw->vfi) return vficon_selection_count(lw->vfi, bytes);
+
+       return 0;
+}
+
+void layout_select_all(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return;
+
+       if (lw->vfl) vflist_select_all(lw->vfl);
+       if (lw->vfi) vficon_select_all(lw->vfi);
+}
+
+void layout_select_none(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return;
+
+       if (lw->vfl) vflist_select_none(lw->vfl);
+       if (lw->vfi) vficon_select_none(lw->vfi);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * access
+ *-----------------------------------------------------------------------------
+ */
+
+const gchar *layout_get_path(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return NULL;
+       return lw->path;
+}
+
+static void layout_sync_path(LayoutWindow *lw)
+{
+       if (!lw->path) return;
+
+       lw->last_time = filetime(lw->path);
+
+       gtk_entry_set_text(GTK_ENTRY(lw->path_entry), lw->path);
+       if (lw->vdl) vdlist_set_path(lw->vdl, lw->path);
+       if (lw->vdt) vdtree_set_path(lw->vdt, lw->path);
+
+       if (lw->vfl) vflist_set_path(lw->vfl, lw->path);
+       if (lw->vfi) vficon_set_path(lw->vfi, lw->path);
+}
+
+gint layout_set_path(LayoutWindow *lw, const gchar *path)
+{
+       gint have_file = FALSE;
+
+       if (!layout_valid(&lw)) return FALSE;
+
+       if (!path || !isname(path)) return FALSE;
+       if (lw->path && path && strcmp(path, lw->path) == 0)
+               {
+               return TRUE;
+               }
+
+       if (isdir(path))
+               {
+               g_free(lw->path);
+               lw->path = g_strdup(path);
+               }
+       else
+               {
+               gchar *base;
+
+               base = remove_level_from_path(path);
+               if (lw->path && strcmp(lw->path, base) == 0)
+                       {
+                       g_free(base);
+                       }
+               else if (isdir(base))
+                       {
+                       g_free(lw->path);
+                       lw->path = base;
+                       }
+               else
+                       {
+                       g_free(base);
+                       return FALSE;
+                       }
+               if (isfile(path)) have_file = TRUE;
+               }
+
+       if (lw->path_entry) tab_completion_append_to_history(lw->path_entry, lw->path);
+       layout_sync_path(lw);
+
+       if (have_file)
+               {
+               gint row;
+
+               row = layout_list_get_index(lw, path);
+               if (row >= 0)
+                       {
+                       layout_image_set_index(lw, row);
+                       }
+               else
+                       {
+                       layout_image_set_path(lw, path);
+                       }
+               }
+       else if (!lazy_image_sync)
+               {
+               layout_image_set_index(lw, 0);
+               }
+
+       return TRUE;
+}
+
+static void layout_refresh_lists(LayoutWindow *lw)
+{
+       if (lw->path) lw->last_time = filetime(lw->path);
+
+       if (lw->vdl) vdlist_refresh(lw->vdl);
+       if (lw->vdt) vdtree_refresh(lw->vdt);
+
+       if (lw->vfl) vflist_refresh(lw->vfl);
+       if (lw->vfi) vficon_refresh(lw->vfi);
+}
+
+static void layout_refresh_by_time(LayoutWindow *lw)
+{
+       layout_refresh_lists(lw);
+
+       if (lw->image && filetime(layout_image_get_path(lw)) >= lw->last_time)
+               {
+               layout_image_refresh(lw);
+               }
+}
+
+void layout_refresh(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return;
+
+       if (debug) printf("layout refresh\n");
+
+       layout_refresh_lists(lw);
+
+       if (lw->image) layout_image_refresh(lw);
+}
+
+static gint layout_check_for_update_cb(gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       if (!update_on_time_change) return TRUE;
+
+       if (lw->path)
+               {
+               time_t new_time;
+
+               new_time = filetime(lw->path);
+
+               if (new_time > 0 && new_time > lw->last_time)
+                       {
+                       if (debug) printf("layout path time changed, refreshing...\n");
+                       layout_refresh_by_time(lw);
+                       }
+               }
+
+       return TRUE;
+}
+
+void layout_thumb_set(LayoutWindow *lw, gint enable)
+{
+       if (!layout_valid(&lw)) return;
+
+       if (lw->thumbs_enabled == enable) return;
+
+       lw->thumbs_enabled = enable;
+
+       layout_util_sync_thumb(lw);
+       layout_list_sync_thumb(lw);
+}
+
+gint layout_thumb_get(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return FALSE;
+
+       return lw->thumbs_enabled;
+}
+
+void layout_sort_set(LayoutWindow *lw, SortType type, gint ascend)
+{
+       if (!layout_valid(&lw)) return;
+       if (lw->sort_method == type && lw->sort_ascend == ascend) return;
+
+       lw->sort_method = type;
+       lw->sort_ascend = ascend;
+
+       if (lw->info_sort) gtk_label_set_text(GTK_LABEL(GTK_BIN(lw->info_sort)->child),
+                                             sort_type_get_text(type));
+       layout_list_sync_sort(lw);
+}
+
+gint layout_sort_get(LayoutWindow *lw, SortType *type, gint *ascend)
+{
+       if (!layout_valid(&lw)) return FALSE;
+
+       if (type) *type = lw->sort_method;
+       if (ascend) *ascend = lw->sort_ascend;
+
+       return TRUE;
+}
+
+gint layout_geometry_get(LayoutWindow *lw, gint *x, gint *y, gint *w, gint *h)
+{
+       if (!layout_valid(&lw)) return FALSE;
+
+       gdk_window_get_root_origin(lw->window->window, x, y);
+       gdk_drawable_get_size(lw->window->window, w, h);
+
+       return TRUE;
+}
+
+gint layout_geometry_get_dividers(LayoutWindow *lw, gint *h, gint *v)
+{
+       if (!layout_valid(&lw)) return FALSE;
+
+       if (lw->h_pane && GTK_PANED(lw->h_pane)->child1->allocation.x >= 0)
+               {
+               *h = GTK_PANED(lw->h_pane)->child1->allocation.width;
+               }
+       else if (h != &lw->div_h)
+               {
+               *h = lw->div_h;
+               }
+
+       if (lw->v_pane && GTK_PANED(lw->v_pane)->child1->allocation.x >= 0)
+               {
+               *v = GTK_PANED(lw->v_pane)->child1->allocation.height;
+               }
+       else if (v != &lw->div_v)
+               {
+               *v = lw->div_v;
+               }
+
+       return TRUE;
+}
+
+void layout_views_set(LayoutWindow *lw, gint tree, gint icons)
+{
+       if (!layout_valid(&lw)) return;
+
+       if (lw->tree_view == tree && lw->icon_view == icons) return;
+
+       lw->tree_view = tree;
+       lw->icon_view = icons;
+
+       layout_style_set(lw, -1, NULL);
+}
+
+gint layout_views_get(LayoutWindow *lw, gint *tree, gint *icons)
+{
+       if (!layout_valid(&lw)) return FALSE;
+
+       *tree = lw->tree_view;
+       *icons = lw->icon_view;
+
+       return TRUE;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * location utils
+ *-----------------------------------------------------------------------------
+ */
+
+static gint layout_location_single(LayoutLocation l)
+{
+       return (l == LAYOUT_LEFT ||
+               l == LAYOUT_RIGHT ||
+               l == LAYOUT_TOP ||
+               l == LAYOUT_BOTTOM);
+}
+
+static gint layout_location_vertical(LayoutLocation l)
+{
+       return (l & LAYOUT_TOP ||
+               l & LAYOUT_BOTTOM);
+}
+
+static gint layout_location_first(LayoutLocation l)
+{
+       return (l & LAYOUT_TOP ||
+               l & LAYOUT_LEFT);
+}
+
+static LayoutLocation layout_grid_compass(LayoutWindow *lw)
+{
+       if (layout_location_single(lw->dir_location)) return lw->dir_location;
+       if (layout_location_single(lw->file_location)) return lw->file_location;
+       return lw->image_location;
+}
+
+static void layout_location_compute(LayoutLocation l1, LayoutLocation l2,
+                                   GtkWidget *s1, GtkWidget *s2,
+                                   GtkWidget **d1, GtkWidget **d2)
+{
+       LayoutLocation l;
+
+       l = l1 & l2;    /* get common compass direction */
+       l = l1 - l;     /* remove it */
+
+       if (layout_location_first(l))
+               {
+               *d1 = s1;
+               *d2 = s2;
+               }
+       else
+               {
+               *d1 = s2;
+               *d2 = s1;
+               }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * tools window (for floating/hidden)
+ *-----------------------------------------------------------------------------
+ */
+
+gint layout_geometry_get_tools(LayoutWindow *lw, gint *x, gint *y, gint *w, gint *h, gint *divider_pos)
+{
+       if (!layout_valid(&lw)) return FALSE;
+
+       if (!lw->tools || !GTK_WIDGET_VISIBLE(lw->tools))
+               {
+               /* use the stored values (sort of breaks success return value) */
+
+               *divider_pos = lw->div_float;
+
+               return FALSE;
+               }
+
+       gdk_window_get_root_origin(lw->tools->window, x, y);
+       gdk_drawable_get_size(lw->tools->window, w, h);
+
+       if (GTK_IS_VPANED(lw->tools_pane))
+               {
+               *divider_pos = GTK_PANED(lw->tools_pane)->child1->allocation.height;
+               }
+       else
+               {
+               *divider_pos = GTK_PANED(lw->tools_pane)->child1->allocation.width;
+               }
+
+       return TRUE;
+}
+
+static void layout_tools_geometry_sync(LayoutWindow *lw)
+{
+       layout_geometry_get_tools(lw, &float_window_x, &float_window_x,
+                                 &float_window_w, &float_window_h, &lw->div_float);
+}
+
+static void layout_tools_hide(LayoutWindow *lw, gint hide)
+{
+       if (!lw->tools) return;
+
+       if (hide)
+               {
+               if (GTK_WIDGET_VISIBLE(lw->tools))
+                       {
+                       layout_tools_geometry_sync(lw);
+                       gtk_widget_hide(lw->tools);
+                       }
+               }
+       else
+               {
+               if (!GTK_WIDGET_VISIBLE(lw->tools))
+                       {
+                       gtk_widget_show(lw->tools);
+                       if (lw->vfi) vficon_refresh(lw->vfi);
+                       }
+               }
+
+       lw->tools_hidden = hide;
+}
+
+static gint layout_tools_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_tools_float_toggle(lw);
+
+       return TRUE;
+}
+
+static void layout_tools_setup(LayoutWindow *lw, GtkWidget *tools, GtkWidget *files)
+{
+       GtkWidget *vbox;
+       GtkWidget *w1, *w2;
+       gint vertical;
+       gint new_window = FALSE;
+
+       vertical = (layout_location_single(lw->image_location) && !layout_location_vertical(lw->image_location)) ||
+                  (!layout_location_single(lw->image_location) && layout_location_vertical(layout_grid_compass(lw)));
+#if 0
+       layout_location_compute(lw->dir_location, lw->file_location,
+                               tools, files, &w1, &w2);
+#endif
+       /* for now, tools/dir are always first in order */
+       w1 = tools;
+       w2 = files;
+
+       if (!lw->tools)
+               {
+               GdkGeometry geometry;
+               GdkWindowHints hints;
+
+               lw->tools = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+               g_signal_connect(G_OBJECT(lw->tools), "delete_event",
+                                G_CALLBACK(layout_tools_delete_cb), lw);
+               layout_keyboard_init(lw, lw->tools);
+
+               if (save_window_positions)
+                       {
+                       hints = GDK_HINT_USER_POS | GDK_HINT_USER_SIZE;
+                       }
+               else
+                       {
+                       hints = 0;
+                       }
+
+               geometry.min_width = 32;
+               geometry.min_height = 32;
+               geometry.base_width = TOOLWINDOW_DEF_WIDTH;
+               geometry.base_height = TOOLWINDOW_DEF_HEIGHT;
+               gtk_window_set_geometry_hints(GTK_WINDOW(lw->tools), NULL, &geometry,
+                                             GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE | hints);
+
+
+               gtk_window_set_resizable(GTK_WINDOW(lw->tools), TRUE);
+               gtk_window_set_title(GTK_WINDOW(lw->tools), _("GQview Tools"));
+               gtk_window_set_wmclass(GTK_WINDOW(lw->tools), "tools", "GQview");
+               gtk_container_set_border_width(GTK_CONTAINER(lw->tools), 0);
+
+               window_set_icon(lw->tools, (const gchar **)tools_xpm, NULL);
+
+               new_window = TRUE;
+               }
+       else
+               {
+               layout_tools_geometry_sync(lw);
+               /* dump the contents */
+               gtk_widget_destroy(GTK_BIN(lw->tools)->child);
+               }
+
+       layout_actions_add_window(lw, lw->tools);
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_add(GTK_CONTAINER(lw->tools), vbox);
+       gtk_widget_show(vbox);
+
+       layout_status_setup(lw, vbox, TRUE);
+
+       if (vertical)
+               {
+               lw->tools_pane = gtk_vpaned_new();
+               }
+       else
+               {
+               lw->tools_pane = gtk_hpaned_new();
+               }
+       gtk_box_pack_start(GTK_BOX(vbox), lw->tools_pane, TRUE, TRUE, 0);
+       gtk_widget_show(lw->tools_pane);
+
+       gtk_paned_pack1(GTK_PANED(lw->tools_pane), w1, FALSE, TRUE);
+       gtk_paned_pack2(GTK_PANED(lw->tools_pane), w2, TRUE, TRUE);
+
+       gtk_widget_show(tools);
+       gtk_widget_show(files);
+
+       if (new_window)
+               {
+               if (save_window_positions)
+                       {
+                       gtk_window_set_default_size(GTK_WINDOW(lw->tools), float_window_w, float_window_h);
+                       gtk_window_move(GTK_WINDOW(lw->tools), float_window_x, float_window_y);
+                       }
+               else
+                       {
+                       if (vertical)
+                               {
+                               gtk_window_set_default_size(GTK_WINDOW(lw->tools),
+                                                           TOOLWINDOW_DEF_WIDTH, TOOLWINDOW_DEF_HEIGHT);
+                               }
+                       else
+                               {
+                               gtk_window_set_default_size(GTK_WINDOW(lw->tools),
+                                                           TOOLWINDOW_DEF_HEIGHT, TOOLWINDOW_DEF_WIDTH);
+                               }
+                       }
+               }
+
+       if (!save_window_positions)
+               {
+               if (vertical)
+                       {
+                       lw->div_float = MAIN_WINDOW_DIV_VPOS;
+                       }
+               else
+                       {
+                       lw->div_float = MAIN_WINDOW_DIV_HPOS;
+                       }
+               }
+
+       gtk_paned_set_position(GTK_PANED(lw->tools_pane), lw->div_float);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * glue (layout arrangement)
+ *-----------------------------------------------------------------------------
+ */
+
+static void layout_grid_compute(LayoutWindow *lw,
+                               GtkWidget *image, GtkWidget *tools, GtkWidget *files,
+                               GtkWidget **w1, GtkWidget **w2, GtkWidget **w3)
+{
+       /* heh, this was fun */
+
+       if (layout_location_single(lw->dir_location))
+               {
+               if (layout_location_first(lw->dir_location))
+                       {
+                       *w1 = tools;
+                       layout_location_compute(lw->file_location, lw->image_location, files, image, w2, w3);
+                       }
+               else
+                       {
+                       *w3 = tools;
+                       layout_location_compute(lw->file_location, lw->image_location, files, image, w1, w2);
+                       }
+               }
+       else if (layout_location_single(lw->file_location))
+               {
+               if (layout_location_first(lw->file_location))
+                       {
+                       *w1 = files;
+                       layout_location_compute(lw->dir_location, lw->image_location, tools, image, w2, w3);
+                       }
+               else
+                       {
+                       *w3 = files;
+                       layout_location_compute(lw->dir_location, lw->image_location, tools, image, w1, w2);
+                       }
+               }
+       else
+               {
+               /* image */
+               if (layout_location_first(lw->image_location))
+                       {
+                       *w1 = image;
+                       layout_location_compute(lw->file_location, lw->dir_location, files, tools, w2, w3);
+                       }
+               else
+                       {
+                       *w3 = image;
+                       layout_location_compute(lw->file_location, lw->dir_location, files, tools, w1, w2);
+                       }
+               }
+}
+
+static void layout_grid_setup(LayoutWindow *lw)
+{
+       gint priority_location;
+       GtkWidget *h;
+       GtkWidget *v;
+       GtkWidget *w1, *w2, *w3;
+
+       GtkWidget *image;
+       GtkWidget *tools;
+       GtkWidget *files;
+
+       layout_actions_setup(lw);
+       layout_actions_add_window(lw, lw->window);
+
+       lw->group_box = gtk_vbox_new(FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(lw->main_box), lw->group_box, TRUE, TRUE, 0);
+       gtk_widget_show(lw->group_box);
+
+       priority_location = layout_grid_compass(lw);
+
+       image = layout_image_new(lw, NULL);
+       tools = layout_tools_new(lw);
+       files = layout_list_new(lw);
+
+       image = layout_bars_prepare(lw, image);
+
+       if (lw->tools_float || lw->tools_hidden)
+               {
+               gtk_box_pack_start(GTK_BOX(lw->group_box), image, TRUE, TRUE, 0);
+               gtk_widget_show(image);
+
+               layout_tools_setup(lw, tools, files);
+
+               gtk_widget_grab_focus(lw->image->widget);
+
+               return;
+               }
+       else if (lw->tools)
+               {
+               layout_tools_geometry_sync(lw);
+               gtk_widget_destroy(lw->tools);
+               lw->tools = NULL;
+               lw->tools_pane = NULL;
+               }
+
+       layout_status_setup(lw, lw->group_box, FALSE);
+
+       layout_grid_compute(lw, image, tools, files, &w1, &w2, &w3);
+
+       v = lw->v_pane = gtk_vpaned_new();
+
+       h = lw->h_pane = gtk_hpaned_new();
+
+       if (!layout_location_vertical(priority_location))
+               {
+               GtkWidget *tmp;
+
+               tmp = v;
+               v = h;
+               h = tmp;
+               }
+
+       gtk_box_pack_start(GTK_BOX(lw->group_box), v, TRUE, TRUE, 0);
+
+       if (!layout_location_first(priority_location))
+               {
+               gtk_paned_pack1(GTK_PANED(v), h, FALSE, TRUE);
+               gtk_paned_pack2(GTK_PANED(v), w3, TRUE, TRUE);
+
+               gtk_paned_pack1(GTK_PANED(h), w1, FALSE, TRUE);
+               gtk_paned_pack2(GTK_PANED(h), w2, TRUE, TRUE);
+               }
+       else
+               {
+               gtk_paned_pack1(GTK_PANED(v), w1, FALSE, TRUE);
+               gtk_paned_pack2(GTK_PANED(v), h, TRUE, TRUE);
+
+               gtk_paned_pack1(GTK_PANED(h), w2, FALSE, TRUE);
+               gtk_paned_pack2(GTK_PANED(h), w3, TRUE, TRUE);
+               }
+
+       gtk_widget_show(image);
+       gtk_widget_show(tools);
+       gtk_widget_show(files);
+
+       gtk_widget_show(v);
+       gtk_widget_show(h);
+
+       /* fix to have image pane visible when it is left and priority widget */
+       if (lw->div_h == -1 &&
+           w1 == image &&
+           !layout_location_vertical(priority_location) &&
+           layout_location_first(priority_location))
+               {
+               gtk_widget_set_size_request(image, 200, -1);
+               }
+
+       gtk_paned_set_position(GTK_PANED(lw->h_pane), lw->div_h);
+       gtk_paned_set_position(GTK_PANED(lw->v_pane), lw->div_v);
+
+       gtk_widget_grab_focus(lw->image->widget);
+}
+
+void layout_style_set(LayoutWindow *lw, gint style, const gchar *order)
+{
+       gchar *path;
+       ImageWindow *old_image;
+
+       if (!layout_valid(&lw)) return;
+
+       if (style != -1)
+               {
+               LayoutLocation d, f, i;
+
+               layout_config_parse(style, order, &d,  &f, &i);
+
+               if (lw->dir_location == d &&
+                   lw->file_location == f &&
+                   lw->image_location == i) return;
+
+               lw->dir_location = d;
+               lw->file_location = f;
+               lw->image_location = i;
+               }
+
+       /* remember state */
+
+       layout_image_slideshow_stop(lw);
+       layout_image_full_screen_stop(lw);
+
+       path = lw->path;
+       lw->path = NULL;
+       old_image = lw->image;
+       lw->image = NULL;
+       lw->utility_box = NULL;
+
+       layout_geometry_get_dividers(lw, &lw->div_h, &lw->div_v);
+
+       /* clear it all */
+
+       gtk_widget_hide(old_image->widget);
+       gtk_widget_ref(old_image->widget);
+       gtk_container_remove(GTK_CONTAINER(old_image->widget->parent), old_image->widget);
+
+       lw->h_pane = NULL;
+       lw->v_pane = NULL;
+
+       lw->toolbar = NULL;
+       lw->thumb_button = NULL;
+       lw->path_entry = NULL;
+       lw->dir_view = NULL;
+       lw->vdl = NULL;
+       lw->vdt = NULL;
+
+       lw->file_view = NULL;
+       lw->vfl = NULL;
+       lw->vfi = NULL;
+
+       lw->info_box = NULL;
+       lw->info_progress_bar = NULL;
+       lw->info_sort = NULL;
+       lw->info_status = NULL;
+       lw->info_details = NULL;
+       lw->info_zoom = NULL;
+
+#if 0
+       if (lw->menu_fact) g_object_unref(G_OBJECT(lw->menu_fact));
+       lw->menu_fact = NULL;
+#endif
+       if (lw->ui_manager) g_object_unref(lw->ui_manager);
+       lw->ui_manager = NULL;
+       lw->action_group = NULL;
+
+       gtk_container_remove(GTK_CONTAINER(lw->main_box), lw->group_box);
+       lw->group_box = NULL;
+
+       /* re-fill */
+
+       layout_grid_setup(lw);
+       layout_tools_hide(lw, lw->tools_hidden);
+
+       layout_list_sync_sort(lw);
+       layout_util_sync(lw);
+       layout_status_update_all(lw);
+
+       /* sync */
+
+       if (image_get_path(old_image))
+               {
+               layout_set_path(lw, image_get_path(old_image));
+               }
+       else
+               {
+               layout_set_path(lw, path);
+               }
+       image_change_from_image(lw->image, old_image);
+       image_top_window_set_sync(lw->image, (lw->tools_float || lw->tools_hidden));
+
+       /* clean up */
+
+       gtk_widget_unref(old_image->widget);
+       g_free(path);
+}
+
+void layout_styles_update(void)
+{
+       GList *work;
+
+       work = layout_window_list;
+       while (work)
+               {
+               LayoutWindow *lw = work->data;
+               work = work->next;
+
+               layout_style_set(lw, layout_style, layout_order);
+               }
+}
+
+void layout_colors_update(void)
+{
+       GList *work;
+
+       work = layout_window_list;
+       while (work)
+               {
+               LayoutWindow *lw = work->data;
+               work = work->next;
+
+               if (lw->image) image_background_set_black(lw->image, black_window_background);
+               }
+}
+
+void layout_tools_float_toggle(LayoutWindow *lw)
+{
+       gint popped;
+
+       if (!lw) return;
+
+       if (!lw->tools_hidden)
+               {
+               popped = !lw->tools_float;
+               }
+       else
+               {
+               popped = TRUE;
+               }
+
+       if (lw->tools_float == popped)
+               {
+               if (popped && lw->tools_hidden)
+                       {
+                       layout_tools_float_set(lw, popped, FALSE);
+                       }
+               }
+       else
+               {
+               if (lw->tools_float)
+                       {
+                       layout_tools_float_set(lw, FALSE, FALSE);
+                       }
+               else
+                       {
+                       layout_tools_float_set(lw, TRUE, FALSE);
+                       }
+               }
+}
+
+void layout_tools_hide_toggle(LayoutWindow *lw)
+{
+       if (!lw) return;
+
+       layout_tools_float_set(lw, lw->tools_float, !lw->tools_hidden);
+}
+
+void layout_tools_float_set(LayoutWindow *lw, gint popped, gint hidden)
+{
+       if (!layout_valid(&lw)) return;
+
+       if (lw->tools_float == popped && lw->tools_hidden == hidden) return;
+
+       if (lw->tools_float == popped && lw->tools_float && lw->tools)
+               {
+               layout_tools_hide(lw, hidden);
+               return;
+               }
+
+       lw->tools_float = popped;
+       lw->tools_hidden = hidden;
+
+       layout_style_set(lw, -1, NULL);
+}
+
+gint layout_tools_float_get(LayoutWindow *lw, gint *popped, gint *hidden)
+{
+       if (!layout_valid(&lw)) return FALSE;
+
+       *popped = lw->tools_float;
+       *hidden = lw->tools_hidden;
+
+       return TRUE;
+}
+
+void layout_toolbar_toggle(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return;
+       if (!lw->toolbar) return;
+
+       lw->toolbar_hidden = !lw->toolbar_hidden;
+
+       if (lw->toolbar_hidden)
+               {
+               if (GTK_WIDGET_VISIBLE(lw->toolbar)) gtk_widget_hide(lw->toolbar);
+               }
+       else
+               {
+               if (!GTK_WIDGET_VISIBLE(lw->toolbar)) gtk_widget_show(lw->toolbar);
+               }
+}
+
+gint layout_toolbar_hidden(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return TRUE;
+
+       return lw->toolbar_hidden;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * base
+ *-----------------------------------------------------------------------------
+ */
+
+void layout_close(LayoutWindow *lw)
+{
+       if (layout_window_list && layout_window_list->next)
+               {
+               layout_free(lw);
+               }
+       else
+               {
+               exit_gqview();
+               }
+}
+
+void layout_free(LayoutWindow *lw)
+{
+       if (!lw) return;
+
+       layout_window_list = g_list_remove(layout_window_list, lw);
+
+       if (lw->last_time_id != -1)
+               {
+               g_source_remove(lw->last_time_id);
+               }
+
+       layout_bars_close(lw);
+
+#if 0
+       if (lw->menu_fact) g_object_unref(G_OBJECT(lw->menu_fact));
+#endif
+       if (lw->tooltips) g_object_unref(G_OBJECT(lw->tooltips));
+       gtk_widget_destroy(lw->window);
+
+       g_free(lw->path);
+
+       g_free(lw);
+}
+
+static gint layout_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_close(lw);
+       return TRUE;
+}
+
+LayoutWindow *layout_new(const gchar *path, gint popped, gint hidden)
+{
+       LayoutWindow *lw;
+       GdkGeometry geometry;
+       GdkWindowHints hints;
+
+       lw = g_new0(LayoutWindow, 1);
+
+       lw->thumbs_enabled = thumbnails_enabled;
+       lw->sort_method = SORT_NAME;
+       lw->sort_ascend = TRUE;
+
+       lw->tools_float = popped;
+       lw->tools_hidden = hidden;
+
+       lw->toolbar_hidden = toolbar_hidden;
+
+       lw->utility_box = NULL;
+       lw->bar_sort = NULL;
+       lw->bar_sort_enabled = FALSE;
+       lw->bar_exif = NULL;
+       lw->bar_exif_enabled = FALSE;
+       lw->bar_exif_size = -1;
+       lw->bar_exif_advanced = FALSE;
+
+       lw->full_screen_overlay_id = -1;
+       lw->full_screen_overlay_on = FALSE;
+
+       /* default layout */
+
+       layout_config_parse(layout_style, layout_order,
+                           &lw->dir_location,  &lw->file_location, &lw->image_location);
+       lw->tree_view = layout_view_tree;
+       lw->icon_view = layout_view_icons;
+
+       /* divider positions */
+
+       if (save_window_positions)
+               {
+               lw->div_h = window_hdivider_pos;
+               lw->div_v = window_vdivider_pos;
+               lw->div_float = float_window_divider;
+               }
+       else
+               {
+               lw->div_h = MAIN_WINDOW_DIV_HPOS;
+               lw->div_v = MAIN_WINDOW_DIV_VPOS;
+               lw->div_float = MAIN_WINDOW_DIV_VPOS;
+               }
+
+       /* window */
+
+       lw->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+       gtk_window_set_resizable(GTK_WINDOW(lw->window), TRUE);
+
+       gtk_window_set_title(GTK_WINDOW(lw->window), "GQview");
+       gtk_window_set_wmclass(GTK_WINDOW(lw->window), "gqview", "GQview");
+       gtk_container_set_border_width(GTK_CONTAINER(lw->window), 0);
+
+       window_set_icon(lw->window, NULL, NULL);
+
+       if (save_window_positions)
+               {
+               hints = GDK_HINT_USER_POS | GDK_HINT_USER_SIZE;
+               }
+       else
+               {
+               hints = 0;
+               }
+
+       geometry.min_width = 32;
+       geometry.min_height = 32;
+       geometry.base_width = MAINWINDOW_DEF_WIDTH;
+       geometry.base_height = MAINWINDOW_DEF_HEIGHT;
+       gtk_window_set_geometry_hints(GTK_WINDOW(lw->window), NULL, &geometry,
+                                     GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE | hints);
+
+       if (save_window_positions)
+               {
+               gtk_window_set_default_size(GTK_WINDOW(lw->window), main_window_w, main_window_h);
+               if (!layout_window_list)
+                       {
+                       gtk_window_move(GTK_WINDOW(lw->window), main_window_x, main_window_y);
+                       if (main_window_maximized) gtk_window_maximize(GTK_WINDOW(lw->window));
+                       }
+               }
+       else
+               {
+               gtk_window_set_default_size(GTK_WINDOW(lw->window), MAINWINDOW_DEF_WIDTH, MAINWINDOW_DEF_HEIGHT);
+               }
+
+       g_signal_connect(G_OBJECT(lw->window), "delete_event",
+                        G_CALLBACK(layout_delete_cb), lw);
+
+       layout_keyboard_init(lw, lw->window);
+
+#if 0
+       gtk_widget_realize(lw->window);
+#endif
+
+       lw->tooltips = gtk_tooltips_new();
+       g_object_ref(G_OBJECT(lw->tooltips));
+       gtk_object_sink(GTK_OBJECT(lw->tooltips));
+
+       lw->main_box = gtk_vbox_new(FALSE, 0);
+       gtk_container_add(GTK_CONTAINER(lw->window), lw->main_box);
+       gtk_widget_show(lw->main_box);
+
+       layout_grid_setup(lw);
+       image_top_window_set_sync(lw->image, (lw->tools_float || lw->tools_hidden));
+
+       layout_util_sync(lw);
+       layout_status_update_all(lw);
+
+       if (path)
+               {
+               layout_set_path(lw, path);
+               }
+       else
+               {
+               GdkPixbuf *pixbuf;
+
+               pixbuf = pixbuf_inline(PIXBUF_INLINE_LOGO);
+               image_change_pixbuf(lw->image, pixbuf, 1.0);
+               gdk_pixbuf_unref(pixbuf);
+               }
+
+       /* set up the time stat timeout */
+       lw->last_time = 0;
+       lw->last_time_id = g_timeout_add(5000, layout_check_for_update_cb, lw);
+
+       gtk_widget_show(lw->window);
+       layout_tools_hide(lw, lw->tools_hidden);
+
+       layout_window_list = g_list_append(layout_window_list, lw);
+
+       return lw;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * maintenance (for rename, move, remove)
+ *-----------------------------------------------------------------------------
+ */
+
+static void layout_real_time_update(LayoutWindow *lw)
+{
+       /* this resets the last time stamp of path so that a refresh does not occur
+        * from an internal file operation.
+        */
+
+       if (lw->path) lw->last_time = filetime(lw->path);
+}
+
+static void layout_real_renamed(LayoutWindow *lw, const gchar *source, const gchar *dest)
+{
+       gint update = FALSE;
+
+       if (lw->image) layout_image_maint_renamed(lw, source, dest);
+
+       if (lw->vfl) update |= vflist_maint_renamed(lw->vfl, source, dest);
+       if (lw->vfi) update |= vficon_maint_renamed(lw->vfi, source, dest);
+
+       if (update) layout_real_time_update(lw);
+}
+
+static void layout_real_removed(LayoutWindow *lw, const gchar *path, GList *ignore_list)
+{
+       gint update = FALSE;
+
+       if (lw->image) layout_image_maint_removed(lw, path);
+
+       if (lw->vfl) update |= vflist_maint_removed(lw->vfl, path, ignore_list);
+       if (lw->vfi) update |= vficon_maint_removed(lw->vfi, path, ignore_list);
+
+       if (update) layout_real_time_update(lw);
+}
+
+static void layout_real_moved(LayoutWindow *lw, const gchar *source, const gchar *dest, GList *ignore_list)
+{
+       gint update = FALSE;
+
+       if (lw->image) layout_image_maint_moved(lw, source, dest);
+
+       if (lw->vfl) update |= vflist_maint_moved(lw->vfl, source, dest, ignore_list);
+       if (lw->vfi) update |= vficon_maint_moved(lw->vfi, source, dest, ignore_list);
+
+       if (update) layout_real_time_update(lw);
+}
+
+void layout_maint_renamed(const gchar *source, const gchar *dest)
+{
+       GList *work = layout_window_list;
+       while (work)
+               {
+               LayoutWindow *lw = work->data;
+               work = work->next;
+
+               layout_real_renamed(lw, source, dest);
+               }
+}
+
+void layout_maint_removed(const gchar *path, GList *ignore_list)
+{
+       GList *work = layout_window_list;
+       while (work)
+               {
+               LayoutWindow *lw = work->data;
+               work = work->next;
+
+               layout_real_removed(lw, path, ignore_list);
+               }
+}
+
+void layout_maint_moved(const gchar *source, const gchar *dest, GList *ignore_list)
+{
+       GList *work = layout_window_list;
+       while (work)
+               {
+               LayoutWindow *lw = work->data;
+               work = work->next;
+
+               layout_real_moved(lw, source, dest, ignore_list);
+               }
+}
diff --git a/src/layout.h b/src/layout.h
new file mode 100644 (file)
index 0000000..7f50017
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifndef LAYOUT_H
+#define LAYOUT_H
+
+
+extern GList *layout_window_list;
+
+
+LayoutWindow *layout_new(const gchar *path, gint popped, gint hidden);
+
+void layout_close(LayoutWindow *lw);
+void layout_free(LayoutWindow *lw);
+
+gint layout_valid(LayoutWindow **lw);
+
+LayoutWindow *layout_find_by_image(ImageWindow *imd);
+
+const gchar *layout_get_path(LayoutWindow *lw);
+gint layout_set_path(LayoutWindow *lw, const gchar *path);
+
+void layout_status_update_progress(LayoutWindow *lw, gdouble val, const gchar *text);
+void layout_status_update_info(LayoutWindow *lw, const gchar *text);
+void layout_status_update_image(LayoutWindow *lw);
+void layout_status_update_all(LayoutWindow *lw);
+
+GList *layout_list(LayoutWindow *lw);
+gint layout_list_count(LayoutWindow *lw, gint64 *bytes);
+const gchar *layout_list_get_path(LayoutWindow *lw, gint index);
+gint layout_list_get_index(LayoutWindow *lw, const gchar *path);
+void layout_list_sync_path(LayoutWindow *lw, const gchar *path);
+
+GList *layout_selection_list(LayoutWindow *lw);
+/* return list of pointers to int for selection */
+GList *layout_selection_list_by_index(LayoutWindow *lw);
+gint layout_selection_count(LayoutWindow *lw, gint64 *bytes);
+void layout_select_all(LayoutWindow *lw);
+void layout_select_none(LayoutWindow *lw);
+
+void layout_refresh(LayoutWindow *lw);
+
+void layout_thumb_set(LayoutWindow *lw, gint enable);
+gint layout_thumb_get(LayoutWindow *lw);
+
+void layout_sort_set(LayoutWindow *lw, SortType type, gint ascend);
+gint layout_sort_get(LayoutWindow *lw, SortType *type, gint *ascend);
+
+gint layout_geometry_get(LayoutWindow *lw, gint *x, gint *y, gint *w, gint *h);
+gint layout_geometry_get_dividers(LayoutWindow *lw, gint *h, gint *v);
+
+void layout_views_set(LayoutWindow *lw, gint tree, gint icons);
+gint layout_views_get(LayoutWindow *lw, gint *tree, gint *icons);
+
+void layout_status_update(LayoutWindow *lw, const gchar *text);
+
+void layout_style_set(LayoutWindow *lw, gint style, const gchar *order);
+
+void layout_menu_update_edit(void);
+void layout_styles_update(void);
+void layout_colors_update(void);
+
+
+gint layout_geometry_get_tools(LayoutWindow *lw, gint *x, gint *y, gint *w, gint *h, gint *divider_pos);
+void layout_tools_float_set(LayoutWindow *lw, gint popped, gint hidden);
+gint layout_tools_float_get(LayoutWindow *lw, gint *popped, gint *hidden);
+
+void layout_tools_float_toggle(LayoutWindow *lw);
+void layout_tools_hide_toggle(LayoutWindow *lw);
+
+
+void layout_toolbar_toggle(LayoutWindow *lw);
+gint layout_toolbar_hidden(LayoutWindow *lw);
+
+
+void layout_maint_renamed(const gchar *source, const gchar *dest);
+void layout_maint_removed(const gchar *path, GList *ignore_list);
+void layout_maint_moved(const gchar *source, const gchar *dest, GList *ignore_list);
+
+
+#endif
+
+
+
diff --git a/src/layout_config.c b/src/layout_config.c
new file mode 100644 (file)
index 0000000..60bdae7
--- /dev/null
@@ -0,0 +1,418 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#include "gqview.h"
+#include "layout_config.h"
+
+
+#include "layout.h"
+
+#include "ui_misc.h"
+
+
+enum {
+       COLUMN_TEXT = 0,
+       COLUMN_KEY
+};
+
+
+typedef struct _LayoutStyle LayoutStyle;
+struct _LayoutStyle
+{
+       LayoutLocation a, b, c;
+};
+
+typedef struct _LayoutConfig LayoutConfig;
+struct _LayoutConfig
+{
+       GtkWidget *box;
+
+       GList *style_widgets;
+
+       GtkWidget *listview;
+
+       gint style;
+       gint a, b, c;
+};
+
+
+static LayoutStyle layout_config_styles[] = {
+       /* 1, 2, 3 */
+       { LAYOUT_LEFT | LAYOUT_TOP, LAYOUT_LEFT | LAYOUT_BOTTOM, LAYOUT_RIGHT },
+       { LAYOUT_LEFT | LAYOUT_TOP, LAYOUT_RIGHT | LAYOUT_TOP, LAYOUT_BOTTOM },
+       { LAYOUT_LEFT, LAYOUT_RIGHT | LAYOUT_TOP, LAYOUT_RIGHT | LAYOUT_BOTTOM },
+       { LAYOUT_TOP, LAYOUT_LEFT | LAYOUT_BOTTOM, LAYOUT_RIGHT | LAYOUT_BOTTOM }
+};
+
+static gint layout_config_style_count = sizeof(layout_config_styles) / sizeof (LayoutStyle);
+
+static gchar *layout_titles[] = { N_("Tools"), N_("Files"), N_("Image") };
+
+
+static void layout_config_destroy(GtkWidget *widget, gpointer data)
+{
+       LayoutConfig * lc = data;
+
+       g_list_free(lc->style_widgets);
+       g_free(lc);
+}
+
+static void layout_config_set_order(LayoutLocation l, gint n,
+                                   LayoutLocation *a, LayoutLocation *b, LayoutLocation *c)
+{
+       switch (n)
+               {
+               case 0:
+                       *a = l;
+                       break;
+               case 1:
+                       *b = l;
+                       break;
+               case 2: default:
+                       *c = l;
+                       break;
+               }
+}
+
+static void layout_config_from_data(gint style, gint oa, gint ob, gint oc,
+                                   LayoutLocation *la, LayoutLocation *lb, LayoutLocation *lc)
+{
+       LayoutStyle ls;
+
+       style = CLAMP(style, 0, layout_config_style_count);
+
+       ls = layout_config_styles[style];
+
+       layout_config_set_order(ls.a, oa, la, lb, lc);
+       layout_config_set_order(ls.b, ob, la, lb, lc);
+       layout_config_set_order(ls.c, oc, la, lb, lc);
+}
+
+void layout_config_parse(gint style, const gchar *order,
+                        LayoutLocation *a, LayoutLocation *b, LayoutLocation *c)
+{
+       gint na, nb, nc;
+
+       layout_config_order_from_text(order, &na, &nb, &nc);
+       layout_config_from_data(style, na, nb, nc, a, b, c);
+}
+
+static void layout_config_list_order_set(LayoutConfig *lc, gint src, gint dest)
+{
+       GtkListStore *store;
+       GtkTreeIter iter;
+       gint valid;
+       gint n;
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(lc->listview)));
+
+       n = 0;
+       valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
+       while (valid)
+               {
+               if (n == dest)
+                       {
+                       gtk_list_store_set(store, &iter, COLUMN_TEXT, _(layout_titles[src]), COLUMN_KEY, src, -1);
+                       return;
+                       }
+               n++;
+               valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
+               }
+}
+
+static gint layout_config_list_order_get(LayoutConfig *lc, gint n)
+{
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gint valid;
+       gint c = 0;
+                                                                                                                               
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(lc->listview));
+                                                                                                                               
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+       while (valid)
+               {
+               if (c == n)
+                       {
+                       gint val;
+                       gtk_tree_model_get(store, &iter, COLUMN_KEY, &val, -1);
+                       return val;
+                       }
+               c++;
+               valid = gtk_tree_model_iter_next(store, &iter);
+               }
+       return 0;
+}
+
+void layout_config_set(GtkWidget *widget, gint style, const gchar *order)
+{
+       LayoutConfig *lc;
+       GtkWidget *button;
+       gint a, b, c;
+
+       lc = g_object_get_data(G_OBJECT(widget), "layout_config");
+
+       if (!lc) return;
+
+       style = CLAMP(style, 0, layout_config_style_count);
+       button = g_list_nth_data(lc->style_widgets, style);
+       if (!button) return;
+
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+
+       layout_config_order_from_text(order, &a, &b, &c);
+
+       layout_config_list_order_set(lc, a, 0);
+       layout_config_list_order_set(lc, b, 1);
+       layout_config_list_order_set(lc, c, 2);
+}
+
+gchar *layout_config_get(GtkWidget *widget, gint *style)
+{
+       LayoutConfig *lc;
+
+       lc = g_object_get_data(G_OBJECT(widget), "layout_config");
+
+       /* this should not happen */
+       if (!lc) return NULL;
+
+       *style = lc->style;
+
+       lc->a = layout_config_list_order_get(lc, 0);
+       lc->b = layout_config_list_order_get(lc, 1);
+       lc->c = layout_config_list_order_get(lc, 2);
+
+       return layout_config_order_to_text(lc->a, lc->b, lc->c);
+}
+
+static void layout_config_widget_click_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutConfig *lc;
+
+       lc = g_object_get_data(G_OBJECT(widget), "layout_config");
+       
+       if (lc) lc->style = GPOINTER_TO_INT(data);
+}
+
+static void layout_config_table_button(GtkWidget *table, LayoutLocation l, const gchar *text)
+{
+       GtkWidget *button;
+
+       gint x1, y1;
+       gint x2, y2;
+
+       x1 = 0;
+       y1 = 0;
+       x2 = 2;
+       y2 = 2;
+
+       if (l & LAYOUT_LEFT) x2 = 1;
+       if (l & LAYOUT_RIGHT) x1 = 1;
+       if (l & LAYOUT_TOP) y2 = 1;
+       if (l & LAYOUT_BOTTOM) y1 = 1;
+
+       button = gtk_button_new_with_label(text);
+       gtk_widget_set_sensitive(button, FALSE);
+       GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS);
+       gtk_table_attach_defaults(GTK_TABLE(table), button, x1, x2, y1, y2);
+       gtk_widget_show(button);
+}
+
+#define LAYOUT_STYLE_SIZE 48
+
+static GtkWidget *layout_config_widget(GtkWidget *group, GtkWidget *box, gint style, LayoutConfig *lc)
+{
+       GtkWidget *table;
+       LayoutStyle ls;
+
+       ls = layout_config_styles[style];
+
+       if (group)
+               {
+               group = gtk_radio_button_new(gtk_radio_button_get_group(GTK_RADIO_BUTTON(group)));
+               }
+       else
+               {
+               group = gtk_radio_button_new(NULL);
+               }
+       g_object_set_data(G_OBJECT(group), "layout_config", lc);
+       g_signal_connect(G_OBJECT(group), "clicked",
+                        G_CALLBACK(layout_config_widget_click_cb), GINT_TO_POINTER(style));
+       gtk_box_pack_start(GTK_BOX(box), group, FALSE, FALSE, 0);
+
+       table = gtk_table_new(2, 2, TRUE);
+
+       layout_config_table_button(table, ls.a, "1");
+       layout_config_table_button(table, ls.b, "2");
+       layout_config_table_button(table, ls.c, "3");
+
+       gtk_widget_set_size_request(table, LAYOUT_STYLE_SIZE, LAYOUT_STYLE_SIZE);
+       gtk_container_add(GTK_CONTAINER(group), table);
+       gtk_widget_show(table);
+
+       gtk_widget_show(group);
+       
+       return group;
+}
+
+#if 0
+static void layout_config_row_move(GtkWidget *clist, gint source_row, gint dest_row, gpointer data)
+{
+       gchar *text;
+       gint i;
+
+       for (i = 0; i < 3; i++)
+               {
+               text = g_strdup_printf("%d", i + 1);
+               gtk_clist_set_text(GTK_CLIST(clist), i, 0, text);
+               g_free(text);
+               }
+}
+#endif
+
+static void layout_config_number_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
+                                   GtkTreeModel *store, GtkTreeIter *iter, gpointer data)
+{
+       GtkTreePath *tpath;
+       gint *indices;
+       gchar *buf;
+
+       tpath = gtk_tree_model_get_path(store, iter);
+       indices = gtk_tree_path_get_indices(tpath);
+       buf = g_strdup_printf("%d", indices[0] + 1);
+       gtk_tree_path_free(tpath);
+       g_object_set(G_OBJECT(cell), "text", buf, NULL);
+       g_free(buf);
+}
+
+GtkWidget *layout_config_new(void)
+{
+       LayoutConfig *lc;
+       GtkWidget *hbox;
+       GtkWidget *group = NULL;
+       GtkWidget *scrolled;
+       GtkListStore *store;
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+       gint i;
+
+       lc = g_new0(LayoutConfig, 1);
+
+       lc->box = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+       g_object_set_data(G_OBJECT(lc->box), "layout_config", lc);
+
+       g_signal_connect(G_OBJECT(lc->box), "destroy",
+                        G_CALLBACK(layout_config_destroy), lc);
+
+       hbox = gtk_hbox_new(TRUE, PREF_PAD_SPACE);
+       gtk_box_pack_start(GTK_BOX(lc->box), hbox, FALSE, FALSE, 0);
+       for (i = 0; i < layout_config_style_count; i++)
+               {
+               group = layout_config_widget(group, hbox, i, lc);
+               lc->style_widgets = g_list_append(lc->style_widgets, group);
+               }
+       gtk_widget_show(hbox);
+
+       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
+                                      GTK_POLICY_NEVER, GTK_POLICY_NEVER);
+       gtk_box_pack_start(GTK_BOX(lc->box), scrolled, FALSE, FALSE, 0);
+       gtk_widget_show(scrolled);
+
+       store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
+       lc->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(lc->listview), FALSE);
+       gtk_tree_view_set_enable_search(GTK_TREE_VIEW(lc->listview), FALSE);
+       gtk_tree_view_set_reorderable(GTK_TREE_VIEW(lc->listview), TRUE);
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+
+       renderer = gtk_cell_renderer_text_new();
+       gtk_tree_view_column_pack_start(column, renderer, FALSE);
+       gtk_tree_view_column_set_cell_data_func(column, renderer, layout_config_number_cb, lc, NULL);
+
+       renderer = gtk_cell_renderer_text_new();
+       gtk_tree_view_column_pack_start(column, renderer, TRUE);
+       gtk_tree_view_column_add_attribute(column, renderer, "text", COLUMN_TEXT);
+
+       gtk_tree_view_append_column(GTK_TREE_VIEW(lc->listview), column);
+
+       for (i = 0; i < 3; i++)
+               {
+               GtkTreeIter iter;
+
+               gtk_list_store_append(store, &iter);
+               gtk_list_store_set(store, &iter, COLUMN_TEXT, _(layout_titles[i]), COLUMN_KEY, i, -1);
+               }
+       
+       gtk_container_add(GTK_CONTAINER(scrolled), lc->listview);
+       gtk_widget_show(lc->listview);
+
+       pref_label_new(lc->box, _("(drag to change order)"));
+       
+       return lc->box;
+}
+
+static char num_to_text_char(gint n)
+{
+       switch (n)
+               {
+               case 1:
+                       return '2';
+                       break;
+               case 2:
+                       return '3';
+                       break;
+               }
+       return '1';
+}
+
+gchar *layout_config_order_to_text(gint a, gint b, gint c)
+{
+       gchar *text;
+
+       text = g_strdup("   ");
+
+       text[0] = num_to_text_char(a);
+       text[1] = num_to_text_char(b);
+       text[2] = num_to_text_char(c);
+
+       return text;
+}
+
+static gint text_char_to_num(const gchar *text, gint n)
+{
+       if (text[n] == '3') return 2;
+       if (text[n] == '2') return 1;
+       return 0;
+}
+
+void layout_config_order_from_text(const gchar *text, gint *a, gint *b, gint *c)
+{
+       if (!text || strlen(text) < 3)
+               {
+               *a = 0;
+               *b = 1;
+               *c = 2;
+               }
+       else
+               {
+               *a = text_char_to_num(text, 0);
+               *b = text_char_to_num(text, 1);
+               *c = text_char_to_num(text, 2);
+               }
+}
+
+
diff --git a/src/layout_config.h b/src/layout_config.h
new file mode 100644 (file)
index 0000000..f97fb3e
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifndef LAYOUT_CONFIG_H
+#define LAYOUT_CONFIG_H
+
+
+#include "layout.h"
+
+
+GtkWidget *layout_config_new(void);
+
+void layout_config_set(GtkWidget *widget, gint style, const gchar *order);
+gchar *layout_config_get(GtkWidget *widget, gint *style);
+
+
+gchar *layout_config_order_to_text(gint a, gint b, gint c);
+void layout_config_order_from_text(const gchar *text, gint *a, gint *b, gint *c);
+
+void layout_config_parse(gint style, const gchar *order,
+                        LayoutLocation *a, LayoutLocation *b, LayoutLocation *c);
+
+
+#endif
+
diff --git a/src/layout_image.c b/src/layout_image.c
new file mode 100644 (file)
index 0000000..d3a0540
--- /dev/null
@@ -0,0 +1,1437 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#include "gqview.h"
+#include "layout_image.h"
+
+#include "collect.h"
+#include "dnd.h"
+#include "editors.h"
+#include "filelist.h"
+#include "fullscreen.h"
+#include "image.h"
+#include "image-overlay.h"
+#include "img-view.h"
+#include "info.h"
+#include "layout.h"
+#include "layout_util.h"
+#include "menu.h"
+#include "pixbuf_util.h"
+#include "utilops.h"
+#include "slideshow.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+
+#include <gdk/gdkkeysyms.h> /* for keyboard values */
+
+
+static GtkWidget *layout_image_pop_menu(LayoutWindow *lw);
+static void layout_image_set_buttons(LayoutWindow *lw);
+
+/*
+ *----------------------------------------------------------------------------
+ * full screen overlay
+ *----------------------------------------------------------------------------
+ */
+
+static void layout_image_overlay_set(LayoutWindow *lw, gint enable)
+{
+       lw->full_screen_overlay_on = enable;
+
+       if (!lw->full_screen) return;
+
+       if (enable)
+               {
+               if (lw->full_screen_overlay_id == -1)
+                       {
+                       lw->full_screen_overlay_id = image_overlay_info_enable(lw->image);
+                       }
+               }
+       else
+               {
+               if (lw->full_screen_overlay_id != -1)
+                       {
+                       image_overlay_info_disable(lw->image, lw->full_screen_overlay_id);
+                       lw->full_screen_overlay_id = -1;
+                       }
+               }
+}
+
+void layout_image_overlay_update(LayoutWindow *lw)
+{
+       if (!lw || !lw->full_screen) return;
+       if (lw->full_screen_overlay_id != -1) image_overlay_update(lw->image, lw->full_screen_overlay_id);
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * full screen
+ *----------------------------------------------------------------------------
+ */
+
+static void layout_image_fullscreen_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       if (!lw->full_screen) return;
+
+       gdk_window_get_origin(lw->full_screen->imd->image->window, x, y);
+       popup_menu_position_clamp(menu, x, y, 0);
+}
+
+static void layout_image_full_screen_menu_popup(LayoutWindow *lw)
+{
+       GtkWidget *menu;
+
+       menu = layout_image_pop_menu(lw);
+       gtk_menu_popup(GTK_MENU(menu), NULL, NULL, layout_image_fullscreen_menu_pos_cb, lw, 0, GDK_CURRENT_TIME);
+}
+
+static gint layout_image_full_screen_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       LayoutWindow *lw = data;
+       gint stop_signal = FALSE;
+       gint x = 0;
+       gint y = 0;
+
+       switch (event->keyval)
+               {
+               case GDK_Left: case GDK_KP_Left:
+                       x -= 1;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Right: case GDK_KP_Right:
+                       x += 1;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Up: case GDK_KP_Up:
+                       y -= 1;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Down: case GDK_KP_Down:
+                       y += 1;
+                       stop_signal = TRUE;
+                       break;
+               }
+
+       if ( !(event->state & GDK_CONTROL_MASK) )
+           switch (event->keyval)
+               {
+               case '+': case '=': case GDK_KP_Add:
+                       layout_image_zoom_adjust(lw, get_zoom_increment());
+                       break;
+               case '-': case GDK_KP_Subtract:
+                       layout_image_zoom_adjust(lw, -get_zoom_increment());
+                       break;
+               case 'X': case 'x': case GDK_KP_Multiply:
+                       layout_image_zoom_set(lw, 0.0);
+                       break;
+               case 'Z': case 'z': case GDK_KP_Divide:
+               case '1':
+                       layout_image_zoom_set(lw, 1.0);
+                       break;
+               case '2':
+                       layout_image_zoom_set(lw, 2.0);
+                       break;
+               case '3':
+                       layout_image_zoom_set(lw, 3.0);
+                       break;
+               case '4':
+                       layout_image_zoom_set(lw, 4.0);
+                       break;
+               case '7':
+                       layout_image_zoom_set(lw, -4.0);
+                       break;
+               case '8':
+                       layout_image_zoom_set(lw, -3.0);
+                       break;
+               case '9':
+                       layout_image_zoom_set(lw, -2.0);
+                       break;
+               case 'W': case 'w':
+                       layout_image_zoom_set_fill_geometry(lw, FALSE);
+                       break;
+               case 'H': case 'h':
+                       layout_image_zoom_set_fill_geometry(lw, TRUE);
+                       break;
+               case GDK_Page_Up: case GDK_KP_Page_Up:
+               case GDK_BackSpace:
+               case 'B': case 'b':
+                       layout_image_prev(lw);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Page_Down: case GDK_KP_Page_Down:
+               case GDK_space:
+               case 'N': case 'n':
+                       layout_image_next(lw);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Home: case GDK_KP_Home:
+                       layout_image_first(lw);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_End: case GDK_KP_End:
+                       layout_image_last(lw);
+                       stop_signal = TRUE;
+                       break;
+               case ']':
+                       layout_image_alter(lw, ALTER_ROTATE_90);
+                       stop_signal = TRUE;
+                       break;
+               case '[':
+                       layout_image_alter(lw, ALTER_ROTATE_90_CC);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Delete: case GDK_KP_Delete:
+                       if (enable_delete_key)
+                               {
+                               file_util_delete(layout_image_get_path(lw), NULL, widget);
+                               stop_signal = TRUE;
+                               }
+                       break;
+               case GDK_Escape:
+                       layout_image_full_screen_stop(lw);
+                       stop_signal = TRUE;
+                       break;
+               case 'R': case 'r':
+                       layout_refresh(lw);
+                       break;
+               case 'S': case 's':
+                       layout_image_slideshow_toggle(lw);
+                       break;
+               case 'P': case 'p':
+                       layout_image_slideshow_pause_toggle(lw);
+                       break;
+               case 'F': case 'f':
+               case 'V': case 'v':
+                       layout_image_full_screen_stop(lw);
+                       break;
+               case GDK_Menu:
+               case GDK_F10:
+                       layout_image_full_screen_menu_popup(lw);
+                       stop_signal = TRUE;
+                       break;
+               case 'I': case 'i':
+                       layout_image_overlay_set(lw, !(lw->full_screen_overlay_on));
+                       break;
+               }
+
+       if (event->state & GDK_CONTROL_MASK)
+               {
+               gint n = -1;
+               switch (event->keyval)
+                       {
+                       case '1':
+                               n = 0;
+                               break;
+                       case '2':
+                               n = 1;
+                               break;
+                       case '3':
+                               n = 2;
+                               break;
+                       case '4':
+                               n = 3;
+                               break;
+                       case '5':
+                               n = 4;
+                               break;
+                       case '6':
+                               n = 5;
+                               break;
+                       case '7':
+                               n = 6;
+                               break;
+                       case '8':
+                               n = 7;
+                               break;
+                       case '9':
+                               n = 8;
+                               break;
+                       case '0':
+                               n = 9;
+                               break;
+                       case 'C': case 'c':
+                               file_util_copy(layout_image_get_path(lw), NULL, NULL, widget);
+                               break;
+                       case 'M': case 'm':
+                               file_util_move(layout_image_get_path(lw), NULL, NULL, widget);
+                               break;
+                       case 'R': case 'r':
+                               file_util_rename(layout_image_get_path(lw), NULL, widget);
+                               break;
+                       case 'D': case 'd':
+                               file_util_delete(layout_image_get_path(lw), NULL, widget);
+                               break;
+                       case 'P': case 'p':
+                               info_window_new(layout_image_get_path(lw), NULL);
+                               break;
+                       case 'Q': case 'q':
+                               exit_gqview();
+                               return FALSE;
+                               break;
+                       }
+               if (n != -1)
+                       {
+                       layout_image_full_screen_stop(lw);
+                       start_editor_from_file(n, layout_image_get_path(lw));
+                       }
+               }
+       else if (event->state & GDK_SHIFT_MASK)
+               {
+               switch (event->keyval)
+                       {
+                       case 'R': case 'r':
+                               layout_image_alter(lw, ALTER_ROTATE_180);
+                               stop_signal = TRUE;
+                               break;
+                       case 'M': case 'm':
+                               layout_image_alter(lw, ALTER_MIRROR);
+                               stop_signal = TRUE;
+                               break;
+                       case 'F': case 'f':
+                               layout_image_alter(lw, ALTER_FLIP);
+                               stop_signal = TRUE;
+                               break;
+                       default:
+                               break;
+                       }
+               x *= 3;
+               y *= 3;
+               }
+
+       if (x != 0 || y!= 0)
+               {
+               keyboard_scroll_calc(&x, &y, event);
+               layout_image_scroll(lw, x, y);
+               }
+
+       return stop_signal;
+}
+
+static void layout_image_full_screen_stop_func(FullScreenData *fs, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       /* restore image window */
+       lw->image = fs->normal_imd;
+
+       if (lw->slideshow)
+               {
+               lw->slideshow->imd = lw->image;
+               }
+
+       lw->full_screen = NULL;
+       lw->full_screen_overlay_id = -1;
+}
+
+void layout_image_full_screen_start(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return;
+
+       if (lw->full_screen) return;
+
+       lw->full_screen = fullscreen_start(lw->window, lw->image,
+                                          layout_image_full_screen_stop_func, lw);
+
+       /* set to new image window */
+       lw->image = lw->full_screen->imd;
+
+       if (lw->slideshow)
+               {
+               lw->slideshow->imd = lw->image;
+               }
+
+       layout_image_set_buttons(lw);
+
+       g_signal_connect(G_OBJECT(lw->full_screen->window), "key_press_event",
+                        G_CALLBACK(layout_image_full_screen_key_press_cb), lw);
+
+#if 0
+       gtk_widget_set_sensitive(lw->window, FALSE);
+       if (lw->tools) gtk_widget_set_sensitive(lw->tools, FALSE);
+#endif
+
+       layout_image_overlay_set(lw, lw->full_screen_overlay_on);
+}
+
+void layout_image_full_screen_stop(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return;
+       if (!lw->full_screen) return;
+
+       fullscreen_stop(lw->full_screen);
+
+#if 0
+       gtk_widget_set_sensitive(lw->window, TRUE);
+       if (lw->tools) gtk_widget_set_sensitive(lw->tools, TRUE);
+#endif
+}
+
+void layout_image_full_screen_toggle(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return;
+       if (lw->full_screen)
+               {
+               layout_image_full_screen_stop(lw);
+               }
+       else
+               {
+               layout_image_full_screen_start(lw);
+               }
+}
+
+gint layout_image_full_screen_active(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return FALSE;
+
+       return (lw->full_screen != NULL);
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * slideshow
+ *----------------------------------------------------------------------------
+ */
+
+static void layout_image_slideshow_next(LayoutWindow *lw)
+{
+       if (lw->slideshow) slideshow_next(lw->slideshow);
+}
+
+static void layout_image_slideshow_prev(LayoutWindow *lw)
+{
+       if (lw->slideshow) slideshow_prev(lw->slideshow);
+}
+
+static void layout_image_slideshow_stop_func(SlideShowData *ss, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       lw->slideshow = NULL;
+       layout_status_update_info(lw, NULL);
+}
+
+void layout_image_slideshow_start(LayoutWindow *lw)
+{
+       CollectionData *cd;
+       CollectInfo *info;
+
+       if (!layout_valid(&lw)) return;
+       if (lw->slideshow) return;
+
+       cd = image_get_collection(lw->image, &info);
+
+       if (cd && info)
+               {
+               lw->slideshow = slideshow_start_from_collection(lw->image, cd,
+                               layout_image_slideshow_stop_func, lw, info);
+               }
+       else
+               {
+               lw->slideshow = slideshow_start(lw->image, lw,
+                               layout_list_get_index(lw, layout_image_get_path(lw)),
+                               layout_image_slideshow_stop_func, lw);
+               }
+
+       layout_status_update_info(lw, NULL);
+}
+
+/* note that slideshow will take ownership of the list, do not free it */
+void layout_image_slideshow_start_from_list(LayoutWindow *lw, GList *list)
+{
+       if (!layout_valid(&lw)) return;
+
+       if (lw->slideshow || !list)
+               {
+               path_list_free(list);
+               return;
+               }
+
+       lw->slideshow = slideshow_start_from_path_list(lw->image, list,
+                                                      layout_image_slideshow_stop_func, lw);
+
+       layout_status_update_info(lw, NULL);
+}
+
+void layout_image_slideshow_stop(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return;
+
+       if (!lw->slideshow) return;
+
+       slideshow_free(lw->slideshow);
+       /* the stop_func sets lw->slideshow to NULL for us */
+}
+
+void layout_image_slideshow_toggle(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return;
+
+       if (lw->slideshow)
+               {
+               layout_image_slideshow_stop(lw);
+               }
+       else
+               {
+               layout_image_slideshow_start(lw);
+               }
+}
+
+gint layout_image_slideshow_active(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return FALSE;
+
+       return (lw->slideshow != NULL);
+}
+
+gint layout_image_slideshow_pause_toggle(LayoutWindow *lw)
+{
+       gint ret;
+
+       if (!layout_valid(&lw)) return FALSE;
+
+       ret = slideshow_pause_toggle(lw->slideshow);
+
+       layout_status_update_info(lw, NULL);
+
+       return ret;
+}
+
+gint layout_image_slideshow_paused(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return FALSE;
+
+       return (slideshow_paused(lw->slideshow));
+}
+
+static gint layout_image_slideshow_continue_check(LayoutWindow *lw)
+{
+       if (!lw->slideshow) return FALSE;
+
+       if (!slideshow_should_continue(lw->slideshow))
+               {
+               layout_image_slideshow_stop(lw);
+               return FALSE;
+               }
+
+       return TRUE;
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * pop-up menus
+ *----------------------------------------------------------------------------
+ */
+
+static void li_pop_menu_zoom_in_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       image_zoom_adjust(lw->image, get_zoom_increment());
+}
+
+static void li_pop_menu_zoom_out_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+       image_zoom_adjust(lw->image, -get_zoom_increment());
+}
+
+static void li_pop_menu_zoom_1_1_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       image_zoom_set(lw->image, 1.0);
+}
+
+static void li_pop_menu_zoom_fit_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       image_zoom_set(lw->image, 0.0);
+}
+
+static void li_pop_menu_edit_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw;
+       gint n;
+
+       lw = submenu_item_get_data(widget);
+       n = GPOINTER_TO_INT(data);
+
+       layout_image_full_screen_stop(lw);
+
+       start_editor_from_file(n, layout_image_get_path(lw));
+}
+
+static void li_pop_menu_wallpaper_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_to_root(lw);
+}
+
+static void li_pop_menu_alter_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+       AlterType type;
+
+       lw = submenu_item_get_data(widget);
+       type = (AlterType)GPOINTER_TO_INT(data);
+
+       image_alter(lw->image, type);
+}
+
+static void li_pop_menu_info_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       info_window_new(layout_image_get_path(lw), NULL);
+}
+
+static void li_pop_menu_new_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       view_window_new(layout_image_get_path(lw));
+}
+
+static GtkWidget *li_pop_menu_click_parent(GtkWidget *widget, LayoutWindow *lw)
+{
+       GtkWidget *menu;
+       GtkWidget *parent;
+
+       menu = gtk_widget_get_toplevel(widget);
+       if (!menu) return NULL;
+
+       parent = g_object_get_data(G_OBJECT(menu), "click_parent");
+
+       if (!parent && lw->full_screen)
+               {
+               parent = lw->full_screen->imd->widget;
+               }
+
+       return parent;
+}
+
+static void li_pop_menu_copy_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       file_util_copy(layout_image_get_path(lw), NULL, NULL,
+                      li_pop_menu_click_parent(widget, lw));
+}
+
+static void li_pop_menu_move_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       file_util_move(layout_image_get_path(lw), NULL, NULL,
+                      li_pop_menu_click_parent(widget, lw));
+}
+
+static void li_pop_menu_rename_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       file_util_rename(layout_image_get_path(lw), NULL,
+                        li_pop_menu_click_parent(widget, lw));
+}
+
+static void li_pop_menu_delete_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       file_util_delete(layout_image_get_path(lw), NULL,
+                        li_pop_menu_click_parent(widget, lw));
+}
+
+static void li_pop_menu_slide_start_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_slideshow_start(lw);
+}
+
+static void li_pop_menu_slide_stop_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_slideshow_stop(lw);
+}
+
+static void li_pop_menu_slide_pause_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_slideshow_pause_toggle(lw);
+}
+
+static void li_pop_menu_full_screen_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_full_screen_toggle(lw);
+}
+
+static void li_pop_menu_hide_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_tools_hide_toggle(lw);
+}
+
+static GtkWidget *layout_image_pop_menu(LayoutWindow *lw)
+{
+       GtkWidget *menu;
+       GtkWidget *item;
+       GtkWidget *submenu;
+       const gchar *path;
+       gint fullscreen;
+
+       path = layout_image_get_path(lw);
+       fullscreen = layout_image_full_screen_active(lw);
+
+       menu = popup_menu_short_lived();
+
+       menu_item_add_stock(menu, _("Zoom _in"), GTK_STOCK_ZOOM_IN, G_CALLBACK(li_pop_menu_zoom_in_cb), lw);
+       menu_item_add_stock(menu, _("Zoom _out"), GTK_STOCK_ZOOM_OUT, G_CALLBACK(li_pop_menu_zoom_out_cb), lw);
+       menu_item_add_stock(menu, _("Zoom _1:1"), GTK_STOCK_ZOOM_100, G_CALLBACK(li_pop_menu_zoom_1_1_cb), lw);
+       menu_item_add_stock(menu, _("Fit image to _window"), GTK_STOCK_ZOOM_FIT, G_CALLBACK(li_pop_menu_zoom_fit_cb), lw);
+       menu_item_add_divider(menu);
+
+       submenu = submenu_add_edit(menu, &item, G_CALLBACK(li_pop_menu_edit_cb), lw);
+       if (!path) gtk_widget_set_sensitive(item, FALSE);
+       menu_item_add_divider(submenu);
+       menu_item_add(submenu, _("Set as _wallpaper"), G_CALLBACK(li_pop_menu_wallpaper_cb), lw);
+
+       item = submenu_add_alter(menu, G_CALLBACK(li_pop_menu_alter_cb), lw);
+
+       item = menu_item_add_stock(menu, _("_Properties"), GTK_STOCK_PROPERTIES, G_CALLBACK(li_pop_menu_info_cb), lw);
+       if (!path) gtk_widget_set_sensitive(item, FALSE);
+
+       item = menu_item_add_stock(menu, _("View in _new window"), GTK_STOCK_NEW, G_CALLBACK(li_pop_menu_new_cb), lw);
+       if (!path || fullscreen) gtk_widget_set_sensitive(item, FALSE);
+
+       menu_item_add_divider(menu);
+
+       item = menu_item_add_stock(menu, _("_Copy..."), GTK_STOCK_COPY, G_CALLBACK(li_pop_menu_copy_cb), lw);
+       if (!path) gtk_widget_set_sensitive(item, FALSE);
+       item = menu_item_add(menu, _("_Move..."), G_CALLBACK(li_pop_menu_move_cb), lw);
+       if (!path) gtk_widget_set_sensitive(item, FALSE);
+       item = menu_item_add(menu, _("_Rename..."), G_CALLBACK(li_pop_menu_rename_cb), lw);
+       if (!path) gtk_widget_set_sensitive(item, FALSE);
+       item = menu_item_add_stock(menu, _("_Delete..."), GTK_STOCK_DELETE, G_CALLBACK(li_pop_menu_delete_cb), lw);
+       if (!path) gtk_widget_set_sensitive(item, FALSE);
+
+       menu_item_add_divider(menu);
+
+       if (layout_image_slideshow_active(lw))
+               {
+               menu_item_add(menu, _("_Stop slideshow"), G_CALLBACK(li_pop_menu_slide_stop_cb), lw);
+               if (layout_image_slideshow_paused(lw))
+                       {
+                       item = menu_item_add(menu, _("Continue slides_how"),
+                                            G_CALLBACK(li_pop_menu_slide_pause_cb), lw);
+                       }
+               else
+                       {
+                       item = menu_item_add(menu, _("Pause slides_how"),
+                                            G_CALLBACK(li_pop_menu_slide_pause_cb), lw);
+                       }
+               }
+       else
+                {
+               menu_item_add(menu, _("_Start slideshow"), G_CALLBACK(li_pop_menu_slide_start_cb), lw);
+               item = menu_item_add(menu, _("Pause slides_how"), G_CALLBACK(li_pop_menu_slide_pause_cb), lw);
+               gtk_widget_set_sensitive(item, FALSE);
+               }
+
+       if (!fullscreen)
+               {
+               menu_item_add(menu, _("_Full screen"), G_CALLBACK(li_pop_menu_full_screen_cb), lw);
+               }
+       else
+               {
+               menu_item_add(menu, _("Exit _full screen"), G_CALLBACK(li_pop_menu_full_screen_cb), lw);
+               }
+
+       menu_item_add_divider(menu);
+
+       item = menu_item_add_check(menu, _("Hide file _list"), lw->tools_hidden,
+                                  G_CALLBACK(li_pop_menu_hide_cb), lw);
+       if (fullscreen) gtk_widget_set_sensitive(item, FALSE);
+
+       return menu;
+}
+
+static void layout_image_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       gdk_window_get_origin(lw->image->image->window, x, y);
+       popup_menu_position_clamp(menu, x, y, 0);
+}
+
+void layout_image_menu_popup(LayoutWindow *lw)
+{
+       GtkWidget *menu;
+
+       menu = layout_image_pop_menu(lw);
+       gtk_menu_popup(GTK_MENU(menu), NULL, NULL, layout_image_menu_pos_cb, lw, 0, GDK_CURRENT_TIME);
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * dnd
+ *----------------------------------------------------------------------------
+ */
+
+static void layout_image_dnd_receive(GtkWidget *widget, GdkDragContext *context,
+                                    gint x, gint y,
+                                    GtkSelectionData *selection_data, guint info,
+                                    guint time, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       if (info == TARGET_URI_LIST || info == TARGET_APP_COLLECTION_MEMBER)
+               {
+               CollectionData *source;
+               GList *list;
+               GList *info_list;
+
+               if (info == TARGET_URI_LIST)
+                       {
+                       list = uri_list_from_text(selection_data->data, TRUE);
+                       source = NULL;
+                       info_list = NULL;
+                       }
+               else
+                       {
+                       source = collection_from_dnd_data((gchar *)selection_data->data, &list, &info_list);
+                       }
+
+               if (list)
+                       {
+                       gchar *path;
+
+                       path = list->data;
+
+                       if (isfile(path))
+                               {
+                               gchar *base;
+                               gint row;
+
+                               base = remove_level_from_path(path);
+                               if (strcmp(base, layout_get_path(lw)) != 0)
+                                       {
+                                       layout_set_path(lw, base);
+                                       }
+                               g_free(base);
+
+                               row = layout_list_get_index(lw, path);
+                               if (source && info_list)
+                                       {
+                                       layout_image_set_collection(lw, source, info_list->data);
+                                       }
+                               else if (row == -1)
+                                       {
+                                       layout_image_set_path(lw, path);
+                                       }
+                               else
+                                       {
+                                       layout_image_set_index(lw, row);
+                                       }
+                               }
+                       else if (isdir(path))
+                               {
+                               layout_set_path(lw, path);
+                               layout_image_set_path(lw, NULL);
+                               }
+                       }
+
+               path_list_free(list);
+               g_list_free(info_list);
+               }
+}
+
+static void layout_image_dnd_get(GtkWidget *widget, GdkDragContext *context,
+                                GtkSelectionData *selection_data, guint info,
+                                guint time, gpointer data)
+{
+       LayoutWindow *lw = data;
+       const gchar *path;
+
+       path = layout_image_get_path(lw);
+
+       if (path)
+               {
+               gchar *text = NULL;
+               gint len;
+               gint plain_text;
+               GList *list;
+
+               switch (info)
+                       {
+                       case TARGET_URI_LIST:
+                               plain_text = FALSE;
+                               break;
+                       case TARGET_TEXT_PLAIN:
+                       default:
+                               plain_text = TRUE;
+                               break;
+                       }
+               list = g_list_append(NULL, (gchar *)path);
+               text = uri_text_from_list(list, &len, plain_text);
+               g_list_free(list);
+               if (text)
+                       {
+                       gtk_selection_data_set (selection_data, selection_data->target,
+                                               8, text, len);
+                       g_free(text);
+                       }
+               }
+       else
+               {
+               gtk_selection_data_set (selection_data, selection_data->target,
+                                       8, NULL, 0);
+               }
+}
+
+static void layout_image_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       LayoutWindow *lw = data;
+       if (context->action == GDK_ACTION_MOVE)
+               {
+               const gchar *path;
+               gint row;
+
+               path = layout_image_get_path(lw);
+               row = layout_list_get_index(lw, path);
+               if (row < 0) return;
+
+               if (!isfile(path))
+                       {
+                       if (row < layout_list_count(lw, NULL) - 1)
+                               {
+                               layout_image_next(lw);
+                               }
+                       else
+                               {
+                               layout_image_prev(lw);
+                               }
+                       }
+               layout_refresh(lw);
+               }
+}
+
+static void layout_image_dnd_init(LayoutWindow *lw)
+{
+       gtk_drag_source_set(lw->image->image, GDK_BUTTON2_MASK,
+                           dnd_file_drag_types, dnd_file_drag_types_count,
+                           GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+       g_signal_connect(G_OBJECT(lw->image->image), "drag_data_get",
+                        G_CALLBACK(layout_image_dnd_get), lw);
+       g_signal_connect(G_OBJECT(lw->image->image), "drag_end",
+                        G_CALLBACK(layout_image_dnd_end), lw);
+
+       gtk_drag_dest_set(lw->image->image,
+                         GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
+                         dnd_file_drop_types, dnd_file_drop_types_count,
+                          GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+       g_signal_connect(G_OBJECT(lw->image->image), "drag_data_received",
+                        G_CALLBACK(layout_image_dnd_receive), lw);
+}
+
+
+/*
+ *----------------------------------------------------------------------------
+ * misc
+ *----------------------------------------------------------------------------
+ */
+
+void layout_image_to_root(LayoutWindow *lw)
+{
+       image_to_root_window(lw->image, (image_zoom_get(lw->image) == 0));
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * manipulation + accessors
+ *----------------------------------------------------------------------------
+ */
+
+void layout_image_scroll(LayoutWindow *lw, gint x, gint y)
+{
+       if (!layout_valid(&lw)) return;
+
+       image_scroll(lw->image, x, y);
+}
+
+void layout_image_zoom_adjust(LayoutWindow *lw, gdouble increment)
+{
+       if (!layout_valid(&lw)) return;
+
+       image_zoom_adjust(lw->image, increment);
+}
+
+void layout_image_zoom_set(LayoutWindow *lw, gdouble zoom)
+{
+       if (!layout_valid(&lw)) return;
+
+       image_zoom_set(lw->image, zoom);
+}
+
+void layout_image_zoom_set_fill_geometry(LayoutWindow *lw, gint vertical)
+{
+       if (!layout_valid(&lw)) return;
+
+       image_zoom_set_fill_geometry(lw->image, vertical);
+}
+
+void layout_image_alter(LayoutWindow *lw, AlterType type)
+{
+       if (!layout_valid(&lw)) return;
+
+       image_alter(lw->image, type);
+}
+
+const gchar *layout_image_get_path(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return NULL;
+
+       return image_get_path(lw->image);
+}
+
+const gchar *layout_image_get_name(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return NULL;
+
+       return image_get_name(lw->image);
+}
+
+CollectionData *layout_image_get_collection(LayoutWindow *lw, CollectInfo **info)
+{
+       if (!layout_valid(&lw)) return NULL;
+
+       return image_get_collection(lw->image, info);
+}
+
+gint layout_image_get_index(LayoutWindow *lw)
+{
+       return layout_list_get_index(lw, image_get_path(lw->image));
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * image changers
+ *----------------------------------------------------------------------------
+ */
+
+void layout_image_set_path(LayoutWindow *lw, const gchar *path)
+{
+       if (!layout_valid(&lw)) return;
+
+       image_change_path(lw->image, path, image_zoom_get_default(lw->image, zoom_mode));
+
+       layout_list_sync_path(lw, path);
+       layout_image_slideshow_continue_check(lw);
+       layout_bars_new_image(lw);
+}
+
+void layout_image_set_with_ahead(LayoutWindow *lw, const gchar *path, const gchar *read_ahead_path)
+{
+       if (!layout_valid(&lw)) return;
+
+       if (path)
+               {
+               const gchar *old_path;
+
+               old_path = layout_image_get_path(lw);
+               if (old_path && strcmp(path, old_path) == 0) return;
+               }
+
+       layout_image_set_path(lw, path);
+       if (enable_read_ahead) image_prebuffer_set(lw->image, read_ahead_path);
+}
+
+void layout_image_set_index(LayoutWindow *lw, gint index)
+{
+       const gchar *path;
+       const gchar *read_ahead_path;
+       gint old;
+
+       if (!layout_valid(&lw)) return;
+
+       old = layout_list_get_index(lw, layout_image_get_path(lw));
+       path = layout_list_get_path(lw, index);
+
+       if (old > index)
+               {
+               read_ahead_path = layout_list_get_path(lw, index - 1);
+               }
+       else
+               {
+               read_ahead_path = layout_list_get_path(lw, index + 1);
+               }
+
+       layout_image_set_with_ahead(lw, path, read_ahead_path);
+}
+
+static void layout_image_set_collection_real(LayoutWindow *lw, CollectionData *cd, CollectInfo *info, gint forward)
+{
+       if (!layout_valid(&lw)) return;
+
+       image_change_from_collection(lw->image, cd, info, image_zoom_get_default(lw->image, zoom_mode));
+       if (enable_read_ahead)
+               {
+               CollectInfo *r_info;
+               if (forward)
+                       {
+                       r_info = collection_next_by_info(cd, info);
+                       if (!r_info) r_info = collection_prev_by_info(cd, info);
+                       }
+               else
+                       {
+                       r_info = collection_prev_by_info(cd, info);
+                       if (!r_info) r_info = collection_next_by_info(cd, info);
+                       }
+               if (r_info) image_prebuffer_set(lw->image, r_info->path);
+               }
+
+       layout_image_slideshow_continue_check(lw);
+       layout_bars_new_image(lw);
+}
+
+void layout_image_set_collection(LayoutWindow *lw, CollectionData *cd, CollectInfo *info)
+{
+       layout_image_set_collection_real(lw, cd, info, TRUE);
+       layout_list_sync_path(lw, layout_image_get_path(lw));
+}
+
+void layout_image_refresh(LayoutWindow *lw)
+{
+       if (!layout_valid(&lw)) return;
+
+       image_reload(lw->image);
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * list walkers
+ *----------------------------------------------------------------------------
+ */
+
+void layout_image_next(LayoutWindow *lw)
+{
+       gint current;
+       CollectionData *cd;
+       CollectInfo *info;
+
+       if (!layout_valid(&lw)) return;
+
+       if (layout_image_slideshow_active(lw))
+               {
+               layout_image_slideshow_next(lw);
+               return;
+               }
+
+       cd = image_get_collection(lw->image, &info);
+
+       if (cd && info)
+               {
+               info = collection_next_by_info(cd, info);
+               if (info) layout_image_set_collection_real(lw, cd, info, TRUE);
+               return;
+               }
+
+       current = layout_image_get_index(lw);
+
+       if (current >= 0)
+               {
+               if (current < layout_list_count(lw, NULL) - 1)
+                       {
+                       layout_image_set_index(lw, current + 1);
+                       }
+               }
+       else
+               {
+               layout_image_set_index(lw, 0);
+               }
+}
+
+void layout_image_prev(LayoutWindow *lw)
+{
+       gint current;
+       CollectionData *cd;
+       CollectInfo *info;
+
+       if (!layout_valid(&lw)) return;
+
+       if (layout_image_slideshow_active(lw))
+               {
+               layout_image_slideshow_prev(lw);
+               return;
+               }
+
+       cd = image_get_collection(lw->image, &info);
+
+       if (cd && info)
+               {
+               info = collection_prev_by_info(cd, info);
+               if (info) layout_image_set_collection_real(lw, cd, info, FALSE);
+               return;
+               }
+
+       current = layout_image_get_index(lw);
+
+       if (current >= 0)
+               {
+               if (current > 0)
+                       {
+                       layout_image_set_index(lw, current - 1);
+                       }
+               }
+       else
+               {
+               layout_image_set_index(lw, layout_list_count(lw, NULL) - 1);
+               }
+}
+
+void layout_image_first(LayoutWindow *lw)
+{
+       gint current;
+       CollectionData *cd;
+       CollectInfo *info;
+
+       if (!layout_valid(&lw)) return;
+
+       cd = image_get_collection(lw->image, &info);
+
+       if (cd && info)
+               {
+               CollectInfo *new;
+               new = collection_get_first(cd);
+               if (new != info) layout_image_set_collection_real(lw, cd, new, TRUE);
+               return;
+               }
+
+       current = layout_image_get_index(lw);
+       if (current != 0 && layout_list_count(lw, NULL) > 0)
+               {
+               layout_image_set_index(lw, 0);
+               }
+}
+
+void layout_image_last(LayoutWindow *lw)
+{
+       gint current;
+       gint count;
+       CollectionData *cd;
+       CollectInfo *info;
+
+       if (!layout_valid(&lw)) return;
+
+       cd = image_get_collection(lw->image, &info);
+
+       if (cd && info)
+               {
+               CollectInfo *new;
+               new = collection_get_last(cd);
+               if (new != info) layout_image_set_collection_real(lw, cd, new, FALSE);
+               return;
+               }
+
+       current = layout_image_get_index(lw);
+       count = layout_list_count(lw, NULL);
+       if (current != count - 1 && count > 0)
+               {
+               layout_image_set_index(lw, count - 1);
+               }
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * mouse callbacks
+ *----------------------------------------------------------------------------
+ */
+
+static void layout_image_button_cb(ImageWindow *imd, gint button, guint32 time,
+                                  gdouble x, gdouble y, guint state, gpointer data)
+{
+       LayoutWindow *lw = data;
+       GtkWidget *menu;
+
+       switch (button)
+               {
+               case 1:
+                       layout_image_next(lw);
+                       break;
+               case 2:
+                       layout_image_prev(lw);
+                       break;
+               case 3:
+                       menu = layout_image_pop_menu(lw);
+                       if (imd == lw->image)
+                               {
+                               g_object_set_data(G_OBJECT(menu), "click_parent", imd->widget);
+                               }
+                       gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, time);
+                       break;
+               default:
+                       break;
+               }
+}
+
+static void layout_image_scroll_cb(ImageWindow *imd, GdkScrollDirection direction, guint32 time,
+                                  gdouble x, gdouble y, guint state, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       if (state & GDK_CONTROL_MASK)
+               {
+               switch (direction)
+                       {
+                       case GDK_SCROLL_UP:
+                               image_zoom_adjust_at_point(imd, get_zoom_increment(), x, y);
+                               break;
+                       case GDK_SCROLL_DOWN:
+                               image_zoom_adjust_at_point(imd, -get_zoom_increment(), x, y);
+                               break;
+                       default:
+                               break;
+                       }
+               }
+       else if ( (state & GDK_SHIFT_MASK) != (mousewheel_scrolls))
+               {
+               switch (direction)
+                       {
+                       case GDK_SCROLL_UP:
+                               image_scroll(imd, 0, -MOUSEWHEEL_SCROLL_SIZE);
+                               break;
+                       case GDK_SCROLL_DOWN:
+                               image_scroll(imd, 0, MOUSEWHEEL_SCROLL_SIZE);
+                               break;
+                       case GDK_SCROLL_LEFT:
+                               image_scroll(imd, -MOUSEWHEEL_SCROLL_SIZE, 0);
+                               break;
+                       case GDK_SCROLL_RIGHT:
+                               image_scroll(imd, MOUSEWHEEL_SCROLL_SIZE, 0);
+                               break;
+                       default:
+                               break;
+                       }
+               }
+       else
+               {
+               switch (direction)
+                       {
+                       case GDK_SCROLL_UP:
+                               layout_image_prev(lw);
+                               break;
+                       case GDK_SCROLL_DOWN:
+                               layout_image_next(lw);
+                               break;
+                       default:
+                               break;
+                       }
+               }
+}
+
+static void layout_image_set_buttons(LayoutWindow *lw)
+{
+       image_set_button_func(lw->image, layout_image_button_cb, lw);
+       image_set_scroll_func(lw->image, layout_image_scroll_cb, lw);
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * setup
+ *----------------------------------------------------------------------------
+ */
+
+static void layout_image_update_cb(ImageWindow *imd, gpointer data)
+{
+       LayoutWindow *lw = data;
+       layout_status_update_image(lw);
+}
+
+GtkWidget *layout_image_new(LayoutWindow *lw, const gchar *path)
+{
+       if (!lw->image) 
+               {
+               lw->image = image_new( (!lw->tools_float && !lw->tools_hidden) );
+               if (black_window_background) image_background_set_black(lw->image, TRUE);
+               image_set_update_func(lw->image, layout_image_update_cb, lw);
+               layout_image_set_buttons(lw);
+               layout_image_dnd_init(lw);
+
+               image_attach_window(lw->image, lw->window, NULL, "GQview", FALSE);
+
+               image_auto_refresh(lw->image, 0);
+               }
+
+       return lw->image->widget;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * maintenance (for rename, move, remove)
+ *-----------------------------------------------------------------------------
+ */
+
+void layout_image_maint_renamed(LayoutWindow *lw, const gchar *source, const gchar *dest)
+{
+       const gchar *img_path;
+
+       img_path = layout_image_get_path(lw);
+       if (img_path && strcmp(img_path, source) == 0)
+               {
+               image_set_path(lw->image, dest);
+               layout_bars_maint_renamed(lw);
+               }
+}
+
+void layout_image_maint_removed(LayoutWindow *lw, const gchar *path)
+{
+       const gchar *img_path;
+
+       img_path = layout_image_get_path(lw);
+       if (img_path && strcmp(img_path, path) == 0)
+               {
+               CollectionData *cd;
+               CollectInfo *info;
+
+               cd = image_get_collection(lw->image, &info);
+               if (cd && info)
+                       {
+                       CollectInfo *new;
+
+                       new = collection_next_by_info(cd, info);
+                       if (!new) new = collection_prev_by_info(cd, info);
+
+                       if (new)
+                               {
+                               layout_image_set_collection(lw, cd, new);
+                               return;
+                               }
+                       }
+
+               layout_image_set_path(lw, NULL);
+               }
+}
+
+void layout_image_maint_moved(LayoutWindow *lw, const gchar *source, const gchar *dest)
+{
+       layout_image_maint_renamed(lw, source, dest);
+}
+
diff --git a/src/layout_image.h b/src/layout_image.h
new file mode 100644 (file)
index 0000000..fbc8b45
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifndef LAYOUT_IMAGE_H
+#define LAYOUT_IMAGE_H
+
+
+GtkWidget *layout_image_new(LayoutWindow *lw, const gchar *path);
+
+void layout_image_set_path(LayoutWindow *lw, const gchar *path);
+void layout_image_set_with_ahead(LayoutWindow *lw, const gchar *path, const gchar *read_ahead_path);
+
+void layout_image_set_index(LayoutWindow *lw, gint index);
+void layout_image_set_collection(LayoutWindow *lw, CollectionData *cd, CollectInfo *info);
+
+void layout_image_refresh(LayoutWindow *lw);
+
+
+const gchar *layout_image_get_path(LayoutWindow *lw);
+const gchar *layout_image_get_name(LayoutWindow *lw);
+CollectionData *layout_image_get_collection(LayoutWindow *lw, CollectInfo **info);
+gint layout_image_get_index(LayoutWindow *lw);
+
+
+void layout_image_scroll(LayoutWindow *lw, gint x, gint y);
+void layout_image_zoom_adjust(LayoutWindow *lw, gdouble increment);
+void layout_image_zoom_set(LayoutWindow *lw, gdouble zoom);
+void layout_image_zoom_set_fill_geometry(LayoutWindow *lw, gint vertical);
+void layout_image_alter(LayoutWindow *lw, AlterType type);
+
+void layout_image_next(LayoutWindow *lw);
+void layout_image_prev(LayoutWindow *lw);
+void layout_image_first(LayoutWindow *lw);
+void layout_image_last(LayoutWindow *lw);
+
+void layout_image_menu_popup(LayoutWindow *lw);
+
+void layout_image_to_root(LayoutWindow *lw);
+
+void layout_image_full_screen_start(LayoutWindow *lw);
+void layout_image_full_screen_stop(LayoutWindow *lw);
+void layout_image_full_screen_toggle(LayoutWindow *lw);
+gint layout_image_full_screen_active(LayoutWindow *lw);
+
+void layout_image_slideshow_start(LayoutWindow *lw);
+void layout_image_slideshow_start_from_list(LayoutWindow *lw, GList *list);
+void layout_image_slideshow_stop(LayoutWindow *lw);
+void layout_image_slideshow_toggle(LayoutWindow *lw);
+gint layout_image_slideshow_active(LayoutWindow *lw);
+gint layout_image_slideshow_pause_toggle(LayoutWindow *lw);
+gint layout_image_slideshow_paused(LayoutWindow *lw);
+
+
+void layout_image_overlay_update(LayoutWindow *lw);
+
+
+void layout_image_maint_renamed(LayoutWindow *lw, const gchar *source, const gchar *dest);
+void layout_image_maint_removed(LayoutWindow *lw, const gchar *path);
+void layout_image_maint_moved(LayoutWindow *lw, const gchar *source, const gchar *dest);
+
+
+#endif
+
+
diff --git a/src/layout_util.c b/src/layout_util.c
new file mode 100644 (file)
index 0000000..7dbb3e9
--- /dev/null
@@ -0,0 +1,1452 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "layout_util.h"
+
+#include "bar_info.h"
+#include "bar_exif.h"
+#include "bar_sort.h"
+#include "cache_maint.h"
+#include "collect.h"
+#include "collect-dlg.h"
+#include "dupe.h"
+#include "editors.h"
+#include "info.h"
+#include "layout_image.h"
+#include "pixbuf_util.h"
+#include "preferences.h"
+#include "print.h"
+#include "search.h"
+#include "utilops.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_misc.h"
+#include "ui_tabcomp.h"
+
+#include <gdk/gdkkeysyms.h> /* for keyboard values */
+
+#include "icons/icon_thumb.xpm"
+#include "icons/icon_float.xpm"
+
+
+#define MENU_EDIT_ACTION_OFFSET 16
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * keyboard handler
+ *-----------------------------------------------------------------------------
+ */
+
+static guint tree_key_overrides[] = {
+       GDK_Page_Up,    GDK_KP_Page_Up,
+       GDK_Page_Down,  GDK_KP_Page_Down,
+       GDK_Home,       GDK_KP_Home,
+       GDK_End,        GDK_KP_End
+};
+
+static gint layout_key_match(guint keyval)
+{
+       gint i;
+
+       for (i = 0; i < sizeof(tree_key_overrides) / sizeof(guint); i++)
+               {
+               if (keyval == tree_key_overrides[i]) return TRUE;
+               }
+
+       return FALSE;
+}
+
+static gint layout_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       LayoutWindow *lw = data;
+       gint stop_signal = FALSE;
+       gint x = 0;
+       gint y = 0;
+
+       if (lw->path_entry && GTK_WIDGET_HAS_FOCUS(lw->path_entry))
+               {
+               if (event->keyval == GDK_Escape && lw->path)
+                       {
+                       gtk_entry_set_text(GTK_ENTRY(lw->path_entry), lw->path);
+                       }
+
+               /* the gtkaccelgroup of the window is stealing presses before they get to the entry (and more),
+                * so when the some widgets have focus, give them priority (HACK)
+                */
+               if (gtk_widget_event(lw->path_entry, (GdkEvent *)event))
+                       {
+                       return TRUE;
+                       }
+               }
+       if (lw->vdt && GTK_WIDGET_HAS_FOCUS(lw->vdt->treeview) &&
+           !layout_key_match(event->keyval) &&
+           gtk_widget_event(lw->vdt->treeview, (GdkEvent *)event))
+               {
+               return TRUE;
+               }
+       if (lw->bar_info &&
+           bar_info_event(lw->bar_info, (GdkEvent *)event))
+               {
+               return TRUE;
+               }
+
+       if (lw->image &&
+           (GTK_WIDGET_HAS_FOCUS(lw->image->widget) || (lw->tools && widget == lw->window)) )
+               {
+               switch (event->keyval)
+                       {
+                       case GDK_Left: case GDK_KP_Left:
+                               x -= 1;
+                               stop_signal = TRUE;
+                               break;
+                       case GDK_Right: case GDK_KP_Right:
+                               x += 1;
+                               stop_signal = TRUE;
+                               break;
+                       case GDK_Up: case GDK_KP_Up:
+                               y -= 1;
+                               stop_signal = TRUE;
+                               break;
+                       case GDK_Down: case GDK_KP_Down:
+                               y += 1;
+                               stop_signal = TRUE;
+                               break;
+                       case GDK_BackSpace:
+                       case 'B': case 'b':
+                               layout_image_prev(lw);
+                               stop_signal = TRUE;
+                               break;
+                       case GDK_space:
+                       case 'N': case 'n':
+                               layout_image_next(lw);
+                               stop_signal = TRUE;
+                               break;
+                       case GDK_Menu:
+                               layout_image_menu_popup(lw);
+                               stop_signal = TRUE;
+                               break;
+                       }
+               }
+
+       if (!stop_signal && !(event->state & GDK_CONTROL_MASK) )
+           switch (event->keyval)
+               {
+               case '+': case GDK_KP_Add:
+                       layout_image_zoom_adjust(lw, get_zoom_increment());
+                       stop_signal = TRUE;
+                       break;
+               case GDK_KP_Subtract:
+                       layout_image_zoom_adjust(lw, -get_zoom_increment());
+                       stop_signal = TRUE;
+                       break;
+               case GDK_KP_Multiply:
+                       layout_image_zoom_set(lw, 0.0);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_KP_Divide:
+               case '1':
+                       layout_image_zoom_set(lw, 1.0);
+                       stop_signal = TRUE;
+                       break;
+               case '2':
+                       layout_image_zoom_set(lw, 2.0);
+                       stop_signal = TRUE;
+                       break;
+               case '3':
+                       layout_image_zoom_set(lw, 3.0);
+                       stop_signal = TRUE;
+                       break;
+               case '4':
+                       layout_image_zoom_set(lw, 4.0);
+                       stop_signal = TRUE;
+                       break;
+               case '7':
+                       layout_image_zoom_set(lw, -4.0);
+                       stop_signal = TRUE;
+                       break;
+               case '8':
+                       layout_image_zoom_set(lw, -3.0);
+                       stop_signal = TRUE;
+                       break;
+               case '9':
+                       layout_image_zoom_set(lw, -2.0);
+                       stop_signal = TRUE;
+                       break;
+               case 'W': case 'w':
+                       layout_image_zoom_set_fill_geometry(lw, FALSE);
+                       break;
+               case 'H': case 'h':
+                       layout_image_zoom_set_fill_geometry(lw, TRUE);
+                       break;
+               case GDK_Page_Up: case GDK_KP_Page_Up:
+                       layout_image_prev(lw);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Page_Down: case GDK_KP_Page_Down:
+                       layout_image_next(lw);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Home: case GDK_KP_Home:
+                       layout_image_first(lw);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_End: case GDK_KP_End:
+                       layout_image_last(lw);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Delete: case GDK_KP_Delete:
+                       if (enable_delete_key)
+                               {
+                               file_util_delete(NULL, layout_selection_list(lw), widget);
+                               stop_signal = TRUE;
+                               }
+                       break;
+               case GDK_Escape:
+                       /* FIXME:interrupting thumbs no longer allowed */
+#if 0
+                       interrupt_thumbs();
+#endif
+                       stop_signal = TRUE;
+                       break;
+               case 'P': case 'p':
+                       layout_image_slideshow_pause_toggle(lw);
+                       break;
+               case 'V': case 'v':
+                       if (!(event->state & GDK_MOD1_MASK)) layout_image_full_screen_toggle(lw);
+                       break;
+               }
+
+       if (event->state & GDK_SHIFT_MASK)
+               {
+               x *= 3;
+               y *= 3;
+               }
+
+       if (x != 0 || y!= 0)
+               {
+               keyboard_scroll_calc(&x, &y, event);
+               layout_image_scroll(lw, x, y);
+               }
+
+       if (stop_signal) g_signal_stop_emission_by_name(G_OBJECT(widget), "key_press_event");
+
+       return stop_signal;
+}
+
+void layout_keyboard_init(LayoutWindow *lw, GtkWidget *window)
+{
+       g_signal_connect(G_OBJECT(window), "key_press_event",
+                        G_CALLBACK(layout_key_press_cb), lw);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * menu callbacks
+ *-----------------------------------------------------------------------------
+ */
+
+static void layout_menu_new_window_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+       LayoutWindow *nw;
+
+       nw = layout_new(NULL, FALSE, FALSE);
+       layout_sort_set(nw, file_sort_method, file_sort_ascending);
+       layout_set_path(nw, layout_get_path(lw));
+}
+
+static void layout_menu_new_cb(GtkAction *action, gpointer data)
+{
+       collection_window_new(NULL);
+}
+
+static void layout_menu_open_cb(GtkAction *action, gpointer data)
+{
+       collection_dialog_load(NULL);
+}
+
+static void layout_menu_search_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       search_new(lw->path, layout_image_get_path(lw));
+}
+
+static void layout_menu_dupes_cb(GtkAction *action, gpointer data)
+{
+       dupe_window_new(DUPE_MATCH_NAME);
+}
+
+static void layout_menu_print_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       print_window_new(layout_image_get_path(lw), layout_selection_list(lw), layout_list(lw), lw->window);
+}
+
+static void layout_menu_dir_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       file_util_create_dir(lw->path, lw->window);
+}
+
+static void layout_menu_copy_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       file_util_copy(NULL, layout_selection_list(lw), NULL, lw->window);
+}
+
+static void layout_menu_move_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       file_util_move(NULL, layout_selection_list(lw), NULL, lw->window);
+}
+
+static void layout_menu_rename_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       file_util_rename(NULL, layout_selection_list(lw), lw->window);
+}
+
+static void layout_menu_delete_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       file_util_delete(NULL, layout_selection_list(lw), lw->window);
+}
+
+static void layout_menu_close_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_close(lw);
+}
+
+static void layout_menu_exit_cb(GtkAction *action, gpointer data)
+{
+       exit_gqview();
+}
+
+static void layout_menu_alter_90_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_alter(lw, ALTER_ROTATE_90);
+}
+
+static void layout_menu_alter_90cc_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_alter(lw, ALTER_ROTATE_90_CC);
+}
+
+static void layout_menu_alter_180_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_alter(lw, ALTER_ROTATE_180);
+}
+
+static void layout_menu_alter_mirror_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_alter(lw, ALTER_MIRROR);
+}
+
+static void layout_menu_alter_flip_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_alter(lw, ALTER_FLIP);
+}
+
+static void layout_menu_info_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+       GList *list;
+       const gchar *path = NULL;
+
+       list = layout_selection_list(lw);
+       if (!list) path = layout_image_get_path(lw);
+
+       info_window_new(path, list);
+}
+
+static void layout_menu_select_all_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_select_all(lw);
+}
+
+static void layout_menu_unselect_all_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_select_none(lw);
+}
+
+static void layout_menu_config_cb(GtkAction *action, gpointer data)
+{
+       show_config_window();
+}
+
+static void layout_menu_remove_thumb_cb(GtkAction *action, gpointer data)
+{
+       cache_manager_show();
+}
+
+static void layout_menu_wallpaper_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_to_root(lw);
+}
+
+static void layout_menu_zoom_in_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_zoom_adjust(lw, get_zoom_increment());
+}
+
+static void layout_menu_zoom_out_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_zoom_adjust(lw, -get_zoom_increment());
+}
+
+static void layout_menu_zoom_1_1_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_zoom_set(lw, 1.0);
+}
+
+static void layout_menu_zoom_fit_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_zoom_set(lw, 0.0);
+}
+
+static void layout_menu_thumb_cb(GtkToggleAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_thumb_set(lw, gtk_toggle_action_get_active(action));
+}
+
+static void layout_menu_list_cb(GtkRadioAction *action, GtkRadioAction *current, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_views_set(lw, lw->tree_view, (gtk_radio_action_get_current_value(action) == 1));
+}
+
+#if 0
+static void layout_menu_icon_cb(gpointer data, guint action, GtkWidget *widget)
+{
+       LayoutWindow *lw = data;
+
+       if (!GTK_CHECK_MENU_ITEM(widget)->active) return;
+
+       layout_views_set(lw, lw->tree_view, TRUE);
+}
+#endif
+
+static void layout_menu_tree_cb(GtkToggleAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_views_set(lw, gtk_toggle_action_get_active(action), lw->icon_view);
+}
+
+static void layout_menu_fullscreen_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_full_screen_toggle(lw);
+}
+
+static void layout_menu_refresh_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_refresh(lw);
+}
+
+static void layout_menu_float_cb(GtkToggleAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       if (lw->tools_float != gtk_toggle_action_get_active(action))
+               {
+               layout_tools_float_toggle(lw);
+               }
+}
+
+static void layout_menu_hide_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_tools_hide_toggle(lw);
+}
+
+static void layout_menu_toolbar_cb(GtkToggleAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       if (lw->toolbar_hidden != gtk_toggle_action_get_active(action))
+               {
+               layout_toolbar_toggle(lw);
+               }
+}
+
+static void layout_menu_bar_info_cb(GtkToggleAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       if (lw->bar_info_enabled != gtk_toggle_action_get_active(action))
+               {
+               layout_bar_info_toggle(lw);
+               }
+}
+
+static void layout_menu_bar_exif_cb(GtkToggleAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       if (lw->bar_exif_enabled != gtk_toggle_action_get_active(action))
+               {
+               layout_bar_exif_toggle(lw);
+               }
+}
+
+static void layout_menu_bar_sort_cb(GtkToggleAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       if (lw->bar_sort_enabled != gtk_toggle_action_get_active(action))
+               {
+               layout_bar_sort_toggle(lw);
+               }
+}
+
+static void layout_menu_slideshow_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_slideshow_toggle(lw);
+}
+
+static void layout_menu_help_cb(GtkAction *action, gpointer data)
+{
+       help_window_show("html_contents");
+}
+
+static void layout_menu_help_keys_cb(GtkAction *action, gpointer data)
+{
+       help_window_show("documentation");
+}
+
+static void layout_menu_notes_cb(GtkAction *action, gpointer data)
+{
+       help_window_show("release_notes");
+}
+
+static void layout_menu_about_cb(GtkAction *action, gpointer data)
+{
+       show_about_window();
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * edit menu
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void layout_menu_edit_cb(GtkAction *action, gpointer data)
+{
+       LayoutWindow *lw = data;
+       GList *list;
+       gint n;
+
+       n = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(action), "edit_index"));
+
+       list = layout_selection_list(lw);
+       start_editor_from_path_list(n, list);
+       path_list_free(list);
+}
+
+static void layout_menu_edit_update(LayoutWindow *lw)
+{
+       gint i;
+
+       /* main edit menu */
+
+       if (!lw->action_group) return;
+
+       for (i = 0; i < 10; i++)
+               {
+               gchar *key;
+               GtkAction *action;
+
+               key = g_strdup_printf("Editor%d", i);
+
+               action = gtk_action_group_get_action(lw->action_group, key);
+               g_object_set_data(G_OBJECT(action), "edit_index", GINT_TO_POINTER(i));
+
+               if (editor_command[i] && strlen(editor_command[i]) > 0)
+                       {
+                       gchar *text;
+
+                       if (editor_name[i] && strlen(editor_name[i]) > 0)
+                               {
+                               text = g_strdup_printf(_("in %s..."), editor_name[i]);
+                               }
+                       else
+                               {
+                               text = g_strdup(_("in (unknown)..."));
+                               }
+                       g_object_set(action, "label", text,
+                                            "sensitive", TRUE, NULL);
+                       g_free(text);
+                       }
+               else
+                       {
+                       g_object_set(action, "label", _("empty"),
+                                            "sensitive", FALSE, NULL);
+                       }
+
+               g_free(key);
+               }
+}
+
+void layout_edit_update_all(void)
+{
+       GList *work;
+
+       work = layout_window_list;
+       while (work)
+               {
+               LayoutWindow *lw = work->data;
+               work = work->next;
+
+               layout_menu_edit_update(lw);
+               }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * recent menu
+ *-----------------------------------------------------------------------------
+ */
+
+static void layout_menu_recent_cb(GtkWidget *widget, gpointer data)
+{
+       gint n;
+       gchar *path;
+
+       n = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "recent_index"));
+
+       path = g_list_nth_data(history_list_get_by_key("recent"), n);
+
+       if (!path) return;
+
+       /* make a copy of it */
+       path = g_strdup(path);
+       collection_window_new(path);
+       g_free(path);
+}
+
+static void layout_menu_recent_update(LayoutWindow *lw)
+{
+       GtkWidget *menu;
+       GtkWidget *recent;
+       GtkWidget *item;
+       GList *list;
+       gint n;
+
+       if (!lw->ui_manager) return;
+
+       list = history_list_get_by_key("recent");
+       n = 0;
+
+       menu = gtk_menu_new();
+
+       while (list)
+               {
+               item = menu_item_add_simple(menu, filename_from_path((gchar *)list->data),
+                                           G_CALLBACK(layout_menu_recent_cb), lw);
+               g_object_set_data(G_OBJECT(item), "recent_index", GINT_TO_POINTER(n));
+               list = list->next;
+               n++;
+               }
+
+       if (n == 0)
+               {
+               menu_item_add(menu, _("Empty"), NULL, NULL);
+               }
+
+       recent = gtk_ui_manager_get_widget(lw->ui_manager, "/MainMenu/FileMenu/OpenRecent");
+       gtk_menu_item_set_submenu(GTK_MENU_ITEM(recent), menu);
+       gtk_widget_set_sensitive(recent, (n != 0));
+}
+
+void layout_recent_update_all(void)
+{
+       GList *work;
+
+       work = layout_window_list;
+       while (work)
+               {
+               LayoutWindow *lw = work->data;
+               work = work->next;
+
+               layout_menu_recent_update(lw);
+               }
+}
+
+void layout_recent_add_path(const gchar *path)
+{
+       if (!path) return;
+
+       history_list_add_to_key("recent", path, recent_list_max);
+
+       layout_recent_update_all();
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * menu
+ *-----------------------------------------------------------------------------
+ */ 
+
+#define CB G_CALLBACK
+
+static GtkActionEntry menu_entries[] = {
+  { "FileMenu",                NULL,           N_("_File") },
+  { "EditMenu",                NULL,           N_("_Edit") },
+  { "AdjustMenu",      NULL,           N_("_Adjust") },
+  { "ViewMenu",                NULL,           N_("_View") },
+  { "HelpMenu",                NULL,           N_("_Help") },
+
+  { "NewWindow",       GTK_STOCK_NEW,  N_("New _window"),      NULL,           NULL,   CB(layout_menu_new_window_cb) },
+  { "NewCollection",   GTK_STOCK_INDEX,N_("_New collection"),  "C",            NULL,   CB(layout_menu_new_cb) },
+  { "OpenCollection",  GTK_STOCK_OPEN, N_("_Open collection..."),"O",          NULL,   CB(layout_menu_open_cb) },
+  { "OpenRecent",      NULL,           N_("Open _recent") },
+  { "Search",          GTK_STOCK_FIND, N_("_Search..."),       "F3",           NULL,   CB(layout_menu_search_cb) },
+  { "FindDupes",       GTK_STOCK_FIND, N_("_Find duplicates..."),"D",          NULL,   CB(layout_menu_dupes_cb) },
+  { "Print",           GTK_STOCK_PRINT,N_("_Print..."),        "<shift>P",     NULL,   CB(layout_menu_print_cb) },
+  { "NewFolder",       NULL,           N_("N_ew folder..."),   "<control>F",   NULL,   CB(layout_menu_dir_cb) },
+  { "Copy",            NULL,           N_("_Copy..."),         "<control>C",   NULL,   CB(layout_menu_copy_cb) },
+  { "Move",            NULL,           N_("_Move..."),         "<control>M",   NULL,   CB(layout_menu_move_cb) },
+  { "Rename",          NULL,           N_("_Rename..."),       "<control>R",   NULL,   CB(layout_menu_rename_cb) },
+  { "Delete",  GTK_STOCK_DELETE,       N_("_Delete..."),       "<control>D",   NULL,   CB(layout_menu_delete_cb) },
+  { "CloseWindow",     GTK_STOCK_CLOSE,N_("C_lose window"),    "<control>W",   NULL,   CB(layout_menu_close_cb) },
+  { "Quit",            GTK_STOCK_QUIT, N_("_Quit"),            "<control>Q",   NULL,   CB(layout_menu_exit_cb) },
+
+  { "Editor0",         NULL,           "editor0",              "<control>1",   NULL,   CB(layout_menu_edit_cb) },
+  { "Editor1",         NULL,           "editor1",              "<control>2",   NULL,   CB(layout_menu_edit_cb) },
+  { "Editor2",         NULL,           "editor2",              "<control>3",   NULL,   CB(layout_menu_edit_cb) },
+  { "Editor3",         NULL,           "editor3",              "<control>4",   NULL,   CB(layout_menu_edit_cb) },
+  { "Editor4",         NULL,           "editor4",              "<control>5",   NULL,   CB(layout_menu_edit_cb) },
+  { "Editor5",         NULL,           "editor5",              "<control>6",   NULL,   CB(layout_menu_edit_cb) },
+  { "Editor6",         NULL,           "editor6",              "<control>7",   NULL,   CB(layout_menu_edit_cb) },
+  { "Editor7",         NULL,           "editor7",              "<control>8",   NULL,   CB(layout_menu_edit_cb) },
+  { "Editor8",         NULL,           "editor8",              "<control>9",   NULL,   CB(layout_menu_edit_cb) },
+  { "Editor9",         NULL,           "editor9",              "<control>0",   NULL,   CB(layout_menu_edit_cb) },
+  { "RotateCW",                NULL,   N_("_Rotate clockwise"),        "bracketright", NULL,   CB(layout_menu_alter_90_cb) },
+  { "RotateCCW",       NULL,   N_("Rotate _counterclockwise"), "bracketleft",  NULL,   CB(layout_menu_alter_90cc_cb) },
+  { "Rotate180",       NULL,           N_("Rotate 1_80"),      "<shift>R",     NULL,   CB(layout_menu_alter_180_cb) },
+  { "Mirror",          NULL,           N_("_Mirror"),          "<shift>M",     NULL,   CB(layout_menu_alter_mirror_cb) },
+  { "Flip",            NULL,           N_("_Flip"),            "<shift>F",     NULL,   CB(layout_menu_alter_flip_cb) },
+  { "Properties",GTK_STOCK_PROPERTIES, N_("_Properties"),      "<control>P",   NULL,   CB(layout_menu_info_cb) },
+  { "SelectAll",       NULL,           N_("Select _all"),      "<control>A",   NULL,   CB(layout_menu_select_all_cb) },
+  { "SelectNone",      NULL,           N_("Select _none"), "<control><shift>A",NULL,   CB(layout_menu_unselect_all_cb) },
+  { "Preferences",GTK_STOCK_PREFERENCES,N_("P_references..."), "<control>O",   NULL,   CB(layout_menu_config_cb) },
+  { "Maintenance",     NULL,           N_("_Thumbnail maintenance..."),NULL,   NULL,   CB(layout_menu_remove_thumb_cb) },
+  { "Wallpaper",       NULL,           N_("Set as _wallpaper"),NULL,           NULL,   CB(layout_menu_wallpaper_cb) },
+
+  { "ZoomIn",  GTK_STOCK_ZOOM_IN,      N_("Zoom _in"),         "equal",        NULL,   CB(layout_menu_zoom_in_cb) },
+  { "ZoomOut", GTK_STOCK_ZOOM_OUT,     N_("Zoom _out"),        "minus",        NULL,   CB(layout_menu_zoom_out_cb) },
+  { "Zoom100", GTK_STOCK_ZOOM_100,     N_("Zoom _1:1"),        "Z",            NULL,   CB(layout_menu_zoom_1_1_cb) },
+  { "ZoomFit", GTK_STOCK_ZOOM_FIT,     N_("_Zoom to fit"),     "X",            NULL,   CB(layout_menu_zoom_fit_cb) },
+  { "FullScreen",      NULL,           N_("F_ull screen"),     "F",            NULL,   CB(layout_menu_fullscreen_cb) },
+  { "HideTools",       NULL,           N_("_Hide file list"),  "<control>H",   NULL,   CB(layout_menu_hide_cb) },
+  { "SlideShow",       NULL,           N_("Toggle _slideshow"),"S",            NULL,   CB(layout_menu_slideshow_cb) },
+  { "Refresh", GTK_STOCK_REFRESH,      N_("_Refresh"),         "R",            NULL,   CB(layout_menu_refresh_cb) },
+
+  { "HelpContents",    GTK_STOCK_HELP, N_("_Contents"),        "F1",           NULL,   CB(layout_menu_help_cb) },
+  { "HelpShortcuts",   NULL,           N_("_Keyboard shortcuts"),NULL,         NULL,   CB(layout_menu_help_keys_cb) },
+  { "HelpNotes",       NULL,           N_("_Release notes"),   NULL,           NULL,   CB(layout_menu_notes_cb) },
+  { "About",           NULL,           N_("_About"),           NULL,           NULL,   CB(layout_menu_about_cb) }
+};
+
+static GtkToggleActionEntry menu_toggle_entries[] = {
+  { "Thumbnails",      NULL,           N_("_Thumbnails"),      "T",            NULL,   CB(layout_menu_thumb_cb) },
+  { "FolderTree",      NULL,           N_("Tr_ee"),            "<control>T",   NULL,   CB(layout_menu_tree_cb) },
+  { "FloatTools",      NULL,           N_("_Float file list"), "L",            NULL,   CB(layout_menu_float_cb) },
+  { "HideToolbar",     NULL,           N_("Hide tool_bar"),    NULL,           NULL,   CB(layout_menu_toolbar_cb) },
+  { "SBarKeywords",    NULL,           N_("_Keywords"),        "<control>K",   NULL,   CB(layout_menu_bar_info_cb) },
+  { "SBarExif",                NULL,           N_("E_xif data"),       "<control>E",   NULL,   CB(layout_menu_bar_exif_cb) },
+  { "SBarSort",                NULL,           N_("Sort _manager"),    "<control>S",   NULL,   CB(layout_menu_bar_sort_cb) }
+};
+
+static GtkRadioActionEntry menu_radio_entries[] = {
+  { "ViewList",                NULL,           N_("_List"),            "<control>L",   NULL,   0 },
+  { "ViewIcons",       NULL,           N_("I_cons"),           "<control>I",   NULL,   1 }
+};
+
+#undef CB
+
+static const char *menu_ui_description =
+"<ui>"
+"  <menubar name='MainMenu'>"
+"    <menu action='FileMenu'>"
+"      <menuitem action='NewWindow'/>"
+"      <menuitem action='NewCollection'/>"
+"      <menuitem action='OpenCollection'/>"
+"      <menuitem action='OpenRecent'/>"
+"      <separator/>"
+"      <menuitem action='Search'/>"
+"      <menuitem action='FindDupes'/>"
+"      <separator/>"
+"      <menuitem action='Print'/>"
+"      <menuitem action='NewFolder'/>"
+"      <separator/>"
+"      <menuitem action='Copy'/>"
+"      <menuitem action='Move'/>"
+"      <menuitem action='Rename'/>"
+"      <menuitem action='Delete'/>"
+"      <separator/>"
+"      <menuitem action='CloseWindow'/>"
+"      <menuitem action='Quit'/>"
+"    </menu>"
+"    <menu action='EditMenu'>"
+"      <menuitem action='Editor0'/>"
+"      <menuitem action='Editor1'/>"
+"      <menuitem action='Editor2'/>"
+"      <menuitem action='Editor3'/>"
+"      <menuitem action='Editor4'/>"
+"      <menuitem action='Editor5'/>"
+"      <menuitem action='Editor6'/>"
+"      <menuitem action='Editor7'/>"
+"      <menuitem action='Editor8'/>"
+"      <menuitem action='Editor9'/>"
+"      <separator/>"
+"      <menu action='AdjustMenu'>"
+"        <menuitem action='RotateCW'/>"
+"        <menuitem action='RotateCCW'/>"
+"        <menuitem action='Rotate180'/>"
+"        <menuitem action='Mirror'/>"
+"        <menuitem action='Flip'/>"
+"      </menu>"
+"      <menuitem action='Properties'/>"
+"      <separator/>"
+"      <menuitem action='SelectAll'/>"
+"      <menuitem action='SelectNone'/>"
+"      <separator/>"
+"      <menuitem action='Preferences'/>"
+"      <menuitem action='Maintenance'/>"
+"      <separator/>"
+"      <menuitem action='Wallpaper'/>"
+"    </menu>"
+"    <menu action='ViewMenu'>"
+"      <separator/>"
+"      <menuitem action='ZoomIn'/>"
+"      <menuitem action='ZoomOut'/>"
+"      <menuitem action='Zoom100'/>"
+"      <menuitem action='ZoomFit'/>"
+"      <separator/>"
+"      <menuitem action='Thumbnails'/>"
+"      <menuitem action='ViewList'/>"
+"      <menuitem action='ViewIcons'/>"
+"      <separator/>"
+"      <menuitem action='FolderTree'/>"
+"      <menuitem action='FullScreen'/>"
+"      <separator/>"
+"      <menuitem action='FloatTools'/>"
+"      <menuitem action='HideTools'/>"
+"      <menuitem action='HideToolbar'/>"
+"      <separator/>"
+"      <menuitem action='SBarKeywords'/>"
+"      <menuitem action='SBarExif'/>"
+"      <menuitem action='SBarSort'/>"
+"      <separator/>"
+"      <menuitem action='SlideShow'/>"
+"      <menuitem action='Refresh'/>"
+"    </menu>"
+"    <menu action='HelpMenu'>"
+"      <separator/>"
+"      <menuitem action='HelpContents'/>"
+"      <menuitem action='HelpShortcuts'/>"
+"      <menuitem action='HelpNotes'/>"
+"      <separator/>"
+"      <menuitem action='About'/>"
+"    </menu>"
+"  </menubar>"
+"</ui>";
+
+
+static gchar *menu_translate(const gchar *path, gpointer data)
+{
+       return _(path);
+}
+
+void layout_actions_setup(LayoutWindow *lw)
+{
+       GError *error;
+
+       if (lw->ui_manager) return;
+
+       lw->action_group = gtk_action_group_new ("MenuActions");
+       gtk_action_group_set_translate_func(lw->action_group, menu_translate, NULL, NULL);
+
+       gtk_action_group_add_actions(lw->action_group,
+                                    menu_entries, G_N_ELEMENTS(menu_entries), lw);
+       gtk_action_group_add_toggle_actions(lw->action_group,
+                                           menu_toggle_entries, G_N_ELEMENTS(menu_toggle_entries), lw);
+       gtk_action_group_add_radio_actions(lw->action_group,
+                                          menu_radio_entries, G_N_ELEMENTS(menu_radio_entries),
+                                          0, G_CALLBACK(layout_menu_list_cb), lw);
+
+       lw->ui_manager = gtk_ui_manager_new();
+       gtk_ui_manager_set_add_tearoffs(lw->ui_manager, TRUE);
+       gtk_ui_manager_insert_action_group(lw->ui_manager, lw->action_group, 0);
+
+       error = NULL;
+       if (!gtk_ui_manager_add_ui_from_string(lw->ui_manager, menu_ui_description, -1, &error))
+               {
+               g_message ("building menus failed: %s", error->message);
+               g_error_free (error);
+               exit (EXIT_FAILURE);
+               }
+}
+
+void layout_actions_add_window(LayoutWindow *lw, GtkWidget *window)
+{
+       GtkAccelGroup *group;
+
+       if (!lw->ui_manager) return;
+
+       group = gtk_ui_manager_get_accel_group(lw->ui_manager);
+       gtk_window_add_accel_group(GTK_WINDOW(window), group);
+}
+
+GtkWidget *layout_actions_menu_bar(LayoutWindow *lw)
+{
+       return gtk_ui_manager_get_widget(lw->ui_manager, "/MainMenu");
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * toolbar
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void layout_button_thumb_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_thumb_set(lw, GTK_TOGGLE_BUTTON(widget)->active);
+}
+
+static void layout_button_home_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+       const gchar *path = homedir();
+
+       if (path) layout_set_path(lw, path);
+}
+
+static void layout_button_refresh_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_refresh(lw);
+}
+
+static void layout_button_zoom_in_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_zoom_adjust(lw, get_zoom_increment());
+}
+
+static void layout_button_zoom_out_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_zoom_adjust(lw, -get_zoom_increment());
+}
+
+static void layout_button_zoom_fit_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_zoom_set(lw, 0.0);
+}
+
+static void layout_button_zoom_1_1_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_image_zoom_set(lw, 1.0);
+}
+
+static void layout_button_config_cb(GtkWidget *widget, gpointer data)
+{
+       show_config_window();
+}
+
+static void layout_button_float_cb(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       layout_tools_float_toggle(lw);
+}
+
+GtkWidget *layout_button(GtkWidget *box, gchar **pixmap_data, const gchar *stock_id, gint toggle,
+                        GtkTooltips *tooltips, const gchar *tip_text,
+                        GCallback func, gpointer data)
+{
+       GtkWidget *button;
+       GtkWidget *icon;
+
+       if (toggle)
+               {
+               button = gtk_toggle_button_new();
+               }
+       else
+               {
+               button = gtk_button_new();
+               }
+
+       g_signal_connect(G_OBJECT(button), "clicked", func, data);
+       gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+       gtk_tooltips_set_tip(tooltips, button, tip_text, NULL);
+
+       if (stock_id)
+               {
+               icon = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_BUTTON);
+               }
+       else
+               {
+               GdkPixbuf *pixbuf;
+
+               pixbuf = gdk_pixbuf_new_from_xpm_data((const char **)pixmap_data);
+               icon = gtk_image_new_from_pixbuf(pixbuf);
+               gdk_pixbuf_unref(pixbuf);
+               }
+
+       gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
+
+       gtk_container_add(GTK_CONTAINER(button), icon);
+       gtk_widget_show(icon);
+
+       return button;
+}
+
+GtkWidget *layout_button_bar(LayoutWindow *lw)
+{
+       GtkWidget *box;
+       GtkTooltips *tooltips;
+
+       tooltips = lw->tooltips;
+
+       box = gtk_hbox_new(FALSE, 0);
+
+       lw->thumb_button = layout_button(box, (gchar **)icon_thumb_xpm, NULL, TRUE,
+                     tooltips, _("Show thumbnails"), G_CALLBACK(layout_button_thumb_cb), lw);
+       layout_button(box, NULL, GTK_STOCK_HOME, FALSE,
+                     tooltips, _("Change to home folder"), G_CALLBACK(layout_button_home_cb), lw);
+       layout_button(box, NULL, GTK_STOCK_REFRESH, FALSE,
+                     tooltips, _("Refresh file list"), G_CALLBACK(layout_button_refresh_cb), lw);
+       layout_button(box, NULL, GTK_STOCK_ZOOM_IN, FALSE,
+                     tooltips, _("Zoom in"), G_CALLBACK(layout_button_zoom_in_cb), lw);
+       layout_button(box, NULL, GTK_STOCK_ZOOM_OUT, FALSE,
+                     tooltips, _("Zoom out"), G_CALLBACK(layout_button_zoom_out_cb), lw);
+       layout_button(box, NULL, GTK_STOCK_ZOOM_FIT, FALSE,
+                     tooltips, _("Fit image to window"), G_CALLBACK(layout_button_zoom_fit_cb), lw);
+       layout_button(box, NULL, GTK_STOCK_ZOOM_100, FALSE,
+                     tooltips, _("Set zoom 1:1"), G_CALLBACK(layout_button_zoom_1_1_cb), lw);
+       layout_button(box, NULL, GTK_STOCK_PREFERENCES, FALSE,
+                     tooltips, _("Configure options"), G_CALLBACK(layout_button_config_cb), lw);
+       layout_button(box, (gchar **)icon_float_xpm, NULL, FALSE,
+                     tooltips, _("Float Controls"), G_CALLBACK(layout_button_float_cb), lw);
+
+       return box;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * misc
+ *-----------------------------------------------------------------------------
+ */
+
+static void layout_util_sync_views(LayoutWindow *lw)
+{
+       GtkAction *action;
+
+       if (!lw->action_group) return;
+
+       action = gtk_action_group_get_action(lw->action_group, "FolderTree");
+       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->tree_view);
+
+       action = gtk_action_group_get_action(lw->action_group, "ViewIcons");
+       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->icon_view);
+
+       action = gtk_action_group_get_action(lw->action_group, "FloatTools");
+       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->tools_float);
+
+       action = gtk_action_group_get_action(lw->action_group, "SBarKeywords");
+       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->bar_info_enabled);
+
+       action = gtk_action_group_get_action(lw->action_group, "SBarExif");
+       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->bar_exif_enabled);
+
+       action = gtk_action_group_get_action(lw->action_group, "SBarSort");
+       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->bar_sort_enabled);
+
+       action = gtk_action_group_get_action(lw->action_group, "HideToolbar");
+       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->toolbar_hidden);
+}
+
+void layout_util_sync_thumb(LayoutWindow *lw)
+{
+       GtkAction *action;
+
+       if (!lw->action_group) return;
+
+       action = gtk_action_group_get_action(lw->action_group, "Thumbnails");
+       gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(action), lw->thumbs_enabled);
+       g_object_set(action, "sensitive", !lw->icon_view, NULL);
+
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lw->thumb_button), lw->thumbs_enabled);
+       gtk_widget_set_sensitive(lw->thumb_button, !lw->icon_view);
+}
+
+void layout_util_sync(LayoutWindow *lw)
+{
+       layout_util_sync_views(lw);
+       layout_util_sync_thumb(lw);
+       layout_menu_recent_update(lw);
+       layout_menu_edit_update(lw);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * icons (since all the toolbar icons are included here, best place as any)
+ *-----------------------------------------------------------------------------
+ */
+
+PixmapFolders *folder_icons_new(void)
+{
+       PixmapFolders *pf;
+
+       pf = g_new0(PixmapFolders, 1);
+
+       pf->close = pixbuf_inline(PIXBUF_INLINE_FOLDER_CLOSED);
+       pf->open = pixbuf_inline(PIXBUF_INLINE_FOLDER_OPEN);
+       pf->deny = pixbuf_inline(PIXBUF_INLINE_FOLDER_LOCKED);
+       pf->parent = pixbuf_inline(PIXBUF_INLINE_FOLDER_UP);
+
+       return pf;
+}
+
+void folder_icons_free(PixmapFolders *pf)
+{
+       if (!pf) return;
+
+       g_object_unref(pf->close);
+       g_object_unref(pf->open);
+       g_object_unref(pf->deny);
+       g_object_unref(pf->parent);
+
+       g_free(pf);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * sidebars
+ *-----------------------------------------------------------------------------
+ */
+
+#define SIDEBAR_WIDTH 288
+
+static void layout_bar_info_destroyed(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       lw->bar_info = NULL;
+
+       if (lw->utility_box)
+               {
+               /* destroyed from within itself */
+               lw->bar_info_enabled = FALSE;
+               layout_util_sync_views(lw);
+               }
+}
+
+static GList *layout_bar_info_list_cb(gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       return layout_selection_list(lw);
+}
+
+static void layout_bar_info_new(LayoutWindow *lw)
+{
+       if (!lw->utility_box) return;
+                                                                                                                    
+       lw->bar_info = bar_info_new(layout_image_get_path(lw), FALSE, lw->utility_box);
+       bar_info_set_selection_func(lw->bar_info, layout_bar_info_list_cb, lw);
+       bar_info_selection(lw->bar_info, layout_selection_count(lw, NULL) - 1);
+       bar_info_size_request(lw->bar_info, SIDEBAR_WIDTH * 3 / 4);
+       g_signal_connect(G_OBJECT(lw->bar_info), "destroy",
+                        G_CALLBACK(layout_bar_info_destroyed), lw);
+       lw->bar_info_enabled = TRUE;
+
+       gtk_box_pack_start(GTK_BOX(lw->utility_box), lw->bar_info, FALSE, FALSE, 0);
+       gtk_widget_show(lw->bar_info);
+}
+                                                                                                                    
+static void layout_bar_info_close(LayoutWindow *lw)
+{
+       if (lw->bar_info)
+               {
+               bar_info_close(lw->bar_info);
+               lw->bar_info = NULL;
+               }
+       lw->bar_info_enabled = FALSE;
+}
+
+void layout_bar_info_toggle(LayoutWindow *lw)
+{
+       if (lw->bar_info_enabled)
+               {
+               layout_bar_info_close(lw);
+               }
+       else
+               {
+               layout_bar_info_new(lw);
+               }
+}
+
+static void layout_bar_info_new_image(LayoutWindow *lw)
+{
+       if (!lw->bar_info || !lw->bar_info_enabled) return;
+
+       bar_info_set(lw->bar_info, layout_image_get_path(lw));
+}
+
+static void layout_bar_info_new_selection(LayoutWindow *lw, gint count)
+{
+       if (!lw->bar_info || !lw->bar_info_enabled) return;
+
+       bar_info_selection(lw->bar_info, count - 1);
+}
+
+static void layout_bar_info_maint_renamed(LayoutWindow *lw)
+{
+       if (!lw->bar_info || !lw->bar_info_enabled) return;
+
+       bar_info_maint_renamed(lw->bar_info, layout_image_get_path(lw));
+}
+
+static void layout_bar_exif_destroyed(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       if (lw->bar_exif)
+               {
+               lw->bar_exif_advanced = bar_exif_is_advanced(lw->bar_exif);
+               }
+
+       lw->bar_exif = NULL;
+       if (lw->utility_box)
+               {
+               /* destroyed from within itself */
+               lw->bar_exif_enabled = FALSE;
+               layout_util_sync_views(lw);
+               }
+}
+
+static void layout_bar_exif_sized(GtkWidget *widget, GtkAllocation *allocation, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       if (lw->bar_exif)
+               {
+               lw->bar_exif_size = allocation->width;
+               }
+}
+
+static void layout_bar_exif_new(LayoutWindow *lw)
+{
+       if (!lw->utility_box) return;
+
+       lw->bar_exif = bar_exif_new(TRUE, layout_image_get_path(lw),
+                                   lw->bar_exif_advanced, lw->utility_box);
+       g_signal_connect(G_OBJECT(lw->bar_exif), "destroy",
+                        G_CALLBACK(layout_bar_exif_destroyed), lw);
+       g_signal_connect(G_OBJECT(lw->bar_exif), "size_allocate",
+                        G_CALLBACK(layout_bar_exif_sized), lw);
+        lw->bar_exif_enabled = TRUE;
+
+       if (lw->bar_exif_size < 1) lw->bar_exif_size = SIDEBAR_WIDTH;
+       gtk_widget_set_size_request(lw->bar_exif, lw->bar_exif_size, -1);
+       gtk_box_pack_start(GTK_BOX(lw->utility_box), lw->bar_exif, FALSE, FALSE, 0);
+       if (lw->bar_info) gtk_box_reorder_child(GTK_BOX(lw->utility_box), lw->bar_exif, 1);
+       gtk_widget_show(lw->bar_exif);
+}
+
+static void layout_bar_exif_close(LayoutWindow *lw)
+{
+       if (lw->bar_exif)
+               {
+               bar_exif_close(lw->bar_exif);
+               lw->bar_exif = NULL;
+               }
+        lw->bar_exif_enabled = FALSE;
+}
+
+void layout_bar_exif_toggle(LayoutWindow *lw)
+{
+       if (lw->bar_exif_enabled)
+               {
+               layout_bar_exif_close(lw);
+               }
+       else
+               {
+               layout_bar_exif_new(lw);
+               }
+}
+
+static void layout_bar_exif_new_image(LayoutWindow *lw)
+{
+       if (!lw->bar_exif || !lw->bar_exif_enabled) return;
+
+       bar_exif_set(lw->bar_exif, layout_image_get_path(lw));
+}
+
+static void layout_bar_sort_destroyed(GtkWidget *widget, gpointer data)
+{
+       LayoutWindow *lw = data;
+
+       lw->bar_sort = NULL;
+
+       if (lw->utility_box)
+               {
+               /* destroyed from within itself */
+               lw->bar_sort_enabled = FALSE;
+
+               layout_util_sync_views(lw);
+               }
+}
+
+static void layout_bar_sort_new(LayoutWindow *lw)
+{
+       if (!lw->utility_box) return;
+
+       lw->bar_sort = bar_sort_new(lw);
+       g_signal_connect(G_OBJECT(lw->bar_sort), "destroy",
+                        G_CALLBACK(layout_bar_sort_destroyed), lw);
+       lw->bar_sort_enabled = TRUE;
+
+       gtk_box_pack_end(GTK_BOX(lw->utility_box), lw->bar_sort, FALSE, FALSE, 0);
+       gtk_widget_show(lw->bar_sort);
+}
+
+static void layout_bar_sort_close(LayoutWindow *lw)
+{
+       if (lw->bar_sort)
+               {
+               bar_sort_close(lw->bar_sort);
+               lw->bar_sort = NULL;
+               }
+       lw->bar_sort_enabled = FALSE;
+}
+
+void layout_bar_sort_toggle(LayoutWindow *lw)
+{
+       if (lw->bar_sort_enabled)
+               {
+               layout_bar_sort_close(lw);
+               }
+       else
+               {
+               layout_bar_sort_new(lw);
+               }
+}
+
+void layout_bars_new_image(LayoutWindow *lw)
+{
+       layout_bar_info_new_image(lw);
+       layout_bar_exif_new_image(lw);
+}
+
+void layout_bars_new_selection(LayoutWindow *lw, gint count)
+{
+       layout_bar_info_new_selection(lw, count);
+}
+
+GtkWidget *layout_bars_prepare(LayoutWindow *lw, GtkWidget *image)
+{
+       lw->utility_box = gtk_hbox_new(FALSE, PREF_PAD_GAP);
+       gtk_box_pack_start(GTK_BOX(lw->utility_box), image, TRUE, TRUE, 0);
+       gtk_widget_show(image);
+
+       if (lw->bar_sort_enabled)
+               {
+               layout_bar_sort_new(lw);
+               }
+
+       if (lw->bar_info_enabled)
+               {
+               layout_bar_info_new(lw);
+               }
+
+       if (lw->bar_exif_enabled)
+               {
+               layout_bar_exif_new(lw);
+               }
+
+       return lw->utility_box;
+}
+
+void layout_bars_close(LayoutWindow *lw)
+{
+       layout_bar_sort_close(lw);
+       layout_bar_exif_close(lw);
+       layout_bar_info_close(lw);
+}
+
+void layout_bars_maint_renamed(LayoutWindow *lw)
+{
+       layout_bar_info_maint_renamed(lw);
+}
+
diff --git a/src/layout_util.h b/src/layout_util.h
new file mode 100644 (file)
index 0000000..e89dde4
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef LAYOUT_UTIL_H
+#define LAYOUT_UTIL_H
+
+
+#include "layout.h"
+
+
+void layout_util_sync_thumb(LayoutWindow *lw);
+void layout_util_sync(LayoutWindow *lw);
+
+
+void layout_edit_update_all(void);
+
+void layout_recent_update_all(void);
+void layout_recent_add_path(const gchar *path);
+
+void layout_actions_setup(LayoutWindow *lw);
+void layout_actions_add_window(LayoutWindow *lw, GtkWidget *window);
+GtkWidget *layout_actions_menu_bar(LayoutWindow *lw);
+
+GtkWidget *layout_button(GtkWidget *box, gchar **pixmap_data, const gchar *stock_id, gint toggle,
+                        GtkTooltips *tooltips, const gchar *tip_text,
+                        GtkSignalFunc func, gpointer data);
+GtkWidget *layout_button_bar(LayoutWindow *lw);
+
+void layout_keyboard_init(LayoutWindow *lw, GtkWidget *window);
+
+
+PixmapFolders *folder_icons_new(void);
+void folder_icons_free(PixmapFolders *pf);
+
+
+void layout_bar_info_toggle(LayoutWindow *lw);
+void layout_bar_exif_toggle(LayoutWindow *lw);
+void layout_bar_sort_toggle(LayoutWindow *lw);
+
+void layout_bars_new_image(LayoutWindow *lw);
+void layout_bars_new_selection(LayoutWindow *lw, gint count);
+
+GtkWidget *layout_bars_prepare(LayoutWindow *lw, GtkWidget *image);
+void layout_bars_close(LayoutWindow *lw);
+
+void layout_bars_maint_renamed(LayoutWindow *lw);
+
+
+#endif
diff --git a/src/logo.h b/src/logo.h
deleted file mode 100644 (file)
index fc310f6..0000000
+++ /dev/null
@@ -1,3507 +0,0 @@
-/* Imlib raw rgb data file created by convertrgb */
-
-const int logo_width  = 200;
-const int logo_height = 70;
-const GdkImlibColor logo_alpha  = { -1, -1, -1, 0 };
-const unsigned char logo[] = {
-0x13, 0x16, 0x42, 0x23, 0x28, 0x75, 0x19, 0x1d, 0x53, 0x12, 0x15, 0x3a,
-0x12, 0x16, 0x3b, 0x13, 0x17, 0x3c, 0x15, 0x17, 0x3d, 0x15, 0x18, 0x3d,
-0x16, 0x19, 0x3e, 0x17, 0x1a, 0x3f, 0x18, 0x1b, 0x3f, 0x17, 0x1a, 0x40,
-0x16, 0x1a, 0x41, 0x15, 0x18, 0x42, 0x15, 0x18, 0x42, 0x14, 0x17, 0x43,
-0x13, 0x16, 0x44, 0x12, 0x16, 0x45, 0x13, 0x16, 0x46, 0x15, 0x18, 0x47,
-0x16, 0x1a, 0x47, 0x18, 0x1c, 0x48, 0x1a, 0x1e, 0x4a, 0x1d, 0x20, 0x4a,
-0x1a, 0x1e, 0x4b, 0x17, 0x1b, 0x4d, 0x15, 0x18, 0x4e, 0x12, 0x16, 0x4e,
-0x10, 0x15, 0x4f, 0x12, 0x15, 0x51, 0x14, 0x17, 0x52, 0x16, 0x1a, 0x53,
-0x1a, 0x1e, 0x54, 0x1d, 0x22, 0x55, 0x1e, 0x22, 0x57, 0x1f, 0x24, 0x58,
-0x20, 0x25, 0x59, 0x21, 0x26, 0x5a, 0x22, 0x27, 0x5c, 0x22, 0x27, 0x5d,
-0x24, 0x29, 0x5e, 0x21, 0x26, 0x5f, 0x1e, 0x23, 0x61, 0x1c, 0x21, 0x62,
-0x1a, 0x1f, 0x64, 0x1a, 0x1f, 0x64, 0x18, 0x1d, 0x66, 0x20, 0x26, 0x67,
-0x28, 0x2f, 0x5f, 0x1b, 0x1f, 0x3b, 0x2b, 0x31, 0x6b, 0x23, 0x29, 0x6c,
-0x1f, 0x24, 0x6d, 0x1b, 0x21, 0x6e, 0x20, 0x26, 0x6f, 0x2f, 0x35, 0x6f,
-0x1e, 0x22, 0x41, 0x22, 0x27, 0x4d, 0x27, 0x2d, 0x58, 0x2b, 0x32, 0x62,
-0x2d, 0x35, 0x73, 0x25, 0x2c, 0x74, 0x23, 0x29, 0x74, 0x25, 0x2c, 0x74,
-0x22, 0x28, 0x74, 0x1d, 0x23, 0x75, 0x21, 0x27, 0x75, 0x2a, 0x32, 0x75,
-0x27, 0x2d, 0x74, 0x23, 0x29, 0x74, 0x22, 0x27, 0x74, 0x20, 0x26, 0x74,
-0x1e, 0x23, 0x73, 0x1f, 0x25, 0x73, 0x2c, 0x33, 0x72, 0x25, 0x2b, 0x55,
-0x26, 0x2d, 0x71, 0x22, 0x27, 0x6f, 0x27, 0x2f, 0x6f, 0x2b, 0x32, 0x6d,
-0x24, 0x2a, 0x6d, 0x20, 0x25, 0x6c, 0x22, 0x27, 0x6b, 0x24, 0x2a, 0x6a,
-0x26, 0x2d, 0x69, 0x28, 0x2f, 0x67, 0x28, 0x2e, 0x67, 0x25, 0x2a, 0x65,
-0x22, 0x27, 0x64, 0x21, 0x26, 0x64, 0x21, 0x26, 0x62, 0x20, 0x25, 0x62,
-0x1f, 0x24, 0x60, 0x1e, 0x22, 0x5f, 0x1d, 0x21, 0x5e, 0x1d, 0x22, 0x5d,
-0x1e, 0x24, 0x5c, 0x1f, 0x25, 0x5a, 0x21, 0x26, 0x5a, 0x22, 0x27, 0x58,
-0x24, 0x29, 0x57, 0x20, 0x25, 0x4a, 0x20, 0x25, 0x4b, 0x21, 0x26, 0x54,
-0x1e, 0x22, 0x53, 0x1b, 0x1f, 0x52, 0x19, 0x1d, 0x50, 0x19, 0x1d, 0x50,
-0x1a, 0x1e, 0x4f, 0x1a, 0x1e, 0x4d, 0x1a, 0x1f, 0x4d, 0x1c, 0x1f, 0x4b,
-0x1a, 0x1e, 0x4a, 0x18, 0x1c, 0x4a, 0x16, 0x1a, 0x48, 0x15, 0x18, 0x47,
-0x13, 0x16, 0x47, 0x12, 0x15, 0x46, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45,
-0x12, 0x15, 0x43, 0x12, 0x15, 0x42, 0x12, 0x15, 0x41, 0x11, 0x15, 0x41,
-0x11, 0x15, 0x3f, 0x11, 0x15, 0x3f, 0x11, 0x15, 0x3f, 0x11, 0x15, 0x3d,
-0x11, 0x15, 0x3d, 0x11, 0x15, 0x3d, 0x11, 0x14, 0x3b, 0x11, 0x14, 0x3b,
-0x11, 0x14, 0x3a, 0x10, 0x13, 0x39, 0x10, 0x13, 0x39, 0x10, 0x12, 0x38,
-0x10, 0x12, 0x37, 0x0f, 0x12, 0x37, 0x0f, 0x12, 0x36, 0x0f, 0x12, 0x35,
-0x0f, 0x12, 0x35, 0x0f, 0x11, 0x35, 0x0e, 0x10, 0x34, 0x0e, 0x10, 0x33,
-0x0e, 0x10, 0x33, 0x0e, 0x10, 0x32, 0x0d, 0x0f, 0x32, 0x0d, 0x0f, 0x32,
-0x0d, 0x0f, 0x31, 0x0d, 0x0f, 0x30, 0x0d, 0x0f, 0x2f, 0x0d, 0x0f, 0x2f,
-0x0c, 0x0e, 0x2f, 0x0b, 0x0d, 0x2e, 0x0b, 0x0d, 0x2d, 0x0b, 0x0d, 0x2d,
-0x0a, 0x0d, 0x2d, 0x0a, 0x0d, 0x2d, 0x0a, 0x0d, 0x2c, 0x0a, 0x0d, 0x2c,
-0x0a, 0x0d, 0x2c, 0x0a, 0x0c, 0x2b, 0x0a, 0x0c, 0x2a, 0x0a, 0x0c, 0x2a,
-0x0a, 0x0c, 0x2a, 0x0a, 0x0b, 0x2a, 0x0a, 0x0b, 0x29, 0x0a, 0x0b, 0x29,
-0x0a, 0x0b, 0x28, 0x0a, 0x0b, 0x28, 0x0a, 0x0b, 0x27, 0x0a, 0x0b, 0x27,
-0x0a, 0x0b, 0x27, 0x09, 0x0b, 0x26, 0x09, 0x0b, 0x26, 0x0a, 0x0b, 0x26,
-0x09, 0x0a, 0x26, 0x0a, 0x0b, 0x26, 0x09, 0x0a, 0x25, 0x09, 0x0a, 0x25,
-0x09, 0x0a, 0x24, 0x09, 0x0a, 0x24, 0x09, 0x0a, 0x24, 0x09, 0x0a, 0x24,
-0x09, 0x0a, 0x23, 0x09, 0x0a, 0x23, 0x09, 0x0a, 0x22, 0x09, 0x0a, 0x22,
-0x09, 0x0a, 0x22, 0x09, 0x0a, 0x22, 0x08, 0x0a, 0x22, 0x08, 0x0a, 0x22,
-0x08, 0x0a, 0x21, 0x08, 0x0a, 0x21, 0x07, 0x09, 0x20, 0x07, 0x09, 0x20,
-0x07, 0x09, 0x20, 0x07, 0x09, 0x20, 0x07, 0x09, 0x1f, 0x02, 0x02, 0x08,
-0x2c, 0x34, 0x9d, 0x3d, 0x4a, 0xd5, 0x3b, 0x45, 0xc6, 0x37, 0x41, 0xba,
-0x3a, 0x42, 0xbb, 0x3c, 0x46, 0xbc, 0x3d, 0x47, 0xbe, 0x3e, 0x4a, 0xc1,
-0x43, 0x4c, 0xc2, 0x47, 0x51, 0xc4, 0x4a, 0x55, 0xc7, 0x4e, 0x58, 0xca,
-0x4e, 0x59, 0xcc, 0x4c, 0x58, 0xcf, 0x49, 0x54, 0xd0, 0x47, 0x51, 0xd4,
-0x43, 0x4e, 0xd5, 0x41, 0x4c, 0xd9, 0x3e, 0x49, 0xdc, 0x3d, 0x47, 0xde,
-0x41, 0x4e, 0xe1, 0x47, 0x51, 0xe5, 0x4a, 0x58, 0xe7, 0x51, 0x60, 0xeb,
-0x59, 0x66, 0xef, 0x59, 0x67, 0xf2, 0x51, 0x5d, 0xf3, 0x47, 0x54, 0xf8,
-0x3e, 0x4c, 0xfc, 0x38, 0x46, 0xfe, 0x38, 0x43, 0xff, 0x3e, 0x4a, 0xff,
-0x47, 0x53, 0xff, 0x51, 0x5e, 0xff, 0x5e, 0x6c, 0xff, 0x63, 0x70, 0xff,
-0x66, 0x75, 0xff, 0x6a, 0x78, 0xff, 0x6c, 0x7d, 0xff, 0x6f, 0x81, 0xff,
-0x70, 0x82, 0xff, 0x73, 0x83, 0xff, 0x6a, 0x7a, 0xff, 0x60, 0x70, 0xff,
-0x59, 0x67, 0xff, 0x55, 0x65, 0xff, 0x53, 0x61, 0xff, 0x55, 0x66, 0xff,
-0x75, 0x87, 0xff, 0x4a, 0x54, 0xa0, 0x73, 0x86, 0xff, 0x7e, 0x93, 0xff,
-0x6b, 0x7d, 0xff, 0x5e, 0x70, 0xff, 0x5d, 0x6c, 0xff, 0x82, 0x95, 0xff,
-0x4f, 0x5d, 0xac, 0x66, 0x77, 0xdc, 0x78, 0x89, 0xff, 0x86, 0x98, 0xff,
-0x98, 0xab, 0xff, 0x7d, 0x92, 0xff, 0x70, 0x83, 0xff, 0x7a, 0x8e, 0xff,
-0x70, 0x83, 0xff, 0x60, 0x70, 0xff, 0x6a, 0x7e, 0xff, 0x89, 0xa0, 0xff,
-0x7e, 0x94, 0xff, 0x70, 0x86, 0xff, 0x6b, 0x7e, 0xff, 0x66, 0x7a, 0xff,
-0x60, 0x72, 0xff, 0x6a, 0x7e, 0xff, 0x8a, 0x9e, 0xff, 0x8a, 0xa0, 0xff,
-0x72, 0x86, 0xff, 0x73, 0x87, 0xff, 0x8a, 0xa0, 0xff, 0x82, 0x98, 0xff,
-0x6f, 0x82, 0xff, 0x6b, 0x7d, 0xff, 0x72, 0x86, 0xff, 0x7c, 0x8e, 0xff,
-0x81, 0x94, 0xff, 0x89, 0x9c, 0xff, 0x7c, 0x8f, 0xff, 0x72, 0x83, 0xff,
-0x6b, 0x7d, 0xff, 0x6b, 0x7c, 0xff, 0x6b, 0x7a, 0xff, 0x65, 0x77, 0xff,
-0x61, 0x72, 0xff, 0x5e, 0x6f, 0xff, 0x60, 0x70, 0xff, 0x63, 0x73, 0xff,
-0x67, 0x78, 0xff, 0x6c, 0x7c, 0xff, 0x72, 0x81, 0xff, 0x72, 0x7e, 0xff,
-0x65, 0x70, 0xe1, 0x67, 0x73, 0xed, 0x6b, 0x7a, 0xff, 0x60, 0x6c, 0xff,
-0x58, 0x65, 0xff, 0x51, 0x5e, 0xff, 0x54, 0x61, 0xfe, 0x55, 0x63, 0xfc,
-0x55, 0x65, 0xf8, 0x59, 0x66, 0xf5, 0x5a, 0x67, 0xf2, 0x53, 0x5e, 0xef,
-0x4a, 0x58, 0xeb, 0x46, 0x51, 0xe7, 0x41, 0x4c, 0xe5, 0x3d, 0x47, 0xe1,
-0x3a, 0x43, 0xde, 0x3a, 0x43, 0xdb, 0x3a, 0x43, 0xd9, 0x3a, 0x46, 0xd8,
-0x3a, 0x43, 0xd4, 0x3a, 0x43, 0xd0, 0x3a, 0x46, 0xce, 0x3a, 0x46, 0xcc,
-0x3a, 0x43, 0xc9, 0x38, 0x43, 0xc7, 0x38, 0x43, 0xc4, 0x38, 0x42, 0xc2,
-0x38, 0x41, 0xbe, 0x38, 0x41, 0xbd, 0x38, 0x41, 0xbc, 0x38, 0x41, 0xbb,
-0x37, 0x3e, 0xb7, 0x37, 0x3e, 0xb5, 0x35, 0x3d, 0xb3, 0x33, 0x3c, 0xb0,
-0x33, 0x3c, 0xaf, 0x31, 0x3a, 0xac, 0x31, 0x3a, 0xab, 0x30, 0x38, 0xaa,
-0x2f, 0x37, 0xa6, 0x2f, 0x35, 0xa5, 0x2c, 0x35, 0xa3, 0x2c, 0x33, 0xa1,
-0x2c, 0x33, 0xa0, 0x2b, 0x33, 0x9e, 0x2b, 0x31, 0x9c, 0x2a, 0x30, 0x9b,
-0x28, 0x30, 0x99, 0x28, 0x2f, 0x98, 0x28, 0x2f, 0x95, 0x26, 0x2c, 0x94,
-0x25, 0x2b, 0x93, 0x25, 0x2b, 0x93, 0x25, 0x2b, 0x92, 0x23, 0x2a, 0x8f,
-0x23, 0x2a, 0x8e, 0x23, 0x28, 0x8c, 0x21, 0x28, 0x8c, 0x21, 0x28, 0x8a,
-0x21, 0x26, 0x89, 0x21, 0x26, 0x87, 0x20, 0x26, 0x86, 0x20, 0x26, 0x86,
-0x20, 0x26, 0x83, 0x20, 0x26, 0x82, 0x20, 0x26, 0x82, 0x20, 0x26, 0x81,
-0x20, 0x26, 0x7e, 0x20, 0x26, 0x7e, 0x20, 0x26, 0x7d, 0x20, 0x25, 0x7c,
-0x20, 0x25, 0x7c, 0x20, 0x25, 0x78, 0x20, 0x25, 0x78, 0x20, 0x25, 0x78,
-0x20, 0x25, 0x77, 0x20, 0x25, 0x77, 0x1e, 0x23, 0x73, 0x1e, 0x23, 0x73,
-0x1e, 0x23, 0x72, 0x1e, 0x23, 0x72, 0x1e, 0x23, 0x70, 0x1e, 0x23, 0x70,
-0x1d, 0x23, 0x6f, 0x1d, 0x23, 0x6f, 0x1d, 0x21, 0x6c, 0x1d, 0x21, 0x6c,
-0x1d, 0x21, 0x6b, 0x1a, 0x21, 0x6b, 0x1a, 0x20, 0x6a, 0x1a, 0x20, 0x6a,
-0x1a, 0x20, 0x67, 0x1a, 0x20, 0x67, 0x1a, 0x20, 0x67, 0x19, 0x1e, 0x66,
-0x19, 0x1e, 0x66, 0x19, 0x1e, 0x65, 0x19, 0x1e, 0x65, 0x0c, 0x0e, 0x2e,
-0x1a, 0x20, 0x62, 0x2c, 0x36, 0xa2, 0x33, 0x3d, 0xb2, 0x32, 0x39, 0xa7,
-0x33, 0x3a, 0xaa, 0x34, 0x3d, 0xac, 0x36, 0x3f, 0xad, 0x38, 0x40, 0xb0,
-0x3a, 0x44, 0xb2, 0x3e, 0x46, 0xb3, 0x40, 0x4a, 0xb7, 0x44, 0x4e, 0xb9,
-0x46, 0x4f, 0xba, 0x4a, 0x54, 0xbe, 0x4a, 0x55, 0xbf, 0x47, 0x52, 0xc1,
-0x45, 0x4f, 0xc5, 0x41, 0x4b, 0xc6, 0x3f, 0x47, 0xc9, 0x3d, 0x46, 0xcb,
-0x39, 0x45, 0xcf, 0x3a, 0x45, 0xd3, 0x40, 0x4a, 0xd4, 0x45, 0x4f, 0xd6,
-0x4a, 0x55, 0xda, 0x51, 0x5f, 0xdc, 0x5a, 0x67, 0xe0, 0x51, 0x5b, 0xe4,
-0x45, 0x51, 0xe6, 0x3e, 0x47, 0xea, 0x36, 0x41, 0xed, 0x33, 0x3e, 0xf0,
-0x39, 0x44, 0xf5, 0x40, 0x4c, 0xf7, 0x4b, 0x59, 0xfc, 0x5a, 0x67, 0xff,
-0x5c, 0x6a, 0xff, 0x60, 0x6d, 0xff, 0x62, 0x73, 0xff, 0x66, 0x75, 0xff,
-0x68, 0x77, 0xff, 0x6c, 0x7c, 0xff, 0x6c, 0x7c, 0xff, 0x62, 0x70, 0xff,
-0x5a, 0x68, 0xff, 0x52, 0x60, 0xff, 0x4f, 0x5f, 0xff, 0x4b, 0x5a, 0xff,
-0x59, 0x68, 0xff, 0x81, 0x92, 0xff, 0x2b, 0x34, 0x67, 0x83, 0x96, 0xff,
-0x6d, 0x7d, 0xff, 0x5c, 0x6d, 0xff, 0x51, 0x61, 0xff, 0x67, 0x7b, 0xff,
-0x67, 0x76, 0xdc, 0x51, 0x5f, 0xad, 0x62, 0x71, 0xd5, 0x73, 0x83, 0xfd,
-0x7c, 0x8e, 0xff, 0x7c, 0x8f, 0xff, 0x67, 0x7b, 0xff, 0x71, 0x84, 0xff,
-0x6d, 0x7e, 0xff, 0x5b, 0x6d, 0xff, 0x64, 0x77, 0xff, 0x83, 0x98, 0xff,
-0x77, 0x8c, 0xff, 0x6c, 0x7e, 0xff, 0x66, 0x77, 0xff, 0x5f, 0x71, 0xff,
-0x56, 0x68, 0xff, 0x6d, 0x81, 0xff, 0x56, 0x66, 0xc1, 0x84, 0x99, 0xff,
-0x61, 0x73, 0xff, 0x71, 0x87, 0xff, 0x8b, 0x9e, 0xff, 0x71, 0x84, 0xff,
-0x5f, 0x70, 0xff, 0x67, 0x7a, 0xff, 0x6f, 0x81, 0xff, 0x76, 0x88, 0xff,
-0x7e, 0x91, 0xff, 0x7a, 0x8b, 0xff, 0x6f, 0x7e, 0xff, 0x64, 0x75, 0xff,
-0x66, 0x75, 0xff, 0x62, 0x73, 0xff, 0x61, 0x70, 0xff, 0x5c, 0x6c, 0xff,
-0x59, 0x67, 0xff, 0x5a, 0x68, 0xff, 0x5c, 0x6d, 0xff, 0x61, 0x6f, 0xff,
-0x66, 0x76, 0xff, 0x6c, 0x7a, 0xff, 0x67, 0x75, 0xf0, 0x5a, 0x64, 0xc6,
-0x61, 0x6f, 0xe1, 0x62, 0x70, 0xfc, 0x5a, 0x66, 0xf7, 0x51, 0x5c, 0xf5,
-0x4e, 0x5a, 0xf0, 0x4f, 0x5b, 0xed, 0x51, 0x5f, 0xea, 0x54, 0x60, 0xe7,
-0x55, 0x61, 0xe2, 0x52, 0x5c, 0xe0, 0x4b, 0x55, 0xdc, 0x45, 0x4f, 0xda,
-0x3f, 0x4b, 0xd6, 0x3a, 0x45, 0xd4, 0x38, 0x40, 0xd3, 0x38, 0x40, 0xce,
-0x38, 0x3f, 0xcb, 0x38, 0x3f, 0xc8, 0x38, 0x40, 0xc6, 0x36, 0x40, 0xc4,
-0x36, 0x40, 0xc1, 0x36, 0x40, 0xbf, 0x36, 0x3f, 0xbb, 0x36, 0x3f, 0xba,
-0x36, 0x3f, 0xb8, 0x36, 0x3e, 0xb4, 0x36, 0x3e, 0xb3, 0x34, 0x3d, 0xb0,
-0x34, 0x3e, 0xae, 0x34, 0x3d, 0xac, 0x34, 0x3d, 0xac, 0x33, 0x3a, 0xa9,
-0x32, 0x39, 0xa7, 0x32, 0x39, 0xa5, 0x30, 0x38, 0xa3, 0x2f, 0x36, 0xa1,
-0x2f, 0x36, 0x9f, 0x2d, 0x34, 0x9d, 0x2d, 0x34, 0x9c, 0x2b, 0x33, 0x99,
-0x2a, 0x32, 0x98, 0x2a, 0x32, 0x97, 0x2a, 0x30, 0x96, 0x29, 0x2f, 0x94,
-0x27, 0x2f, 0x92, 0x27, 0x2d, 0x8f, 0x25, 0x2b, 0x8e, 0x24, 0x2b, 0x8c,
-0x24, 0x2a, 0x8b, 0x24, 0x2a, 0x8b, 0x23, 0x29, 0x89, 0x23, 0x29, 0x88,
-0x22, 0x27, 0x87, 0x22, 0x27, 0x84, 0x1f, 0x25, 0x83, 0x1f, 0x25, 0x82,
-0x1f, 0x24, 0x81, 0x1e, 0x24, 0x81, 0x1e, 0x24, 0x7e, 0x1e, 0x24, 0x7d,
-0x1e, 0x24, 0x7c, 0x1e, 0x24, 0x7b, 0x1e, 0x24, 0x7b, 0x1e, 0x24, 0x7a,
-0x1e, 0x24, 0x77, 0x1e, 0x24, 0x77, 0x1e, 0x24, 0x76, 0x1e, 0x23, 0x75,
-0x1e, 0x24, 0x75, 0x1e, 0x23, 0x73, 0x1e, 0x23, 0x71, 0x1e, 0x23, 0x71,
-0x1e, 0x23, 0x70, 0x1d, 0x22, 0x6d, 0x1d, 0x22, 0x6d, 0x1d, 0x22, 0x6d,
-0x1d, 0x22, 0x6d, 0x1d, 0x22, 0x6c, 0x1d, 0x22, 0x6a, 0x1c, 0x22, 0x68,
-0x1c, 0x22, 0x67, 0x1c, 0x22, 0x67, 0x1c, 0x1f, 0x66, 0x1c, 0x1f, 0x66,
-0x19, 0x1e, 0x66, 0x19, 0x1e, 0x64, 0x19, 0x1e, 0x62, 0x19, 0x1e, 0x62,
-0x18, 0x1e, 0x61, 0x18, 0x1e, 0x61, 0x18, 0x1d, 0x60, 0x18, 0x1d, 0x60,
-0x18, 0x1d, 0x60, 0x17, 0x1c, 0x5f, 0x17, 0x1c, 0x5f, 0x17, 0x1c, 0x5c,
-0x17, 0x1c, 0x5c, 0x17, 0x1c, 0x5b, 0x16, 0x1a, 0x57, 0x04, 0x04, 0x0f,
-0x12, 0x16, 0x44, 0x25, 0x2d, 0x89, 0x28, 0x30, 0x92, 0x25, 0x2b, 0x82,
-0x26, 0x2b, 0x80, 0x26, 0x2c, 0x82, 0x28, 0x2d, 0x83, 0x29, 0x2f, 0x85,
-0x2a, 0x30, 0x86, 0x2c, 0x32, 0x88, 0x2e, 0x34, 0x8a, 0x30, 0x36, 0x8b,
-0x31, 0x3b, 0x8d, 0x34, 0x3c, 0x8f, 0x37, 0x3f, 0x91, 0x3b, 0x42, 0x93,
-0x3b, 0x42, 0x95, 0x37, 0x40, 0x98, 0x34, 0x3d, 0x99, 0x32, 0x3b, 0x9b,
-0x31, 0x39, 0x9d, 0x2e, 0x36, 0x9e, 0x2c, 0x33, 0xa1, 0x2f, 0x37, 0xa4,
-0x32, 0x3c, 0xa5, 0x37, 0x41, 0xa7, 0x3e, 0x46, 0xab, 0x43, 0x4e, 0xad,
-0x42, 0x4c, 0xaf, 0x39, 0x42, 0xb3, 0x30, 0x3b, 0xb5, 0x2b, 0x33, 0xb7,
-0x28, 0x2f, 0xb9, 0x2b, 0x33, 0xbd, 0x31, 0x3b, 0xbf, 0x39, 0x42, 0xc2,
-0x44, 0x4f, 0xc6, 0x48, 0x53, 0xc8, 0x4a, 0x56, 0xcb, 0x4e, 0x58, 0xce,
-0x51, 0x5c, 0xd1, 0x52, 0x5f, 0xd4, 0x54, 0x61, 0xd8, 0x54, 0x60, 0xdb,
-0x4c, 0x56, 0xde, 0x44, 0x50, 0xe1, 0x3f, 0x4a, 0xe5, 0x3c, 0x46, 0xe7,
-0x39, 0x43, 0xeb, 0x4e, 0x5a, 0xee, 0x41, 0x4a, 0x8b, 0x41, 0x4d, 0x8d,
-0x5f, 0x6d, 0xf8, 0x4e, 0x5b, 0xfb, 0x42, 0x50, 0xfe, 0x44, 0x52, 0xff,
-0x68, 0x78, 0xff, 0x2c, 0x33, 0x64, 0x41, 0x4c, 0x8c, 0x49, 0x53, 0x9c,
-0x51, 0x5d, 0xb0, 0x67, 0x77, 0xff, 0x52, 0x61, 0xff, 0x58, 0x67, 0xff,
-0x57, 0x67, 0xff, 0x49, 0x57, 0xff, 0x4f, 0x5d, 0xff, 0x69, 0x79, 0xff,
-0x5f, 0x6e, 0xff, 0x54, 0x63, 0xff, 0x50, 0x5f, 0xff, 0x4a, 0x58, 0xff,
-0x44, 0x52, 0xff, 0x5d, 0x6d, 0xff, 0x1d, 0x24, 0x4e, 0x60, 0x6e, 0xff,
-0x4f, 0x5c, 0xff, 0x60, 0x6f, 0xfe, 0x63, 0x73, 0xfc, 0x51, 0x60, 0xf9,
-0x4d, 0x5a, 0xf7, 0x53, 0x62, 0xf3, 0x5b, 0x68, 0xf1, 0x60, 0x6e, 0xee,
-0x63, 0x72, 0xec, 0x58, 0x67, 0xea, 0x50, 0x5d, 0xe6, 0x4f, 0x5b, 0xe4,
-0x4e, 0x5b, 0xe1, 0x4c, 0x57, 0xde, 0x48, 0x54, 0xdc, 0x45, 0x51, 0xda,
-0x45, 0x51, 0xd8, 0x49, 0x54, 0xd5, 0x4d, 0x57, 0xd2, 0x50, 0x5c, 0xd0,
-0x55, 0x60, 0xcc, 0x4c, 0x55, 0xad, 0x40, 0x4a, 0x90, 0x4c, 0x56, 0xae,
-0x4d, 0x57, 0xc2, 0x44, 0x4f, 0xbf, 0x3e, 0x46, 0xbd, 0x3d, 0x45, 0xb9,
-0x3e, 0x48, 0xb7, 0x40, 0x49, 0xb5, 0x41, 0x4c, 0xb1, 0x44, 0x4d, 0xb0,
-0x3e, 0x45, 0xad, 0x39, 0x41, 0xaa, 0x32, 0x3b, 0xa7, 0x2f, 0x39, 0xa6,
-0x2c, 0x33, 0xa3, 0x2b, 0x31, 0xa1, 0x2b, 0x31, 0x9e, 0x2b, 0x32, 0x9d,
-0x2a, 0x32, 0x9b, 0x2a, 0x31, 0x99, 0x2a, 0x31, 0x97, 0x2b, 0x32, 0x94,
-0x2b, 0x32, 0x93, 0x2a, 0x31, 0x91, 0x2a, 0x31, 0x8f, 0x2a, 0x30, 0x8c,
-0x2a, 0x30, 0x8b, 0x2a, 0x2f, 0x89, 0x2a, 0x2f, 0x87, 0x29, 0x2f, 0x86,
-0x29, 0x2e, 0x83, 0x28, 0x2e, 0x82, 0x28, 0x2d, 0x81, 0x27, 0x2c, 0x7f,
-0x26, 0x2b, 0x7e, 0x24, 0x2a, 0x7c, 0x24, 0x2a, 0x7b, 0x22, 0x29, 0x79,
-0x21, 0x28, 0x78, 0x21, 0x28, 0x77, 0x21, 0x28, 0x76, 0x20, 0x26, 0x74,
-0x1f, 0x26, 0x73, 0x1f, 0x24, 0x72, 0x1e, 0x22, 0x70, 0x1d, 0x21, 0x6f,
-0x1c, 0x21, 0x6e, 0x1c, 0x20, 0x6d, 0x1c, 0x20, 0x6c, 0x1b, 0x1f, 0x6a,
-0x1b, 0x1f, 0x69, 0x1a, 0x1e, 0x68, 0x19, 0x1d, 0x67, 0x19, 0x1e, 0x66,
-0x19, 0x1d, 0x65, 0x18, 0x1c, 0x64, 0x18, 0x1c, 0x63, 0x18, 0x1c, 0x62,
-0x18, 0x1c, 0x62, 0x18, 0x1c, 0x61, 0x18, 0x1c, 0x60, 0x18, 0x1b, 0x5f,
-0x18, 0x1b, 0x5d, 0x18, 0x1c, 0x5d, 0x18, 0x1b, 0x5c, 0x18, 0x1b, 0x5b,
-0x18, 0x1b, 0x5a, 0x18, 0x1b, 0x5a, 0x18, 0x1b, 0x58, 0x18, 0x1b, 0x57,
-0x17, 0x1b, 0x57, 0x17, 0x1b, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x55,
-0x17, 0x1b, 0x54, 0x16, 0x1a, 0x53, 0x16, 0x1a, 0x52, 0x16, 0x1a, 0x52,
-0x16, 0x1a, 0x52, 0x16, 0x19, 0x51, 0x16, 0x19, 0x51, 0x15, 0x19, 0x4f,
-0x15, 0x19, 0x4f, 0x15, 0x18, 0x4e, 0x14, 0x18, 0x4d, 0x14, 0x18, 0x4d,
-0x14, 0x17, 0x4d, 0x14, 0x17, 0x4c, 0x14, 0x17, 0x4a, 0x14, 0x17, 0x4a,
-0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48,
-0x13, 0x16, 0x48, 0x10, 0x15, 0x46, 0x10, 0x15, 0x46, 0x10, 0x15, 0x45,
-0x10, 0x15, 0x45, 0x10, 0x15, 0x44, 0x0f, 0x12, 0x3e, 0x01, 0x01, 0x06,
-0x12, 0x15, 0x44, 0x25, 0x2c, 0x8a, 0x27, 0x2e, 0x8f, 0x21, 0x28, 0x7a,
-0x1f, 0x25, 0x72, 0x1f, 0x25, 0x73, 0x21, 0x26, 0x75, 0x22, 0x28, 0x76,
-0x23, 0x29, 0x77, 0x25, 0x2b, 0x79, 0x26, 0x2d, 0x7b, 0x27, 0x2e, 0x7c,
-0x29, 0x30, 0x7e, 0x2c, 0x32, 0x80, 0x2e, 0x35, 0x81, 0x31, 0x38, 0x83,
-0x33, 0x3b, 0x85, 0x36, 0x3e, 0x87, 0x35, 0x3d, 0x88, 0x32, 0x3b, 0x8a,
-0x30, 0x37, 0x8c, 0x2d, 0x35, 0x8e, 0x2c, 0x32, 0x90, 0x29, 0x31, 0x92,
-0x29, 0x31, 0x94, 0x2c, 0x34, 0x96, 0x30, 0x39, 0x98, 0x35, 0x3e, 0x9a,
-0x3b, 0x43, 0x9d, 0x40, 0x49, 0x9f, 0x36, 0x40, 0xa2, 0x2f, 0x37, 0xa4,
-0x29, 0x31, 0xa7, 0x24, 0x2c, 0xa9, 0x25, 0x2d, 0xab, 0x2a, 0x33, 0xae,
-0x32, 0x3b, 0xb1, 0x3e, 0x47, 0xb3, 0x42, 0x4c, 0xb6, 0x44, 0x4f, 0xb9,
-0x47, 0x52, 0xbc, 0x4a, 0x55, 0xbf, 0x4b, 0x57, 0xc2, 0x4e, 0x59, 0xc5,
-0x4b, 0x56, 0xc8, 0x44, 0x4d, 0xcb, 0x3c, 0x46, 0xce, 0x38, 0x42, 0xd1,
-0x34, 0x3f, 0xd4, 0x38, 0x42, 0xd7, 0x52, 0x60, 0xda, 0x11, 0x15, 0x31,
-0x52, 0x5e, 0xb8, 0x4c, 0x59, 0xe3, 0x40, 0x4b, 0xe6, 0x37, 0x43, 0xe7,
-0x50, 0x5d, 0xe7, 0x13, 0x18, 0x36, 0x1d, 0x24, 0x48, 0x2e, 0x37, 0x67,
-0x36, 0x3f, 0x75, 0x56, 0x64, 0xc6, 0x50, 0x5e, 0xe4, 0x51, 0x5f, 0xe3,
-0x54, 0x63, 0xe3, 0x44, 0x52, 0xe3, 0x48, 0x56, 0xe3, 0x58, 0x66, 0xcf,
-0x58, 0x66, 0xe2, 0x4e, 0x5d, 0xe2, 0x4a, 0x58, 0xe2, 0x43, 0x51, 0xe1,
-0x3f, 0x4c, 0xe1, 0x56, 0x65, 0xcd, 0x27, 0x2e, 0x5c, 0x50, 0x5e, 0xe1,
-0x4e, 0x5c, 0xe1, 0x54, 0x61, 0xc5, 0x54, 0x63, 0xe1, 0x44, 0x50, 0xe1,
-0x47, 0x54, 0xdf, 0x4f, 0x5c, 0xdd, 0x55, 0x62, 0xda, 0x4f, 0x5c, 0xbf,
-0x55, 0x62, 0xd5, 0x4c, 0x59, 0xd2, 0x47, 0x53, 0xd0, 0x47, 0x52, 0xce,
-0x45, 0x51, 0xcc, 0x43, 0x4e, 0xca, 0x40, 0x4b, 0xc7, 0x3f, 0x49, 0xc5,
-0x43, 0x4d, 0xc2, 0x45, 0x50, 0xbf, 0x4a, 0x54, 0xbe, 0x4b, 0x55, 0xb2,
-0x41, 0x4b, 0x94, 0x36, 0x3d, 0x76, 0x44, 0x4d, 0x9c, 0x44, 0x4f, 0xb1,
-0x3c, 0x46, 0xae, 0x36, 0x3f, 0xac, 0x37, 0x41, 0xa9, 0x3a, 0x42, 0xa7,
-0x3c, 0x44, 0xa4, 0x3e, 0x47, 0xa2, 0x3b, 0x43, 0x9f, 0x35, 0x3e, 0x9c,
-0x30, 0x38, 0x9b, 0x2d, 0x34, 0x98, 0x29, 0x30, 0x96, 0x26, 0x2d, 0x94,
-0x26, 0x2d, 0x92, 0x27, 0x2d, 0x8f, 0x26, 0x2d, 0x8d, 0x26, 0x2e, 0x8c,
-0x26, 0x2d, 0x8a, 0x26, 0x2d, 0x88, 0x26, 0x2d, 0x86, 0x26, 0x2d, 0x84,
-0x26, 0x2c, 0x82, 0x26, 0x2c, 0x81, 0x26, 0x2b, 0x7f, 0x25, 0x2b, 0x7d,
-0x26, 0x2b, 0x7c, 0x25, 0x2b, 0x7a, 0x25, 0x2a, 0x78, 0x24, 0x2a, 0x77,
-0x23, 0x28, 0x75, 0x22, 0x27, 0x73, 0x22, 0x27, 0x72, 0x21, 0x26, 0x71,
-0x20, 0x25, 0x70, 0x20, 0x25, 0x6f, 0x1e, 0x24, 0x6d, 0x1e, 0x23, 0x6c,
-0x1e, 0x23, 0x6b, 0x1d, 0x21, 0x69, 0x1c, 0x21, 0x68, 0x1b, 0x20, 0x67,
-0x1b, 0x1f, 0x66, 0x19, 0x1e, 0x65, 0x19, 0x1d, 0x63, 0x18, 0x1d, 0x62,
-0x18, 0x1c, 0x61, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e,
-0x16, 0x1a, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a,
-0x15, 0x19, 0x59, 0x14, 0x19, 0x58, 0x15, 0x19, 0x58, 0x15, 0x19, 0x57,
-0x15, 0x18, 0x56, 0x15, 0x18, 0x55, 0x15, 0x18, 0x54, 0x15, 0x18, 0x53,
-0x15, 0x18, 0x53, 0x14, 0x18, 0x52, 0x14, 0x18, 0x51, 0x14, 0x18, 0x50,
-0x14, 0x18, 0x50, 0x14, 0x18, 0x4f, 0x14, 0x18, 0x4e, 0x14, 0x18, 0x4e,
-0x13, 0x17, 0x4d, 0x13, 0x17, 0x4c, 0x13, 0x17, 0x4c, 0x13, 0x17, 0x4b,
-0x13, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x12, 0x16, 0x48,
-0x12, 0x16, 0x47, 0x11, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x15, 0x45,
-0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x10, 0x14, 0x44, 0x10, 0x14, 0x43,
-0x10, 0x14, 0x43, 0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x0f, 0x13, 0x41,
-0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f,
-0x0e, 0x12, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3d,
-0x0e, 0x11, 0x3d, 0x0e, 0x11, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05,
-0x12, 0x15, 0x45, 0x25, 0x2b, 0x8a, 0x27, 0x2d, 0x90, 0x22, 0x27, 0x7b,
-0x1e, 0x24, 0x73, 0x1f, 0x25, 0x74, 0x20, 0x26, 0x76, 0x21, 0x27, 0x77,
-0x22, 0x28, 0x78, 0x24, 0x2a, 0x7a, 0x25, 0x2b, 0x7b, 0x26, 0x2c, 0x7d,
-0x27, 0x2e, 0x7f, 0x29, 0x30, 0x80, 0x2c, 0x32, 0x82, 0x2d, 0x35, 0x84,
-0x31, 0x37, 0x86, 0x33, 0x3b, 0x87, 0x36, 0x3e, 0x89, 0x3a, 0x41, 0x8b,
-0x37, 0x3f, 0x8d, 0x35, 0x3c, 0x8f, 0x32, 0x3a, 0x91, 0x2f, 0x36, 0x93,
-0x2c, 0x34, 0x95, 0x2a, 0x31, 0x98, 0x2c, 0x33, 0x99, 0x30, 0x38, 0x9c,
-0x35, 0x3e, 0x9e, 0x3c, 0x44, 0xa1, 0x43, 0x4c, 0xa3, 0x3d, 0x46, 0xa6,
-0x33, 0x3c, 0xa8, 0x2b, 0x34, 0xaa, 0x26, 0x2f, 0xae, 0x25, 0x2d, 0xb0,
-0x2b, 0x33, 0xb3, 0x32, 0x3c, 0xb6, 0x3f, 0x47, 0xb9, 0x45, 0x4f, 0xbc,
-0x48, 0x52, 0xbe, 0x4a, 0x56, 0xc2, 0x4e, 0x59, 0xc5, 0x50, 0x5b, 0xc8,
-0x51, 0x5d, 0xcb, 0x4d, 0x58, 0xce, 0x43, 0x4f, 0xd1, 0x3c, 0x47, 0xd5,
-0x38, 0x43, 0xd7, 0x35, 0x40, 0xdb, 0x41, 0x4d, 0xde, 0x4c, 0x56, 0xa8,
-0x1c, 0x21, 0x45, 0x5c, 0x6a, 0xe7, 0x49, 0x56, 0xe7, 0x3f, 0x4b, 0xe7,
-0x46, 0x53, 0xe6, 0x3c, 0x45, 0x81, 0x14, 0x19, 0x39, 0x15, 0x1a, 0x3a,
-0x1d, 0x23, 0x48, 0x3a, 0x43, 0x7e, 0x58, 0x67, 0xe3, 0x55, 0x64, 0xe3,
-0x5c, 0x6b, 0xe3, 0x4a, 0x57, 0xe2, 0x4c, 0x5b, 0xe2, 0x4c, 0x59, 0xab,
-0x5d, 0x6d, 0xe2, 0x53, 0x62, 0xe2, 0x4e, 0x5c, 0xe1, 0x47, 0x55, 0xe1,
-0x47, 0x55, 0xe1, 0x2d, 0x35, 0x68, 0x32, 0x3b, 0x73, 0x4c, 0x5a, 0xe0,
-0x59, 0x68, 0xe0, 0x45, 0x50, 0x9d, 0x52, 0x60, 0xe0, 0x48, 0x55, 0xe0,
-0x4f, 0x5d, 0xe0, 0x57, 0x65, 0xe1, 0x54, 0x62, 0xcd, 0x52, 0x5f, 0xc6,
-0x52, 0x5f, 0xd9, 0x4a, 0x57, 0xd6, 0x49, 0x56, 0xd4, 0x49, 0x55, 0xd2,
-0x46, 0x52, 0xd0, 0x43, 0x4d, 0xcd, 0x41, 0x4b, 0xca, 0x44, 0x4f, 0xc8,
-0x48, 0x54, 0xc5, 0x4c, 0x58, 0xc3, 0x4a, 0x54, 0xae, 0x3f, 0x47, 0x8c,
-0x30, 0x38, 0x6a, 0x46, 0x50, 0xa1, 0x46, 0x51, 0xb6, 0x3d, 0x48, 0xb3,
-0x39, 0x42, 0xb1, 0x3b, 0x43, 0xad, 0x3e, 0x46, 0xab, 0x3f, 0x48, 0xa8,
-0x41, 0x4a, 0xa6, 0x3c, 0x44, 0xa3, 0x35, 0x3d, 0xa1, 0x30, 0x38, 0x9e,
-0x2b, 0x33, 0x9b, 0x29, 0x30, 0x9a, 0x28, 0x2e, 0x97, 0x28, 0x2f, 0x95,
-0x28, 0x2f, 0x93, 0x27, 0x2f, 0x91, 0x28, 0x2f, 0x8e, 0x28, 0x30, 0x8d,
-0x28, 0x2f, 0x8b, 0x28, 0x2e, 0x89, 0x28, 0x2e, 0x87, 0x28, 0x2e, 0x85,
-0x28, 0x2e, 0x83, 0x27, 0x2d, 0x81, 0x27, 0x2d, 0x80, 0x27, 0x2d, 0x7e,
-0x26, 0x2c, 0x7c, 0x25, 0x2b, 0x7b, 0x24, 0x2a, 0x79, 0x24, 0x29, 0x77,
-0x23, 0x28, 0x76, 0x22, 0x27, 0x74, 0x21, 0x26, 0x73, 0x20, 0x26, 0x71,
-0x20, 0x25, 0x70, 0x1f, 0x24, 0x6f, 0x1e, 0x24, 0x6d, 0x1d, 0x22, 0x6c,
-0x1d, 0x21, 0x6b, 0x1c, 0x21, 0x6a, 0x1b, 0x20, 0x69, 0x1a, 0x1f, 0x67,
-0x1a, 0x1e, 0x66, 0x19, 0x1d, 0x65, 0x18, 0x1d, 0x64, 0x18, 0x1c, 0x63,
-0x18, 0x1b, 0x62, 0x17, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x16, 0x1a, 0x5e,
-0x16, 0x1a, 0x5d, 0x16, 0x1a, 0x5d, 0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5b,
-0x16, 0x1a, 0x5a, 0x16, 0x1a, 0x59, 0x16, 0x1a, 0x58, 0x15, 0x19, 0x57,
-0x15, 0x19, 0x56, 0x15, 0x19, 0x55, 0x15, 0x19, 0x54, 0x15, 0x19, 0x54,
-0x15, 0x19, 0x53, 0x15, 0x19, 0x52, 0x15, 0x19, 0x51, 0x15, 0x19, 0x51,
-0x14, 0x19, 0x50, 0x14, 0x19, 0x4f, 0x14, 0x19, 0x4e, 0x14, 0x19, 0x4e,
-0x14, 0x19, 0x4d, 0x14, 0x17, 0x4c, 0x14, 0x17, 0x4c, 0x13, 0x17, 0x4b,
-0x13, 0x17, 0x4a, 0x13, 0x17, 0x4a, 0x12, 0x16, 0x48, 0x12, 0x15, 0x48,
-0x12, 0x15, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x45,
-0x11, 0x14, 0x45, 0x10, 0x14, 0x44, 0x10, 0x14, 0x44, 0x10, 0x13, 0x43,
-0x10, 0x13, 0x43, 0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x0f, 0x12, 0x41,
-0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0e, 0x12, 0x3f,
-0x0e, 0x12, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3d,
-0x0e, 0x11, 0x3d, 0x0e, 0x11, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05,
-0x13, 0x16, 0x45, 0x27, 0x2d, 0x8b, 0x28, 0x2e, 0x90, 0x22, 0x27, 0x7c,
-0x1e, 0x23, 0x73, 0x1f, 0x24, 0x75, 0x1f, 0x25, 0x76, 0x20, 0x26, 0x77,
-0x21, 0x28, 0x79, 0x22, 0x28, 0x7a, 0x23, 0x29, 0x7c, 0x25, 0x2b, 0x7e,
-0x26, 0x2d, 0x7f, 0x27, 0x2e, 0x81, 0x2a, 0x30, 0x83, 0x2c, 0x32, 0x85,
-0x2e, 0x35, 0x87, 0x31, 0x37, 0x88, 0x33, 0x3b, 0x8a, 0x36, 0x3e, 0x8c,
-0x3a, 0x42, 0x8e, 0x3d, 0x44, 0x90, 0x3a, 0x42, 0x93, 0x36, 0x3f, 0x94,
-0x34, 0x3b, 0x97, 0x30, 0x38, 0x98, 0x2d, 0x35, 0x9b, 0x2c, 0x33, 0x9d,
-0x30, 0x38, 0xa0, 0x34, 0x3e, 0xa2, 0x3a, 0x43, 0xa5, 0x42, 0x4b, 0xa7,
-0x45, 0x4f, 0xa9, 0x39, 0x42, 0xad, 0x2f, 0x38, 0xaf, 0x28, 0x31, 0xb2,
-0x25, 0x2d, 0xb5, 0x2a, 0x32, 0xb8, 0x32, 0x3c, 0xbb, 0x3f, 0x49, 0xbe,
-0x48, 0x52, 0xc1, 0x4b, 0x56, 0xc4, 0x4f, 0x5a, 0xc8, 0x51, 0x5d, 0xcb,
-0x54, 0x60, 0xce, 0x55, 0x63, 0xd2, 0x4f, 0x5a, 0xd5, 0x44, 0x51, 0xd9,
-0x3d, 0x48, 0xdb, 0x39, 0x44, 0xdf, 0x35, 0x40, 0xe3, 0x4f, 0x5c, 0xe5,
-0x13, 0x17, 0x35, 0x3a, 0x43, 0x7d, 0x56, 0x64, 0xe7, 0x48, 0x54, 0xe7,
-0x3f, 0x4b, 0xe6, 0x5c, 0x6a, 0xd6, 0x16, 0x1b, 0x3c, 0x16, 0x1b, 0x3c,
-0x16, 0x1b, 0x3d, 0x16, 0x1b, 0x3d, 0x59, 0x68, 0xd0, 0x59, 0x69, 0xe2,
-0x58, 0x67, 0xcf, 0x4f, 0x5e, 0xe2, 0x4f, 0x5e, 0xe1, 0x3d, 0x48, 0x89,
-0x56, 0x64, 0xc7, 0x57, 0x67, 0xe1, 0x52, 0x61, 0xe0, 0x4a, 0x59, 0xe0,
-0x53, 0x62, 0xe0, 0x12, 0x17, 0x39, 0x3f, 0x4b, 0x90, 0x51, 0x60, 0xdf,
-0x47, 0x54, 0xa5, 0x4a, 0x56, 0xab, 0x4f, 0x5d, 0xdf, 0x50, 0x5d, 0xdf,
-0x58, 0x67, 0xdf, 0x53, 0x5f, 0xc4, 0x47, 0x52, 0xa3, 0x59, 0x67, 0xdf,
-0x4e, 0x5b, 0xdd, 0x4d, 0x59, 0xdb, 0x4d, 0x59, 0xd8, 0x4a, 0x56, 0xd6,
-0x45, 0x51, 0xd3, 0x42, 0x4e, 0xd1, 0x47, 0x52, 0xce, 0x4c, 0x57, 0xcc,
-0x50, 0x5b, 0xc9, 0x4b, 0x55, 0xad, 0x3b, 0x43, 0x83, 0x2f, 0x37, 0x67,
-0x48, 0x53, 0xa8, 0x48, 0x53, 0xbb, 0x3e, 0x49, 0xb9, 0x3c, 0x45, 0xb5,
-0x3f, 0x48, 0xb2, 0x41, 0x4b, 0xb0, 0x43, 0x4d, 0xac, 0x42, 0x4c, 0xaa,
-0x3b, 0x44, 0xa7, 0x35, 0x3d, 0xa5, 0x30, 0x37, 0xa2, 0x2c, 0x33, 0xa0,
-0x29, 0x30, 0x9d, 0x29, 0x30, 0x9b, 0x29, 0x31, 0x99, 0x29, 0x31, 0x96,
-0x2a, 0x31, 0x94, 0x2a, 0x31, 0x92, 0x2a, 0x31, 0x90, 0x29, 0x30, 0x8d,
-0x2a, 0x30, 0x8b, 0x2a, 0x30, 0x8a, 0x29, 0x30, 0x88, 0x28, 0x2f, 0x86,
-0x28, 0x30, 0x84, 0x28, 0x2f, 0x82, 0x27, 0x2e, 0x80, 0x26, 0x2d, 0x7f,
-0x25, 0x2c, 0x7d, 0x24, 0x2b, 0x7b, 0x24, 0x2a, 0x7a, 0x23, 0x29, 0x78,
-0x22, 0x28, 0x76, 0x22, 0x27, 0x75, 0x21, 0x26, 0x73, 0x21, 0x26, 0x72,
-0x1f, 0x25, 0x70, 0x1f, 0x24, 0x6f, 0x1e, 0x22, 0x6e, 0x1d, 0x22, 0x6c,
-0x1c, 0x20, 0x6c, 0x1b, 0x1f, 0x6a, 0x1a, 0x1f, 0x69, 0x1a, 0x1e, 0x68,
-0x19, 0x1e, 0x67, 0x18, 0x1d, 0x65, 0x18, 0x1c, 0x64, 0x17, 0x1c, 0x63,
-0x17, 0x1b, 0x62, 0x16, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f,
-0x17, 0x1a, 0x5e, 0x17, 0x1b, 0x5d, 0x17, 0x1b, 0x5c, 0x16, 0x1a, 0x5b,
-0x17, 0x1b, 0x5a, 0x17, 0x1b, 0x59, 0x16, 0x1a, 0x58, 0x16, 0x1a, 0x57,
-0x16, 0x1a, 0x56, 0x16, 0x1a, 0x56, 0x16, 0x1a, 0x55, 0x16, 0x1a, 0x54,
-0x15, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x51,
-0x15, 0x19, 0x50, 0x15, 0x19, 0x4f, 0x15, 0x19, 0x4f, 0x14, 0x19, 0x4e,
-0x14, 0x18, 0x4d, 0x14, 0x17, 0x4d, 0x13, 0x17, 0x4c, 0x13, 0x17, 0x4b,
-0x13, 0x17, 0x4b, 0x12, 0x16, 0x4a, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48,
-0x11, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x45,
-0x10, 0x14, 0x45, 0x10, 0x14, 0x44, 0x10, 0x14, 0x44, 0x10, 0x13, 0x43,
-0x10, 0x13, 0x43, 0x10, 0x13, 0x43, 0x10, 0x13, 0x42, 0x0f, 0x12, 0x41,
-0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0e, 0x11, 0x3f,
-0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e,
-0x0e, 0x11, 0x3d, 0x0e, 0x11, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05,
-0x13, 0x17, 0x45, 0x27, 0x2e, 0x8b, 0x28, 0x2f, 0x93, 0x22, 0x28, 0x7c,
-0x1f, 0x24, 0x74, 0x1f, 0x24, 0x75, 0x1f, 0x25, 0x77, 0x1f, 0x25, 0x78,
-0x20, 0x26, 0x79, 0x21, 0x28, 0x7b, 0x22, 0x29, 0x7d, 0x23, 0x29, 0x7f,
-0x25, 0x2b, 0x80, 0x26, 0x2d, 0x82, 0x27, 0x2e, 0x84, 0x29, 0x30, 0x86,
-0x2b, 0x31, 0x87, 0x2d, 0x34, 0x89, 0x30, 0x37, 0x8b, 0x33, 0x3b, 0x8d,
-0x35, 0x3e, 0x8f, 0x3a, 0x41, 0x91, 0x37, 0x3f, 0x85, 0x36, 0x3f, 0x81,
-0x3c, 0x44, 0x98, 0x38, 0x40, 0x9a, 0x34, 0x3d, 0x9d, 0x32, 0x3a, 0x9f,
-0x2e, 0x36, 0xa1, 0x30, 0x37, 0xa4, 0x34, 0x3d, 0xa6, 0x3b, 0x44, 0xa8,
-0x42, 0x4c, 0xac, 0x4b, 0x56, 0xae, 0x40, 0x4a, 0xb1, 0x35, 0x3e, 0xb4,
-0x2b, 0x34, 0xb7, 0x26, 0x2e, 0xba, 0x2a, 0x33, 0xbe, 0x32, 0x3c, 0xc1,
-0x3f, 0x4a, 0xc4, 0x4a, 0x56, 0xc7, 0x4e, 0x5a, 0xcb, 0x52, 0x5e, 0xce,
-0x54, 0x62, 0xd1, 0x57, 0x63, 0xd3, 0x59, 0x66, 0xd7, 0x50, 0x5c, 0xdc,
-0x44, 0x51, 0xe0, 0x3e, 0x49, 0xe3, 0x3a, 0x45, 0xe5, 0x3e, 0x4a, 0xe6,
-0x56, 0x63, 0xc3, 0x14, 0x19, 0x39, 0x50, 0x5c, 0xae, 0x53, 0x61, 0xe7,
-0x46, 0x53, 0xe6, 0x56, 0x65, 0xe5, 0x17, 0x1d, 0x3f, 0x17, 0x1d, 0x3f,
-0x17, 0x1d, 0x40, 0x17, 0x1d, 0x40, 0x41, 0x4c, 0x8e, 0x5e, 0x6d, 0xe2,
-0x51, 0x5e, 0xb7, 0x56, 0x66, 0xe1, 0x53, 0x63, 0xe1, 0x2a, 0x32, 0x61,
-0x4b, 0x58, 0xa9, 0x5c, 0x6c, 0xdf, 0x56, 0x66, 0xdf, 0x4d, 0x5c, 0xdf,
-0x52, 0x61, 0xc2, 0x12, 0x18, 0x3b, 0x49, 0x56, 0xa9, 0x55, 0x65, 0xcf,
-0x18, 0x1f, 0x45, 0x51, 0x5f, 0xc0, 0x51, 0x60, 0xde, 0x59, 0x68, 0xdd,
-0x4c, 0x58, 0xb1, 0x3a, 0x44, 0x85, 0x48, 0x53, 0xa6, 0x57, 0x65, 0xdf,
-0x50, 0x5e, 0xe0, 0x4f, 0x5d, 0xe0, 0x4e, 0x5a, 0xdd, 0x48, 0x54, 0xda,
-0x45, 0x50, 0xd8, 0x49, 0x55, 0xd5, 0x4f, 0x5b, 0xd2, 0x54, 0x61, 0xcf,
-0x4a, 0x55, 0xa9, 0x38, 0x40, 0x7a, 0x2e, 0x36, 0x65, 0x4b, 0x56, 0xad,
-0x49, 0x54, 0xc1, 0x3f, 0x4a, 0xbd, 0x3f, 0x49, 0xbb, 0x42, 0x4c, 0xb8,
-0x45, 0x4f, 0xb5, 0x48, 0x52, 0xb1, 0x42, 0x4b, 0xaf, 0x3b, 0x43, 0xac,
-0x34, 0x3d, 0xa9, 0x2f, 0x38, 0xa7, 0x2b, 0x33, 0xa4, 0x2b, 0x32, 0xa1,
-0x2b, 0x33, 0x9f, 0x2b, 0x33, 0x9c, 0x2c, 0x33, 0x9a, 0x2c, 0x33, 0x98,
-0x2c, 0x33, 0x95, 0x2c, 0x33, 0x93, 0x2c, 0x32, 0x91, 0x2b, 0x32, 0x8f,
-0x2b, 0x32, 0x8c, 0x2b, 0x32, 0x8a, 0x2b, 0x32, 0x89, 0x2a, 0x31, 0x87,
-0x29, 0x30, 0x85, 0x28, 0x2f, 0x83, 0x27, 0x2e, 0x81, 0x26, 0x2d, 0x7f,
-0x25, 0x2c, 0x7e, 0x24, 0x2b, 0x7c, 0x24, 0x2a, 0x7a, 0x23, 0x29, 0x79,
-0x22, 0x28, 0x77, 0x21, 0x27, 0x75, 0x20, 0x25, 0x74, 0x1f, 0x25, 0x72,
-0x1e, 0x24, 0x71, 0x1e, 0x22, 0x6f, 0x1d, 0x21, 0x6e, 0x1c, 0x20, 0x6c,
-0x1b, 0x20, 0x6c, 0x1a, 0x20, 0x6b, 0x1a, 0x1e, 0x69, 0x19, 0x1e, 0x68,
-0x18, 0x1d, 0x67, 0x18, 0x1d, 0x66, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x63,
-0x18, 0x1b, 0x62, 0x17, 0x1c, 0x61, 0x18, 0x1c, 0x60, 0x18, 0x1c, 0x5f,
-0x17, 0x1b, 0x5e, 0x17, 0x1c, 0x5d, 0x17, 0x1c, 0x5c, 0x17, 0x1b, 0x5b,
-0x18, 0x1c, 0x5a, 0x18, 0x1c, 0x59, 0x18, 0x1c, 0x58, 0x17, 0x1b, 0x57,
-0x17, 0x1c, 0x57, 0x17, 0x1b, 0x56, 0x17, 0x1b, 0x55, 0x16, 0x1b, 0x54,
-0x16, 0x1a, 0x53, 0x16, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x51,
-0x15, 0x19, 0x50, 0x15, 0x19, 0x50, 0x14, 0x19, 0x4f, 0x14, 0x19, 0x4e,
-0x14, 0x18, 0x4d, 0x13, 0x17, 0x4d, 0x13, 0x17, 0x4c, 0x13, 0x16, 0x4b,
-0x13, 0x16, 0x4b, 0x12, 0x16, 0x4a, 0x12, 0x15, 0x49, 0x11, 0x15, 0x48,
-0x11, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47,
-0x10, 0x14, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x10, 0x13, 0x43,
-0x10, 0x13, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41,
-0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0e, 0x11, 0x3f,
-0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e,
-0x0d, 0x10, 0x3d, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05,
-0x14, 0x17, 0x45, 0x29, 0x31, 0x8d, 0x29, 0x32, 0x93, 0x24, 0x2a, 0x7d,
-0x1f, 0x26, 0x74, 0x20, 0x26, 0x76, 0x20, 0x26, 0x77, 0x20, 0x26, 0x78,
-0x20, 0x26, 0x7a, 0x20, 0x26, 0x7c, 0x21, 0x28, 0x7e, 0x22, 0x29, 0x7f,
-0x24, 0x2a, 0x80, 0x25, 0x2b, 0x82, 0x26, 0x2d, 0x85, 0x27, 0x2e, 0x87,
-0x29, 0x31, 0x89, 0x2b, 0x32, 0x8a, 0x2d, 0x34, 0x8c, 0x30, 0x37, 0x8f,
-0x32, 0x3a, 0x90, 0x36, 0x3e, 0x93, 0x3a, 0x41, 0x94, 0x3b, 0x44, 0x92,
-0x36, 0x3e, 0x7f, 0x36, 0x3f, 0x81, 0x3e, 0x48, 0x9e, 0x3a, 0x44, 0xa1,
-0x36, 0x3f, 0xa3, 0x32, 0x3b, 0xa6, 0x2f, 0x37, 0xa8, 0x34, 0x3c, 0xab,
-0x39, 0x43, 0xad, 0x42, 0x4b, 0xb0, 0x4b, 0x56, 0xb3, 0x49, 0x54, 0xb6,
-0x3a, 0x44, 0xba, 0x2f, 0x39, 0xbd, 0x28, 0x31, 0xc0, 0x2a, 0x32, 0xc3,
-0x32, 0x3c, 0xc6, 0x40, 0x4a, 0xc9, 0x4d, 0x59, 0xcd, 0x52, 0x5e, 0xd1,
-0x56, 0x63, 0xd4, 0x56, 0x62, 0xce, 0x57, 0x65, 0xd1, 0x57, 0x64, 0xce,
-0x52, 0x5e, 0xe4, 0x46, 0x53, 0xe5, 0x41, 0x4d, 0xe5, 0x3d, 0x49, 0xe5,
-0x4d, 0x5c, 0xe5, 0x16, 0x1b, 0x3b, 0x16, 0x1c, 0x3d, 0x60, 0x6f, 0xe0,
-0x51, 0x5f, 0xe6, 0x4b, 0x5a, 0xe5, 0x19, 0x1e, 0x42, 0x19, 0x1f, 0x43,
-0x19, 0x1e, 0x43, 0x19, 0x1e, 0x43, 0x19, 0x1e, 0x43, 0x57, 0x66, 0xc8,
-0x44, 0x4f, 0x96, 0x5d, 0x6d, 0xe0, 0x58, 0x68, 0xe0, 0x18, 0x1e, 0x44,
-0x3e, 0x4a, 0x8c, 0x53, 0x63, 0xc3, 0x5b, 0x6b, 0xdf, 0x51, 0x61, 0xde,
-0x24, 0x2c, 0x5a, 0x14, 0x19, 0x3e, 0x51, 0x5f, 0xc1, 0x36, 0x40, 0x7c,
-0x11, 0x17, 0x3a, 0x54, 0x64, 0xcd, 0x57, 0x67, 0xd8, 0x46, 0x53, 0xa3,
-0x2e, 0x37, 0x6d, 0x23, 0x2a, 0x57, 0x4c, 0x58, 0xb1, 0x57, 0x65, 0xdf,
-0x55, 0x63, 0xe0, 0x53, 0x60, 0xe2, 0x4d, 0x5a, 0xe1, 0x48, 0x55, 0xdf,
-0x4c, 0x58, 0xdc, 0x51, 0x5e, 0xd9, 0x58, 0x65, 0xd6, 0x47, 0x52, 0x9f,
-0x31, 0x38, 0x6a, 0x2e, 0x36, 0x65, 0x4f, 0x5a, 0xb7, 0x4a, 0x55, 0xc6,
-0x40, 0x4b, 0xc4, 0x44, 0x4e, 0xc0, 0x47, 0x52, 0xbd, 0x4a, 0x55, 0xba,
-0x4c, 0x56, 0xb7, 0x41, 0x4b, 0xb4, 0x3a, 0x43, 0xb0, 0x33, 0x3c, 0xae,
-0x2e, 0x36, 0xab, 0x2d, 0x35, 0xa8, 0x2d, 0x35, 0xa5, 0x2d, 0x36, 0xa3,
-0x2e, 0x35, 0xa0, 0x2e, 0x35, 0x9e, 0x2e, 0x35, 0x9b, 0x2e, 0x36, 0x99,
-0x2d, 0x35, 0x96, 0x2d, 0x35, 0x94, 0x2d, 0x35, 0x92, 0x2d, 0x35, 0x90,
-0x2c, 0x34, 0x8d, 0x2d, 0x33, 0x8b, 0x2c, 0x32, 0x89, 0x2a, 0x31, 0x88,
-0x29, 0x30, 0x86, 0x28, 0x2f, 0x83, 0x27, 0x2d, 0x81, 0x26, 0x2d, 0x80,
-0x25, 0x2b, 0x7e, 0x24, 0x2a, 0x7d, 0x23, 0x2a, 0x7b, 0x22, 0x28, 0x79,
-0x21, 0x27, 0x78, 0x20, 0x25, 0x76, 0x1f, 0x24, 0x74, 0x1e, 0x23, 0x73,
-0x1d, 0x22, 0x71, 0x1c, 0x22, 0x70, 0x1c, 0x21, 0x6e, 0x1b, 0x20, 0x6d,
-0x1a, 0x1f, 0x6c, 0x1a, 0x1f, 0x6b, 0x19, 0x1e, 0x69, 0x19, 0x1e, 0x69,
-0x18, 0x1d, 0x67, 0x19, 0x1d, 0x66, 0x19, 0x1d, 0x65, 0x19, 0x1d, 0x64,
-0x19, 0x1d, 0x63, 0x19, 0x1d, 0x62, 0x19, 0x1d, 0x61, 0x19, 0x1d, 0x5f,
-0x19, 0x1d, 0x5e, 0x18, 0x1d, 0x5d, 0x18, 0x1d, 0x5c, 0x18, 0x1d, 0x5b,
-0x19, 0x1d, 0x5a, 0x18, 0x1d, 0x5a, 0x18, 0x1d, 0x59, 0x18, 0x1d, 0x58,
-0x17, 0x1c, 0x57, 0x17, 0x1c, 0x56, 0x17, 0x1c, 0x55, 0x16, 0x1b, 0x54,
-0x16, 0x1a, 0x54, 0x16, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x51,
-0x15, 0x19, 0x50, 0x14, 0x19, 0x50, 0x14, 0x19, 0x4f, 0x14, 0x18, 0x4e,
-0x14, 0x18, 0x4e, 0x13, 0x17, 0x4c, 0x13, 0x16, 0x4c, 0x13, 0x16, 0x4c,
-0x12, 0x16, 0x4b, 0x12, 0x16, 0x4a, 0x12, 0x15, 0x49, 0x11, 0x15, 0x48,
-0x11, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47,
-0x10, 0x14, 0x45, 0x10, 0x14, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44,
-0x10, 0x13, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41,
-0x0f, 0x12, 0x41, 0x0e, 0x12, 0x40, 0x0e, 0x12, 0x40, 0x0e, 0x12, 0x40,
-0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e,
-0x0d, 0x10, 0x3d, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x36, 0x01, 0x01, 0x05,
-0x15, 0x18, 0x46, 0x2b, 0x31, 0x8d, 0x2c, 0x34, 0x94, 0x25, 0x2a, 0x7d,
-0x21, 0x27, 0x75, 0x22, 0x27, 0x76, 0x22, 0x28, 0x77, 0x22, 0x28, 0x79,
-0x22, 0x28, 0x7b, 0x21, 0x28, 0x7d, 0x21, 0x28, 0x7e, 0x21, 0x28, 0x80,
-0x22, 0x29, 0x81, 0x23, 0x2a, 0x83, 0x25, 0x2b, 0x85, 0x26, 0x2d, 0x88,
-0x28, 0x2f, 0x89, 0x29, 0x31, 0x8b, 0x2b, 0x32, 0x8d, 0x2d, 0x34, 0x8f,
-0x2f, 0x37, 0x91, 0x31, 0x3a, 0x94, 0x36, 0x3e, 0x96, 0x39, 0x41, 0x98,
-0x3d, 0x45, 0x9a, 0x3a, 0x43, 0x8c, 0x33, 0x3a, 0x76, 0x37, 0x3f, 0x81,
-0x41, 0x4b, 0xa5, 0x3c, 0x45, 0xa7, 0x38, 0x41, 0xa9, 0x34, 0x3c, 0xac,
-0x32, 0x3b, 0xb0, 0x38, 0x42, 0xb2, 0x40, 0x4a, 0xb5, 0x4a, 0x55, 0xb8,
-0x55, 0x61, 0xbc, 0x42, 0x4d, 0xbf, 0x34, 0x3e, 0xc2, 0x2a, 0x33, 0xc5,
-0x28, 0x33, 0xc9, 0x32, 0x3c, 0xcd, 0x40, 0x4b, 0xd0, 0x52, 0x5e, 0xd4,
-0x56, 0x63, 0xd7, 0x58, 0x65, 0xd5, 0x57, 0x63, 0xce, 0x58, 0x65, 0xce,
-0x57, 0x63, 0xc8, 0x54, 0x63, 0xe4, 0x4a, 0x57, 0xe4, 0x44, 0x51, 0xe4,
-0x41, 0x4d, 0xe4, 0x57, 0x65, 0xc7, 0x17, 0x1d, 0x3f, 0x1c, 0x22, 0x47,
-0x5f, 0x6f, 0xe6, 0x4f, 0x5d, 0xe5, 0x4f, 0x5c, 0xae, 0x1b, 0x20, 0x46,
-0x1b, 0x20, 0x46, 0x1b, 0x20, 0x47, 0x1a, 0x20, 0x47, 0x49, 0x56, 0xa2,
-0x33, 0x3d, 0x75, 0x51, 0x60, 0xb7, 0x5c, 0x6d, 0xdf, 0x1a, 0x20, 0x48,
-0x28, 0x31, 0x61, 0x46, 0x54, 0x9f, 0x54, 0x63, 0xc5, 0x55, 0x65, 0xdd,
-0x16, 0x1c, 0x42, 0x15, 0x1b, 0x41, 0x49, 0x57, 0xac, 0x13, 0x19, 0x3e,
-0x20, 0x27, 0x54, 0x53, 0x63, 0xcd, 0x3f, 0x4b, 0x93, 0x24, 0x2c, 0x5a,
-0x0f, 0x14, 0x36, 0x2a, 0x32, 0x66, 0x50, 0x5e, 0xc0, 0x58, 0x67, 0xd9,
-0x59, 0x68, 0xe0, 0x53, 0x61, 0xe2, 0x4d, 0x5b, 0xe3, 0x4e, 0x5c, 0xe3,
-0x56, 0x63, 0xe0, 0x59, 0x67, 0xd4, 0x45, 0x4f, 0x97, 0x2a, 0x31, 0x5c,
-0x2f, 0x36, 0x65, 0x54, 0x60, 0xc4, 0x4b, 0x56, 0xcd, 0x44, 0x4f, 0xc9,
-0x48, 0x53, 0xc6, 0x4c, 0x57, 0xc3, 0x50, 0x5b, 0xbf, 0x4b, 0x56, 0xbc,
-0x40, 0x4a, 0xb8, 0x38, 0x41, 0xb5, 0x32, 0x3c, 0xb3, 0x2e, 0x37, 0xaf,
-0x2e, 0x37, 0xac, 0x2f, 0x38, 0xaa, 0x30, 0x38, 0xa7, 0x30, 0x38, 0xa4,
-0x30, 0x38, 0xa1, 0x30, 0x39, 0x9f, 0x30, 0x38, 0x9c, 0x30, 0x38, 0x9a,
-0x30, 0x37, 0x98, 0x2f, 0x36, 0x95, 0x2f, 0x36, 0x92, 0x2f, 0x36, 0x91,
-0x2d, 0x34, 0x8e, 0x2d, 0x33, 0x8c, 0x2b, 0x32, 0x8a, 0x2a, 0x30, 0x88,
-0x28, 0x2f, 0x86, 0x27, 0x2f, 0x84, 0x26, 0x2d, 0x82, 0x25, 0x2c, 0x80,
-0x24, 0x2a, 0x7e, 0x23, 0x29, 0x7d, 0x22, 0x28, 0x7c, 0x21, 0x26, 0x7a,
-0x20, 0x25, 0x78, 0x1f, 0x24, 0x77, 0x1e, 0x24, 0x75, 0x1d, 0x22, 0x73,
-0x1c, 0x22, 0x72, 0x1b, 0x21, 0x70, 0x1b, 0x21, 0x6f, 0x1a, 0x20, 0x6d,
-0x1a, 0x1f, 0x6c, 0x1a, 0x1f, 0x6b, 0x1a, 0x1e, 0x69, 0x1a, 0x1f, 0x69,
-0x1a, 0x1f, 0x68, 0x1a, 0x1f, 0x66, 0x1a, 0x1f, 0x65, 0x1a, 0x1e, 0x64,
-0x1a, 0x1e, 0x63, 0x1a, 0x1e, 0x62, 0x1a, 0x1e, 0x61, 0x1a, 0x1e, 0x60,
-0x1a, 0x1f, 0x5f, 0x1a, 0x1e, 0x5e, 0x19, 0x1f, 0x5d, 0x19, 0x1f, 0x5c,
-0x19, 0x1e, 0x5b, 0x19, 0x1e, 0x5a, 0x18, 0x1d, 0x59, 0x18, 0x1d, 0x58,
-0x17, 0x1c, 0x57, 0x17, 0x1c, 0x56, 0x16, 0x1b, 0x55, 0x16, 0x1b, 0x55,
-0x16, 0x1b, 0x54, 0x15, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x1a, 0x51,
-0x15, 0x19, 0x51, 0x14, 0x19, 0x50, 0x14, 0x18, 0x4f, 0x13, 0x18, 0x4e,
-0x13, 0x18, 0x4e, 0x13, 0x16, 0x4c, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c,
-0x12, 0x16, 0x4b, 0x12, 0x16, 0x4a, 0x12, 0x16, 0x4a, 0x11, 0x15, 0x48,
-0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47,
-0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44,
-0x10, 0x13, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x42,
-0x0f, 0x12, 0x41, 0x0e, 0x12, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40,
-0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e,
-0x0d, 0x10, 0x3d, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x14, 0x18, 0x46, 0x2b, 0x31, 0x8e, 0x2d, 0x34, 0x94, 0x27, 0x2c, 0x7e,
-0x23, 0x28, 0x75, 0x23, 0x29, 0x77, 0x24, 0x29, 0x78, 0x24, 0x2a, 0x7a,
-0x24, 0x29, 0x7b, 0x23, 0x2a, 0x7d, 0x23, 0x2a, 0x7f, 0x24, 0x2a, 0x81,
-0x24, 0x2a, 0x82, 0x23, 0x2a, 0x84, 0x23, 0x2a, 0x86, 0x25, 0x2b, 0x88,
-0x27, 0x2d, 0x8a, 0x27, 0x2e, 0x8c, 0x29, 0x30, 0x8e, 0x2b, 0x32, 0x90,
-0x2d, 0x34, 0x93, 0x2f, 0x37, 0x94, 0x31, 0x3a, 0x97, 0x34, 0x3c, 0x99,
-0x38, 0x40, 0x9c, 0x3c, 0x45, 0x9e, 0x3f, 0x48, 0x9b, 0x39, 0x41, 0x87,
-0x31, 0x38, 0x70, 0x38, 0x40, 0x83, 0x44, 0x4e, 0xab, 0x3f, 0x48, 0xae,
-0x39, 0x43, 0xb1, 0x33, 0x3c, 0xb4, 0x37, 0x41, 0xb7, 0x3f, 0x4a, 0xba,
-0x49, 0x54, 0xbe, 0x56, 0x62, 0xc1, 0x4d, 0x58, 0xc4, 0x3b, 0x46, 0xc8,
-0x2e, 0x38, 0xcc, 0x29, 0x32, 0xcf, 0x30, 0x3b, 0xd3, 0x40, 0x4b, 0xd7,
-0x55, 0x62, 0xda, 0x5a, 0x68, 0xdf, 0x58, 0x65, 0xd1, 0x51, 0x5d, 0xb9,
-0x4b, 0x56, 0xa7, 0x4c, 0x59, 0xab, 0x59, 0x67, 0xe3, 0x4c, 0x5b, 0xe3,
-0x47, 0x55, 0xe3, 0x4c, 0x5a, 0xe4, 0x18, 0x1e, 0x41, 0x1a, 0x1f, 0x44,
-0x3e, 0x49, 0x85, 0x5b, 0x6c, 0xe5, 0x5b, 0x6c, 0xe4, 0x1d, 0x23, 0x4a,
-0x1d, 0x23, 0x4b, 0x1d, 0x23, 0x4b, 0x1d, 0x23, 0x4c, 0x25, 0x2d, 0x5b,
-0x25, 0x2d, 0x5b, 0x39, 0x44, 0x80, 0x56, 0x66, 0xc7, 0x1b, 0x22, 0x4c,
-0x1b, 0x21, 0x4b, 0x36, 0x40, 0x7b, 0x4b, 0x59, 0xac, 0x50, 0x60, 0xbe,
-0x17, 0x1d, 0x46, 0x16, 0x1c, 0x45, 0x22, 0x2a, 0x59, 0x14, 0x1a, 0x41,
-0x2d, 0x36, 0x6d, 0x3b, 0x46, 0x89, 0x15, 0x1b, 0x42, 0x10, 0x16, 0x3a,
-0x10, 0x15, 0x38, 0x33, 0x3e, 0x79, 0x49, 0x55, 0xaa, 0x50, 0x5e, 0xbd,
-0x5a, 0x69, 0xe0, 0x54, 0x62, 0xe2, 0x54, 0x62, 0xe3, 0x5c, 0x69, 0xe4,
-0x59, 0x66, 0xd0, 0x3f, 0x49, 0x8a, 0x1b, 0x20, 0x42, 0x30, 0x38, 0x69,
-0x59, 0x65, 0xd1, 0x4d, 0x58, 0xd4, 0x49, 0x55, 0xd0, 0x4e, 0x58, 0xcc,
-0x52, 0x5e, 0xc8, 0x57, 0x62, 0xc5, 0x4a, 0x54, 0xc2, 0x3f, 0x49, 0xbe,
-0x37, 0x41, 0xbb, 0x31, 0x3a, 0xb7, 0x31, 0x39, 0xb4, 0x31, 0x3a, 0xb1,
-0x32, 0x3a, 0xae, 0x32, 0x3b, 0xab, 0x33, 0x3b, 0xa8, 0x33, 0x3b, 0xa5,
-0x33, 0x3a, 0xa3, 0x33, 0x3a, 0xa0, 0x32, 0x3a, 0x9e, 0x31, 0x3a, 0x9b,
-0x31, 0x3a, 0x99, 0x30, 0x39, 0x96, 0x30, 0x37, 0x94, 0x2f, 0x35, 0x91,
-0x2d, 0x33, 0x8f, 0x2b, 0x32, 0x8d, 0x2b, 0x31, 0x8b, 0x29, 0x30, 0x88,
-0x28, 0x2f, 0x87, 0x27, 0x2e, 0x85, 0x25, 0x2c, 0x83, 0x24, 0x2b, 0x81,
-0x23, 0x29, 0x7f, 0x21, 0x27, 0x7d, 0x21, 0x27, 0x7b, 0x20, 0x25, 0x7b,
-0x1f, 0x24, 0x79, 0x1e, 0x24, 0x77, 0x1d, 0x23, 0x75, 0x1c, 0x22, 0x74,
-0x1c, 0x21, 0x72, 0x1b, 0x21, 0x71, 0x1b, 0x20, 0x6f, 0x1b, 0x20, 0x6e,
-0x1b, 0x20, 0x6c, 0x1b, 0x20, 0x6b, 0x1c, 0x20, 0x6a, 0x1b, 0x20, 0x68,
-0x1b, 0x20, 0x68, 0x1c, 0x20, 0x66, 0x1c, 0x20, 0x66, 0x1c, 0x21, 0x65,
-0x1b, 0x20, 0x63, 0x1a, 0x20, 0x62, 0x1a, 0x20, 0x61, 0x1a, 0x20, 0x60,
-0x1b, 0x20, 0x5f, 0x1a, 0x20, 0x5e, 0x1a, 0x1f, 0x5d, 0x19, 0x1f, 0x5c,
-0x19, 0x1e, 0x5b, 0x18, 0x1d, 0x5a, 0x18, 0x1d, 0x59, 0x17, 0x1c, 0x58,
-0x17, 0x1c, 0x57, 0x16, 0x1c, 0x56, 0x16, 0x1b, 0x56, 0x16, 0x1b, 0x55,
-0x16, 0x1a, 0x54, 0x15, 0x1a, 0x53, 0x15, 0x1a, 0x52, 0x15, 0x19, 0x52,
-0x15, 0x19, 0x51, 0x14, 0x18, 0x4f, 0x13, 0x18, 0x4f, 0x13, 0x18, 0x4f,
-0x13, 0x17, 0x4e, 0x13, 0x17, 0x4d, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c,
-0x12, 0x16, 0x4b, 0x12, 0x16, 0x4b, 0x12, 0x16, 0x4a, 0x11, 0x14, 0x48,
-0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47,
-0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44,
-0x10, 0x12, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x42,
-0x0e, 0x12, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40,
-0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e,
-0x0d, 0x10, 0x3d, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x14, 0x17, 0x47, 0x28, 0x31, 0x8e, 0x2a, 0x32, 0x95, 0x25, 0x2b, 0x7e,
-0x23, 0x28, 0x76, 0x24, 0x2a, 0x78, 0x26, 0x2b, 0x78, 0x26, 0x2b, 0x7a,
-0x25, 0x2b, 0x7c, 0x26, 0x2b, 0x7e, 0x26, 0x2c, 0x80, 0x26, 0x2c, 0x81,
-0x26, 0x2c, 0x83, 0x26, 0x2c, 0x85, 0x26, 0x2c, 0x87, 0x26, 0x2c, 0x89,
-0x25, 0x2c, 0x8b, 0x26, 0x2d, 0x8d, 0x28, 0x2f, 0x8f, 0x29, 0x31, 0x91,
-0x2b, 0x32, 0x94, 0x2d, 0x34, 0x95, 0x2f, 0x37, 0x98, 0x32, 0x39, 0x9a,
-0x34, 0x3c, 0x9d, 0x37, 0x40, 0x9f, 0x3b, 0x44, 0xa2, 0x41, 0x49, 0xa5,
-0x41, 0x49, 0x9c, 0x37, 0x3f, 0x7f, 0x29, 0x2f, 0x5d, 0x3b, 0x44, 0x89,
-0x47, 0x52, 0xb3, 0x40, 0x4a, 0xb6, 0x3a, 0x44, 0xb9, 0x36, 0x40, 0xbc,
-0x3d, 0x49, 0xc0, 0x48, 0x52, 0xc3, 0x55, 0x62, 0xc6, 0x5b, 0x68, 0xca,
-0x44, 0x50, 0xce, 0x33, 0x3e, 0xd2, 0x28, 0x32, 0xd6, 0x30, 0x3a, 0xda,
-0x3f, 0x4b, 0xde, 0x5a, 0x67, 0xe2, 0x57, 0x64, 0xce, 0x4b, 0x57, 0xaa,
-0x3e, 0x47, 0x89, 0x33, 0x3c, 0x72, 0x3f, 0x4a, 0x8b, 0x5c, 0x6b, 0xe2,
-0x51, 0x60, 0xe2, 0x4c, 0x5a, 0xe3, 0x5b, 0x6b, 0xd4, 0x1b, 0x21, 0x47,
-0x1d, 0x23, 0x49, 0x4f, 0x5b, 0xaa, 0x58, 0x6a, 0xe4, 0x1f, 0x25, 0x4e,
-0x1f, 0x26, 0x4f, 0x1f, 0x25, 0x4f, 0x1f, 0x26, 0x50, 0x1e, 0x25, 0x50,
-0x1f, 0x25, 0x51, 0x1f, 0x25, 0x51, 0x4d, 0x5c, 0xad, 0x1e, 0x24, 0x50,
-0x1d, 0x24, 0x50, 0x23, 0x2b, 0x5a, 0x3e, 0x4b, 0x8f, 0x22, 0x2a, 0x5a,
-0x18, 0x1f, 0x4a, 0x17, 0x1e, 0x47, 0x16, 0x1c, 0x46, 0x15, 0x1b, 0x44,
-0x36, 0x42, 0x81, 0x13, 0x19, 0x40, 0x12, 0x18, 0x3e, 0x11, 0x17, 0x3d,
-0x10, 0x16, 0x3b, 0x31, 0x3a, 0x73, 0x3e, 0x4a, 0x8f, 0x4d, 0x5a, 0xb3,
-0x5a, 0x6a, 0xe0, 0x5b, 0x6a, 0xe2, 0x58, 0x67, 0xd0, 0x4c, 0x58, 0xa9,
-0x2e, 0x36, 0x66, 0x13, 0x17, 0x35, 0x31, 0x38, 0x6a, 0x5d, 0x6b, 0xdf,
-0x4e, 0x5a, 0xdb, 0x4e, 0x5a, 0xd7, 0x54, 0x60, 0xd3, 0x5a, 0x66, 0xce,
-0x56, 0x62, 0xcb, 0x48, 0x54, 0xc7, 0x3e, 0x48, 0xc4, 0x36, 0x40, 0xc0,
-0x33, 0x3c, 0xbd, 0x33, 0x3d, 0xb9, 0x34, 0x3d, 0xb6, 0x34, 0x3e, 0xb3,
-0x35, 0x3d, 0xaf, 0x36, 0x3e, 0xad, 0x35, 0x3e, 0xaa, 0x35, 0x3e, 0xa7,
-0x35, 0x3e, 0xa4, 0x35, 0x3d, 0xa1, 0x35, 0x3d, 0x9e, 0x33, 0x3c, 0x9c,
-0x32, 0x3a, 0x99, 0x30, 0x39, 0x97, 0x2f, 0x36, 0x95, 0x2e, 0x35, 0x92,
-0x2c, 0x33, 0x90, 0x2b, 0x31, 0x8e, 0x2a, 0x31, 0x8c, 0x28, 0x30, 0x89,
-0x26, 0x2d, 0x87, 0x25, 0x2c, 0x86, 0x24, 0x2a, 0x84, 0x23, 0x29, 0x82,
-0x22, 0x27, 0x80, 0x21, 0x26, 0x7e, 0x1f, 0x25, 0x7c, 0x1e, 0x25, 0x7b,
-0x1d, 0x23, 0x79, 0x1d, 0x23, 0x78, 0x1d, 0x23, 0x76, 0x1c, 0x22, 0x74,
-0x1d, 0x22, 0x73, 0x1d, 0x22, 0x71, 0x1d, 0x22, 0x70, 0x1d, 0x22, 0x6e,
-0x1d, 0x22, 0x6d, 0x1d, 0x22, 0x6b, 0x1d, 0x22, 0x6a, 0x1d, 0x22, 0x69,
-0x1d, 0x22, 0x68, 0x1c, 0x22, 0x66, 0x1c, 0x22, 0x66, 0x1c, 0x22, 0x65,
-0x1c, 0x21, 0x63, 0x1c, 0x21, 0x63, 0x1b, 0x21, 0x61, 0x1b, 0x20, 0x60,
-0x1a, 0x20, 0x5f, 0x1a, 0x1f, 0x5e, 0x19, 0x1f, 0x5d, 0x19, 0x1e, 0x5c,
-0x18, 0x1e, 0x5b, 0x18, 0x1d, 0x5a, 0x17, 0x1d, 0x59, 0x17, 0x1c, 0x58,
-0x17, 0x1c, 0x57, 0x16, 0x1b, 0x57, 0x16, 0x1b, 0x56, 0x16, 0x1a, 0x55,
-0x16, 0x1a, 0x54, 0x15, 0x1a, 0x53, 0x15, 0x19, 0x52, 0x14, 0x19, 0x52,
-0x14, 0x19, 0x51, 0x13, 0x18, 0x4f, 0x13, 0x18, 0x4f, 0x13, 0x18, 0x4f,
-0x13, 0x17, 0x4e, 0x13, 0x17, 0x4d, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c,
-0x12, 0x16, 0x4b, 0x12, 0x16, 0x4b, 0x12, 0x15, 0x4a, 0x11, 0x14, 0x48,
-0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47,
-0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x12, 0x44, 0x10, 0x12, 0x44,
-0x10, 0x12, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42,
-0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40,
-0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e,
-0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x13, 0x17, 0x47, 0x27, 0x2f, 0x8f, 0x29, 0x32, 0x95, 0x24, 0x2b, 0x7f,
-0x21, 0x27, 0x76, 0x22, 0x29, 0x78, 0x24, 0x2a, 0x79, 0x25, 0x2b, 0x7b,
-0x26, 0x2c, 0x7d, 0x27, 0x2e, 0x7f, 0x27, 0x2e, 0x80, 0x27, 0x2e, 0x81,
-0x27, 0x2e, 0x84, 0x27, 0x2f, 0x86, 0x28, 0x2f, 0x88, 0x27, 0x2e, 0x89,
-0x28, 0x2e, 0x8c, 0x28, 0x2f, 0x8e, 0x28, 0x2f, 0x90, 0x28, 0x2e, 0x92,
-0x29, 0x31, 0x95, 0x2b, 0x33, 0x97, 0x2d, 0x34, 0x99, 0x2e, 0x37, 0x9b,
-0x31, 0x38, 0x9e, 0x33, 0x3d, 0xa1, 0x36, 0x3f, 0xa3, 0x3a, 0x44, 0xa6,
-0x3f, 0x48, 0xa9, 0x44, 0x4e, 0xac, 0x3e, 0x47, 0x94, 0x33, 0x3a, 0x74,
-0x23, 0x2a, 0x52, 0x3d, 0x46, 0x8d, 0x49, 0x54, 0xbb, 0x41, 0x4c, 0xbe,
-0x3a, 0x45, 0xc2, 0x3c, 0x46, 0xc5, 0x46, 0x51, 0xc9, 0x53, 0x5f, 0xcc,
-0x65, 0x73, 0xd0, 0x50, 0x5d, 0xd4, 0x3a, 0x44, 0xd8, 0x2a, 0x34, 0xdd,
-0x2e, 0x39, 0xe1, 0x40, 0x4d, 0xe2, 0x56, 0x63, 0xcd, 0x49, 0x55, 0xa6,
-0x34, 0x3d, 0x74, 0x21, 0x28, 0x52, 0x14, 0x19, 0x3c, 0x2f, 0x38, 0x6b,
-0x5a, 0x69, 0xd6, 0x56, 0x65, 0xe1, 0x50, 0x60, 0xe2, 0x1c, 0x22, 0x4a,
-0x1e, 0x24, 0x4c, 0x20, 0x27, 0x4f, 0x58, 0x68, 0xc1, 0x3f, 0x49, 0x87,
-0x22, 0x29, 0x54, 0x22, 0x29, 0x55, 0x21, 0x28, 0x55, 0x22, 0x29, 0x56,
-0x21, 0x28, 0x56, 0x21, 0x28, 0x56, 0x40, 0x4c, 0x8f, 0x20, 0x27, 0x55,
-0x1f, 0x26, 0x55, 0x1e, 0x26, 0x54, 0x2f, 0x39, 0x71, 0x1c, 0x23, 0x50,
-0x1a, 0x21, 0x4e, 0x19, 0x1f, 0x4c, 0x17, 0x1e, 0x49, 0x16, 0x1d, 0x48,
-0x15, 0x1b, 0x45, 0x14, 0x1a, 0x43, 0x13, 0x19, 0x41, 0x12, 0x18, 0x3f,
-0x11, 0x17, 0x3d, 0x20, 0x27, 0x54, 0x33, 0x3c, 0x76, 0x4e, 0x5c, 0xb4,
-0x57, 0x66, 0xce, 0x49, 0x54, 0xa1, 0x34, 0x3d, 0x73, 0x15, 0x19, 0x39,
-0x15, 0x19, 0x39, 0x30, 0x38, 0x67, 0x5f, 0x6e, 0xe6, 0x4d, 0x59, 0xe2,
-0x55, 0x61, 0xdd, 0x5a, 0x66, 0xd7, 0x4a, 0x54, 0xa5, 0x54, 0x60, 0xd1,
-0x46, 0x51, 0xcd, 0x3c, 0x47, 0xca, 0x34, 0x3e, 0xc6, 0x36, 0x40, 0xc2,
-0x36, 0x40, 0xbe, 0x38, 0x40, 0xbb, 0x38, 0x41, 0xb8, 0x38, 0x42, 0xb4,
-0x38, 0x41, 0xb1, 0x39, 0x42, 0xae, 0x39, 0x41, 0xab, 0x38, 0x41, 0xa8,
-0x37, 0x41, 0xa5, 0x36, 0x3f, 0xa2, 0x35, 0x3c, 0x9f, 0x32, 0x3b, 0x9d,
-0x31, 0x39, 0x9a, 0x30, 0x38, 0x98, 0x2e, 0x36, 0x96, 0x2d, 0x34, 0x93,
-0x2c, 0x33, 0x91, 0x2a, 0x31, 0x8e, 0x3b, 0x42, 0x7e, 0x90, 0x8f, 0x41,
-0xa5, 0xa3, 0x32, 0xa5, 0xa2, 0x31, 0x4d, 0x50, 0x69, 0x21, 0x27, 0x82,
-0x20, 0x27, 0x80, 0x1f, 0x25, 0x7f, 0x1f, 0x24, 0x7d, 0x1e, 0x24, 0x7b,
-0x1e, 0x24, 0x79, 0x1e, 0x24, 0x78, 0x1f, 0x24, 0x77, 0x1f, 0x24, 0x75,
-0x1f, 0x24, 0x73, 0x1f, 0x24, 0x72, 0x1f, 0x24, 0x70, 0x1f, 0x24, 0x6f,
-0x1e, 0x24, 0x6d, 0x1e, 0x24, 0x6c, 0x1e, 0x24, 0x6a, 0x1e, 0x24, 0x69,
-0x1e, 0x24, 0x68, 0x1e, 0x24, 0x68, 0x1d, 0x22, 0x65, 0x1d, 0x22, 0x65,
-0x1c, 0x21, 0x63, 0x1c, 0x21, 0x63, 0x1b, 0x21, 0x62, 0x1a, 0x20, 0x60,
-0x1a, 0x1f, 0x5f, 0x1a, 0x1f, 0x5e, 0x19, 0x1e, 0x5d, 0x18, 0x1e, 0x5c,
-0x18, 0x1d, 0x5b, 0x18, 0x1d, 0x5a, 0x18, 0x1d, 0x5a, 0x17, 0x1c, 0x59,
-0x17, 0x1b, 0x58, 0x16, 0x1b, 0x57, 0x16, 0x1a, 0x56, 0x16, 0x1a, 0x55,
-0x15, 0x19, 0x54, 0x14, 0x19, 0x53, 0x14, 0x19, 0x53, 0x14, 0x19, 0x52,
-0x14, 0x18, 0x51, 0x13, 0x18, 0x4f, 0x13, 0x18, 0x4f, 0x13, 0x17, 0x4f,
-0x13, 0x17, 0x4e, 0x13, 0x17, 0x4d, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c,
-0x12, 0x15, 0x4b, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4a, 0x11, 0x14, 0x49,
-0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47,
-0x11, 0x14, 0x47, 0x10, 0x13, 0x45, 0x10, 0x12, 0x44, 0x10, 0x12, 0x44,
-0x10, 0x12, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42,
-0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40,
-0x0e, 0x10, 0x3f, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e,
-0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x13, 0x16, 0x48, 0x27, 0x2d, 0x8f, 0x29, 0x31, 0x96, 0x23, 0x29, 0x7f,
-0x20, 0x26, 0x77, 0x21, 0x28, 0x78, 0x22, 0x29, 0x7a, 0x24, 0x29, 0x7b,
-0x24, 0x2a, 0x7d, 0x26, 0x2c, 0x7f, 0x27, 0x2d, 0x81, 0x28, 0x2f, 0x82,
-0x29, 0x30, 0x84, 0x2a, 0x31, 0x86, 0x2b, 0x32, 0x89, 0x2b, 0x32, 0x8a,
-0x2a, 0x32, 0x8c, 0x2a, 0x32, 0x8f, 0x2a, 0x32, 0x90, 0x2a, 0x32, 0x93,
-0x2a, 0x32, 0x95, 0x2a, 0x32, 0x98, 0x2a, 0x32, 0x9a, 0x2d, 0x34, 0x9d,
-0x2f, 0x37, 0x9f, 0x31, 0x38, 0xa2, 0x33, 0x3c, 0xa5, 0x36, 0x3f, 0xa7,
-0x3a, 0x43, 0xab, 0x3d, 0x47, 0xad, 0x44, 0x4c, 0xb0, 0x47, 0x52, 0xae,
-0x3d, 0x46, 0x8f, 0x2e, 0x35, 0x67, 0x22, 0x28, 0x50, 0x40, 0x49, 0x93,
-0x4c, 0x58, 0xc4, 0x43, 0x4f, 0xc8, 0x3a, 0x46, 0xcb, 0x44, 0x4f, 0xcf,
-0x51, 0x5e, 0xd3, 0x41, 0x4b, 0x94, 0x49, 0x54, 0xa8, 0x44, 0x4f, 0xe0,
-0x30, 0x3b, 0xe1, 0x2f, 0x3a, 0xe1, 0x42, 0x4f, 0xe1, 0x4f, 0x5c, 0xb8,
-0x31, 0x3a, 0x71, 0x17, 0x1c, 0x41, 0x15, 0x1a, 0x3d, 0x16, 0x1c, 0x40,
-0x1f, 0x26, 0x50, 0x52, 0x61, 0xbc, 0x5b, 0x6b, 0xe1, 0x5f, 0x70, 0xe0,
-0x1f, 0x26, 0x4f, 0x22, 0x29, 0x53, 0x24, 0x2b, 0x57, 0x5e, 0x70, 0xd6,
-0x25, 0x2c, 0x5a, 0x25, 0x2c, 0x5a, 0x25, 0x2c, 0x5b, 0x24, 0x2c, 0x5b,
-0x24, 0x2c, 0x5c, 0x24, 0x2b, 0x5c, 0x30, 0x3a, 0x72, 0x23, 0x2a, 0x5b,
-0x22, 0x2a, 0x5b, 0x21, 0x28, 0x58, 0x1f, 0x26, 0x56, 0x1e, 0x25, 0x55,
-0x1c, 0x23, 0x52, 0x1a, 0x21, 0x4f, 0x19, 0x20, 0x4d, 0x17, 0x1e, 0x4b,
-0x16, 0x1d, 0x48, 0x15, 0x1c, 0x46, 0x14, 0x1a, 0x43, 0x13, 0x19, 0x42,
-0x13, 0x19, 0x41, 0x14, 0x1a, 0x40, 0x34, 0x3e, 0x78, 0x48, 0x54, 0xa1,
-0x34, 0x3e, 0x75, 0x16, 0x1c, 0x3e, 0x16, 0x1b, 0x3d, 0x17, 0x1c, 0x3c,
-0x1e, 0x24, 0x48, 0x62, 0x70, 0xe6, 0x56, 0x63, 0xe7, 0x5c, 0x6a, 0xe5,
-0x55, 0x61, 0xc1, 0x4f, 0x5a, 0xb2, 0x51, 0x5d, 0xd8, 0x43, 0x4f, 0xd4,
-0x3a, 0x43, 0xcf, 0x38, 0x42, 0xcc, 0x39, 0x44, 0xc8, 0x3a, 0x44, 0xc4,
-0x3c, 0x45, 0xc1, 0x3c, 0x45, 0xbd, 0x3c, 0x46, 0xba, 0x3c, 0x46, 0xb6,
-0x3c, 0x45, 0xb2, 0x3c, 0x45, 0xaf, 0x3b, 0x45, 0xac, 0x39, 0x42, 0xa9,
-0x37, 0x40, 0xa7, 0x36, 0x3e, 0xa3, 0x34, 0x3b, 0xa1, 0x33, 0x3a, 0x9e,
-0x30, 0x38, 0x9c, 0x2f, 0x37, 0x99, 0x2e, 0x34, 0x96, 0x2b, 0x32, 0x94,
-0x29, 0x31, 0x91, 0x66, 0x69, 0x61, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07,
-0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0x62, 0x64, 0x59,
-0x20, 0x27, 0x81, 0x21, 0x26, 0x7f, 0x21, 0x26, 0x7d, 0x20, 0x26, 0x7b,
-0x21, 0x27, 0x7a, 0x20, 0x27, 0x78, 0x20, 0x26, 0x77, 0x20, 0x26, 0x75,
-0x20, 0x27, 0x74, 0x21, 0x27, 0x72, 0x21, 0x26, 0x71, 0x20, 0x26, 0x6f,
-0x21, 0x26, 0x6e, 0x20, 0x25, 0x6c, 0x20, 0x25, 0x6b, 0x1f, 0x24, 0x6a,
-0x1e, 0x23, 0x68, 0x1e, 0x23, 0x67, 0x1d, 0x22, 0x66, 0x1c, 0x22, 0x65,
-0x1c, 0x21, 0x64, 0x1b, 0x21, 0x63, 0x1a, 0x20, 0x62, 0x1a, 0x1f, 0x60,
-0x19, 0x1f, 0x5f, 0x19, 0x1f, 0x5f, 0x19, 0x1d, 0x5e, 0x18, 0x1d, 0x5d,
-0x18, 0x1d, 0x5c, 0x18, 0x1c, 0x5b, 0x17, 0x1c, 0x5a, 0x17, 0x1c, 0x59,
-0x17, 0x1b, 0x58, 0x17, 0x1b, 0x57, 0x16, 0x1a, 0x56, 0x16, 0x1a, 0x55,
-0x15, 0x19, 0x54, 0x15, 0x19, 0x54, 0x15, 0x19, 0x53, 0x14, 0x18, 0x52,
-0x14, 0x18, 0x51, 0x14, 0x17, 0x50, 0x13, 0x17, 0x4f, 0x13, 0x17, 0x4f,
-0x13, 0x17, 0x4e, 0x13, 0x16, 0x4e, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4c,
-0x12, 0x16, 0x4c, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4a, 0x11, 0x14, 0x49,
-0x11, 0x14, 0x48, 0x11, 0x14, 0x47, 0x11, 0x14, 0x47, 0x10, 0x14, 0x47,
-0x10, 0x14, 0x47, 0x10, 0x12, 0x45, 0x10, 0x12, 0x45, 0x10, 0x12, 0x44,
-0x10, 0x12, 0x43, 0x10, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42,
-0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40, 0x0e, 0x11, 0x40,
-0x0e, 0x10, 0x3f, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e,
-0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x13, 0x17, 0x48, 0x27, 0x2d, 0x90, 0x28, 0x2e, 0x96, 0x23, 0x28, 0x80,
-0x20, 0x25, 0x78, 0x20, 0x26, 0x78, 0x21, 0x27, 0x7a, 0x22, 0x28, 0x7c,
-0x23, 0x2a, 0x7e, 0x24, 0x2a, 0x80, 0x26, 0x2c, 0x81, 0x27, 0x2e, 0x83,
-0x28, 0x2f, 0x85, 0x29, 0x31, 0x87, 0x2b, 0x32, 0x89, 0x2e, 0x34, 0x8b,
-0x2d, 0x34, 0x8d, 0x2e, 0x34, 0x90, 0x2e, 0x35, 0x91, 0x2d, 0x34, 0x94,
-0x2d, 0x34, 0x96, 0x2d, 0x34, 0x99, 0x2d, 0x35, 0x9b, 0x2d, 0x35, 0x9e,
-0x2c, 0x35, 0xa0, 0x2f, 0x36, 0xa4, 0x30, 0x39, 0xa6, 0x33, 0x3c, 0xa9,
-0x36, 0x3e, 0xab, 0x39, 0x42, 0xae, 0x3d, 0x46, 0xb1, 0x41, 0x4b, 0xb5,
-0x69, 0x70, 0x91, 0x7a, 0x7f, 0x71, 0xac, 0xaa, 0x30, 0xa5, 0xa3, 0x21,
-0xa3, 0xa0, 0x1d, 0xaf, 0xae, 0x38, 0xb3, 0xb3, 0x49, 0xaf, 0xaf, 0x4a,
-0xae, 0xad, 0x4c, 0x80, 0x86, 0x93, 0x81, 0x87, 0x7e, 0x0d, 0x12, 0x30,
-0x53, 0x61, 0xe0, 0x3a, 0x46, 0xe0, 0x30, 0x3c, 0xe0, 0x43, 0x51, 0xdf,
-0x48, 0x55, 0xa6, 0x13, 0x19, 0x3c, 0x15, 0x1a, 0x3f, 0x16, 0x1c, 0x42,
-0x18, 0x1e, 0x45, 0x1a, 0x21, 0x49, 0x4b, 0x58, 0xa7, 0x5c, 0x6c, 0xd6,
-0x21, 0x28, 0x53, 0x24, 0x2b, 0x57, 0x27, 0x2e, 0x5b, 0x34, 0x3d, 0x72,
-0x29, 0x30, 0x60, 0x29, 0x30, 0x61, 0x29, 0x30, 0x62, 0x28, 0x30, 0x62,
-0x27, 0x2f, 0x62, 0x50, 0x55, 0x4e, 0x66, 0x69, 0x43, 0xa6, 0xa4, 0x25,
-0xa5, 0xa3, 0x25, 0xa5, 0xa3, 0x24, 0xa4, 0xa2, 0x23, 0x8d, 0x8d, 0x2c,
-0x60, 0x63, 0x3c, 0x32, 0x37, 0x4b, 0x1a, 0x21, 0x51, 0x19, 0x20, 0x4f,
-0x17, 0x1e, 0x4c, 0x16, 0x1d, 0x49, 0x15, 0x1b, 0x47, 0x15, 0x1b, 0x46,
-0x16, 0x1c, 0x45, 0x16, 0x1c, 0x44, 0x34, 0x3e, 0x78, 0x18, 0x1d, 0x43,
-0x18, 0x1e, 0x42, 0x19, 0x1e, 0x41, 0x18, 0x1e, 0x40, 0x18, 0x1d, 0x3e,
-0x5c, 0x6b, 0xd3, 0x60, 0x6e, 0xe7, 0x58, 0x65, 0xc8, 0x46, 0x50, 0x97,
-0x5f, 0x6d, 0xe2, 0x4d, 0x5a, 0xdf, 0x40, 0x4b, 0xdb, 0x3a, 0x45, 0xd6,
-0x3b, 0x46, 0xd2, 0x3c, 0x47, 0xce, 0x3e, 0x49, 0xca, 0x3f, 0x49, 0xc6,
-0x3f, 0x49, 0xc2, 0x3f, 0x4b, 0xbf, 0x41, 0x4a, 0xbb, 0x40, 0x49, 0xb8,
-0x40, 0x49, 0xb4, 0x3e, 0x47, 0xb0, 0x3a, 0x44, 0xad, 0x39, 0x41, 0xaa,
-0x36, 0x3f, 0xa7, 0x35, 0x3d, 0xa5, 0x33, 0x3b, 0xa1, 0x31, 0x39, 0x9f,
-0x2e, 0x36, 0x9c, 0x2c, 0x34, 0x9a, 0x2a, 0x32, 0x97, 0x28, 0x30, 0x95,
-0x27, 0x2e, 0x92, 0xd0, 0xca, 0x16, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07,
-0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xcf, 0xca, 0x15,
-0x22, 0x29, 0x82, 0x22, 0x29, 0x80, 0x22, 0x29, 0x7e, 0x22, 0x29, 0x7c,
-0x23, 0x29, 0x7a, 0x23, 0x29, 0x78, 0x23, 0x29, 0x78, 0x23, 0x29, 0x76,
-0x23, 0x28, 0x74, 0x23, 0x28, 0x73, 0x22, 0x28, 0x71, 0x21, 0x27, 0x6f,
-0x21, 0x26, 0x6e, 0x20, 0x25, 0x6d, 0x1f, 0x24, 0x6b, 0x1e, 0x24, 0x6a,
-0x1d, 0x23, 0x68, 0x1d, 0x23, 0x67, 0x1c, 0x22, 0x66, 0x1c, 0x22, 0x65,
-0x1b, 0x21, 0x65, 0x1a, 0x20, 0x63, 0x19, 0x1f, 0x62, 0x19, 0x1f, 0x61,
-0x19, 0x1e, 0x5f, 0x19, 0x1e, 0x5f, 0x19, 0x1d, 0x5e, 0x18, 0x1d, 0x5d,
-0x18, 0x1c, 0x5c, 0x17, 0x1c, 0x5b, 0x17, 0x1c, 0x5a, 0x17, 0x1b, 0x59,
-0x17, 0x1b, 0x58, 0x16, 0x1a, 0x57, 0x16, 0x1a, 0x56, 0x15, 0x19, 0x55,
-0x15, 0x19, 0x55, 0x15, 0x18, 0x54, 0x15, 0x18, 0x53, 0x14, 0x18, 0x52,
-0x14, 0x17, 0x51, 0x14, 0x17, 0x51, 0x13, 0x17, 0x50, 0x13, 0x17, 0x4f,
-0x12, 0x16, 0x4e, 0x12, 0x16, 0x4e, 0x12, 0x16, 0x4c, 0x12, 0x15, 0x4c,
-0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x15, 0x4a, 0x11, 0x14, 0x49,
-0x11, 0x14, 0x48, 0x11, 0x14, 0x48, 0x10, 0x14, 0x47, 0x10, 0x13, 0x47,
-0x10, 0x13, 0x47, 0x10, 0x12, 0x45, 0x10, 0x12, 0x45, 0x0f, 0x12, 0x44,
-0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42,
-0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40, 0x0e, 0x10, 0x40,
-0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e,
-0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x14, 0x17, 0x48, 0x28, 0x2f, 0x90, 0x29, 0x32, 0x97, 0x23, 0x2a, 0x80,
-0x20, 0x26, 0x78, 0x20, 0x26, 0x79, 0x20, 0x27, 0x7b, 0x20, 0x26, 0x7c,
-0x21, 0x28, 0x7e, 0x22, 0x29, 0x80, 0x24, 0x2a, 0x81, 0x25, 0x2b, 0x83,
-0x26, 0x2d, 0x86, 0x28, 0x2e, 0x88, 0x29, 0x30, 0x8a, 0x2a, 0x32, 0x8c,
-0x2d, 0x33, 0x8e, 0x2e, 0x35, 0x90, 0x30, 0x38, 0x92, 0x31, 0x39, 0x95,
-0x31, 0x39, 0x97, 0x30, 0x39, 0x9a, 0x31, 0x39, 0x9c, 0x30, 0x39, 0x9f,
-0x2f, 0x38, 0xa1, 0x2f, 0x38, 0xa4, 0x2f, 0x38, 0xa7, 0x30, 0x39, 0xaa,
-0x32, 0x3b, 0xad, 0x70, 0x73, 0x77, 0xac, 0xaa, 0x40, 0xc7, 0xc5, 0x18,
-0xd1, 0xca, 0x1a, 0xd7, 0xd0, 0x1c, 0xde, 0xd7, 0x1d, 0xcf, 0xc9, 0x1a,
-0xdb, 0xd4, 0x1c, 0xdc, 0xda, 0x1d, 0xc7, 0xc5, 0x18, 0xcc, 0xc6, 0x19,
-0xd7, 0xd5, 0x1c, 0xdf, 0xd9, 0x22, 0xd1, 0xcf, 0x1a, 0xdf, 0xd9, 0x22,
-0xcd, 0xc7, 0x0b, 0x99, 0x9a, 0x3f, 0x69, 0x72, 0xaf, 0x33, 0x40, 0xde,
-0x45, 0x53, 0xde, 0x3d, 0x48, 0x8b, 0x15, 0x1b, 0x40, 0x17, 0x1d, 0x44,
-0x19, 0x1f, 0x47, 0x1b, 0x21, 0x4a, 0x1d, 0x24, 0x4e, 0x3a, 0x46, 0x82,
-0x54, 0x63, 0xbc, 0x25, 0x2c, 0x5b, 0x29, 0x30, 0x60, 0x2d, 0x34, 0x65,
-0x35, 0x3e, 0x74, 0x2d, 0x35, 0x69, 0x55, 0x5a, 0x53, 0x92, 0x93, 0x33,
-0xd0, 0xcb, 0x12, 0xe6, 0xdf, 0x37, 0xe3, 0xe1, 0x32, 0xdf, 0xd9, 0x22,
-0xe0, 0xd9, 0x23, 0xe0, 0xd9, 0x23, 0xde, 0xd8, 0x1f, 0xd4, 0xcd, 0x1b,
-0xd9, 0xd2, 0x1c, 0xde, 0xdb, 0x1d, 0xb8, 0xb5, 0x18, 0x74, 0x75, 0x31,
-0x18, 0x20, 0x4f, 0x17, 0x1e, 0x4c, 0x16, 0x1d, 0x4b, 0x17, 0x1e, 0x4a,
-0x18, 0x1f, 0x4a, 0x19, 0x1f, 0x49, 0x1a, 0x20, 0x48, 0x1b, 0x21, 0x48,
-0x1b, 0x21, 0x47, 0x1b, 0x21, 0x45, 0x1a, 0x1f, 0x43, 0x56, 0x63, 0xbe,
-0x50, 0x5c, 0xaf, 0x38, 0x41, 0x78, 0x2a, 0x31, 0x5d, 0x5d, 0x6b, 0xe7,
-0x49, 0x55, 0xe6, 0x3c, 0x47, 0xe1, 0x3e, 0x49, 0xdd, 0x40, 0x4b, 0xd8,
-0x42, 0x4d, 0xd4, 0x43, 0x4e, 0xd0, 0x43, 0x4f, 0xcc, 0x44, 0x4f, 0xc8,
-0x45, 0x4f, 0xc4, 0x44, 0x4e, 0xc0, 0x43, 0x4e, 0xbc, 0x41, 0x4b, 0xb9,
-0x3f, 0x47, 0xb5, 0x3b, 0x45, 0xb2, 0x39, 0x42, 0xae, 0x38, 0x40, 0xab,
-0x35, 0x3e, 0xa8, 0x34, 0x3b, 0xa5, 0x30, 0x38, 0xa2, 0x2e, 0x36, 0x9f,
-0x2c, 0x34, 0x9d, 0x29, 0x31, 0x9a, 0x27, 0x2f, 0x98, 0x27, 0x2d, 0x95,
-0x65, 0x67, 0x64, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07,
-0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07,
-0x25, 0x2b, 0x82, 0x26, 0x2c, 0x80, 0x26, 0x2b, 0x7e, 0x25, 0x2b, 0x7c,
-0x26, 0x2c, 0x7b, 0x26, 0x2c, 0x79, 0x25, 0x2b, 0x78, 0x24, 0x2a, 0x76,
-0x23, 0x29, 0x75, 0x22, 0x28, 0x73, 0x22, 0x27, 0x71, 0x21, 0x26, 0x70,
-0x20, 0x25, 0x6e, 0x1f, 0x24, 0x6d, 0x1e, 0x24, 0x6c, 0x1d, 0x23, 0x6a,
-0x1d, 0x23, 0x69, 0x1c, 0x22, 0x67, 0x1c, 0x22, 0x66, 0x1b, 0x21, 0x65,
-0x1a, 0x20, 0x64, 0x1a, 0x1f, 0x63, 0x19, 0x1f, 0x62, 0x19, 0x1e, 0x61,
-0x19, 0x1e, 0x5f, 0x19, 0x1d, 0x5f, 0x18, 0x1c, 0x5e, 0x18, 0x1c, 0x5d,
-0x17, 0x1c, 0x5c, 0x17, 0x1b, 0x5b, 0x17, 0x1b, 0x5a, 0x16, 0x1a, 0x59,
-0x16, 0x1a, 0x58, 0x15, 0x19, 0x57, 0x15, 0x19, 0x56, 0x15, 0x19, 0x56,
-0x15, 0x18, 0x55, 0x15, 0x18, 0x54, 0x14, 0x18, 0x53, 0x14, 0x17, 0x52,
-0x14, 0x17, 0x52, 0x13, 0x17, 0x51, 0x13, 0x17, 0x50, 0x12, 0x16, 0x4f,
-0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x12, 0x16, 0x4d, 0x12, 0x15, 0x4c,
-0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4a, 0x11, 0x14, 0x4a,
-0x11, 0x14, 0x48, 0x11, 0x14, 0x48, 0x10, 0x13, 0x47, 0x10, 0x13, 0x47,
-0x10, 0x13, 0x47, 0x10, 0x12, 0x45, 0x10, 0x12, 0x45, 0x0f, 0x12, 0x44,
-0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42,
-0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40,
-0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e,
-0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x15, 0x19, 0x48, 0x2b, 0x31, 0x90, 0x2c, 0x34, 0x97, 0x26, 0x2c, 0x81,
-0x22, 0x28, 0x78, 0x22, 0x28, 0x79, 0x22, 0x29, 0x7b, 0x22, 0x29, 0x7d,
-0x22, 0x29, 0x7f, 0x22, 0x29, 0x81, 0x22, 0x29, 0x82, 0x23, 0x2a, 0x84,
-0x24, 0x2b, 0x86, 0x26, 0x2d, 0x89, 0x27, 0x2e, 0x8a, 0x28, 0x2f, 0x8c,
-0x2a, 0x32, 0x8f, 0x2c, 0x33, 0x90, 0x2d, 0x34, 0x93, 0x2f, 0x38, 0x96,
-0x32, 0x39, 0x98, 0x33, 0x3c, 0x9b, 0x34, 0x3d, 0x9d, 0x34, 0x3c, 0xa0,
-0x34, 0x3d, 0xa3, 0x34, 0x3c, 0xa5, 0x33, 0x3c, 0xa8, 0x82, 0x83, 0x62,
-0xd1, 0xcc, 0x1a, 0xd9, 0xd2, 0x1c, 0xdb, 0xd4, 0x1c, 0xdf, 0xd8, 0x20,
-0xcb, 0xc4, 0x18, 0xcf, 0xc9, 0x1a, 0xdd, 0xd6, 0x1c, 0xde, 0xd7, 0x1d,
-0xdf, 0xd8, 0x20, 0xd2, 0xcc, 0x1b, 0xc6, 0xc4, 0x17, 0xc0, 0xba, 0x15,
-0xd1, 0xcf, 0x1a, 0xe0, 0xda, 0x25, 0xe6, 0xdf, 0x37, 0xdf, 0xd9, 0x22,
-0xdc, 0xda, 0x1d, 0xcf, 0xc9, 0x1a, 0x9e, 0x9b, 0x16, 0x58, 0x68, 0xdd,
-0x3c, 0x4a, 0xdd, 0x46, 0x55, 0xdd, 0x32, 0x3c, 0x76, 0x17, 0x1d, 0x45,
-0x19, 0x20, 0x49, 0x1c, 0x22, 0x4d, 0x1e, 0x25, 0x51, 0x21, 0x28, 0x56,
-0x27, 0x2f, 0x60, 0x27, 0x2f, 0x60, 0x2b, 0x33, 0x65, 0x2f, 0x37, 0x6b,
-0x45, 0x4c, 0x63, 0xaa, 0xa8, 0x2a, 0xe6, 0xdf, 0x37, 0xe6, 0xe0, 0x39,
-0xe6, 0xe4, 0x3b, 0xea, 0xe4, 0x45, 0xe3, 0xe1, 0x32, 0xdf, 0xd9, 0x22,
-0xd1, 0xcf, 0x1a, 0xdf, 0xd8, 0x20, 0xd2, 0xcc, 0x1b, 0xdc, 0xda, 0x1d,
-0xde, 0xdb, 0x1d, 0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xdf, 0xd9, 0x22,
-0xce, 0xc9, 0x0f, 0x45, 0x49, 0x3f, 0x19, 0x21, 0x50, 0x1b, 0x22, 0x50,
-0x1c, 0x22, 0x4f, 0x1d, 0x23, 0x4e, 0x1e, 0x24, 0x4e, 0x1e, 0x24, 0x4c,
-0x1e, 0x24, 0x4b, 0x1c, 0x22, 0x47, 0x49, 0x55, 0x9d, 0x2d, 0x35, 0x64,
-0x18, 0x1d, 0x3f, 0x32, 0x3b, 0x6e, 0x5a, 0x69, 0xe6, 0x47, 0x53, 0xe6,
-0x41, 0x4c, 0xe6, 0x43, 0x4f, 0xe5, 0x44, 0x51, 0xdf, 0x47, 0x52, 0xdb,
-0x48, 0x54, 0xd6, 0x49, 0x55, 0xd2, 0x49, 0x55, 0xce, 0x49, 0x54, 0xca,
-0x48, 0x53, 0xc5, 0x44, 0x4f, 0xc1, 0x42, 0x4c, 0xbd, 0x40, 0x49, 0xba,
-0x3c, 0x46, 0xb6, 0x3a, 0x44, 0xb3, 0x38, 0x41, 0xb0, 0x35, 0x3d, 0xad,
-0x32, 0x3b, 0xa9, 0x2f, 0x37, 0xa6, 0x2d, 0x35, 0xa4, 0x2a, 0x33, 0xa0,
-0x29, 0x31, 0x9e, 0x27, 0x2e, 0x9b, 0x27, 0x2e, 0x98, 0x27, 0x2e, 0x96,
-0x66, 0x69, 0x64, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07,
-0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xd0, 0xca, 0x15,
-0x29, 0x30, 0x82, 0x28, 0x2f, 0x81, 0x28, 0x2f, 0x7f, 0x27, 0x2d, 0x7d,
-0x26, 0x2c, 0x7b, 0x25, 0x2b, 0x79, 0x24, 0x2a, 0x77, 0x23, 0x29, 0x76,
-0x22, 0x27, 0x75, 0x21, 0x26, 0x73, 0x21, 0x26, 0x72, 0x20, 0x25, 0x70,
-0x1f, 0x25, 0x6f, 0x1e, 0x24, 0x6d, 0x1d, 0x24, 0x6c, 0x1d, 0x23, 0x6a,
-0x1c, 0x22, 0x69, 0x1c, 0x21, 0x68, 0x1b, 0x21, 0x66, 0x1b, 0x20, 0x65,
-0x1a, 0x1f, 0x64, 0x1a, 0x1f, 0x63, 0x19, 0x1e, 0x62, 0x19, 0x1e, 0x62,
-0x19, 0x1d, 0x5f, 0x18, 0x1d, 0x5f, 0x18, 0x1c, 0x5e, 0x17, 0x1c, 0x5d,
-0x17, 0x1b, 0x5c, 0x16, 0x1b, 0x5b, 0x16, 0x1a, 0x5a, 0x16, 0x1a, 0x59,
-0x15, 0x19, 0x58, 0x15, 0x19, 0x57, 0x15, 0x19, 0x57, 0x15, 0x18, 0x56,
-0x14, 0x18, 0x55, 0x14, 0x18, 0x54, 0x14, 0x17, 0x53, 0x13, 0x17, 0x52,
-0x13, 0x17, 0x52, 0x13, 0x17, 0x51, 0x13, 0x16, 0x50, 0x12, 0x16, 0x4f,
-0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d, 0x12, 0x15, 0x4d,
-0x11, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4a,
-0x10, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x13, 0x47, 0x10, 0x13, 0x47,
-0x10, 0x13, 0x47, 0x0f, 0x12, 0x45, 0x0f, 0x12, 0x45, 0x0f, 0x12, 0x44,
-0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42,
-0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40,
-0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e,
-0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x17, 0x1a, 0x48, 0x2d, 0x34, 0x92, 0x2f, 0x36, 0x97, 0x28, 0x2d, 0x81,
-0x24, 0x2a, 0x78, 0x25, 0x2a, 0x7a, 0x25, 0x2a, 0x7b, 0x24, 0x2a, 0x7d,
-0x24, 0x2a, 0x7f, 0x25, 0x2a, 0x81, 0x25, 0x2b, 0x82, 0x25, 0x2b, 0x85,
-0x25, 0x2c, 0x87, 0x25, 0x2c, 0x89, 0x25, 0x2d, 0x8b, 0x27, 0x2d, 0x8d,
-0x28, 0x2f, 0x90, 0x29, 0x30, 0x91, 0x2b, 0x33, 0x94, 0x2d, 0x34, 0x96,
-0x2f, 0x36, 0x99, 0x30, 0x38, 0x9b, 0x33, 0x3a, 0x9e, 0x35, 0x3e, 0xa0,
-0x38, 0x41, 0xa4, 0x72, 0x76, 0x71, 0xd2, 0xcd, 0x19, 0xdf, 0xd9, 0x22,
-0xe0, 0xde, 0x25, 0xd1, 0xcf, 0x1a, 0xdc, 0xda, 0x1d, 0xde, 0xdc, 0x1f,
-0xde, 0xdc, 0x1f, 0xd4, 0xcd, 0x1b, 0xad, 0xac, 0x46, 0x8a, 0x8e, 0x72,
-0x7c, 0x81, 0x8a, 0x80, 0x87, 0x8d, 0x82, 0x87, 0x84, 0x9a, 0x9b, 0x43,
-0xce, 0xc9, 0x0d, 0xe0, 0xde, 0x25, 0xd4, 0xcd, 0x1b, 0xdb, 0xd4, 0x1c,
-0xd9, 0xd2, 0x1c, 0xcf, 0xc9, 0x1a, 0x8d, 0x8c, 0x28, 0x11, 0x16, 0x3a,
-0x1b, 0x22, 0x4d, 0x49, 0x59, 0xdb, 0x47, 0x56, 0xda, 0x26, 0x2e, 0x5f,
-0x19, 0x20, 0x4b, 0x1c, 0x22, 0x4f, 0x1f, 0x26, 0x54, 0x22, 0x2a, 0x59,
-0x26, 0x2d, 0x5e, 0x29, 0x31, 0x64, 0x2d, 0x35, 0x6a, 0x81, 0x83, 0x42,
-0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26, 0xe4, 0xe2, 0x35, 0xe5, 0xdf, 0x36,
-0xe1, 0xda, 0x26, 0xe8, 0xe2, 0x3f, 0xe1, 0xdb, 0x28, 0xbe, 0xbb, 0x21,
-0xaa, 0xa8, 0x2d, 0xa9, 0xa7, 0x2c, 0xd4, 0xcd, 0x1b, 0xdf, 0xd8, 0x20,
-0xd2, 0xcc, 0x1b, 0xde, 0xdb, 0x1d, 0xe2, 0xe0, 0x2d, 0xe1, 0xdf, 0x2a,
-0xe3, 0xdd, 0x30, 0xdf, 0xd8, 0x20, 0x76, 0x77, 0x32, 0x1f, 0x26, 0x56,
-0x20, 0x27, 0x56, 0x21, 0x27, 0x54, 0x22, 0x28, 0x53, 0x22, 0x28, 0x51,
-0x20, 0x26, 0x4e, 0x1e, 0x24, 0x4a, 0x1c, 0x22, 0x47, 0x1a, 0x1f, 0x43,
-0x3e, 0x48, 0x85, 0x57, 0x66, 0xe6, 0x49, 0x56, 0xe6, 0x4a, 0x57, 0xe6,
-0x4b, 0x58, 0xe6, 0x4c, 0x58, 0xe6, 0x4c, 0x59, 0xe2, 0x4e, 0x5b, 0xdd,
-0x4e, 0x5b, 0xd8, 0x4f, 0x5b, 0xd4, 0x4d, 0x59, 0xcf, 0x49, 0x54, 0xcb,
-0x45, 0x51, 0xc7, 0x43, 0x4e, 0xc2, 0x41, 0x4a, 0xbf, 0x3d, 0x47, 0xbb,
-0x39, 0x43, 0xb8, 0x35, 0x3f, 0xb4, 0x33, 0x3c, 0xb0, 0x30, 0x39, 0xad,
-0x2e, 0x36, 0xaa, 0x2b, 0x34, 0xa7, 0x2a, 0x32, 0xa4, 0x29, 0x30, 0xa1,
-0x29, 0x31, 0x9e, 0x2a, 0x32, 0x9c, 0x2b, 0x32, 0x99, 0x2b, 0x32, 0x97,
-0x3f, 0x45, 0x84, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07,
-0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0x7d, 0x7d, 0x4d,
-0x29, 0x30, 0x82, 0x28, 0x2e, 0x81, 0x27, 0x2d, 0x7f, 0x26, 0x2c, 0x7d,
-0x25, 0x2b, 0x7b, 0x24, 0x2a, 0x7a, 0x23, 0x29, 0x78, 0x22, 0x28, 0x77,
-0x21, 0x27, 0x75, 0x20, 0x26, 0x74, 0x20, 0x25, 0x72, 0x1f, 0x25, 0x71,
-0x1e, 0x24, 0x6f, 0x1d, 0x23, 0x6e, 0x1d, 0x23, 0x6c, 0x1c, 0x22, 0x6b,
-0x1c, 0x21, 0x69, 0x1c, 0x21, 0x68, 0x1b, 0x20, 0x67, 0x1b, 0x1f, 0x65,
-0x1a, 0x1f, 0x65, 0x1a, 0x1e, 0x63, 0x19, 0x1e, 0x63, 0x19, 0x1d, 0x62,
-0x18, 0x1d, 0x60, 0x18, 0x1c, 0x5f, 0x17, 0x1b, 0x5e, 0x17, 0x1b, 0x5d,
-0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a, 0x15, 0x19, 0x59,
-0x15, 0x19, 0x59, 0x15, 0x19, 0x58, 0x14, 0x19, 0x57, 0x14, 0x18, 0x56,
-0x14, 0x18, 0x55, 0x14, 0x17, 0x54, 0x13, 0x17, 0x53, 0x13, 0x17, 0x53,
-0x13, 0x17, 0x52, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50, 0x12, 0x16, 0x4f,
-0x12, 0x16, 0x4f, 0x12, 0x15, 0x4e, 0x11, 0x15, 0x4d, 0x11, 0x15, 0x4d,
-0x11, 0x15, 0x4c, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4a,
-0x10, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x13, 0x48, 0x10, 0x13, 0x48,
-0x10, 0x13, 0x47, 0x0f, 0x12, 0x45, 0x0f, 0x12, 0x45, 0x0f, 0x12, 0x44,
-0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0e, 0x11, 0x42,
-0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40,
-0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e,
-0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x17, 0x1a, 0x48, 0x2f, 0x36, 0x92, 0x31, 0x3a, 0x98, 0x2a, 0x30, 0x81,
-0x26, 0x2c, 0x78, 0x27, 0x2d, 0x7a, 0x26, 0x2d, 0x7c, 0x27, 0x2d, 0x7e,
-0x27, 0x2e, 0x80, 0x27, 0x2e, 0x81, 0x27, 0x2f, 0x83, 0x28, 0x2e, 0x85,
-0x28, 0x2e, 0x87, 0x28, 0x2f, 0x8a, 0x28, 0x2f, 0x8b, 0x28, 0x2f, 0x8e,
-0x29, 0x2f, 0x90, 0x28, 0x2f, 0x92, 0x29, 0x30, 0x95, 0x2a, 0x32, 0x97,
-0x2c, 0x34, 0x9a, 0x2e, 0x35, 0x9c, 0x30, 0x38, 0x9f, 0x44, 0x4c, 0x90,
-0xaa, 0xa9, 0x3b, 0xde, 0xdb, 0x1d, 0xe1, 0xda, 0x26, 0xd7, 0xd5, 0x1c,
-0xd7, 0xd5, 0x1c, 0xde, 0xdc, 0x1f, 0xd5, 0xcf, 0x1c, 0xd2, 0xcd, 0x1b,
-0x86, 0x89, 0x6c, 0x3a, 0x44, 0xc2, 0x39, 0x43, 0xc6, 0x3c, 0x46, 0xcb,
-0x40, 0x4c, 0xcf, 0x45, 0x51, 0xd2, 0x4c, 0x58, 0xd7, 0x54, 0x61, 0xdb,
-0x52, 0x5f, 0xc3, 0x95, 0x95, 0x35, 0xb2, 0xac, 0x11, 0xd7, 0xd0, 0x1c,
-0xd9, 0xd2, 0x1c, 0xe1, 0xda, 0x26, 0x87, 0x8f, 0x95, 0x2a, 0x33, 0x67,
-0x12, 0x18, 0x3e, 0x14, 0x1a, 0x41, 0x50, 0x60, 0xc2, 0x49, 0x59, 0xd8,
-0x19, 0x20, 0x4c, 0x1d, 0x24, 0x52, 0x20, 0x27, 0x56, 0x23, 0x2b, 0x5c,
-0x27, 0x2f, 0x62, 0x2b, 0x33, 0x69, 0xa9, 0xa7, 0x2a, 0xe1, 0xda, 0x26,
-0xe4, 0xde, 0x31, 0xe6, 0xe4, 0x39, 0xe0, 0xde, 0x25, 0xdf, 0xd8, 0x20,
-0xe3, 0xdd, 0x30, 0x87, 0x8a, 0x4f, 0x3c, 0x46, 0x8a, 0x3b, 0x45, 0x89,
-0x39, 0x43, 0x86, 0x34, 0x3e, 0x81, 0x30, 0x3a, 0x7c, 0x7e, 0x80, 0x45,
-0xe1, 0xdb, 0x2a, 0xe0, 0xde, 0x25, 0xe0, 0xd9, 0x23, 0xe1, 0xda, 0x26,
-0xe2, 0xdc, 0x2d, 0xe3, 0xdd, 0x2e, 0xde, 0xdb, 0x1d, 0x8f, 0x8e, 0x2d,
-0x25, 0x2c, 0x5c, 0x26, 0x2e, 0x5c, 0x26, 0x2c, 0x59, 0x23, 0x2a, 0x55,
-0x21, 0x27, 0x50, 0x1f, 0x25, 0x4c, 0x1d, 0x22, 0x48, 0x4b, 0x58, 0xa3,
-0x54, 0x63, 0xe5, 0x52, 0x61, 0xe5, 0x54, 0x61, 0xe5, 0x55, 0x63, 0xe5,
-0x55, 0x64, 0xe6, 0x55, 0x64, 0xe6, 0x54, 0x62, 0xe4, 0x56, 0x63, 0xdf,
-0x52, 0x5f, 0xda, 0x4e, 0x5a, 0xd5, 0x4b, 0x57, 0xd1, 0x47, 0x52, 0xcd,
-0x44, 0x4f, 0xc8, 0x3f, 0x4a, 0xc4, 0x3b, 0x46, 0xc0, 0x37, 0x41, 0xbc,
-0x34, 0x3d, 0xb8, 0x31, 0x3a, 0xb5, 0x2f, 0x38, 0xb2, 0x2b, 0x34, 0xae,
-0x2c, 0x35, 0xaa, 0x2d, 0x35, 0xa8, 0x2d, 0x36, 0xa5, 0x2e, 0x36, 0xa2,
-0x2f, 0x36, 0x9f, 0x30, 0x37, 0x9c, 0x30, 0x37, 0x9a, 0x30, 0x38, 0x97,
-0x30, 0x38, 0x95, 0x6d, 0x6f, 0x63, 0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07,
-0xe6, 0xdf, 0x07, 0xe6, 0xdf, 0x07, 0x91, 0x91, 0x40, 0x29, 0x30, 0x85,
-0x27, 0x2f, 0x83, 0x26, 0x2d, 0x81, 0x26, 0x2c, 0x7f, 0x25, 0x2b, 0x7e,
-0x24, 0x29, 0x7c, 0x23, 0x29, 0x7a, 0x22, 0x28, 0x78, 0x21, 0x27, 0x76,
-0x20, 0x26, 0x75, 0x1f, 0x26, 0x74, 0x1f, 0x25, 0x72, 0x1e, 0x24, 0x71,
-0x1d, 0x23, 0x6f, 0x1d, 0x23, 0x6e, 0x1c, 0x22, 0x6c, 0x1c, 0x21, 0x6b,
-0x1c, 0x21, 0x6a, 0x1b, 0x20, 0x68, 0x1a, 0x1f, 0x67, 0x1a, 0x1e, 0x66,
-0x19, 0x1e, 0x65, 0x19, 0x1d, 0x64, 0x19, 0x1d, 0x63, 0x18, 0x1c, 0x62,
-0x18, 0x1c, 0x60, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e,
-0x16, 0x1a, 0x5d, 0x16, 0x1a, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x1a, 0x5a,
-0x15, 0x19, 0x59, 0x14, 0x19, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56,
-0x14, 0x17, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53, 0x13, 0x17, 0x53,
-0x13, 0x16, 0x52, 0x12, 0x16, 0x51, 0x12, 0x15, 0x50, 0x12, 0x15, 0x50,
-0x12, 0x15, 0x4f, 0x12, 0x15, 0x4e, 0x11, 0x15, 0x4d, 0x11, 0x15, 0x4d,
-0x11, 0x15, 0x4c, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4a,
-0x10, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x13, 0x48, 0x10, 0x13, 0x48,
-0x10, 0x13, 0x47, 0x10, 0x13, 0x46, 0x10, 0x13, 0x45, 0x0f, 0x13, 0x44,
-0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43, 0x0f, 0x12, 0x43,
-0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x10, 0x40,
-0x0e, 0x10, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e,
-0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x14, 0x18, 0x48, 0x2b, 0x32, 0x92, 0x2e, 0x35, 0x98, 0x28, 0x2e, 0x82,
-0x26, 0x2b, 0x79, 0x26, 0x2d, 0x7a, 0x28, 0x2f, 0x7c, 0x2a, 0x30, 0x7e,
-0x2a, 0x31, 0x80, 0x2b, 0x31, 0x81, 0x2b, 0x31, 0x83, 0x2b, 0x32, 0x86,
-0x2b, 0x32, 0x88, 0x2b, 0x32, 0x8a, 0x2b, 0x32, 0x8c, 0x2b, 0x32, 0x8e,
-0x2c, 0x33, 0x90, 0x2c, 0x33, 0x93, 0x2c, 0x34, 0x96, 0x2b, 0x33, 0x97,
-0x2b, 0x34, 0x9b, 0x2c, 0x34, 0x9d, 0x41, 0x47, 0x8f, 0xd1, 0xcb, 0x18,
-0xd5, 0xcf, 0x1c, 0xd7, 0xd0, 0x1c, 0xde, 0xdc, 0x1f, 0xe1, 0xdf, 0x2a,
-0xd1, 0xcf, 0x1a, 0xd7, 0xd0, 0x1c, 0x8a, 0x8d, 0x6a, 0x45, 0x4e, 0xbd,
-0x44, 0x4e, 0xc0, 0x42, 0x4d, 0xc4, 0x41, 0x4c, 0xc8, 0x40, 0x4b, 0xcc,
-0x3e, 0x49, 0xd0, 0x3d, 0x49, 0xd5, 0x42, 0x4e, 0xd9, 0x49, 0x56, 0xdd,
-0x51, 0x5e, 0xe2, 0x89, 0x90, 0x97, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c,
-0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2d, 0x3f, 0x42, 0x2f, 0x1f, 0x27, 0x54,
-0x34, 0x3f, 0x7d, 0x14, 0x1a, 0x43, 0x15, 0x1c, 0x46, 0x17, 0x1e, 0x4a,
-0x4c, 0x5e, 0xd6, 0x1d, 0x24, 0x54, 0x1f, 0x27, 0x59, 0x24, 0x2c, 0x5f,
-0x28, 0x31, 0x66, 0xa8, 0xa6, 0x29, 0xde, 0xdb, 0x1d, 0xe2, 0xdc, 0x2b,
-0xe0, 0xde, 0x25, 0xe4, 0xde, 0x31, 0xe1, 0xdb, 0x2a, 0xd4, 0xcf, 0x17,
-0x59, 0x61, 0x88, 0x46, 0x51, 0x99, 0x45, 0x50, 0x99, 0x43, 0x4e, 0x98,
-0x40, 0x4b, 0x94, 0x3b, 0x46, 0x8e, 0x35, 0x40, 0x87, 0x31, 0x3b, 0x81,
-0x40, 0x48, 0x6d, 0xd0, 0xcb, 0x13, 0xd9, 0xd2, 0x1c, 0xe1, 0xdb, 0x2a,
-0xde, 0xd7, 0x1d, 0xde, 0xdc, 0x1f, 0xe2, 0xe0, 0x2b, 0xe1, 0xdb, 0x28,
-0x6a, 0x6c, 0x45, 0x2b, 0x32, 0x62, 0x28, 0x2f, 0x5c, 0x24, 0x2b, 0x57,
-0x22, 0x29, 0x53, 0x20, 0x26, 0x4f, 0x55, 0x63, 0xbc, 0x5c, 0x6c, 0xe4,
-0x5e, 0x6d, 0xe4, 0x60, 0x70, 0xe5, 0x60, 0x6f, 0xe3, 0x60, 0x6f, 0xe4,
-0x60, 0x6e, 0xe4, 0x5f, 0x6e, 0xe4, 0x5a, 0x68, 0xe6, 0x53, 0x60, 0xe1,
-0x4f, 0x5c, 0xdc, 0x4b, 0x57, 0xd7, 0x47, 0x53, 0xd2, 0x41, 0x4d, 0xce,
-0x3c, 0x48, 0xc9, 0x38, 0x42, 0xc5, 0x36, 0x3f, 0xc1, 0x32, 0x3c, 0xbd,
-0x2f, 0x38, 0xb9, 0x2f, 0x38, 0xb5, 0x30, 0x3a, 0xb2, 0x32, 0x3a, 0xaf,
-0x32, 0x3b, 0xac, 0x33, 0x3c, 0xa9, 0x34, 0x3c, 0xa6, 0x34, 0x3d, 0xa2,
-0x35, 0x3d, 0xa0, 0x35, 0x3e, 0x9d, 0x35, 0x3e, 0x9b, 0x33, 0x3b, 0x97,
-0x31, 0x39, 0x95, 0x2f, 0x38, 0x93, 0x2e, 0x35, 0x90, 0x6a, 0x6d, 0x61,
-0x69, 0x6b, 0x5f, 0x3e, 0x44, 0x7a, 0x29, 0x30, 0x88, 0x27, 0x2e, 0x86,
-0x26, 0x2d, 0x83, 0x26, 0x2c, 0x81, 0x25, 0x2b, 0x80, 0x24, 0x29, 0x7e,
-0x23, 0x28, 0x7c, 0x22, 0x28, 0x7a, 0x21, 0x28, 0x79, 0x20, 0x26, 0x77,
-0x1f, 0x25, 0x75, 0x1e, 0x24, 0x74, 0x1e, 0x24, 0x73, 0x1d, 0x23, 0x71,
-0x1d, 0x22, 0x70, 0x1d, 0x21, 0x6e, 0x1c, 0x21, 0x6d, 0x1b, 0x20, 0x6b,
-0x1b, 0x1f, 0x6a, 0x1a, 0x1f, 0x68, 0x1a, 0x1e, 0x67, 0x19, 0x1e, 0x66,
-0x19, 0x1d, 0x65, 0x18, 0x1c, 0x64, 0x18, 0x1c, 0x63, 0x18, 0x1b, 0x62,
-0x17, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x16, 0x1b, 0x5f, 0x16, 0x1a, 0x5e,
-0x16, 0x1a, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a,
-0x15, 0x19, 0x59, 0x14, 0x18, 0x58, 0x14, 0x18, 0x57, 0x14, 0x17, 0x56,
-0x13, 0x17, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53,
-0x13, 0x16, 0x52, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50, 0x12, 0x16, 0x50,
-0x12, 0x16, 0x4f, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4d,
-0x11, 0x15, 0x4c, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4b, 0x11, 0x14, 0x4a,
-0x11, 0x14, 0x49, 0x10, 0x14, 0x48, 0x10, 0x13, 0x48, 0x10, 0x13, 0x48,
-0x10, 0x13, 0x47, 0x10, 0x13, 0x47, 0x10, 0x13, 0x45, 0x0f, 0x13, 0x44,
-0x0f, 0x13, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43,
-0x0e, 0x11, 0x42, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x41, 0x0e, 0x11, 0x40,
-0x0e, 0x11, 0x40, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3f, 0x0d, 0x10, 0x3e,
-0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3d, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x13, 0x16, 0x48, 0x28, 0x2e, 0x93, 0x2a, 0x32, 0x98, 0x25, 0x2b, 0x82,
-0x22, 0x28, 0x79, 0x23, 0x29, 0x7b, 0x24, 0x2a, 0x7d, 0x26, 0x2c, 0x7f,
-0x27, 0x2e, 0x81, 0x29, 0x30, 0x82, 0x2b, 0x31, 0x84, 0x2d, 0x34, 0x86,
-0x2e, 0x36, 0x88, 0x2f, 0x36, 0x8a, 0x2f, 0x37, 0x8c, 0x30, 0x38, 0x8f,
-0x30, 0x38, 0x91, 0x2f, 0x38, 0x93, 0x30, 0x38, 0x96, 0x30, 0x38, 0x98,
-0x30, 0x38, 0x9b, 0x43, 0x4a, 0x8d, 0xd1, 0xcc, 0x18, 0xdf, 0xd8, 0x20,
-0xe3, 0xdd, 0x30, 0xde, 0xd7, 0x1d, 0xde, 0xd8, 0x1f, 0xcc, 0xc6, 0x19,
-0xd1, 0xcc, 0x1a, 0x4b, 0x54, 0xa2, 0x3c, 0x46, 0xba, 0x3f, 0x4a, 0xbe,
-0x44, 0x4e, 0xc2, 0x49, 0x54, 0xc5, 0x4b, 0x57, 0xca, 0x49, 0x56, 0xce,
-0x48, 0x54, 0xd2, 0x46, 0x52, 0xd6, 0x44, 0x4f, 0xda, 0x40, 0x4c, 0xdf,
-0x46, 0x53, 0xe2, 0x81, 0x88, 0x98, 0xde, 0xdc, 0x1f, 0xde, 0xdc, 0x1f,
-0xe1, 0xda, 0x26, 0xe2, 0xdc, 0x2d, 0x12, 0x18, 0x3d, 0x13, 0x19, 0x3f,
-0x14, 0x1a, 0x42, 0x15, 0x1b, 0x45, 0x15, 0x1c, 0x48, 0x17, 0x1e, 0x4c,
-0x19, 0x21, 0x50, 0x46, 0x56, 0xa8, 0x20, 0x28, 0x5b, 0x24, 0x2c, 0x62,
-0xa7, 0xa5, 0x28, 0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26, 0xdd, 0xd6, 0x1c,
-0xe1, 0xdb, 0x28, 0xdf, 0xd9, 0x22, 0xd5, 0xd0, 0x19, 0x64, 0x6d, 0x98,
-0x53, 0x5f, 0xac, 0x51, 0x5d, 0xac, 0x4f, 0x5c, 0xab, 0x4d, 0x5a, 0xaa,
-0x49, 0x55, 0xa5, 0x43, 0x4f, 0x9d, 0x3c, 0x48, 0x95, 0x35, 0x41, 0x8c,
-0x2f, 0x3a, 0x83, 0x54, 0x5a, 0x62, 0xdf, 0xd8, 0x20, 0xdb, 0xd4, 0x1c,
-0xe0, 0xde, 0x25, 0xde, 0xdc, 0x1f, 0xe2, 0xdc, 0x2d, 0xdf, 0xd8, 0x20,
-0xd1, 0xcc, 0x12, 0x41, 0x46, 0x5a, 0x29, 0x30, 0x5f, 0x26, 0x2d, 0x5b,
-0x23, 0x2a, 0x55, 0x58, 0x68, 0xc6, 0x51, 0x5f, 0xb2, 0x4d, 0x59, 0xa7,
-0x46, 0x52, 0x98, 0x45, 0x51, 0x97, 0x46, 0x52, 0x99, 0x45, 0x51, 0x98,
-0x57, 0x64, 0xc9, 0x5d, 0x6c, 0xe4, 0x56, 0x63, 0xe5, 0x50, 0x5d, 0xe2,
-0x49, 0x56, 0xdd, 0x43, 0x4f, 0xd8, 0x3d, 0x49, 0xd4, 0x39, 0x43, 0xcf,
-0x36, 0x40, 0xca, 0x32, 0x3c, 0xc6, 0x34, 0x3d, 0xc2, 0x34, 0x3e, 0xbf,
-0x36, 0x3f, 0xbb, 0x37, 0x40, 0xb7, 0x39, 0x42, 0xb3, 0x39, 0x43, 0xb0,
-0x3a, 0x43, 0xad, 0x3b, 0x45, 0xa9, 0x3c, 0x45, 0xa6, 0x39, 0x42, 0xa3,
-0x36, 0x3f, 0xa0, 0x35, 0x3d, 0x9e, 0x32, 0x3b, 0x9a, 0x31, 0x38, 0x98,
-0x2f, 0x38, 0x95, 0x2d, 0x35, 0x93, 0x2d, 0x33, 0x91, 0x2b, 0x32, 0x8f,
-0x29, 0x31, 0x8c, 0x28, 0x30, 0x8a, 0x26, 0x2e, 0x87, 0x26, 0x2d, 0x86,
-0x25, 0x2b, 0x84, 0x25, 0x2b, 0x82, 0x23, 0x29, 0x80, 0x22, 0x29, 0x7f,
-0x21, 0x28, 0x7d, 0x20, 0x27, 0x7b, 0x1f, 0x26, 0x79, 0x1f, 0x25, 0x77,
-0x1f, 0x24, 0x76, 0x1e, 0x23, 0x75, 0x1e, 0x22, 0x73, 0x1d, 0x22, 0x71,
-0x1c, 0x21, 0x70, 0x1c, 0x21, 0x6e, 0x1b, 0x20, 0x6d, 0x1b, 0x1f, 0x6b,
-0x1a, 0x1f, 0x6a, 0x1a, 0x1e, 0x69, 0x19, 0x1e, 0x67, 0x18, 0x1d, 0x66,
-0x18, 0x1d, 0x65, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x63, 0x17, 0x1b, 0x62,
-0x16, 0x1b, 0x61, 0x16, 0x1b, 0x60, 0x16, 0x1a, 0x5f, 0x15, 0x1a, 0x5e,
-0x15, 0x19, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a,
-0x15, 0x19, 0x59, 0x14, 0x18, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56,
-0x14, 0x17, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53,
-0x13, 0x16, 0x52, 0x13, 0x16, 0x51, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50,
-0x12, 0x16, 0x4f, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4d,
-0x11, 0x15, 0x4c, 0x11, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4a,
-0x11, 0x14, 0x49, 0x11, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x13, 0x48,
-0x10, 0x13, 0x47, 0x10, 0x13, 0x47, 0x10, 0x13, 0x45, 0x0f, 0x13, 0x44,
-0x0f, 0x13, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43,
-0x0f, 0x11, 0x42, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x41, 0x0e, 0x11, 0x40,
-0x0e, 0x11, 0x40, 0x0e, 0x10, 0x3f, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3e,
-0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x12, 0x15, 0x48, 0x25, 0x2c, 0x93, 0x28, 0x2e, 0x99, 0x22, 0x28, 0x82,
-0x1f, 0x25, 0x79, 0x20, 0x26, 0x7b, 0x21, 0x27, 0x7d, 0x22, 0x29, 0x7f,
-0x24, 0x2a, 0x81, 0x25, 0x2b, 0x82, 0x26, 0x2c, 0x84, 0x28, 0x2e, 0x87,
-0x29, 0x31, 0x89, 0x2c, 0x32, 0x8a, 0x2e, 0x35, 0x8d, 0x2f, 0x37, 0x8f,
-0x32, 0x3a, 0x91, 0x35, 0x3e, 0x94, 0x36, 0x3d, 0x96, 0x35, 0x3e, 0x99,
-0x48, 0x4f, 0x8a, 0xd1, 0xcc, 0x18, 0xd5, 0xcf, 0x1c, 0xe3, 0xdd, 0x30,
-0xe1, 0xdb, 0x2a, 0xde, 0xdb, 0x1d, 0xd7, 0xd0, 0x1c, 0xd1, 0xcc, 0x1a,
-0x47, 0x4e, 0xa0, 0x34, 0x3d, 0xb7, 0x36, 0x40, 0xbb, 0x39, 0x44, 0xbf,
-0x3c, 0x47, 0xc2, 0x40, 0x4b, 0xc6, 0x45, 0x50, 0xcb, 0x4a, 0x57, 0xcf,
-0x51, 0x5d, 0xd4, 0x53, 0x61, 0xd8, 0x51, 0x5f, 0xdd, 0x4f, 0x5c, 0xe2,
-0x4d, 0x5b, 0xe2, 0x7f, 0x85, 0x98, 0xdf, 0xd9, 0x22, 0xdf, 0xd9, 0x22,
-0xde, 0xdb, 0x1d, 0xcf, 0xca, 0x0f, 0x13, 0x19, 0x3e, 0x14, 0x1a, 0x41,
-0x15, 0x1b, 0x44, 0x16, 0x1c, 0x47, 0x17, 0x1e, 0x4a, 0x18, 0x1f, 0x4e,
-0x19, 0x21, 0x52, 0x1c, 0x24, 0x57, 0x1f, 0x27, 0x5d, 0x8f, 0x8e, 0x31,
-0xe6, 0xdf, 0x37, 0xe6, 0xdf, 0x37, 0xd7, 0xd5, 0x1c, 0xdf, 0xd9, 0x22,
-0xdf, 0xd9, 0x22, 0xd5, 0xd0, 0x19, 0x72, 0x7c, 0xa9, 0x64, 0x70, 0xc2,
-0x62, 0x6f, 0xc3, 0x5f, 0x6c, 0xc2, 0x5e, 0x6b, 0xc3, 0x5b, 0x68, 0xc0,
-0x55, 0x63, 0xba, 0x4c, 0x59, 0xaf, 0x42, 0x4f, 0xa3, 0x3b, 0x47, 0x99,
-0x34, 0x40, 0x8f, 0x2e, 0x39, 0x85, 0x92, 0x93, 0x3c, 0xd1, 0xca, 0x1a,
-0xde, 0xdb, 0x1d, 0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25, 0xe1, 0xda, 0x26,
-0xe1, 0xdb, 0x28, 0x94, 0x93, 0x32, 0x2b, 0x32, 0x63, 0x27, 0x2e, 0x5d,
-0x30, 0x39, 0x6c, 0x25, 0x2c, 0x58, 0x1f, 0x25, 0x4e, 0x1d, 0x23, 0x4a,
-0x1a, 0x20, 0x46, 0x1c, 0x21, 0x48, 0x3a, 0x45, 0x80, 0x4e, 0x5b, 0xb0,
-0x5b, 0x69, 0xd7, 0x56, 0x65, 0xe3, 0x4d, 0x5a, 0xe4, 0x43, 0x50, 0xe3,
-0x3e, 0x4a, 0xde, 0x39, 0x44, 0xd9, 0x36, 0x40, 0xd4, 0x38, 0x42, 0xd0,
-0x39, 0x44, 0xcb, 0x3c, 0x45, 0xc7, 0x3c, 0x47, 0xc2, 0x3e, 0x49, 0xbf,
-0x40, 0x4b, 0xbb, 0x42, 0x4c, 0xb7, 0x42, 0x4c, 0xb3, 0x3f, 0x49, 0xb0,
-0x3d, 0x46, 0xad, 0x3a, 0x43, 0xaa, 0x38, 0x42, 0xa7, 0x36, 0x3e, 0xa4,
-0x33, 0x3d, 0xa1, 0x32, 0x3a, 0x9e, 0x30, 0x38, 0x9b, 0x2e, 0x36, 0x99,
-0x2d, 0x34, 0x96, 0x2c, 0x33, 0x94, 0x2a, 0x32, 0x91, 0x29, 0x31, 0x8f,
-0x27, 0x2f, 0x8d, 0x27, 0x2e, 0x8a, 0x26, 0x2c, 0x89, 0x25, 0x2b, 0x87,
-0x23, 0x2a, 0x84, 0x23, 0x29, 0x82, 0x22, 0x29, 0x80, 0x21, 0x27, 0x7f,
-0x20, 0x26, 0x7d, 0x1f, 0x26, 0x7b, 0x1f, 0x25, 0x79, 0x1e, 0x24, 0x77,
-0x1e, 0x23, 0x76, 0x1d, 0x22, 0x75, 0x1c, 0x21, 0x73, 0x1c, 0x21, 0x72,
-0x1b, 0x20, 0x70, 0x1b, 0x20, 0x6f, 0x1a, 0x1f, 0x6d, 0x1a, 0x1e, 0x6c,
-0x1a, 0x1e, 0x6a, 0x19, 0x1d, 0x69, 0x19, 0x1d, 0x68, 0x18, 0x1c, 0x66,
-0x17, 0x1c, 0x65, 0x17, 0x1c, 0x65, 0x17, 0x1c, 0x63, 0x17, 0x1b, 0x62,
-0x16, 0x1b, 0x61, 0x16, 0x1b, 0x60, 0x16, 0x1a, 0x5f, 0x16, 0x1a, 0x5e,
-0x16, 0x1a, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a,
-0x15, 0x19, 0x59, 0x14, 0x18, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56,
-0x14, 0x17, 0x55, 0x14, 0x17, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53,
-0x13, 0x17, 0x52, 0x13, 0x16, 0x51, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50,
-0x12, 0x16, 0x4f, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4e, 0x12, 0x15, 0x4d,
-0x11, 0x15, 0x4c, 0x11, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4a,
-0x11, 0x14, 0x49, 0x11, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x14, 0x48,
-0x10, 0x13, 0x47, 0x10, 0x13, 0x47, 0x10, 0x13, 0x45, 0x10, 0x13, 0x45,
-0x10, 0x13, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x44, 0x0f, 0x12, 0x43,
-0x0f, 0x11, 0x42, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x40,
-0x0f, 0x11, 0x40, 0x0e, 0x10, 0x3f, 0x0e, 0x10, 0x3f, 0x0d, 0x10, 0x3e,
-0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x11, 0x14, 0x48, 0x23, 0x2b, 0x93, 0x24, 0x2d, 0x99, 0x20, 0x26, 0x82,
-0x1d, 0x23, 0x79, 0x1e, 0x23, 0x7b, 0x1f, 0x24, 0x7d, 0x20, 0x25, 0x7f,
-0x21, 0x26, 0x81, 0x21, 0x28, 0x82, 0x22, 0x29, 0x85, 0x23, 0x2a, 0x87,
-0x25, 0x2c, 0x89, 0x27, 0x2e, 0x8b, 0x28, 0x2f, 0x8d, 0x2a, 0x31, 0x90,
-0x2c, 0x33, 0x92, 0x2e, 0x34, 0x94, 0x30, 0x39, 0x96, 0x33, 0x3a, 0x99,
-0xd1, 0xcc, 0x17, 0xdb, 0xd4, 0x1c, 0xde, 0xdc, 0x1f, 0xdf, 0xd9, 0x22,
-0xde, 0xdb, 0x1d, 0xc7, 0xc5, 0x18, 0xc0, 0xba, 0x15, 0x4f, 0x57, 0x9e,
-0x3b, 0x46, 0xb5, 0x3b, 0x46, 0xb8, 0x3b, 0x45, 0xbc, 0x3b, 0x45, 0xbf,
-0x3a, 0x44, 0xc4, 0x3a, 0x44, 0xc8, 0x3d, 0x48, 0xcc, 0x40, 0x4c, 0xd0,
-0x45, 0x51, 0xd5, 0x4b, 0x58, 0xd9, 0x52, 0x60, 0xdf, 0x5a, 0x68, 0xe2,
-0x57, 0x65, 0xd1, 0x86, 0x8d, 0x8d, 0xe0, 0xde, 0x25, 0xd7, 0xd5, 0x1c,
-0xe0, 0xd9, 0x23, 0xb3, 0xb3, 0x41, 0x2c, 0x36, 0x6b, 0x15, 0x1b, 0x43,
-0x16, 0x1d, 0x47, 0x17, 0x1e, 0x49, 0x19, 0x20, 0x4d, 0x1a, 0x21, 0x51,
-0x1b, 0x23, 0x55, 0x1d, 0x25, 0x59, 0x4b, 0x50, 0x4c, 0xe0, 0xde, 0x25,
-0xe1, 0xda, 0x26, 0xe4, 0xe2, 0x35, 0xdf, 0xd9, 0x22, 0xdd, 0xd6, 0x1c,
-0xdf, 0xd8, 0x20, 0x8a, 0x8f, 0x7d, 0x6d, 0x7a, 0xcf, 0x77, 0x85, 0xde,
-0x76, 0x85, 0xe1, 0x73, 0x82, 0xe1, 0x71, 0x7f, 0xe1, 0x6c, 0x7b, 0xdd,
-0x64, 0x73, 0xd4, 0x57, 0x66, 0xc5, 0x4b, 0x59, 0xb6, 0x41, 0x4e, 0xa8,
-0x39, 0x46, 0x9b, 0x32, 0x3e, 0x8f, 0x4b, 0x55, 0x82, 0xde, 0xd8, 0x1f,
-0xe4, 0xe2, 0x33, 0xe1, 0xdf, 0x2a, 0xd7, 0xd5, 0x1c, 0xdd, 0xd6, 0x1c,
-0xe3, 0xdd, 0x30, 0xdb, 0xd4, 0x1c, 0x2c, 0x34, 0x66, 0x28, 0x30, 0x5f,
-0x25, 0x2c, 0x5a, 0x22, 0x28, 0x54, 0x1f, 0x26, 0x50, 0x1c, 0x22, 0x4a,
-0x1a, 0x20, 0x46, 0x2b, 0x33, 0x63, 0x42, 0x4e, 0x94, 0x5d, 0x6b, 0xe0,
-0x52, 0x60, 0xe2, 0x48, 0x55, 0xe2, 0x40, 0x4d, 0xe3, 0x39, 0x45, 0xe3,
-0x3c, 0x48, 0xdf, 0x3f, 0x4b, 0xda, 0x41, 0x4e, 0xd5, 0x45, 0x50, 0xd0,
-0x48, 0x53, 0xcc, 0x4a, 0x55, 0xc8, 0x4b, 0x56, 0xc4, 0x48, 0x53, 0xbf,
-0x44, 0x4f, 0xbc, 0x41, 0x4a, 0xb8, 0x3d, 0x48, 0xb5, 0x3a, 0x45, 0xb1,
-0x39, 0x42, 0xae, 0x37, 0x3f, 0xab, 0x35, 0x3d, 0xa7, 0x33, 0x3b, 0xa4,
-0x31, 0x39, 0xa1, 0x30, 0x38, 0x9f, 0x2e, 0x36, 0x9c, 0x2c, 0x33, 0x99,
-0x2b, 0x32, 0x96, 0x29, 0x31, 0x94, 0x28, 0x30, 0x92, 0x27, 0x2e, 0x8f,
-0x25, 0x2c, 0x8d, 0x25, 0x2c, 0x8b, 0x24, 0x2b, 0x89, 0x23, 0x2a, 0x87,
-0x22, 0x29, 0x85, 0x21, 0x28, 0x82, 0x21, 0x27, 0x81, 0x20, 0x25, 0x7f,
-0x1f, 0x24, 0x7d, 0x1f, 0x24, 0x7b, 0x1e, 0x23, 0x79, 0x1d, 0x22, 0x78,
-0x1d, 0x22, 0x76, 0x1c, 0x21, 0x75, 0x1b, 0x20, 0x73, 0x1b, 0x20, 0x72,
-0x1b, 0x1f, 0x70, 0x1a, 0x1f, 0x6f, 0x1a, 0x1f, 0x6d, 0x19, 0x1e, 0x6c,
-0x19, 0x1e, 0x6a, 0x19, 0x1d, 0x69, 0x19, 0x1d, 0x68, 0x18, 0x1d, 0x66,
-0x18, 0x1d, 0x65, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x63, 0x17, 0x1c, 0x63,
-0x17, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x16, 0x1a, 0x5f, 0x16, 0x1a, 0x5e,
-0x16, 0x1a, 0x5d, 0x15, 0x19, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x19, 0x5a,
-0x15, 0x19, 0x59, 0x14, 0x19, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56,
-0x14, 0x18, 0x56, 0x14, 0x18, 0x55, 0x13, 0x17, 0x54, 0x13, 0x17, 0x53,
-0x13, 0x17, 0x52, 0x13, 0x16, 0x51, 0x13, 0x16, 0x51, 0x12, 0x16, 0x50,
-0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d,
-0x12, 0x15, 0x4c, 0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x14, 0x4a,
-0x11, 0x14, 0x49, 0x11, 0x14, 0x48, 0x10, 0x14, 0x48, 0x10, 0x14, 0x48,
-0x10, 0x13, 0x47, 0x10, 0x13, 0x47, 0x10, 0x13, 0x45, 0x10, 0x13, 0x45,
-0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x0f, 0x12, 0x43,
-0x0f, 0x11, 0x42, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x40,
-0x0f, 0x11, 0x40, 0x0e, 0x11, 0x3f, 0x0e, 0x11, 0x3f, 0x0e, 0x10, 0x3f,
-0x0d, 0x10, 0x3e, 0x0d, 0x10, 0x3e, 0x0d, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x13, 0x16, 0x49, 0x25, 0x2c, 0x93, 0x27, 0x2d, 0x99, 0x22, 0x27, 0x82,
-0x1e, 0x24, 0x7a, 0x1e, 0x23, 0x7c, 0x1f, 0x24, 0x7e, 0x1e, 0x24, 0x80,
-0x1f, 0x25, 0x81, 0x1f, 0x25, 0x83, 0x20, 0x26, 0x85, 0x20, 0x27, 0x87,
-0x22, 0x28, 0x8a, 0x23, 0x29, 0x8b, 0x24, 0x2b, 0x8e, 0x25, 0x2c, 0x90,
-0x27, 0x2e, 0x92, 0x28, 0x30, 0x95, 0x2a, 0x32, 0x97, 0x92, 0x92, 0x48,
-0xdb, 0xd4, 0x1c, 0xd4, 0xcd, 0x1b, 0xe2, 0xe0, 0x2d, 0xdf, 0xd9, 0x22,
-0xd1, 0xcf, 0x1a, 0xbe, 0xb8, 0x15, 0x78, 0x7c, 0x77, 0x46, 0x51, 0xb2,
-0x46, 0x51, 0xb6, 0x46, 0x50, 0xb9, 0x46, 0x51, 0xbd, 0x46, 0x50, 0xc1,
-0x44, 0x50, 0xc4, 0x44, 0x50, 0xc9, 0x43, 0x4d, 0xcd, 0x40, 0x4c, 0xd1,
-0x40, 0x4b, 0xd6, 0x40, 0x4b, 0xdb, 0x45, 0x51, 0xe0, 0x4b, 0x58, 0xe2,
-0x54, 0x63, 0xe1, 0x86, 0x8d, 0x8d, 0xdb, 0xd4, 0x1c, 0xe1, 0xdb, 0x28,
-0xe1, 0xda, 0x26, 0x81, 0x83, 0x43, 0x38, 0x43, 0x83, 0x34, 0x3e, 0x7a,
-0x17, 0x1e, 0x48, 0x19, 0x20, 0x4c, 0x1a, 0x21, 0x50, 0x1c, 0x23, 0x54,
-0x1d, 0x25, 0x58, 0x1f, 0x27, 0x5e, 0xcf, 0xca, 0x11, 0xe1, 0xda, 0x26,
-0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xde, 0xdb, 0x1d, 0xe2, 0xdc, 0x2b,
-0xb5, 0xb4, 0x40, 0x64, 0x71, 0xc9, 0x78, 0x87, 0xe4, 0x92, 0xa1, 0xfd,
-0x8e, 0x9d, 0xfd, 0x86, 0x96, 0xfd, 0x80, 0x91, 0xfd, 0x7a, 0x8b, 0xf9,
-0x6f, 0x80, 0xed, 0x61, 0x71, 0xdc, 0x54, 0x63, 0xca, 0x49, 0x58, 0xba,
-0x3d, 0x4c, 0xa9, 0x42, 0x4f, 0xa7, 0x4b, 0x58, 0xaa, 0xb5, 0xb4, 0x3e,
-0xde, 0xd8, 0x1f, 0xe1, 0xdf, 0x2a, 0xdc, 0xda, 0x1d, 0xde, 0xd7, 0x1d,
-0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0x6a, 0x6d, 0x48, 0x2a, 0x31, 0x62,
-0x25, 0x2c, 0x5b, 0x21, 0x28, 0x55, 0x1e, 0x25, 0x4f, 0x1b, 0x22, 0x4a,
-0x28, 0x31, 0x60, 0x4d, 0x5a, 0xaf, 0x57, 0x66, 0xe0, 0x4c, 0x5b, 0xe0,
-0x44, 0x53, 0xe1, 0x47, 0x55, 0xe1, 0x49, 0x57, 0xe2, 0x4c, 0x59, 0xe3,
-0x4f, 0x5c, 0xe0, 0x53, 0x60, 0xdb, 0x56, 0x63, 0xd6, 0x53, 0x5f, 0xd1,
-0x4d, 0x59, 0xcd, 0x4a, 0x55, 0xc9, 0x46, 0x50, 0xc4, 0x42, 0x4c, 0xc1,
-0x40, 0x49, 0xbc, 0x3c, 0x46, 0xb8, 0x39, 0x43, 0xb5, 0x37, 0x41, 0xb1,
-0x36, 0x3f, 0xae, 0x33, 0x3c, 0xab, 0x32, 0x3a, 0xa8, 0x2f, 0x37, 0xa5,
-0x2e, 0x36, 0xa2, 0x2d, 0x35, 0x9f, 0x2b, 0x33, 0x9c, 0x29, 0x31, 0x9a,
-0x29, 0x30, 0x97, 0x27, 0x2f, 0x95, 0x26, 0x2e, 0x92, 0x25, 0x2c, 0x90,
-0x24, 0x2b, 0x8e, 0x23, 0x2a, 0x8b, 0x22, 0x29, 0x89, 0x22, 0x28, 0x87,
-0x21, 0x27, 0x85, 0x20, 0x26, 0x83, 0x1f, 0x25, 0x81, 0x1f, 0x24, 0x80,
-0x1f, 0x24, 0x7e, 0x1e, 0x23, 0x7c, 0x1d, 0x23, 0x7a, 0x1d, 0x22, 0x78,
-0x1c, 0x21, 0x77, 0x1c, 0x21, 0x75, 0x1c, 0x21, 0x74, 0x1c, 0x20, 0x72,
-0x1b, 0x20, 0x70, 0x1a, 0x1f, 0x6f, 0x1a, 0x1f, 0x6d, 0x1a, 0x1e, 0x6c,
-0x1a, 0x1e, 0x6b, 0x19, 0x1d, 0x69, 0x19, 0x1e, 0x68, 0x19, 0x1d, 0x68,
-0x18, 0x1d, 0x66, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x64, 0x17, 0x1c, 0x63,
-0x17, 0x1b, 0x62, 0x17, 0x1b, 0x60, 0x16, 0x1b, 0x5f, 0x16, 0x1a, 0x5e,
-0x16, 0x1a, 0x5d, 0x16, 0x1a, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x1a, 0x5a,
-0x15, 0x19, 0x59, 0x14, 0x19, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56,
-0x14, 0x18, 0x56, 0x14, 0x18, 0x55, 0x14, 0x17, 0x54, 0x13, 0x17, 0x53,
-0x13, 0x17, 0x52, 0x13, 0x17, 0x51, 0x13, 0x17, 0x51, 0x12, 0x16, 0x50,
-0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d,
-0x12, 0x15, 0x4c, 0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x15, 0x4a,
-0x11, 0x15, 0x49, 0x11, 0x14, 0x48, 0x11, 0x14, 0x48, 0x11, 0x14, 0x48,
-0x10, 0x14, 0x47, 0x10, 0x14, 0x47, 0x10, 0x13, 0x45, 0x10, 0x13, 0x45,
-0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x0f, 0x12, 0x43,
-0x0f, 0x11, 0x42, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x41, 0x0f, 0x11, 0x40,
-0x0f, 0x11, 0x40, 0x0f, 0x11, 0x3f, 0x0f, 0x11, 0x3f, 0x0e, 0x11, 0x3f,
-0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x14, 0x17, 0x49, 0x29, 0x2f, 0x94, 0x2a, 0x31, 0x99, 0x24, 0x2a, 0x82,
-0x20, 0x26, 0x7a, 0x20, 0x26, 0x7c, 0x21, 0x27, 0x7e, 0x21, 0x27, 0x80,
-0x21, 0x27, 0x81, 0x21, 0x28, 0x83, 0x22, 0x28, 0x85, 0x23, 0x28, 0x88,
-0x22, 0x29, 0x8a, 0x22, 0x28, 0x8c, 0x23, 0x29, 0x8e, 0x23, 0x29, 0x90,
-0x23, 0x2a, 0x93, 0x24, 0x2b, 0x95, 0x4f, 0x53, 0x77, 0xcb, 0xc4, 0x18,
-0xc9, 0xc7, 0x18, 0xde, 0xdb, 0x1d, 0xdb, 0xd4, 0x1c, 0xd4, 0xcd, 0x1b,
-0xdf, 0xd9, 0x22, 0xbd, 0xba, 0x2b, 0x35, 0x3e, 0xaf, 0x38, 0x42, 0xb3,
-0x3b, 0x46, 0xb6, 0x40, 0x4b, 0xb9, 0x45, 0x50, 0xbd, 0x4c, 0x57, 0xc2,
-0x52, 0x5e, 0xc5, 0x52, 0x5f, 0xc9, 0x52, 0x5f, 0xce, 0x51, 0x5d, 0xd2,
-0x4f, 0x5c, 0xd7, 0x4e, 0x5b, 0xdc, 0x4c, 0x59, 0xe1, 0x4b, 0x58, 0xe2,
-0x49, 0x57, 0xe1, 0x70, 0x7a, 0xb0, 0xb6, 0xb6, 0x4f, 0xb3, 0xb3, 0x41,
-0xa8, 0xa6, 0x28, 0x42, 0x45, 0x33, 0x16, 0x1c, 0x43, 0x17, 0x1e, 0x47,
-0x19, 0x1f, 0x4b, 0x1a, 0x21, 0x4e, 0x1c, 0x23, 0x53, 0x1d, 0x25, 0x57,
-0x20, 0x28, 0x5d, 0x8e, 0x8e, 0x2f, 0xe0, 0xde, 0x25, 0xd2, 0xcc, 0x1b,
-0xd9, 0xd2, 0x1c, 0xdf, 0xd9, 0x22, 0xdf, 0xd8, 0x20, 0xd7, 0xd5, 0x1c,
-0x64, 0x6e, 0xa6, 0x6a, 0x79, 0xd8, 0x80, 0x90, 0xf6, 0x99, 0xaa, 0xfd,
-0xa5, 0xb6, 0xfd, 0x9d, 0xaf, 0xfd, 0x93, 0xa6, 0xfd, 0x8c, 0x9f, 0xfd,
-0x7d, 0x90, 0xfd, 0x6b, 0x7d, 0xf6, 0x5b, 0x6c, 0xe0, 0x4d, 0x5e, 0xcb,
-0x4b, 0x5b, 0xc1, 0x5c, 0x6a, 0xca, 0x67, 0x75, 0xce, 0xa3, 0xa6, 0x75,
-0xd7, 0xd0, 0x1c, 0xd1, 0xca, 0x1a, 0xe1, 0xdf, 0x2a, 0xe7, 0xe1, 0x3e,
-0xe1, 0xdb, 0x2a, 0xdf, 0xd9, 0x22, 0xa8, 0xa6, 0x28, 0x28, 0x30, 0x62,
-0x23, 0x2b, 0x5a, 0x20, 0x27, 0x54, 0x1d, 0x24, 0x4f, 0x3c, 0x47, 0x88,
-0x5a, 0x6a, 0xd9, 0x74, 0x7f, 0xae, 0x96, 0x9c, 0x7f, 0xb7, 0xb8, 0x4e,
-0xdb, 0xd4, 0x1c, 0xa2, 0xa3, 0x54, 0x4a, 0x56, 0xa9, 0x54, 0x60, 0xc6,
-0x59, 0x67, 0xe1, 0x53, 0x61, 0xdc, 0x4e, 0x5b, 0xd7, 0x49, 0x56, 0xd2,
-0x45, 0x51, 0xce, 0x43, 0x4e, 0xc9, 0x51, 0x5a, 0xaf, 0x9a, 0x9b, 0x5a,
-0xe8, 0xe6, 0x3f, 0xe3, 0xe1, 0x32, 0xbe, 0xbb, 0x2d, 0x5a, 0x5f, 0x8c,
-0x32, 0x3a, 0xae, 0x2f, 0x37, 0xab, 0x2e, 0x36, 0xa8, 0x2c, 0x35, 0xa5,
-0x2a, 0x33, 0xa3, 0x2a, 0x32, 0xa0, 0x28, 0x31, 0x9d, 0x27, 0x2f, 0x9a,
-0x66, 0x69, 0x67, 0x8f, 0x8e, 0x46, 0xba, 0xb6, 0x26, 0xcb, 0xc4, 0x18,
-0xc9, 0xc7, 0x18, 0xa4, 0xa2, 0x33, 0x22, 0x28, 0x8a, 0x21, 0x27, 0x88,
-0x20, 0x26, 0x85, 0x20, 0x26, 0x83, 0x1f, 0x25, 0x81, 0x1f, 0x25, 0x80,
-0x1f, 0x24, 0x7e, 0x1e, 0x24, 0x7c, 0x1e, 0x23, 0x7a, 0x1d, 0x22, 0x78,
-0x1d, 0x22, 0x77, 0x1d, 0x22, 0x76, 0x1c, 0x22, 0x74, 0x1c, 0x21, 0x72,
-0x32, 0x35, 0x65, 0x74, 0x74, 0x40, 0xa2, 0x9f, 0x29, 0xdb, 0xd4, 0x1c,
-0xc7, 0xc5, 0x18, 0xc3, 0xbd, 0x16, 0xce, 0xc9, 0x12, 0xa1, 0x9e, 0x27,
-0x45, 0x47, 0x51, 0x18, 0x1c, 0x65, 0x18, 0x1c, 0x64, 0x17, 0x1c, 0x63,
-0x18, 0x1b, 0x62, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e,
-0x16, 0x1a, 0x5d, 0x5b, 0x5b, 0x3f, 0x88, 0x86, 0x2c, 0xb7, 0xb2, 0x19,
-0xd9, 0xd2, 0x1c, 0xdf, 0xd9, 0x22, 0x5a, 0x5b, 0x3c, 0x14, 0x19, 0x57,
-0x14, 0x18, 0x56, 0x14, 0x18, 0x55, 0x14, 0x17, 0x54, 0x13, 0x17, 0x53,
-0x13, 0x17, 0x52, 0x13, 0x17, 0x52, 0x13, 0x17, 0x51, 0x13, 0x16, 0x50,
-0x12, 0x16, 0x4f, 0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e, 0x29, 0x2c, 0x45,
-0x40, 0x41, 0x3c, 0x12, 0x15, 0x4c, 0x11, 0x15, 0x4b, 0x11, 0x15, 0x4a,
-0x11, 0x15, 0x4a, 0x11, 0x15, 0x48, 0x11, 0x15, 0x48, 0x11, 0x14, 0x48,
-0x58, 0x57, 0x31, 0xb6, 0xb1, 0x15, 0xe2, 0xdc, 0x2b, 0xcd, 0xc7, 0x0e,
-0x6e, 0x6d, 0x28, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44, 0x10, 0x13, 0x43,
-0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, 0x0f, 0x11, 0x40,
-0x0f, 0x11, 0x40, 0x0f, 0x11, 0x3f, 0x0f, 0x11, 0x3f, 0x0e, 0x11, 0x3f,
-0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x15, 0x19, 0x49, 0x2b, 0x33, 0x94, 0x2d, 0x35, 0x99, 0x26, 0x2d, 0x82,
-0x23, 0x29, 0x7a, 0x23, 0x29, 0x7c, 0x23, 0x2a, 0x7e, 0x24, 0x2a, 0x80,
-0x24, 0x2a, 0x81, 0x24, 0x2b, 0x83, 0x25, 0x2c, 0x86, 0x25, 0x2c, 0x88,
-0x25, 0x2d, 0x8a, 0x26, 0x2d, 0x8c, 0x26, 0x2d, 0x8e, 0x27, 0x2e, 0x90,
-0x26, 0x2e, 0x93, 0x27, 0x2e, 0x96, 0xbb, 0xb7, 0x27, 0xe1, 0xda, 0x26,
-0xe1, 0xdf, 0x2a, 0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c, 0xc7, 0xc1, 0x18,
-0xd4, 0xcd, 0x1b, 0x53, 0x58, 0x87, 0x2c, 0x35, 0xb0, 0x2e, 0x37, 0xb3,
-0x31, 0x3a, 0xb6, 0x33, 0x3d, 0xba, 0x37, 0x41, 0xbe, 0x3a, 0x44, 0xc2,
-0x3f, 0x4a, 0xc7, 0x44, 0x4f, 0xcb, 0x49, 0x55, 0xcf, 0x51, 0x5d, 0xd4,
-0x55, 0x61, 0xce, 0x48, 0x52, 0xa4, 0x50, 0x5b, 0xb8, 0x52, 0x5f, 0xbf,
-0x51, 0x5f, 0xbe, 0x51, 0x5f, 0xbe, 0x53, 0x61, 0xc5, 0x55, 0x64, 0xcc,
-0x55, 0x64, 0xcb, 0x41, 0x4e, 0x96, 0x1a, 0x21, 0x4b, 0x18, 0x1e, 0x48,
-0x1a, 0x21, 0x4d, 0x1c, 0x23, 0x51, 0x1d, 0x25, 0x56, 0x20, 0x28, 0x5b,
-0x37, 0x3d, 0x56, 0xe3, 0xdd, 0x30, 0xde, 0xd7, 0x1d, 0xdf, 0xd9, 0x22,
-0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d, 0xe2, 0xe0, 0x2d, 0xaf, 0xaf, 0x3c,
-0x53, 0x62, 0xc1, 0x69, 0x79, 0xe1, 0x83, 0x94, 0xfd, 0x9f, 0xb2, 0xfd,
-0xc3, 0xd7, 0xfd, 0xba, 0xd0, 0xfd, 0xae, 0xc4, 0xfd, 0xa4, 0xbb, 0xfd,
-0x8f, 0xa5, 0xfd, 0x75, 0x8b, 0xfd, 0x61, 0x75, 0xf8, 0x51, 0x64, 0xde,
-0x6b, 0x7c, 0xed, 0x82, 0x92, 0xfa, 0x8c, 0x9b, 0xf6, 0x9c, 0xa2, 0x95,
-0xc4, 0xbe, 0x17, 0xd4, 0xcd, 0x1b, 0xe1, 0xda, 0x26, 0xe3, 0xdd, 0x2e,
-0xe2, 0xdc, 0x2b, 0xe4, 0xde, 0x33, 0xbc, 0xb8, 0x1c, 0x26, 0x2e, 0x62,
-0x22, 0x29, 0x5a, 0x4f, 0x54, 0x4b, 0x88, 0x8c, 0x52, 0xa8, 0xa6, 0x28,
-0xdb, 0xd4, 0x1c, 0xe0, 0xda, 0x25, 0xe1, 0xda, 0x26, 0xdd, 0xd6, 0x1c,
-0xde, 0xd8, 0x1f, 0xcc, 0xc6, 0x19, 0x97, 0x9c, 0x7d, 0x54, 0x62, 0xe1,
-0x4e, 0x5b, 0xe2, 0x4a, 0x56, 0xdd, 0x46, 0x52, 0xd8, 0x41, 0x4d, 0xd3,
-0x3e, 0x49, 0xce, 0x3c, 0x46, 0xca, 0xac, 0xab, 0x46, 0xde, 0xdb, 0x1d,
-0xe0, 0xda, 0x25, 0xe3, 0xdd, 0x2e, 0xe1, 0xdf, 0x2a, 0xdf, 0xd9, 0x22,
-0x41, 0x48, 0x9c, 0x2c, 0x35, 0xac, 0x2b, 0x33, 0xa9, 0x3e, 0x44, 0x94,
-0x67, 0x6a, 0x6f, 0x90, 0x90, 0x4b, 0xbb, 0xb7, 0x28, 0xdf, 0xd9, 0x22,
-0xe1, 0xdb, 0x2a, 0xe1, 0xdb, 0x2a, 0xde, 0xdb, 0x1d, 0xe1, 0xda, 0x26,
-0xe1, 0xdf, 0x2a, 0xa5, 0xa2, 0x33, 0x22, 0x29, 0x8a, 0x22, 0x28, 0x88,
-0x22, 0x27, 0x86, 0x20, 0x26, 0x83, 0x20, 0x26, 0x82, 0x20, 0x26, 0x80,
-0x1f, 0x25, 0x7e, 0x1f, 0x24, 0x7c, 0x1e, 0x24, 0x7a, 0x1e, 0x23, 0x78,
-0x1d, 0x22, 0x77, 0x1d, 0x22, 0x76, 0x32, 0x36, 0x68, 0x8b, 0x8a, 0x36,
-0xdc, 0xda, 0x1d, 0xe0, 0xd9, 0x23, 0xe0, 0xde, 0x25, 0xd1, 0xcf, 0x1a,
-0xd4, 0xcd, 0x1b, 0xd9, 0xd2, 0x1c, 0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20,
-0xde, 0xd7, 0x1d, 0x89, 0x88, 0x31, 0x18, 0x1c, 0x64, 0x18, 0x1c, 0x63,
-0x18, 0x1c, 0x62, 0x2d, 0x30, 0x57, 0x72, 0x71, 0x38, 0xa1, 0x9d, 0x24,
-0xdf, 0xd9, 0x22, 0xe3, 0xdd, 0x30, 0xde, 0xd7, 0x1d, 0xdf, 0xd9, 0x22,
-0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d, 0x5a, 0x5b, 0x3d, 0x15, 0x19, 0x57,
-0x15, 0x19, 0x56, 0x15, 0x18, 0x55, 0x15, 0x18, 0x54, 0x14, 0x18, 0x53,
-0x14, 0x18, 0x52, 0x14, 0x18, 0x52, 0x14, 0x17, 0x51, 0x2b, 0x2c, 0x47,
-0xd5, 0xcf, 0x1c, 0xdd, 0xd6, 0x1c, 0xde, 0xdc, 0x1f, 0xdb, 0xd4, 0x1c,
-0x9f, 0x9c, 0x1e, 0x12, 0x16, 0x4c, 0x12, 0x16, 0x4b, 0x12, 0x15, 0x4a,
-0x12, 0x15, 0x4a, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, 0x40, 0x41, 0x39,
-0xe2, 0xdc, 0x2b, 0xe4, 0xde, 0x33, 0xe2, 0xe0, 0x2b, 0xe1, 0xdb, 0x28,
-0xe1, 0xdb, 0x28, 0x6f, 0x6d, 0x28, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44,
-0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40,
-0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x11, 0x3f, 0x0e, 0x11, 0x3f,
-0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x16, 0x1a, 0x49, 0x2e, 0x36, 0x94, 0x31, 0x38, 0x9c, 0x2a, 0x30, 0x82,
-0x26, 0x2c, 0x7a, 0x26, 0x2d, 0x7c, 0x27, 0x2d, 0x7e, 0x27, 0x2e, 0x80,
-0x27, 0x2e, 0x81, 0x28, 0x2f, 0x84, 0x28, 0x30, 0x86, 0x29, 0x30, 0x88,
-0x2a, 0x31, 0x8a, 0x2a, 0x31, 0x8c, 0x2b, 0x32, 0x8f, 0x2b, 0x33, 0x90,
-0x2b, 0x33, 0x93, 0x54, 0x59, 0x76, 0xe0, 0xde, 0x25, 0xe6, 0xdf, 0x37,
-0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0xd1, 0xcf, 0x1a, 0xd1, 0xcf, 0x1a,
-0xbc, 0xb9, 0x2b, 0x2e, 0x37, 0xac, 0x2e, 0x37, 0xb0, 0x2f, 0x38, 0xb3,
-0x2e, 0x37, 0xb7, 0x2e, 0x37, 0xbb, 0x2e, 0x37, 0xbf, 0x2e, 0x37, 0xc3,
-0x30, 0x3a, 0xc7, 0x33, 0x3d, 0xcc, 0x36, 0x41, 0xd0, 0x3a, 0x45, 0xd4,
-0x3e, 0x4a, 0xd9, 0x44, 0x50, 0xde, 0x4c, 0x58, 0xe2, 0x55, 0x64, 0xe2,
-0x51, 0x5f, 0xbe, 0x2d, 0x36, 0x69, 0x12, 0x17, 0x39, 0x13, 0x18, 0x3c,
-0x14, 0x1a, 0x3f, 0x15, 0x1b, 0x42, 0x17, 0x1d, 0x46, 0x18, 0x1f, 0x4a,
-0x1a, 0x21, 0x4e, 0x1c, 0x23, 0x52, 0x1e, 0x26, 0x58, 0x21, 0x29, 0x5e,
-0x7a, 0x7b, 0x3b, 0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xdc, 0xda, 0x1d,
-0xe2, 0xdc, 0x2d, 0xde, 0xd8, 0x1f, 0xdb, 0xd4, 0x1c, 0x66, 0x6f, 0x89,
-0x4d, 0x5d, 0xc3, 0x62, 0x73, 0xe4, 0x7e, 0x91, 0xfd, 0xa3, 0xb8, 0xfd,
-0xd0, 0xe7, 0xfd, 0xe6, 0xfd, 0xfd, 0xd2, 0xec, 0xfd, 0xc5, 0xe0, 0xfd,
-0xa6, 0xc0, 0xfd, 0x83, 0x9c, 0xfd, 0x69, 0x80, 0xfd, 0x7b, 0x90, 0xfd,
-0x9c, 0xaf, 0xfd, 0xa9, 0xba, 0xfd, 0x94, 0xa4, 0xfd, 0x7f, 0x8d, 0xeb,
-0xcf, 0xc9, 0x1a, 0xdd, 0xd6, 0x1c, 0xde, 0xd8, 0x1f, 0xe0, 0xd9, 0x23,
-0xde, 0xdc, 0x1f, 0xe5, 0xdf, 0x34, 0xe6, 0xe0, 0x39, 0x24, 0x2c, 0x60,
-0x62, 0x65, 0x3e, 0xe4, 0xde, 0x31, 0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d,
-0xe2, 0xe0, 0x2b, 0xd7, 0xd0, 0x1c, 0xdc, 0xda, 0x1d, 0xde, 0xdc, 0x1f,
-0xe0, 0xd9, 0x23, 0xce, 0xc7, 0x19, 0xc4, 0xc2, 0x37, 0x48, 0x56, 0xe1,
-0x43, 0x4f, 0xe2, 0x3f, 0x4b, 0xdd, 0x3c, 0x48, 0xd8, 0x3a, 0x45, 0xd4,
-0x37, 0x42, 0xcf, 0x34, 0x3f, 0xcb, 0xaa, 0xa9, 0x47, 0xe0, 0xda, 0x25,
-0xde, 0xd8, 0x1f, 0xde, 0xdc, 0x1f, 0xe3, 0xdd, 0x30, 0xe3, 0xdd, 0x30,
-0x92, 0x93, 0x52, 0x2b, 0x33, 0xac, 0x2b, 0x33, 0xa9, 0xde, 0xdb, 0x1d,
-0xe3, 0xdd, 0x2e, 0xe2, 0xe0, 0x2b, 0xde, 0xdb, 0x1d, 0xdb, 0xd4, 0x1c,
-0xd7, 0xd5, 0x1c, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25, 0xe6, 0xdf, 0x37,
-0xe0, 0xde, 0x25, 0x64, 0x66, 0x5f, 0x23, 0x29, 0x8a, 0x23, 0x28, 0x88,
-0x22, 0x28, 0x86, 0x22, 0x27, 0x84, 0x20, 0x26, 0x82, 0x20, 0x26, 0x80,
-0x20, 0x25, 0x7e, 0x1f, 0x25, 0x7c, 0x1f, 0x24, 0x7a, 0x1e, 0x23, 0x78,
-0x1e, 0x23, 0x78, 0x76, 0x75, 0x44, 0xcf, 0xc9, 0x1a, 0xce, 0xcc, 0x19,
-0xde, 0xd8, 0x1f, 0xdd, 0xd6, 0x1c, 0xce, 0xc9, 0x12, 0xa2, 0x9f, 0x28,
-0xb8, 0xb4, 0x1d, 0xdf, 0xd9, 0x22, 0xe1, 0xdb, 0x28, 0xd7, 0xd5, 0x1c,
-0xd2, 0xcc, 0x1b, 0xdf, 0xd8, 0x20, 0x73, 0x73, 0x3a, 0x19, 0x1d, 0x63,
-0x19, 0x1d, 0x62, 0xe5, 0xdf, 0x36, 0xe6, 0xdf, 0x37, 0xe4, 0xde, 0x31,
-0xe2, 0xdc, 0x2d, 0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xdc, 0xda, 0x1d,
-0xe2, 0xdc, 0x2d, 0xde, 0xd8, 0x1f, 0x89, 0x86, 0x2b, 0x16, 0x1a, 0x57,
-0x16, 0x1a, 0x56, 0x15, 0x19, 0x55, 0x15, 0x19, 0x54, 0x15, 0x19, 0x53,
-0x14, 0x18, 0x52, 0x14, 0x18, 0x52, 0x14, 0x18, 0x51, 0x88, 0x86, 0x27,
-0xe2, 0xdc, 0x2b, 0xcb, 0xc4, 0x18, 0xd9, 0xd2, 0x1c, 0xde, 0xd7, 0x1d,
-0x9f, 0x9c, 0x1e, 0x13, 0x16, 0x4c, 0x13, 0x16, 0x4b, 0x13, 0x16, 0x4b,
-0x12, 0x16, 0x4a, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48,
-0xde, 0xdc, 0x1f, 0xe5, 0xdf, 0x34, 0xe6, 0xe0, 0x39, 0xe2, 0xe0, 0x2d,
-0xe2, 0xdc, 0x2d, 0xcd, 0xc7, 0x0d, 0x11, 0x13, 0x44, 0x11, 0x13, 0x44,
-0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41,
-0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f,
-0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x14, 0x18, 0x49, 0x29, 0x32, 0x94, 0x2d, 0x35, 0x9c, 0x27, 0x2d, 0x83,
-0x23, 0x29, 0x7a, 0x24, 0x2a, 0x7c, 0x25, 0x2b, 0x7e, 0x26, 0x2c, 0x80,
-0x27, 0x2d, 0x81, 0x28, 0x2f, 0x84, 0x29, 0x30, 0x86, 0x2a, 0x31, 0x88,
-0x2c, 0x33, 0x8a, 0x2d, 0x34, 0x8c, 0x2e, 0x36, 0x8f, 0x30, 0x38, 0x91,
-0x32, 0x39, 0x93, 0xaa, 0xa8, 0x36, 0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26,
-0xe1, 0xdb, 0x28, 0xdf, 0xd9, 0x22, 0xe1, 0xdb, 0x28, 0xde, 0xd7, 0x1d,
-0x71, 0x74, 0x73, 0x37, 0x40, 0xad, 0x37, 0x40, 0xb0, 0x38, 0x42, 0xb4,
-0x38, 0x42, 0xb8, 0x38, 0x42, 0xbc, 0x38, 0x42, 0xbf, 0x38, 0x42, 0xc3,
-0x38, 0x42, 0xc7, 0x38, 0x43, 0xcc, 0x38, 0x42, 0xd0, 0x37, 0x42, 0xd5,
-0x36, 0x42, 0xda, 0x35, 0x41, 0xdf, 0x35, 0x41, 0xe2, 0x3a, 0x46, 0xe1,
-0x41, 0x4e, 0xe1, 0x48, 0x56, 0xe0, 0x53, 0x62, 0xdf, 0x55, 0x64, 0xcc,
-0x32, 0x3c, 0x75, 0x16, 0x1c, 0x43, 0x17, 0x1d, 0x47, 0x19, 0x1f, 0x4a,
-0x1b, 0x22, 0x4f, 0x1d, 0x24, 0x54, 0x1f, 0x27, 0x59, 0x22, 0x2a, 0x60,
-0xd0, 0xca, 0x11, 0xe3, 0xdd, 0x30, 0xd2, 0xcc, 0x1b, 0xdb, 0xd4, 0x1c,
-0xe1, 0xdf, 0x2a, 0xe1, 0xda, 0x26, 0xd3, 0xcf, 0x19, 0x4f, 0x5e, 0xc0,
-0x53, 0x64, 0xd1, 0x58, 0x6b, 0xe5, 0x74, 0x89, 0xfd, 0x9e, 0xb6, 0xfd,
-0xd9, 0xf4, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf7, 0xfd, 0xfd,
-0xc5, 0xe5, 0xfd, 0x94, 0xb2, 0xfd, 0x8e, 0xa9, 0xfd, 0xc4, 0xdc, 0xfd,
-0xcd, 0xe2, 0xfd, 0xaf, 0xc2, 0xfd, 0x98, 0xa9, 0xfd, 0x86, 0x95, 0xf7,
-0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c,
-0xdb, 0xd4, 0x1c, 0xe6, 0xdf, 0x37, 0xe1, 0xdf, 0x2a, 0x22, 0x2a, 0x60,
-0x49, 0x4e, 0x46, 0xa2, 0xa0, 0x20, 0xce, 0xc9, 0x0f, 0xe1, 0xda, 0x26,
-0xde, 0xdc, 0x1f, 0xd1, 0xcf, 0x1a, 0xd9, 0xd2, 0x1c, 0xe0, 0xde, 0x25,
-0xe0, 0xda, 0x25, 0xd2, 0xcc, 0x1b, 0xcc, 0xc6, 0x19, 0x3e, 0x4a, 0xe1,
-0x39, 0x45, 0xe2, 0x36, 0x41, 0xde, 0x35, 0x40, 0xda, 0x34, 0x40, 0xd5,
-0x34, 0x3f, 0xd0, 0x33, 0x3e, 0xcc, 0x6e, 0x72, 0x87, 0xe6, 0xe0, 0x39,
-0xe3, 0xdd, 0x30, 0xe1, 0xdf, 0x2a, 0xcc, 0xc6, 0x19, 0xd7, 0xd5, 0x1c,
-0xa8, 0xa6, 0x3f, 0x2d, 0x35, 0xad, 0x2c, 0x34, 0xaa, 0xa7, 0xa6, 0x3c,
-0xd0, 0xcb, 0x18, 0xe1, 0xdf, 0x2a, 0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20,
-0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c, 0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26,
-0xe1, 0xdb, 0x28, 0x4e, 0x51, 0x6e, 0x24, 0x2a, 0x8b, 0x24, 0x29, 0x88,
-0x23, 0x29, 0x86, 0x22, 0x28, 0x84, 0x22, 0x28, 0x82, 0x22, 0x27, 0x80,
-0x21, 0x27, 0x7e, 0x21, 0x26, 0x7c, 0x20, 0x26, 0x7a, 0x20, 0x26, 0x79,
-0xa4, 0xa1, 0x2c, 0xd2, 0xcc, 0x1b, 0xdf, 0xd8, 0x20, 0xce, 0xcc, 0x19,
-0xd4, 0xcd, 0x1b, 0x76, 0x75, 0x40, 0x1d, 0x22, 0x6e, 0x1d, 0x22, 0x6c,
-0x1d, 0x21, 0x6b, 0x5f, 0x60, 0x49, 0xc7, 0xc5, 0x18, 0xd5, 0xcf, 0x1c,
-0xd9, 0xd2, 0x1c, 0xe1, 0xdb, 0x2a, 0xce, 0xc9, 0x11, 0x1a, 0x1f, 0x63,
-0x1a, 0x1e, 0x62, 0xa2, 0x9e, 0x25, 0xb8, 0xb3, 0x1a, 0xe3, 0xe1, 0x32,
-0xe2, 0xdc, 0x2b, 0xe3, 0xdd, 0x30, 0xd2, 0xcc, 0x1b, 0xdb, 0xd4, 0x1c,
-0xe1, 0xdf, 0x2a, 0xe1, 0xda, 0x26, 0xa1, 0x9d, 0x22, 0x17, 0x1b, 0x57,
-0x17, 0x1b, 0x56, 0x16, 0x1a, 0x55, 0x16, 0x1a, 0x54, 0x16, 0x1a, 0x53,
-0x15, 0x19, 0x52, 0x15, 0x19, 0x52, 0x15, 0x19, 0x51, 0xcf, 0xc9, 0x1a,
-0xe3, 0xdd, 0x2e, 0xd7, 0xd0, 0x1c, 0xd7, 0xd5, 0x1c, 0xd4, 0xcd, 0x1b,
-0xce, 0xc8, 0x0e, 0x14, 0x17, 0x4c, 0x14, 0x17, 0x4b, 0x13, 0x17, 0x4b,
-0x13, 0x16, 0x4a, 0x13, 0x16, 0x49, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48,
-0xdb, 0xd4, 0x1c, 0xe6, 0xdf, 0x37, 0xe1, 0xdf, 0x2a, 0xe0, 0xde, 0x25,
-0xe5, 0xdf, 0x36, 0xe2, 0xdc, 0x2d, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44,
-0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41,
-0x0f, 0x13, 0x40, 0x0f, 0x13, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f,
-0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x13, 0x16, 0x49, 0x28, 0x2e, 0x94, 0x2a, 0x31, 0x9c, 0x24, 0x2a, 0x83,
-0x20, 0x27, 0x7b, 0x20, 0x27, 0x7c, 0x21, 0x28, 0x7e, 0x22, 0x29, 0x80,
-0x23, 0x2a, 0x82, 0x24, 0x2b, 0x84, 0x25, 0x2c, 0x86, 0x26, 0x2c, 0x88,
-0x27, 0x2e, 0x8a, 0x28, 0x2e, 0x8c, 0x29, 0x30, 0x8f, 0x2a, 0x32, 0x91,
-0x2b, 0x33, 0x94, 0xd9, 0xd2, 0x1c, 0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d,
-0xe0, 0xde, 0x25, 0xd7, 0xd5, 0x1c, 0xe2, 0xdc, 0x2b, 0xde, 0xd8, 0x1f,
-0x39, 0x42, 0xaa, 0x3c, 0x45, 0xad, 0x3e, 0x48, 0xb1, 0x41, 0x4a, 0xb4,
-0x44, 0x4e, 0xb8, 0x47, 0x51, 0xbc, 0x47, 0x51, 0xbf, 0x47, 0x53, 0xc4,
-0x49, 0x54, 0xc8, 0x49, 0x54, 0xcc, 0x49, 0x55, 0xd1, 0x4a, 0x56, 0xd6,
-0x4a, 0x56, 0xda, 0x4a, 0x56, 0xdf, 0x49, 0x56, 0xe2, 0x4b, 0x59, 0xe1,
-0x4d, 0x5b, 0xe1, 0x4e, 0x5c, 0xe0, 0x4f, 0x5d, 0xdf, 0x4f, 0x5e, 0xde,
-0x50, 0x60, 0xdd, 0x51, 0x61, 0xdb, 0x58, 0x69, 0xda, 0x40, 0x4e, 0x96,
-0x1b, 0x22, 0x50, 0x1d, 0x25, 0x55, 0x20, 0x27, 0x5a, 0x4d, 0x52, 0x4d,
-0xde, 0xd8, 0x1f, 0xe5, 0xdf, 0x36, 0xe1, 0xda, 0x26, 0xd9, 0xd2, 0x1c,
-0xe3, 0xe1, 0x32, 0xe3, 0xdd, 0x30, 0xb4, 0xb4, 0x43, 0x5a, 0x69, 0xd0,
-0x62, 0x73, 0xe7, 0x69, 0x7d, 0xfd, 0x72, 0x89, 0xfd, 0x8d, 0xa8, 0xfd,
-0xd3, 0xf3, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd,
-0xee, 0xfd, 0xfd, 0xa6, 0xcb, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd,
-0xd5, 0xec, 0xfd, 0xb3, 0xc7, 0xfd, 0x8e, 0x9f, 0xfd, 0x74, 0x83, 0xea,
-0xde, 0xd8, 0x1f, 0xe2, 0xe0, 0x2d, 0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d,
-0xe2, 0xe0, 0x2b, 0xe2, 0xe0, 0x2d, 0xe0, 0xde, 0x25, 0x21, 0x29, 0x5f,
-0x1e, 0x26, 0x59, 0x1c, 0x23, 0x53, 0x1a, 0x21, 0x4f, 0x39, 0x45, 0x86,
-0x5f, 0x6d, 0xa8, 0xe0, 0xd9, 0x23, 0xcf, 0xc9, 0x1a, 0xdb, 0xd4, 0x1c,
-0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c, 0xdf, 0xd9, 0x22, 0x3e, 0x4b, 0xe1,
-0x3b, 0x47, 0xe2, 0x39, 0x45, 0xdf, 0x39, 0x44, 0xda, 0x37, 0x43, 0xd6,
-0x37, 0x41, 0xd1, 0x36, 0x40, 0xcc, 0x70, 0x74, 0x87, 0xe5, 0xdf, 0x36,
-0xe1, 0xdf, 0x2a, 0xdf, 0xd9, 0x22, 0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d,
-0xa9, 0xa7, 0x3f, 0x2e, 0x37, 0xae, 0x2e, 0x36, 0xaa, 0x2d, 0x36, 0xa7,
-0x2d, 0x35, 0xa4, 0x2c, 0x34, 0xa2, 0x54, 0x59, 0x7c, 0xd0, 0xcb, 0x17,
-0xdf, 0xd8, 0x20, 0xd9, 0xd2, 0x1c, 0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d,
-0xe0, 0xde, 0x25, 0x27, 0x2e, 0x8c, 0x27, 0x2e, 0x8b, 0x26, 0x2d, 0x88,
-0x26, 0x2d, 0x86, 0x25, 0x2c, 0x84, 0x25, 0x2c, 0x83, 0x24, 0x2b, 0x80,
-0x23, 0x2a, 0x7e, 0x23, 0x29, 0x7c, 0x23, 0x29, 0x7b, 0xa4, 0xa2, 0x2d,
-0xde, 0xdc, 0x1f, 0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c,
-0x61, 0x63, 0x4d, 0x1f, 0x25, 0x70, 0x1f, 0x25, 0x6e, 0x1e, 0x24, 0x6d,
-0x1e, 0x23, 0x6b, 0x1e, 0x23, 0x6a, 0xb9, 0xb4, 0x1c, 0xde, 0xdc, 0x1f,
-0xd7, 0xd5, 0x1c, 0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0x5e, 0x5f, 0x44,
-0x1b, 0x20, 0x62, 0x1b, 0x20, 0x61, 0x1b, 0x1f, 0x60, 0x1b, 0x1f, 0x5f,
-0x1a, 0x1e, 0x5e, 0xb8, 0xb3, 0x1a, 0xe1, 0xda, 0x26, 0xd9, 0xd2, 0x1c,
-0xe3, 0xe1, 0x32, 0xe3, 0xdd, 0x30, 0xa1, 0x9e, 0x22, 0x18, 0x1c, 0x57,
-0x17, 0x1c, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x54, 0x16, 0x1b, 0x53,
-0x16, 0x1b, 0x53, 0x16, 0x1a, 0x52, 0x72, 0x71, 0x30, 0xd1, 0xcf, 0x1a,
-0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c, 0xcb, 0xc4, 0x18, 0xd1, 0xcf, 0x1a,
-0xce, 0xcc, 0x19, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b,
-0x14, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48,
-0x9f, 0x9c, 0x1c, 0xe2, 0xe0, 0x2d, 0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d,
-0xe2, 0xe0, 0x2d, 0xe7, 0xe1, 0x3c, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44,
-0x10, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41,
-0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f,
-0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x12, 0x15, 0x49, 0x25, 0x2c, 0x94, 0x27, 0x2d, 0x9c, 0x22, 0x27, 0x83,
-0x1e, 0x23, 0x7b, 0x1f, 0x24, 0x7d, 0x1f, 0x24, 0x7f, 0x20, 0x26, 0x81,
-0x20, 0x26, 0x82, 0x21, 0x27, 0x84, 0x22, 0x27, 0x86, 0x23, 0x29, 0x89,
-0x23, 0x2a, 0x8a, 0x23, 0x2a, 0x8d, 0x24, 0x2b, 0x8f, 0x25, 0x2d, 0x91,
-0x66, 0x69, 0x65, 0xc9, 0xc3, 0x18, 0xe1, 0xdb, 0x28, 0xe1, 0xda, 0x26,
-0xdf, 0xd8, 0x20, 0xcb, 0xc4, 0x18, 0xd1, 0xcf, 0x1a, 0xa8, 0xa7, 0x3c,
-0x30, 0x38, 0xaa, 0x31, 0x3a, 0xad, 0x33, 0x3c, 0xb1, 0x34, 0x3e, 0xb4,
-0x37, 0x40, 0xb8, 0x38, 0x42, 0xbc, 0x3b, 0x44, 0xc0, 0x3d, 0x47, 0xc4,
-0x3f, 0x4a, 0xc8, 0x43, 0x4d, 0xcd, 0x46, 0x51, 0xd1, 0x49, 0x55, 0xd6,
-0x4d, 0x5a, 0xdb, 0x51, 0x5e, 0xe0, 0x58, 0x67, 0xe2, 0x56, 0x63, 0xcd,
-0x44, 0x50, 0x9a, 0x27, 0x2f, 0x5e, 0x16, 0x1b, 0x41, 0x13, 0x19, 0x3e,
-0x15, 0x1b, 0x41, 0x16, 0x1c, 0x44, 0x18, 0x1e, 0x48, 0x1a, 0x20, 0x4c,
-0x1c, 0x23, 0x51, 0x1e, 0x25, 0x55, 0x20, 0x28, 0x5b, 0x8e, 0x8e, 0x2f,
-0xd7, 0xd0, 0x1c, 0xe4, 0xe2, 0x35, 0xe5, 0xdf, 0x36, 0xe0, 0xda, 0x25,
-0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0x85, 0x8d, 0x84, 0x60, 0x70, 0xdb,
-0x6e, 0x80, 0xf9, 0x7e, 0x94, 0xfd, 0x8e, 0xa7, 0xfd, 0xa0, 0xbe, 0xfd,
-0xb3, 0xd8, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd,
-0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd,
-0xc0, 0xd9, 0xfd, 0x91, 0xa7, 0xfd, 0x74, 0x86, 0xfd, 0x5f, 0x6f, 0xda,
-0xe1, 0xda, 0x26, 0xd9, 0xd2, 0x1c, 0xe2, 0xe0, 0x2d, 0xe1, 0xdf, 0x2a,
-0xe3, 0xdd, 0x2e, 0xe0, 0xde, 0x25, 0xde, 0xd8, 0x1f, 0x23, 0x2c, 0x62,
-0x20, 0x28, 0x5b, 0x1e, 0x25, 0x55, 0x2c, 0x36, 0x6d, 0x3f, 0x4b, 0x91,
-0x4d, 0x5c, 0xb4, 0xc5, 0xc4, 0x34, 0xe0, 0xd9, 0x23, 0xde, 0xdc, 0x1f,
-0xc7, 0xc5, 0x18, 0xd7, 0xd5, 0x1c, 0xd9, 0xd2, 0x1c, 0x54, 0x5f, 0xc9,
-0x40, 0x4d, 0xe3, 0x3f, 0x4b, 0xe0, 0x3f, 0x4b, 0xdb, 0x3f, 0x4a, 0xd6,
-0x3e, 0x49, 0xd1, 0x3d, 0x49, 0xcd, 0x4f, 0x57, 0xb3, 0xe2, 0xdc, 0x2b,
-0xe0, 0xde, 0x25, 0xde, 0xd8, 0x1f, 0xde, 0xd7, 0x1d, 0xdf, 0xd8, 0x20,
-0x71, 0x75, 0x79, 0x36, 0x40, 0xae, 0x35, 0x3e, 0xaa, 0x35, 0x3d, 0xa7,
-0x35, 0x3c, 0xa5, 0x33, 0x3b, 0xa2, 0x32, 0x3a, 0x9e, 0xe2, 0xe0, 0x2d,
-0xdb, 0xd4, 0x1c, 0xc9, 0xc3, 0x18, 0xe1, 0xdb, 0x28, 0xe1, 0xda, 0x26,
-0xbc, 0xb8, 0x25, 0x2c, 0x33, 0x8d, 0x2b, 0x33, 0x8b, 0x2b, 0x32, 0x89,
-0x29, 0x30, 0x86, 0x29, 0x2f, 0x84, 0x29, 0x2f, 0x83, 0x28, 0x2e, 0x81,
-0x27, 0x2d, 0x7f, 0x27, 0x2c, 0x7d, 0xa6, 0xa3, 0x2d, 0xe3, 0xdd, 0x30,
-0xd5, 0xcf, 0x1c, 0xd5, 0xcf, 0x1c, 0xdf, 0xd8, 0x20, 0x8e, 0x8d, 0x37,
-0x22, 0x28, 0x71, 0x22, 0x28, 0x70, 0x21, 0x27, 0x6e, 0x20, 0x26, 0x6d,
-0x20, 0x26, 0x6b, 0x1f, 0x25, 0x6a, 0xa3, 0xa1, 0x27, 0xdf, 0xd8, 0x20,
-0xdf, 0xd8, 0x20, 0xd7, 0xd5, 0x1c, 0xd9, 0xd2, 0x1c, 0x5f, 0x61, 0x44,
-0x1c, 0x22, 0x62, 0x1c, 0x21, 0x61, 0x1b, 0x21, 0x60, 0x1b, 0x21, 0x5f,
-0x1a, 0x20, 0x5e, 0xa2, 0x9f, 0x23, 0xe5, 0xdf, 0x36, 0xe0, 0xda, 0x25,
-0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0xa1, 0x9e, 0x22, 0x18, 0x1d, 0x57,
-0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55, 0x18, 0x1c, 0x54, 0x17, 0x1b, 0x53,
-0x17, 0x1b, 0x53, 0x16, 0x1b, 0x52, 0xce, 0xc8, 0x0f, 0xde, 0xdc, 0x1f,
-0xce, 0xcc, 0x19, 0xd4, 0xcd, 0x1b, 0xc0, 0xba, 0x15, 0xd9, 0xd2, 0x1c,
-0xdf, 0xd8, 0x20, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b,
-0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48,
-0x9f, 0x9c, 0x1c, 0xe0, 0xde, 0x25, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25,
-0xe1, 0xda, 0x26, 0x9f, 0x9b, 0x1b, 0x11, 0x15, 0x44, 0x11, 0x15, 0x44,
-0x11, 0x14, 0x42, 0x11, 0x14, 0x42, 0x11, 0x14, 0x41, 0x11, 0x14, 0x41,
-0x10, 0x14, 0x40, 0x10, 0x14, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f,
-0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x11, 0x14, 0x49, 0x23, 0x2b, 0x94, 0x24, 0x2c, 0x9c, 0x20, 0x25, 0x83,
-0x1c, 0x22, 0x7b, 0x1d, 0x23, 0x7d, 0x1d, 0x24, 0x7f, 0x1d, 0x24, 0x81,
-0x1e, 0x24, 0x82, 0x1e, 0x25, 0x84, 0x1f, 0x26, 0x86, 0x1f, 0x27, 0x89,
-0x20, 0x27, 0x8a, 0x20, 0x27, 0x8d, 0x21, 0x28, 0x8f, 0x22, 0x29, 0x91,
-0x8e, 0x8e, 0x46, 0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26,
-0xdd, 0xd6, 0x1c, 0xce, 0xcc, 0x19, 0xd5, 0xcf, 0x1c, 0x7c, 0x7c, 0x60,
-0x28, 0x31, 0xaa, 0x2a, 0x32, 0xae, 0x2b, 0x33, 0xb1, 0x2c, 0x34, 0xb5,
-0x2d, 0x35, 0xb8, 0x2e, 0x37, 0xbd, 0x2e, 0x38, 0xc0, 0x30, 0x3a, 0xc4,
-0x31, 0x3c, 0xc9, 0x33, 0x3d, 0xcd, 0x34, 0x3e, 0xd2, 0x36, 0x40, 0xd6,
-0x37, 0x42, 0xdb, 0x39, 0x44, 0xe0, 0x3c, 0x48, 0xe2, 0x40, 0x4d, 0xe1,
-0x44, 0x52, 0xe1, 0x49, 0x58, 0xdf, 0x4f, 0x5e, 0xdf, 0x56, 0x66, 0xde,
-0x55, 0x65, 0xce, 0x42, 0x4e, 0x97, 0x2a, 0x33, 0x67, 0x1a, 0x20, 0x4c,
-0x1c, 0x23, 0x51, 0x1e, 0x25, 0x56, 0x21, 0x29, 0x5c, 0xba, 0xb7, 0x1b,
-0xdc, 0xda, 0x1d, 0xdd, 0xd6, 0x1c, 0xe7, 0xe1, 0x3c, 0xe2, 0xe0, 0x2d,
-0xe1, 0xdb, 0x28, 0xe0, 0xda, 0x25, 0x67, 0x74, 0xb2, 0x63, 0x74, 0xe1,
-0x71, 0x84, 0xfd, 0x85, 0x9b, 0xfd, 0x9e, 0xb8, 0xfd, 0xc4, 0xe4, 0xfd,
-0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd,
-0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xc1, 0xe1, 0xfd,
-0x8e, 0xa8, 0xfd, 0x7c, 0x92, 0xfd, 0x6d, 0x80, 0xfd, 0x62, 0x73, 0xe0,
-0xde, 0xd8, 0x1f, 0xd7, 0xd0, 0x1c, 0xe4, 0xe2, 0x35, 0xe6, 0xdf, 0x37,
-0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0x26, 0x2e, 0x65,
-0x23, 0x2b, 0x5e, 0x20, 0x27, 0x58, 0x1e, 0x25, 0x53, 0x1b, 0x22, 0x4e,
-0x19, 0x20, 0x4a, 0xa1, 0x9e, 0x1c, 0xe0, 0xde, 0x25, 0xe2, 0xe0, 0x2b,
-0xd1, 0xcf, 0x1a, 0xd7, 0xd5, 0x1c, 0xd9, 0xd2, 0x1c, 0x87, 0x8e, 0x8e,
-0x5c, 0x6a, 0xe3, 0x58, 0x66, 0xe1, 0x56, 0x64, 0xdc, 0x54, 0x61, 0xd7,
-0x52, 0x5e, 0xd3, 0x50, 0x5c, 0xce, 0x4e, 0x5a, 0xca, 0xce, 0xc7, 0x19,
-0xdf, 0xd8, 0x20, 0xde, 0xd8, 0x1f, 0xdf, 0xd8, 0x20, 0xde, 0xdb, 0x1d,
-0x43, 0x4c, 0xb2, 0x41, 0x4b, 0xaf, 0x40, 0x49, 0xab, 0x3e, 0x47, 0xa7,
-0x3c, 0x45, 0xa5, 0x3b, 0x44, 0xa2, 0x5f, 0x64, 0x7c, 0xd4, 0xcd, 0x1b,
-0xd7, 0xd5, 0x1c, 0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d, 0xe1, 0xda, 0x26,
-0xaa, 0xa8, 0x34, 0x31, 0x39, 0x8d, 0x30, 0x38, 0x8b, 0x30, 0x37, 0x89,
-0x2e, 0x35, 0x86, 0x2d, 0x34, 0x84, 0x2d, 0x33, 0x83, 0x2b, 0x32, 0x81,
-0x2b, 0x32, 0x7f, 0x7d, 0x7e, 0x48, 0xd7, 0xd0, 0x1c, 0xde, 0xd8, 0x1f,
-0xd4, 0xcd, 0x1b, 0xcc, 0xc6, 0x19, 0xd0, 0xca, 0x13, 0x26, 0x2b, 0x73,
-0x25, 0x2a, 0x71, 0x25, 0x2a, 0x70, 0x23, 0x29, 0x6e, 0x23, 0x28, 0x6d,
-0x22, 0x27, 0x6b, 0x22, 0x27, 0x6b, 0xcf, 0xc9, 0x12, 0xe0, 0xde, 0x25,
-0xe0, 0xda, 0x25, 0xdd, 0xd6, 0x1c, 0xde, 0xdc, 0x1f, 0x60, 0x61, 0x44,
-0x1e, 0x23, 0x62, 0x1e, 0x22, 0x61, 0x1d, 0x22, 0x60, 0x1d, 0x21, 0x5f,
-0x1c, 0x20, 0x5e, 0xa2, 0x9f, 0x23, 0xe7, 0xe1, 0x3c, 0xe2, 0xe0, 0x2d,
-0xe1, 0xdb, 0x28, 0xe0, 0xda, 0x25, 0xa2, 0x9f, 0x22, 0x19, 0x1e, 0x57,
-0x19, 0x1e, 0x56, 0x18, 0x1d, 0x55, 0x18, 0x1d, 0x54, 0x18, 0x1c, 0x53,
-0x18, 0x1c, 0x53, 0x72, 0x71, 0x30, 0xc4, 0xbe, 0x17, 0xe1, 0xdb, 0x28,
-0xce, 0xcc, 0x19, 0xce, 0xcc, 0x19, 0xdf, 0xd9, 0x22, 0xdd, 0xd6, 0x1c,
-0xd7, 0xd5, 0x1c, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b,
-0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x17, 0x49, 0x13, 0x17, 0x48,
-0x59, 0x59, 0x31, 0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0xd9, 0xd2, 0x1c,
-0xde, 0xdc, 0x1f, 0x6f, 0x6e, 0x28, 0x11, 0x15, 0x44, 0x11, 0x15, 0x44,
-0x11, 0x14, 0x42, 0x11, 0x14, 0x42, 0x11, 0x14, 0x41, 0x11, 0x14, 0x41,
-0x10, 0x14, 0x40, 0x10, 0x14, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f,
-0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x11, 0x15, 0x49, 0x23, 0x2b, 0x94, 0x25, 0x2d, 0x9c, 0x20, 0x26, 0x83,
-0x1d, 0x23, 0x7b, 0x1d, 0x23, 0x7d, 0x1d, 0x24, 0x7f, 0x1e, 0x25, 0x81,
-0x1f, 0x25, 0x82, 0x1f, 0x25, 0x84, 0x20, 0x26, 0x86, 0x20, 0x27, 0x89,
-0x21, 0x28, 0x8a, 0x22, 0x28, 0x8d, 0x22, 0x29, 0x8f, 0x23, 0x2a, 0x91,
-0xa5, 0xa2, 0x36, 0xe3, 0xdd, 0x30, 0xe2, 0xdc, 0x2b, 0xce, 0xc7, 0x19,
-0xdb, 0xd4, 0x1c, 0xde, 0xdc, 0x1f, 0xc1, 0xbb, 0x16, 0x67, 0x69, 0x71,
-0x28, 0x31, 0xaa, 0x2a, 0x32, 0xae, 0x2a, 0x32, 0xb1, 0x2b, 0x34, 0xb5,
-0x2c, 0x35, 0xb9, 0x2d, 0x36, 0xbd, 0x2e, 0x37, 0xc0, 0x2f, 0x38, 0xc5,
-0x30, 0x39, 0xc9, 0x30, 0x3a, 0xcd, 0x31, 0x3b, 0xd2, 0x31, 0x3d, 0xd6,
-0x32, 0x3e, 0xdb, 0x33, 0x3f, 0xe0, 0x36, 0x42, 0xe2, 0x39, 0x45, 0xe1,
-0x3c, 0x48, 0xe1, 0x3f, 0x4d, 0xe0, 0x42, 0x51, 0xdf, 0x48, 0x56, 0xde,
-0x4c, 0x5b, 0xdd, 0x51, 0x61, 0xdb, 0x56, 0x68, 0xda, 0x52, 0x62, 0xc3,
-0x44, 0x53, 0xa0, 0x2f, 0x3a, 0x74, 0x21, 0x29, 0x5c, 0xd7, 0xd0, 0x1c,
-0xe1, 0xda, 0x26, 0xe0, 0xd9, 0x23, 0xde, 0xdb, 0x1d, 0xdc, 0xda, 0x1d,
-0xe2, 0xdc, 0x2d, 0xe1, 0xda, 0x26, 0x58, 0x67, 0xc9, 0x64, 0x75, 0xe3,
-0x73, 0x86, 0xfd, 0x86, 0x9d, 0xfd, 0xa2, 0xbd, 0xfd, 0xcb, 0xed, 0xfd,
-0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd,
-0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xec, 0xfd, 0xfd,
-0xbc, 0xd7, 0xfd, 0x9c, 0xb3, 0xfd, 0x86, 0x99, 0xfd, 0x80, 0x8e, 0xd9,
-0xce, 0xc7, 0x19, 0xe3, 0xdd, 0x2e, 0xe5, 0xdf, 0x34, 0xe2, 0xdc, 0x2b,
-0xdc, 0xda, 0x1d, 0xdc, 0xda, 0x1d, 0xbc, 0xb9, 0x1e, 0x29, 0x31, 0x68,
-0x25, 0x2d, 0x60, 0x22, 0x29, 0x5a, 0x1f, 0x26, 0x54, 0x1c, 0x23, 0x4f,
-0x1b, 0x21, 0x4b, 0x5d, 0x5f, 0x31, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25,
-0xdf, 0xd9, 0x22, 0xd7, 0xd5, 0x1c, 0xe2, 0xe0, 0x2d, 0x78, 0x7c, 0x62,
-0x4d, 0x58, 0xad, 0x54, 0x61, 0xc5, 0x55, 0x61, 0xc8, 0x55, 0x62, 0xca,
-0x55, 0x61, 0xcc, 0x54, 0x61, 0xce, 0x52, 0x5e, 0xca, 0xc4, 0xc1, 0x31,
-0xe0, 0xde, 0x25, 0xe1, 0xda, 0x26, 0xe3, 0xe1, 0x32, 0x9e, 0x9e, 0x55,
-0x43, 0x4d, 0xb2, 0x42, 0x4b, 0xaf, 0x3f, 0x49, 0xab, 0x3e, 0x47, 0xa7,
-0x3b, 0x45, 0xa5, 0x3b, 0x43, 0xa2, 0x72, 0x75, 0x6c, 0xc7, 0xc5, 0x18,
-0xdb, 0xd4, 0x1c, 0xe3, 0xdd, 0x30, 0xe2, 0xdc, 0x2b, 0xce, 0xc7, 0x19,
-0x6d, 0x6f, 0x61, 0x30, 0x37, 0x8d, 0x2f, 0x35, 0x8b, 0x2e, 0x35, 0x89,
-0x2c, 0x34, 0x86, 0x2b, 0x33, 0x85, 0x2b, 0x32, 0x83, 0x29, 0x31, 0x81,
-0x3d, 0x43, 0x71, 0xe0, 0xda, 0x25, 0xe1, 0xda, 0x26, 0xd4, 0xcd, 0x1b,
-0xd1, 0xcf, 0x1a, 0xd4, 0xcd, 0x1b, 0x79, 0x7a, 0x43, 0x24, 0x29, 0x73,
-0x23, 0x29, 0x71, 0x23, 0x28, 0x70, 0x22, 0x28, 0x6e, 0x21, 0x27, 0x6d,
-0x20, 0x26, 0x6c, 0x77, 0x77, 0x3e, 0xdf, 0xd8, 0x20, 0xe1, 0xdb, 0x28,
-0xdf, 0xd8, 0x20, 0xcc, 0xc6, 0x19, 0xde, 0xdb, 0x1d, 0x1d, 0x22, 0x63,
-0x1c, 0x22, 0x62, 0x1c, 0x21, 0x61, 0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f,
-0x1b, 0x20, 0x5e, 0xa2, 0x9f, 0x23, 0xde, 0xdb, 0x1d, 0xdc, 0xda, 0x1d,
-0xe2, 0xdc, 0x2d, 0xe1, 0xda, 0x26, 0xa1, 0x9e, 0x22, 0x18, 0x1d, 0x57,
-0x18, 0x1c, 0x56, 0x18, 0x1c, 0x55, 0x17, 0x1b, 0x54, 0x17, 0x1b, 0x53,
-0x17, 0x1b, 0x53, 0xce, 0xc8, 0x0f, 0xdb, 0xd4, 0x1c, 0xce, 0xc7, 0x19,
-0xd1, 0xca, 0x1a, 0xdf, 0xd9, 0x22, 0xde, 0xdc, 0x1f, 0xdd, 0xd6, 0x1c,
-0xe2, 0xe0, 0x2b, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b,
-0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48,
-0x59, 0x59, 0x32, 0xdc, 0xda, 0x1d, 0xd7, 0xd0, 0x1c, 0xdc, 0xda, 0x1d,
-0xe1, 0xda, 0x26, 0x12, 0x15, 0x45, 0x12, 0x14, 0x44, 0x11, 0x14, 0x44,
-0x10, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41,
-0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f,
-0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x12, 0x15, 0x49, 0x24, 0x2c, 0x94, 0x25, 0x2d, 0x9c, 0x21, 0x26, 0x83,
-0x1e, 0x23, 0x7b, 0x1e, 0x24, 0x7d, 0x1e, 0x24, 0x7f, 0x1f, 0x25, 0x81,
-0x20, 0x25, 0x82, 0x20, 0x26, 0x84, 0x21, 0x27, 0x86, 0x21, 0x27, 0x89,
-0x21, 0x28, 0x8a, 0x22, 0x28, 0x8d, 0x23, 0x29, 0x8f, 0x23, 0x2a, 0x91,
-0xd0, 0xca, 0x17, 0xd7, 0xd0, 0x1c, 0xde, 0xd7, 0x1d, 0xdc, 0xda, 0x1d,
-0xd7, 0xd5, 0x1c, 0xdf, 0xd8, 0x20, 0xd2, 0xcc, 0x1b, 0x3d, 0x44, 0x95,
-0x2a, 0x33, 0xaa, 0x2c, 0x34, 0xae, 0x2c, 0x35, 0xb1, 0x2d, 0x36, 0xb5,
-0x2e, 0x37, 0xb8, 0x2f, 0x38, 0xbd, 0x30, 0x3a, 0xc0, 0x31, 0x3b, 0xc5,
-0x33, 0x3c, 0xc9, 0xaa, 0xa9, 0x49, 0xd1, 0xca, 0x1a, 0xc3, 0xbd, 0x16,
-0xd7, 0xd5, 0x1c, 0xde, 0xd7, 0x1d, 0xd7, 0xd5, 0x1c, 0xdc, 0xda, 0x1d,
-0xe1, 0xda, 0x26, 0xd7, 0xd5, 0x1c, 0xd1, 0xcf, 0x1a, 0xe1, 0xdb, 0x2a,
-0xdd, 0xd6, 0x1c, 0xce, 0xcc, 0x19, 0xcb, 0xc4, 0x18, 0xa9, 0xa8, 0x2b,
-0x1c, 0x23, 0x51, 0x1e, 0x26, 0x57, 0x36, 0x3c, 0x52, 0xe1, 0xdf, 0x2a,
-0xc3, 0xbd, 0x16, 0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26, 0xe0, 0xde, 0x25,
-0xce, 0xcc, 0x19, 0xc3, 0xc0, 0x2c, 0x58, 0x67, 0xc8, 0x64, 0x75, 0xe2,
-0x72, 0x85, 0xfd, 0x86, 0x9c, 0xfd, 0xa0, 0xba, 0xfd, 0xbd, 0xdd, 0xfd,
-0xe2, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd,
-0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xf0, 0xfd, 0xfd,
-0xc3, 0xdd, 0xfd, 0xa4, 0xba, 0xfd, 0x8d, 0xa0, 0xfd, 0x9f, 0xa8, 0xa9,
-0xe1, 0xdb, 0x28, 0xe6, 0xdf, 0x37, 0xdf, 0xd8, 0x20, 0xd7, 0xd0, 0x1c,
-0xe1, 0xdf, 0x2a, 0xdf, 0xd9, 0x22, 0xa9, 0xa7, 0x2b, 0x2b, 0x34, 0x6b,
-0x27, 0x2f, 0x62, 0x24, 0x2b, 0x5c, 0x20, 0x27, 0x56, 0x2c, 0x35, 0x68,
-0x48, 0x56, 0xa2, 0x82, 0x8a, 0x7f, 0xd2, 0xcc, 0x1b, 0xd7, 0xd5, 0x1c,
-0xe0, 0xde, 0x25, 0xe0, 0xde, 0x25, 0xe0, 0xda, 0x25, 0x7e, 0x85, 0x99,
-0x49, 0x56, 0xe4, 0x46, 0x52, 0xe2, 0x44, 0x50, 0xdc, 0x43, 0x4f, 0xd8,
-0x42, 0x4e, 0xd3, 0x41, 0x4c, 0xce, 0x40, 0x4a, 0xca, 0xae, 0xad, 0x46,
-0xdb, 0xd4, 0x1c, 0xe3, 0xdd, 0x30, 0xe4, 0xe2, 0x33, 0x4b, 0x53, 0xa2,
-0x38, 0x41, 0xb2, 0x37, 0x40, 0xaf, 0x35, 0x3e, 0xab, 0x34, 0x3e, 0xa8,
-0x33, 0x3c, 0xa5, 0x33, 0x3a, 0xa2, 0xaa, 0xa7, 0x39, 0xe1, 0xdf, 0x2a,
-0xde, 0xdb, 0x1d, 0xd7, 0xd0, 0x1c, 0xde, 0xd7, 0x1d, 0xdc, 0xda, 0x1d,
-0x6a, 0x6c, 0x61, 0x2b, 0x31, 0x8d, 0x2b, 0x31, 0x8b, 0x29, 0x30, 0x89,
-0x28, 0x2f, 0x86, 0x27, 0x2e, 0x85, 0x27, 0x2d, 0x83, 0x26, 0x2d, 0x81,
-0xba, 0xb6, 0x21, 0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20, 0xd1, 0xcf, 0x1a,
-0xd1, 0xca, 0x1a, 0xdc, 0xda, 0x1d, 0x22, 0x28, 0x74, 0x21, 0x27, 0x73,
-0x20, 0x27, 0x71, 0x20, 0x26, 0x70, 0x20, 0x25, 0x6e, 0x1f, 0x25, 0x6d,
-0x61, 0x62, 0x4a, 0xd7, 0xd5, 0x1c, 0xd1, 0xcf, 0x1a, 0xe1, 0xdb, 0x2a,
-0xdd, 0xd6, 0x1c, 0xce, 0xcc, 0x19, 0x8b, 0x8a, 0x30, 0x1c, 0x21, 0x63,
-0x1b, 0x20, 0x62, 0x1b, 0x20, 0x61, 0x1b, 0x1f, 0x60, 0x1a, 0x1f, 0x5f,
-0x1a, 0x1e, 0x5e, 0xa2, 0x9e, 0x23, 0xe1, 0xda, 0x26, 0xe0, 0xde, 0x25,
-0xce, 0xcc, 0x19, 0xde, 0xd7, 0x1d, 0xd4, 0xcd, 0x1b, 0x18, 0x1c, 0x57,
-0x17, 0x1b, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x54, 0x16, 0x1b, 0x53,
-0x72, 0x71, 0x31, 0xdf, 0xd8, 0x20, 0xd7, 0xd5, 0x1c, 0x71, 0x70, 0x2f,
-0xd5, 0xcf, 0x1c, 0xe0, 0xda, 0x25, 0xde, 0xd7, 0x1d, 0xdf, 0xd8, 0x20,
-0xdf, 0xd8, 0x20, 0x14, 0x18, 0x4c, 0x14, 0x17, 0x4b, 0x14, 0x17, 0x4b,
-0x13, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48,
-0x12, 0x16, 0x47, 0xdf, 0xd9, 0x22, 0xdf, 0xd8, 0x20, 0xdf, 0xd9, 0x22,
-0x87, 0x84, 0x22, 0x12, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44,
-0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41,
-0x0f, 0x13, 0x40, 0x0f, 0x13, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f,
-0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x12, 0x15, 0x49, 0x25, 0x2c, 0x94, 0x27, 0x2d, 0x9c, 0x22, 0x27, 0x83,
-0x1e, 0x23, 0x7b, 0x1f, 0x24, 0x7d, 0x1f, 0x24, 0x7f, 0x20, 0x25, 0x81,
-0x20, 0x26, 0x82, 0x21, 0x26, 0x84, 0x21, 0x27, 0x86, 0x22, 0x28, 0x89,
-0x22, 0x29, 0x8a, 0x23, 0x2a, 0x8d, 0x24, 0x2a, 0x8f, 0x25, 0x2c, 0x91,
-0xd4, 0xcd, 0x1b, 0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xd2, 0xcc, 0x1b,
-0xde, 0xdb, 0x1d, 0xe1, 0xdb, 0x2a, 0xdf, 0xd8, 0x20, 0x2b, 0x33, 0xa7,
-0x2c, 0x35, 0xaa, 0x2d, 0x36, 0xad, 0x2f, 0x38, 0xb1, 0x30, 0x39, 0xb4,
-0x32, 0x3a, 0xb8, 0x33, 0x3d, 0xbc, 0x35, 0x3e, 0xc0, 0x36, 0x40, 0xc4,
-0x37, 0x42, 0xc8, 0xac, 0xab, 0x49, 0xc7, 0xc5, 0x18, 0xcf, 0xc9, 0x1a,
-0xd4, 0xcd, 0x1b, 0xce, 0xc7, 0x19, 0xd4, 0xcd, 0x1b, 0xde, 0xd7, 0x1d,
-0xde, 0xd7, 0x1d, 0xd7, 0xd0, 0x1c, 0xd5, 0xcf, 0x1c, 0xdd, 0xd6, 0x1c,
-0xd7, 0xd5, 0x1c, 0xe0, 0xde, 0x25, 0xdf, 0xd8, 0x20, 0xa2, 0x9f, 0x1e,
-0x1c, 0x23, 0x51, 0x1e, 0x25, 0x55, 0x62, 0x65, 0x3f, 0xdc, 0xda, 0x1d,
-0xcb, 0xc4, 0x18, 0xe0, 0xde, 0x25, 0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20,
-0xe0, 0xd9, 0x23, 0xb1, 0xb1, 0x3e, 0x54, 0x63, 0xc2, 0x5d, 0x6d, 0xd8,
-0x66, 0x78, 0xf1, 0x6f, 0x85, 0xfd, 0x7b, 0x94, 0xfd, 0x88, 0xa6, 0xfd,
-0xa0, 0xc5, 0xfd, 0xc5, 0xf5, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd,
-0xfd, 0xfd, 0xfd, 0xf0, 0xfd, 0xfd, 0xbc, 0xe1, 0xfd, 0xb3, 0xd1, 0xfd,
-0xa6, 0xbf, 0xfd, 0x98, 0xae, 0xfd, 0x86, 0x98, 0xfd, 0xa7, 0xad, 0x89,
-0xe1, 0xda, 0x26, 0xe0, 0xd9, 0x23, 0xdf, 0xd9, 0x22, 0xdb, 0xd4, 0x1c,
-0xe1, 0xdb, 0x2a, 0xdb, 0xd4, 0x1c, 0x80, 0x82, 0x42, 0x2b, 0x33, 0x6a,
-0x26, 0x2e, 0x61, 0x23, 0x2a, 0x5b, 0x21, 0x28, 0x56, 0x1e, 0x25, 0x51,
-0x1c, 0x22, 0x4b, 0x5e, 0x5f, 0x31, 0xe1, 0xdb, 0x2a, 0xde, 0xdc, 0x1f,
-0xe1, 0xda, 0x26, 0xe0, 0xde, 0x25, 0xdc, 0xda, 0x1d, 0xa9, 0xab, 0x69,
-0x55, 0x64, 0xe4, 0x4e, 0x5b, 0xe2, 0x49, 0x56, 0xdd, 0x46, 0x51, 0xd8,
-0x43, 0x4e, 0xd3, 0x3f, 0x4a, 0xce, 0x4e, 0x58, 0xb4, 0xdf, 0xd9, 0x22,
-0xd2, 0xcc, 0x1b, 0xdf, 0xd9, 0x22, 0x95, 0x96, 0x56, 0x32, 0x3b, 0xb5,
-0x30, 0x3a, 0xb2, 0x2f, 0x38, 0xae, 0x2f, 0x37, 0xab, 0x2d, 0x35, 0xa8,
-0x2d, 0x35, 0xa5, 0x2c, 0x34, 0xa2, 0xbc, 0xb8, 0x28, 0xde, 0xd7, 0x1d,
-0xd4, 0xcd, 0x1b, 0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xd2, 0xcc, 0x1b,
-0x28, 0x2e, 0x8f, 0x26, 0x2e, 0x8d, 0x26, 0x2d, 0x8b, 0x26, 0x2c, 0x89,
-0x25, 0x2b, 0x87, 0x24, 0x2a, 0x85, 0x24, 0x2a, 0x83, 0x39, 0x3d, 0x73,
-0xe2, 0xe0, 0x2d, 0xe4, 0xe2, 0x35, 0xe2, 0xe0, 0x2b, 0xe1, 0xdb, 0x28,
-0xdf, 0xd8, 0x20, 0xa4, 0xa1, 0x2c, 0x1f, 0x25, 0x74, 0x1f, 0x24, 0x73,
-0x1f, 0x24, 0x71, 0x1e, 0x24, 0x70, 0x1e, 0x23, 0x6e, 0x8c, 0x8a, 0x34,
-0xde, 0xd7, 0x1d, 0xd7, 0xd0, 0x1c, 0xd5, 0xcf, 0x1c, 0xdd, 0xd6, 0x1c,
-0xd7, 0xd5, 0x1c, 0xce, 0xc9, 0x11, 0x31, 0x34, 0x59, 0x1a, 0x1f, 0x63,
-0x1a, 0x1e, 0x62, 0x1a, 0x1e, 0x61, 0x19, 0x1d, 0x60, 0x19, 0x1d, 0x5f,
-0x19, 0x1d, 0x5e, 0xa1, 0x9e, 0x23, 0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20,
-0xe0, 0xd9, 0x23, 0xdf, 0xd8, 0x20, 0xe2, 0xdc, 0x2b, 0x17, 0x1b, 0x57,
-0x16, 0x1a, 0x56, 0x16, 0x1a, 0x55, 0x16, 0x1a, 0x54, 0x15, 0x19, 0x53,
-0xce, 0xc8, 0x0f, 0xe2, 0xdc, 0x2b, 0xa0, 0x9d, 0x1f, 0x14, 0x18, 0x50,
-0xde, 0xd8, 0x1f, 0xe2, 0xe0, 0x2d, 0xde, 0xd7, 0x1d, 0xd7, 0xd5, 0x1c,
-0xdf, 0xd9, 0x22, 0x59, 0x59, 0x35, 0x13, 0x16, 0x4b, 0x13, 0x16, 0x4b,
-0x13, 0x16, 0x4a, 0x12, 0x16, 0x49, 0x12, 0x16, 0x49, 0x12, 0x16, 0x48,
-0x6f, 0x6e, 0x2a, 0xdb, 0xd4, 0x1c, 0xe2, 0xe0, 0x2d, 0xcd, 0xc7, 0x0e,
-0x28, 0x2a, 0x3e, 0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44,
-0x10, 0x13, 0x42, 0x10, 0x13, 0x42, 0x10, 0x12, 0x41, 0x0f, 0x12, 0x41,
-0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f,
-0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x12, 0x15, 0x49, 0x25, 0x2c, 0x94, 0x28, 0x2e, 0x9c, 0x22, 0x28, 0x83,
-0x1f, 0x25, 0x7b, 0x1f, 0x25, 0x7c, 0x20, 0x25, 0x7e, 0x21, 0x26, 0x80,
-0x21, 0x28, 0x82, 0x22, 0x28, 0x84, 0x23, 0x29, 0x86, 0x23, 0x29, 0x88,
-0x24, 0x2b, 0x8a, 0x24, 0x2c, 0x8c, 0x25, 0x2c, 0x8f, 0x26, 0x2e, 0x91,
-0xbe, 0xb8, 0x15, 0xdb, 0xd4, 0x1c, 0xe5, 0xdf, 0x36, 0xe3, 0xdd, 0x30,
-0xe1, 0xdb, 0x28, 0xe2, 0xe0, 0x2d, 0xdd, 0xd6, 0x1c, 0x2f, 0x37, 0xa7,
-0x31, 0x3a, 0xaa, 0x32, 0x3b, 0xad, 0x34, 0x3c, 0xb1, 0x35, 0x3e, 0xb4,
-0x37, 0x41, 0xb8, 0x39, 0x43, 0xbc, 0x3b, 0x45, 0xbf, 0x3d, 0x48, 0xc4,
-0x3f, 0x4a, 0xc8, 0x8a, 0x8d, 0x74, 0xb0, 0xaf, 0x4a, 0xc2, 0xbf, 0x35,
-0xcb, 0xc4, 0x18, 0xd2, 0xcc, 0x1b, 0xd1, 0xcf, 0x1a, 0xe0, 0xd9, 0x23,
-0xdb, 0xd4, 0x1c, 0xdb, 0xd4, 0x1c, 0xde, 0xd8, 0x1f, 0xdf, 0xd9, 0x22,
-0xd3, 0xce, 0x17, 0xac, 0xab, 0x30, 0xa9, 0xa7, 0x2a, 0x78, 0x7a, 0x35,
-0x1b, 0x22, 0x50, 0x1d, 0x25, 0x55, 0x62, 0x65, 0x3f, 0xde, 0xdb, 0x1d,
-0xdf, 0xd8, 0x20, 0xcc, 0xc6, 0x19, 0xcb, 0xc4, 0x18, 0xd7, 0xd5, 0x1c,
-0xe2, 0xe0, 0x2d, 0xae, 0xae, 0x3a, 0x47, 0x55, 0xb2, 0x4f, 0x5e, 0xc5,
-0x54, 0x65, 0xd9, 0x59, 0x6d, 0xf0, 0x64, 0x7b, 0xfd, 0x70, 0x8b, 0xfd,
-0x82, 0xa2, 0xfd, 0xa4, 0xc9, 0xfd, 0xfd, 0xfd, 0xfd, 0xfb, 0xfd, 0xfd,
-0xd6, 0xfd, 0xfd, 0xbc, 0xe1, 0xfd, 0x9f, 0xbf, 0xfd, 0x86, 0xa1, 0xfd,
-0x7b, 0x92, 0xfd, 0x76, 0x8a, 0xfd, 0x71, 0x82, 0xf6, 0xbd, 0xbd, 0x4f,
-0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26, 0xd4, 0xcd, 0x1b, 0xcf, 0xc9, 0x1a,
-0xe0, 0xd9, 0x23, 0xe2, 0xdc, 0x2d, 0x55, 0x5b, 0x58, 0x29, 0x32, 0x67,
-0x25, 0x2d, 0x60, 0x22, 0x2a, 0x5a, 0x20, 0x27, 0x55, 0x1d, 0x24, 0x4f,
-0x1c, 0x22, 0x4b, 0x19, 0x1f, 0x47, 0xe2, 0xe0, 0x2b, 0xe4, 0xe2, 0x35,
-0xe0, 0xda, 0x25, 0xde, 0xdc, 0x1f, 0xe0, 0xde, 0x25, 0x9f, 0x9c, 0x16,
-0x10, 0x15, 0x33, 0x10, 0x14, 0x32, 0x25, 0x2c, 0x56, 0x37, 0x41, 0x7b,
-0x42, 0x4b, 0x94, 0x4a, 0x55, 0xac, 0xa2, 0xa3, 0x58, 0xd1, 0xca, 0x1a,
-0xe0, 0xde, 0x25, 0xd3, 0xce, 0x1b, 0x55, 0x5d, 0xa5, 0x40, 0x4a, 0xb5,
-0x3d, 0x47, 0xb2, 0x3a, 0x44, 0xae, 0x38, 0x40, 0xab, 0x36, 0x3f, 0xa8,
-0x34, 0x3b, 0xa5, 0x32, 0x3a, 0xa2, 0xe1, 0xdb, 0x2a, 0xc7, 0xc1, 0x18,
-0xbe, 0xb8, 0x15, 0xdb, 0xd4, 0x1c, 0xe5, 0xdf, 0x36, 0xd0, 0xcb, 0x16,
-0x28, 0x2f, 0x8f, 0x27, 0x2d, 0x8d, 0x26, 0x2d, 0x8b, 0x25, 0x2b, 0x88,
-0x24, 0x2a, 0x87, 0x23, 0x29, 0x85, 0x22, 0x29, 0x83, 0x8d, 0x8d, 0x3d,
-0xde, 0xd8, 0x1f, 0xdf, 0xd9, 0x22, 0xdb, 0xd4, 0x1c, 0xe1, 0xdf, 0x2a,
-0xe1, 0xda, 0x26, 0x60, 0x62, 0x51, 0x1d, 0x23, 0x74, 0x1d, 0x23, 0x73,
-0x49, 0x4c, 0x59, 0x8b, 0x8a, 0x35, 0xcf, 0xc9, 0x12, 0xe0, 0xd9, 0x23,
-0xdb, 0xd4, 0x1c, 0xdb, 0xd4, 0x1c, 0xde, 0xd8, 0x1f, 0xdf, 0xd9, 0x22,
-0xce, 0xc9, 0x11, 0x2f, 0x33, 0x5a, 0x19, 0x1e, 0x64, 0x19, 0x1d, 0x63,
-0x19, 0x1d, 0x62, 0x18, 0x1d, 0x61, 0x18, 0x1c, 0x60, 0x18, 0x1c, 0x5f,
-0x17, 0x1b, 0x5e, 0x72, 0x71, 0x36, 0xcb, 0xc4, 0x18, 0xd7, 0xd5, 0x1c,
-0xe2, 0xe0, 0x2d, 0xe2, 0xe0, 0x2b, 0xe3, 0xdd, 0x30, 0x16, 0x1a, 0x57,
-0x15, 0x19, 0x56, 0x15, 0x19, 0x55, 0x15, 0x19, 0x54, 0x71, 0x70, 0x31,
-0xe3, 0xe1, 0x32, 0xe1, 0xdf, 0x2a, 0x2b, 0x2d, 0x48, 0x14, 0x17, 0x50,
-0xcb, 0xc4, 0x18, 0xe3, 0xdd, 0x30, 0xe8, 0xe2, 0x3f, 0xe0, 0xda, 0x25,
-0xcc, 0xc6, 0x19, 0x59, 0x59, 0x35, 0x12, 0x16, 0x4b, 0x12, 0x16, 0x4b,
-0x12, 0x15, 0x4a, 0x12, 0x15, 0x49, 0x12, 0x15, 0x49, 0x12, 0x15, 0x48,
-0xcd, 0xc7, 0x0e, 0xe2, 0xdc, 0x2d, 0xde, 0xd8, 0x1f, 0x6f, 0x6d, 0x29,
-0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x10, 0x14, 0x44,
-0x10, 0x12, 0x42, 0x10, 0x12, 0x42, 0x10, 0x12, 0x41, 0x10, 0x12, 0x41,
-0x10, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x11, 0x3f, 0x0e, 0x11, 0x3f,
-0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x13, 0x16, 0x49, 0x27, 0x2d, 0x94, 0x29, 0x2f, 0x9c, 0x23, 0x29, 0x83,
-0x20, 0x26, 0x7a, 0x20, 0x26, 0x7c, 0x21, 0x27, 0x7e, 0x21, 0x28, 0x80,
-0x22, 0x29, 0x81, 0x23, 0x2a, 0x84, 0x24, 0x2b, 0x86, 0x25, 0x2c, 0x88,
-0x26, 0x2d, 0x8a, 0x27, 0x2d, 0x8c, 0x28, 0x2f, 0x8f, 0x2a, 0x30, 0x91,
-0xde, 0xdb, 0x1d, 0xdd, 0xd6, 0x1c, 0xde, 0xd8, 0x1f, 0xe3, 0xdd, 0x30,
-0xe4, 0xde, 0x31, 0xe4, 0xde, 0x31, 0xe1, 0xda, 0x26, 0x33, 0x3b, 0xa7,
-0x35, 0x3e, 0xaa, 0x37, 0x40, 0xad, 0x38, 0x42, 0xb0, 0x3b, 0x44, 0xb4,
-0x3d, 0x46, 0xb8, 0x3e, 0x48, 0xbc, 0x3f, 0x4a, 0xbf, 0x40, 0x4a, 0xc3,
-0x41, 0x4c, 0xc7, 0x42, 0x4d, 0xcc, 0x43, 0x4d, 0xd0, 0x43, 0x4f, 0xd5,
-0x43, 0x50, 0xda, 0xc2, 0xbf, 0x37, 0xdb, 0xd4, 0x1c, 0xe1, 0xdb, 0x28,
-0xd7, 0xd5, 0x1c, 0xe1, 0xdf, 0x2a, 0xd2, 0xcc, 0x1b, 0xc5, 0xc3, 0x37,
-0x52, 0x61, 0xc1, 0x35, 0x3f, 0x7a, 0x18, 0x1e, 0x47, 0x19, 0x20, 0x4b,
-0x1b, 0x22, 0x4f, 0x1d, 0x24, 0x54, 0x61, 0x64, 0x3d, 0xde, 0xd7, 0x1d,
-0xe0, 0xde, 0x25, 0xde, 0xd8, 0x1f, 0xd1, 0xcf, 0x1a, 0xcc, 0xc6, 0x19,
-0xd2, 0xcc, 0x1b, 0xab, 0xab, 0x36, 0x3c, 0x4a, 0xa3, 0x43, 0x52, 0xb4,
-0x48, 0x59, 0xc6, 0x4e, 0x61, 0xdb, 0x56, 0x6b, 0xf4, 0x61, 0x79, 0xfd,
-0x73, 0x8e, 0xfd, 0xb3, 0xd1, 0xfd, 0xf5, 0xfd, 0xfd, 0xbb, 0xdd, 0xfd,
-0xa3, 0xc3, 0xfd, 0x98, 0xb6, 0xfd, 0x87, 0xa2, 0xfd, 0x77, 0x8f, 0xfd,
-0x69, 0x7e, 0xfd, 0x5c, 0x6f, 0xe9, 0x5b, 0x6c, 0xd9, 0xe1, 0xda, 0x26,
-0xe3, 0xdd, 0x30, 0xcf, 0xc9, 0x1a, 0xde, 0xdb, 0x1d, 0xde, 0xdb, 0x1d,
-0xce, 0xcc, 0x19, 0xd1, 0xcc, 0x13, 0x2c, 0x35, 0x6d, 0x28, 0x30, 0x66,
-0x25, 0x2c, 0x5f, 0x22, 0x29, 0x59, 0x1f, 0x26, 0x54, 0x1d, 0x23, 0x4e,
-0x1b, 0x21, 0x4a, 0x19, 0x1f, 0x46, 0xde, 0xd7, 0x1d, 0xe3, 0xdd, 0x2e,
-0xe1, 0xda, 0x26, 0xe0, 0xd9, 0x23, 0xd7, 0xd5, 0x1c, 0x9f, 0x9c, 0x16,
-0x10, 0x15, 0x33, 0x12, 0x17, 0x36, 0x12, 0x17, 0x35, 0x11, 0x16, 0x33,
-0x13, 0x18, 0x36, 0x40, 0x42, 0x2a, 0xd9, 0xd2, 0x1c, 0xdd, 0xd6, 0x1c,
-0xe0, 0xda, 0x25, 0x64, 0x65, 0x38, 0x30, 0x38, 0x6b, 0x37, 0x3f, 0x7c,
-0x3d, 0x45, 0x8b, 0x41, 0x4b, 0x9a, 0x44, 0x4d, 0xa3, 0x44, 0x4d, 0xa8,
-0x40, 0x49, 0xa5, 0x62, 0x67, 0x7f, 0xdf, 0xd9, 0x22, 0xd1, 0xca, 0x1a,
-0xde, 0xdb, 0x1d, 0xdd, 0xd6, 0x1c, 0xde, 0xd8, 0x1f, 0xa9, 0xa7, 0x35,
-0x2e, 0x36, 0x8f, 0x2c, 0x33, 0x8d, 0x2c, 0x32, 0x8b, 0x2a, 0x30, 0x88,
-0x28, 0x2f, 0x87, 0x27, 0x2e, 0x85, 0x26, 0x2d, 0x82, 0xba, 0xb6, 0x22,
-0xd5, 0xcf, 0x1c, 0xde, 0xd7, 0x1d, 0xde, 0xdc, 0x1f, 0xd1, 0xcf, 0x1a,
-0xe1, 0xdb, 0x28, 0xa4, 0xa1, 0x2c, 0xb9, 0xb5, 0x1f, 0xdd, 0xd6, 0x1c,
-0xd1, 0xcf, 0x1a, 0xd2, 0xcc, 0x1b, 0xdb, 0xd4, 0x1c, 0xe1, 0xdb, 0x28,
-0xd7, 0xd5, 0x1c, 0xe1, 0xdf, 0x2a, 0xce, 0xc9, 0x12, 0x74, 0x74, 0x3d,
-0x19, 0x1e, 0x67, 0x19, 0x1d, 0x65, 0x18, 0x1d, 0x64, 0x18, 0x1d, 0x63,
-0x18, 0x1c, 0x62, 0x17, 0x1c, 0x61, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f,
-0x16, 0x1a, 0x5d, 0x5b, 0x5b, 0x3f, 0xd1, 0xcf, 0x1a, 0xcc, 0xc6, 0x19,
-0xd2, 0xcc, 0x1b, 0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0x15, 0x19, 0x57,
-0x15, 0x18, 0x56, 0x14, 0x18, 0x55, 0x14, 0x18, 0x54, 0xce, 0xc8, 0x0f,
-0xe4, 0xde, 0x31, 0x88, 0x85, 0x28, 0x13, 0x17, 0x51, 0x13, 0x17, 0x50,
-0xe2, 0xe0, 0x2b, 0xe4, 0xde, 0x33, 0xe2, 0xe0, 0x2b, 0xd7, 0xd5, 0x1c,
-0xd5, 0xcf, 0x1c, 0x58, 0x59, 0x35, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4b,
-0x12, 0x15, 0x4a, 0x11, 0x15, 0x49, 0x11, 0x15, 0x49, 0x6f, 0x6d, 0x2b,
-0xce, 0xcc, 0x19, 0xdf, 0xd9, 0x22, 0xb6, 0xb1, 0x14, 0x11, 0x14, 0x45,
-0x10, 0x14, 0x45, 0x10, 0x14, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44,
-0x10, 0x12, 0x42, 0x10, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41,
-0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0e, 0x11, 0x3f,
-0x0e, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x14, 0x17, 0x49, 0x29, 0x2f, 0x94, 0x2a, 0x32, 0x9c, 0x24, 0x2b, 0x82,
-0x21, 0x28, 0x7a, 0x22, 0x28, 0x7c, 0x22, 0x29, 0x7e, 0x23, 0x2a, 0x80,
-0x24, 0x2a, 0x81, 0x25, 0x2c, 0x84, 0x26, 0x2d, 0x86, 0x27, 0x2e, 0x88,
-0x28, 0x2f, 0x8a, 0x29, 0x30, 0x8c, 0x2a, 0x32, 0x8f, 0x2c, 0x33, 0x90,
-0xd1, 0xcf, 0x1a, 0xdc, 0xda, 0x1d, 0xd7, 0xd5, 0x1c, 0xe0, 0xda, 0x25,
-0xe6, 0xe4, 0x39, 0xdb, 0xd4, 0x1c, 0xe1, 0xda, 0x26, 0x34, 0x3c, 0xa6,
-0x34, 0x3e, 0xa9, 0x35, 0x3e, 0xad, 0x36, 0x40, 0xb0, 0x37, 0x40, 0xb3,
-0x37, 0x41, 0xb7, 0x38, 0x42, 0xbb, 0x38, 0x41, 0xbf, 0x38, 0x43, 0xc3,
-0x39, 0x44, 0xc7, 0x3a, 0x44, 0xcc, 0x3a, 0x45, 0xd0, 0x3b, 0x46, 0xd4,
-0x3b, 0x46, 0xd9, 0xc0, 0xbd, 0x37, 0xe4, 0xe2, 0x33, 0xce, 0xcc, 0x19,
-0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20, 0xce, 0xcc, 0x19, 0x70, 0x70, 0x24,
-0x14, 0x1a, 0x3f, 0x15, 0x1b, 0x42, 0x16, 0x1d, 0x45, 0x18, 0x1e, 0x49,
-0x19, 0x20, 0x4d, 0x1b, 0x22, 0x51, 0x60, 0x62, 0x3b, 0xe1, 0xdb, 0x2a,
-0xdb, 0xd4, 0x1c, 0xd4, 0xcd, 0x1b, 0xc1, 0xbb, 0x16, 0xc9, 0xc7, 0x18,
-0xd2, 0xcc, 0x1b, 0xa9, 0xa8, 0x33, 0x35, 0x42, 0x98, 0x3b, 0x4a, 0xa7,
-0x40, 0x50, 0xb6, 0x46, 0x57, 0xc8, 0x4d, 0x60, 0xdd, 0x59, 0x6e, 0xf7,
-0x71, 0x88, 0xfd, 0xb6, 0xcf, 0xfd, 0xb8, 0xd2, 0xfd, 0x95, 0xb0, 0xfd,
-0x83, 0x9d, 0xfd, 0x7d, 0x96, 0xfd, 0x74, 0x8b, 0xfd, 0x69, 0x7e, 0xfd,
-0x5e, 0x71, 0xee, 0x56, 0x67, 0xd8, 0x6e, 0x79, 0x99, 0xdf, 0xd8, 0x20,
-0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26, 0xdf, 0xd9, 0x22, 0xe1, 0xda, 0x26,
-0xe1, 0xda, 0x26, 0x93, 0x93, 0x36, 0x2a, 0x33, 0x6b, 0x27, 0x2f, 0x63,
-0x23, 0x2b, 0x5d, 0x21, 0x28, 0x57, 0x1e, 0x25, 0x52, 0x1c, 0x23, 0x4e,
-0x1a, 0x20, 0x49, 0x18, 0x1e, 0x45, 0xdf, 0xd9, 0x22, 0xdf, 0xd9, 0x22,
-0xd7, 0xd5, 0x1c, 0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c, 0xad, 0xac, 0x31,
-0x4c, 0x58, 0xaa, 0x4a, 0x55, 0xa6, 0x46, 0x51, 0x9e, 0x42, 0x4b, 0x93,
-0x3e, 0x48, 0x8b, 0xc0, 0xbc, 0x23, 0xe1, 0xda, 0x26, 0xde, 0xdc, 0x1f,
-0xab, 0xa9, 0x2d, 0x37, 0x3f, 0x7a, 0x34, 0x3c, 0x74, 0x35, 0x3c, 0x75,
-0x34, 0x3c, 0x75, 0x32, 0x39, 0x70, 0x31, 0x38, 0x6d, 0x33, 0x3a, 0x72,
-0x30, 0x37, 0x6c, 0x6c, 0x6f, 0x4b, 0xdb, 0xd4, 0x1c, 0xc1, 0xbb, 0x16,
-0xd1, 0xcf, 0x1a, 0xdc, 0xda, 0x1d, 0xd7, 0xd5, 0x1c, 0x85, 0x87, 0x53,
-0x36, 0x3e, 0x8f, 0x34, 0x3c, 0x8d, 0x32, 0x3a, 0x8b, 0x30, 0x37, 0x88,
-0x2f, 0x36, 0x87, 0x2d, 0x34, 0x85, 0x2b, 0x32, 0x82, 0xe1, 0xdf, 0x2a,
-0xdf, 0xd9, 0x22, 0xd5, 0xcf, 0x1c, 0xde, 0xd7, 0x1d, 0xde, 0xdc, 0x1f,
-0xcb, 0xc4, 0x18, 0xd1, 0xcf, 0x1a, 0xe1, 0xda, 0x26, 0xe1, 0xda, 0x26,
-0xdf, 0xd8, 0x20, 0xde, 0xd7, 0x1d, 0xe4, 0xe2, 0x33, 0xcf, 0xc9, 0x12,
-0xa3, 0xa0, 0x28, 0x60, 0x61, 0x49, 0x1d, 0x22, 0x69, 0x1c, 0x21, 0x68,
-0x1c, 0x20, 0x67, 0x1b, 0x1f, 0x65, 0x1b, 0x1f, 0x64, 0x1a, 0x1e, 0x63,
-0x19, 0x1e, 0x62, 0x19, 0x1d, 0x61, 0x18, 0x1d, 0x60, 0x18, 0x1c, 0x5e,
-0x17, 0x1c, 0x5d, 0x5c, 0x5c, 0x3f, 0xc1, 0xbb, 0x16, 0xc9, 0xc7, 0x18,
-0xd2, 0xcc, 0x1b, 0xd1, 0xcf, 0x1a, 0xdc, 0xda, 0x1d, 0x15, 0x19, 0x57,
-0x15, 0x19, 0x56, 0x14, 0x18, 0x55, 0x71, 0x70, 0x31, 0xdf, 0xd8, 0x20,
-0xdc, 0xda, 0x1d, 0x2a, 0x2c, 0x49, 0x13, 0x17, 0x51, 0x13, 0x16, 0x50,
-0xe8, 0xe6, 0x3f, 0xe0, 0xde, 0x25, 0xc6, 0xc0, 0x17, 0xe3, 0xdd, 0x2e,
-0xdc, 0xda, 0x1d, 0x58, 0x58, 0x35, 0x11, 0x15, 0x4b, 0x11, 0x15, 0x4b,
-0x11, 0x15, 0x4a, 0x11, 0x14, 0x49, 0x28, 0x2a, 0x41, 0xcd, 0xc7, 0x0e,
-0xe1, 0xda, 0x26, 0xe1, 0xdf, 0x2a, 0x3e, 0x3f, 0x37, 0x10, 0x13, 0x45,
-0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44,
-0x0f, 0x12, 0x42, 0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41,
-0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x11, 0x3f,
-0x0f, 0x11, 0x3e, 0x0e, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x14, 0x18, 0x49, 0x29, 0x32, 0x94, 0x2c, 0x34, 0x99, 0x26, 0x2c, 0x82,
-0x23, 0x29, 0x7a, 0x24, 0x29, 0x7c, 0x25, 0x2a, 0x7e, 0x26, 0x2c, 0x80,
-0x27, 0x2d, 0x81, 0x27, 0x2e, 0x83, 0x28, 0x2e, 0x86, 0x28, 0x2f, 0x88,
-0x28, 0x30, 0x8a, 0x29, 0x30, 0x8c, 0x2a, 0x31, 0x8e, 0x2b, 0x32, 0x90,
-0xd0, 0xcb, 0x16, 0xd1, 0xcf, 0x1a, 0xdb, 0xd4, 0x1c, 0xe4, 0xde, 0x31,
-0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2b, 0xe0, 0xde, 0x25, 0x43, 0x49, 0x94,
-0x30, 0x39, 0xa9, 0x31, 0x39, 0xad, 0x31, 0x3a, 0xb0, 0x32, 0x3b, 0xb3,
-0x32, 0x3b, 0xb6, 0x32, 0x3c, 0xba, 0x33, 0x3d, 0xbe, 0x35, 0x3e, 0xc2,
-0x38, 0x43, 0xc7, 0x3b, 0x46, 0xcb, 0x3f, 0x4b, 0xcf, 0x45, 0x50, 0xd4,
-0x4a, 0x56, 0xd8, 0xde, 0xd7, 0x1d, 0xe4, 0xe2, 0x33, 0xe1, 0xda, 0x26,
-0xd4, 0xcd, 0x1b, 0xcc, 0xc6, 0x19, 0xd2, 0xcc, 0x1b, 0x58, 0x59, 0x29,
-0x13, 0x19, 0x3e, 0x14, 0x1a, 0x41, 0x15, 0x1c, 0x44, 0x16, 0x1d, 0x47,
-0x18, 0x1f, 0x4b, 0x19, 0x20, 0x4e, 0x47, 0x4b, 0x42, 0xe4, 0xe2, 0x35,
-0xe0, 0xde, 0x25, 0xc9, 0xc7, 0x18, 0xd1, 0xcf, 0x1a, 0xce, 0xc7, 0x19,
-0xc3, 0xbd, 0x16, 0xbc, 0xb9, 0x22, 0x30, 0x3c, 0x8d, 0x34, 0x42, 0x9a,
-0x39, 0x47, 0xa7, 0x40, 0x50, 0xb8, 0x48, 0x59, 0xca, 0x50, 0x63, 0xdd,
-0x77, 0x8b, 0xfd, 0xb0, 0xc6, 0xfd, 0x94, 0xaa, 0xfd, 0x7c, 0x93, 0xfd,
-0x70, 0x86, 0xfd, 0x69, 0x7f, 0xfd, 0x64, 0x78, 0xfb, 0x5d, 0x70, 0xea,
-0x56, 0x67, 0xd8, 0x4e, 0x5e, 0xc6, 0x9e, 0xa1, 0x54, 0xe2, 0xe0, 0x2b,
-0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xde, 0xdc, 0x1f, 0xe3, 0xdd, 0x30,
-0xe6, 0xdf, 0x37, 0x52, 0x57, 0x55, 0x26, 0x2f, 0x65, 0x24, 0x2c, 0x5f,
-0x22, 0x29, 0x5a, 0x1f, 0x26, 0x55, 0x1e, 0x24, 0x50, 0x1b, 0x22, 0x4c,
-0x1a, 0x20, 0x48, 0x18, 0x1e, 0x44, 0xa0, 0x9e, 0x1a, 0xce, 0xc7, 0x19,
-0xd9, 0xd2, 0x1c, 0xd7, 0xd5, 0x1c, 0xde, 0xd7, 0x1d, 0xd3, 0xce, 0x16,
-0x4d, 0x58, 0xae, 0x51, 0x5d, 0xb8, 0x4e, 0x59, 0xb3, 0x50, 0x5b, 0xba,
-0x92, 0x96, 0x6c, 0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0xd4, 0xcf, 0x1b,
-0x5c, 0x64, 0xa0, 0x49, 0x53, 0xac, 0x46, 0x52, 0xa9, 0x45, 0x4f, 0xa3,
-0x43, 0x4b, 0x9c, 0x40, 0x4a, 0x99, 0x40, 0x48, 0x96, 0x3e, 0x47, 0x93,
-0x3c, 0x44, 0x8d, 0xad, 0xab, 0x34, 0xd1, 0xca, 0x1a, 0xd1, 0xca, 0x1a,
-0xd7, 0xd5, 0x1c, 0xd1, 0xcf, 0x1a, 0xdb, 0xd4, 0x1c, 0x70, 0x73, 0x57,
-0x36, 0x3d, 0x80, 0x35, 0x3c, 0x7f, 0x34, 0x3c, 0x7e, 0x36, 0x3d, 0x81,
-0x36, 0x3e, 0x87, 0x34, 0x3a, 0x84, 0x59, 0x5d, 0x66, 0xdf, 0xd9, 0x22,
-0xdd, 0xd6, 0x1c, 0xdb, 0xd4, 0x1c, 0xdf, 0xd9, 0x22, 0xd7, 0xd5, 0x1c,
-0xbb, 0xb7, 0x20, 0x67, 0x69, 0x51, 0x66, 0x67, 0x4f, 0x65, 0x67, 0x4e,
-0x65, 0x66, 0x4d, 0x38, 0x3c, 0x63, 0x22, 0x28, 0x6f, 0x21, 0x27, 0x6d,
-0x20, 0x26, 0x6c, 0x20, 0x25, 0x6a, 0x1f, 0x25, 0x69, 0x1f, 0x24, 0x68,
-0x1e, 0x23, 0x67, 0x1d, 0x22, 0x65, 0x1d, 0x21, 0x64, 0x1c, 0x21, 0x63,
-0x1b, 0x20, 0x62, 0x1b, 0x20, 0x61, 0x1a, 0x1f, 0x5f, 0x19, 0x1e, 0x5e,
-0x19, 0x1d, 0x5d, 0x5d, 0x5d, 0x3f, 0xd1, 0xcf, 0x1a, 0xce, 0xc7, 0x19,
-0xc3, 0xbd, 0x16, 0xcf, 0xc9, 0x1a, 0xe1, 0xdb, 0x2a, 0x2c, 0x2f, 0x4e,
-0x16, 0x1a, 0x56, 0x2b, 0x2e, 0x4c, 0xe2, 0xdc, 0x2d, 0xdf, 0xd9, 0x22,
-0x88, 0x86, 0x28, 0x14, 0x18, 0x52, 0x14, 0x18, 0x51, 0x14, 0x17, 0x50,
-0xd4, 0xcd, 0x1b, 0xde, 0xd8, 0x1f, 0xe3, 0xdd, 0x2e, 0xe1, 0xdf, 0x2a,
-0xd1, 0xca, 0x1a, 0x58, 0x59, 0x35, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4a,
-0x12, 0x15, 0x4a, 0x11, 0x15, 0x49, 0x86, 0x84, 0x24, 0xe3, 0xdd, 0x30,
-0xe6, 0xdf, 0x37, 0x86, 0x84, 0x23, 0x10, 0x13, 0x45, 0x10, 0x13, 0x45,
-0x10, 0x13, 0x45, 0x10, 0x13, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x44,
-0x0f, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40,
-0x0f, 0x12, 0x40, 0x0f, 0x12, 0x40, 0x0e, 0x11, 0x3f, 0x0e, 0x10, 0x3f,
-0x0e, 0x10, 0x3e, 0x0e, 0x10, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x14, 0x19, 0x49, 0x2b, 0x32, 0x94, 0x2c, 0x35, 0x99, 0x26, 0x2c, 0x82,
-0x22, 0x29, 0x7a, 0x23, 0x29, 0x7c, 0x24, 0x2a, 0x7e, 0x24, 0x2a, 0x80,
-0x25, 0x2b, 0x81, 0x25, 0x2c, 0x83, 0x26, 0x2c, 0x85, 0x26, 0x2d, 0x88,
-0x27, 0x2d, 0x8a, 0x27, 0x2e, 0x8c, 0x28, 0x2f, 0x8e, 0x28, 0x2f, 0x90,
-0xa7, 0xa4, 0x35, 0xcf, 0xc9, 0x1a, 0xe1, 0xdf, 0x2a, 0xe2, 0xe0, 0x2d,
-0xe0, 0xd9, 0x23, 0xdb, 0xd4, 0x1c, 0xe2, 0xe0, 0x2d, 0x6a, 0x6d, 0x70,
-0x2c, 0x35, 0xa8, 0x2e, 0x37, 0xac, 0x31, 0x39, 0xaf, 0x33, 0x3c, 0xb3,
-0x35, 0x3e, 0xb6, 0x38, 0x42, 0xba, 0x3c, 0x47, 0xbd, 0x40, 0x4a, 0xc2,
-0x44, 0x4f, 0xc5, 0x4a, 0x56, 0xc9, 0x50, 0x5d, 0xce, 0x52, 0x5d, 0xc5,
-0x69, 0x70, 0x7f, 0xe1, 0xda, 0x26, 0xde, 0xdb, 0x1d, 0xe1, 0xda, 0x26,
-0xd9, 0xd2, 0x1c, 0xdc, 0xda, 0x1d, 0xd5, 0xcf, 0x1c, 0x11, 0x16, 0x39,
-0x12, 0x18, 0x3c, 0x13, 0x19, 0x3f, 0x14, 0x1a, 0x42, 0x15, 0x1c, 0x45,
-0x16, 0x1d, 0x48, 0x17, 0x1e, 0x4c, 0x19, 0x21, 0x50, 0xe1, 0xdf, 0x2a,
-0xde, 0xd8, 0x1f, 0xd9, 0xd2, 0x1c, 0xe0, 0xde, 0x25, 0xd5, 0xcf, 0x1c,
-0xc7, 0xc1, 0x18, 0xdf, 0xd8, 0x20, 0x2b, 0x37, 0x84, 0x2e, 0x3b, 0x8e,
-0x34, 0x41, 0x9a, 0x3b, 0x49, 0xa9, 0x42, 0x52, 0xb8, 0x55, 0x66, 0xd3,
-0x79, 0x8a, 0xfd, 0x90, 0xa2, 0xfd, 0x7a, 0x8d, 0xfd, 0x6a, 0x7d, 0xfb,
-0x60, 0x73, 0xf0, 0x5b, 0x6d, 0xe6, 0x58, 0x69, 0xdd, 0x53, 0x64, 0xd1,
-0x4d, 0x5d, 0xc3, 0x46, 0x55, 0xb4, 0xe5, 0xdf, 0x34, 0xd7, 0xd0, 0x1c,
-0xd2, 0xcc, 0x1b, 0xe3, 0xe1, 0x32, 0xe4, 0xe2, 0x33, 0xe5, 0xdf, 0x36,
-0xbb, 0xb7, 0x1d, 0x25, 0x2e, 0x66, 0x23, 0x2b, 0x60, 0x21, 0x29, 0x5b,
-0x1f, 0x26, 0x56, 0x1d, 0x24, 0x52, 0x3c, 0x49, 0x8a, 0x3f, 0x4b, 0x8e,
-0x32, 0x3c, 0x73, 0x27, 0x2f, 0x5e, 0xa0, 0x9e, 0x1a, 0xd7, 0xd5, 0x1c,
-0xd4, 0xcd, 0x1b, 0xd9, 0xd2, 0x1c, 0xdc, 0xda, 0x1d, 0xde, 0xdb, 0x1d,
-0x53, 0x60, 0xbe, 0x50, 0x5c, 0xba, 0x52, 0x5d, 0xbd, 0x61, 0x6b, 0xaa,
-0xd5, 0xcf, 0x1c, 0xdc, 0xda, 0x1d, 0xdb, 0xd4, 0x1c, 0x81, 0x86, 0x82,
-0x4d, 0x59, 0xbe, 0x4b, 0x55, 0xba, 0x49, 0x53, 0xb7, 0x47, 0x51, 0xb4,
-0x44, 0x4e, 0xb0, 0x44, 0x4c, 0xad, 0x42, 0x4b, 0xa9, 0x41, 0x4a, 0xa6,
-0x40, 0x4a, 0xa4, 0xc0, 0xbd, 0x29, 0xe7, 0xe1, 0x3c, 0xe4, 0xde, 0x31,
-0xdb, 0xd4, 0x1c, 0xcf, 0xc9, 0x1a, 0xe1, 0xdf, 0x2a, 0x4b, 0x52, 0x81,
-0x38, 0x41, 0x8e, 0x37, 0x40, 0x8d, 0x36, 0x3e, 0x8a, 0x36, 0x3d, 0x88,
-0x35, 0x3c, 0x86, 0x34, 0x3a, 0x84, 0x6e, 0x71, 0x59, 0xe0, 0xd9, 0x23,
-0xe1, 0xdb, 0x2a, 0xd7, 0xd5, 0x1c, 0xd7, 0xd5, 0x1c, 0xde, 0xdc, 0x1f,
-0xa8, 0xa6, 0x2c, 0x2c, 0x32, 0x76, 0x2b, 0x31, 0x74, 0x29, 0x30, 0x72,
-0x28, 0x2f, 0x71, 0x27, 0x2d, 0x6f, 0x26, 0x2c, 0x6f, 0x25, 0x2a, 0x6d,
-0x24, 0x29, 0x6c, 0x23, 0x28, 0x6a, 0x22, 0x27, 0x69, 0x21, 0x26, 0x68,
-0x20, 0x25, 0x66, 0x1f, 0x25, 0x65, 0x1e, 0x24, 0x64, 0x1d, 0x23, 0x63,
-0x1d, 0x22, 0x62, 0x1d, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1b, 0x20, 0x5e,
-0x1b, 0x20, 0x5d, 0x5e, 0x5f, 0x3f, 0xe0, 0xde, 0x25, 0xd5, 0xcf, 0x1c,
-0xc7, 0xc1, 0x18, 0xdf, 0xd8, 0x20, 0xdb, 0xd4, 0x1c, 0x5c, 0x5d, 0x3c,
-0x17, 0x1c, 0x56, 0x89, 0x87, 0x29, 0xdf, 0xd9, 0x22, 0xde, 0xdc, 0x1f,
-0x2c, 0x2f, 0x49, 0x16, 0x1a, 0x52, 0x15, 0x19, 0x51, 0x15, 0x19, 0x50,
-0xa0, 0x9c, 0x1f, 0xe2, 0xe0, 0x2b, 0xdf, 0xd9, 0x22, 0xd4, 0xcd, 0x1b,
-0xdb, 0xd4, 0x1c, 0x9f, 0x9c, 0x1e, 0x13, 0x16, 0x4b, 0x12, 0x16, 0x4a,
-0x12, 0x16, 0x4a, 0x40, 0x41, 0x3a, 0xe4, 0xe2, 0x33, 0xe5, 0xdf, 0x36,
-0xb6, 0xb1, 0x15, 0x11, 0x14, 0x47, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45,
-0x10, 0x14, 0x45, 0x10, 0x14, 0x45, 0x10, 0x13, 0x44, 0x10, 0x13, 0x43,
-0x10, 0x12, 0x42, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x41, 0x0f, 0x12, 0x40,
-0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x11, 0x3f,
-0x0f, 0x11, 0x3e, 0x0e, 0x10, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x14, 0x17, 0x49, 0x29, 0x31, 0x93, 0x2a, 0x32, 0x99, 0x24, 0x2b, 0x82,
-0x21, 0x28, 0x7a, 0x21, 0x28, 0x7c, 0x22, 0x29, 0x7e, 0x22, 0x29, 0x80,
-0x23, 0x2a, 0x81, 0x23, 0x2a, 0x83, 0x23, 0x2b, 0x85, 0x24, 0x2b, 0x87,
-0x24, 0x2c, 0x8a, 0x25, 0x2c, 0x8b, 0x25, 0x2d, 0x8e, 0x26, 0x2d, 0x90,
-0x7b, 0x7c, 0x54, 0xe6, 0xe0, 0x39, 0xe6, 0xdf, 0x37, 0xd7, 0xd0, 0x1c,
-0xcb, 0xc4, 0x18, 0xe0, 0xda, 0x25, 0xd5, 0xcf, 0x1c, 0x94, 0x94, 0x4d,
-0x33, 0x3b, 0xa8, 0x35, 0x3f, 0xac, 0x38, 0x41, 0xaf, 0x3b, 0x46, 0xb2,
-0x3f, 0x49, 0xb6, 0x43, 0x4d, 0xb9, 0x48, 0x54, 0xbd, 0x4e, 0x59, 0xbf,
-0x47, 0x52, 0xa7, 0x3b, 0x43, 0x85, 0x28, 0x2e, 0x5b, 0x0c, 0x10, 0x2a,
-0x54, 0x55, 0x1f, 0xde, 0xd7, 0x1d, 0xdc, 0xda, 0x1d, 0xcc, 0xc6, 0x19,
-0xdd, 0xd6, 0x1c, 0xd7, 0xd5, 0x1c, 0xcd, 0xc8, 0x0c, 0x11, 0x16, 0x38,
-0x11, 0x17, 0x3b, 0x12, 0x18, 0x3d, 0x13, 0x19, 0x40, 0x1b, 0x22, 0x4f,
-0x39, 0x45, 0x89, 0x27, 0x31, 0x66, 0x17, 0x1f, 0x4d, 0xb8, 0xb4, 0x17,
-0xd2, 0xcc, 0x1b, 0xe0, 0xda, 0x25, 0xe2, 0xe0, 0x2d, 0xd9, 0xd2, 0x1c,
-0xe1, 0xdf, 0x2a, 0xd7, 0xd0, 0x1c, 0x50, 0x57, 0x61, 0x2b, 0x37, 0x85,
-0x30, 0x3d, 0x8f, 0x36, 0x44, 0x9c, 0x40, 0x4f, 0xac, 0x59, 0x68, 0xca,
-0x78, 0x87, 0xee, 0x79, 0x89, 0xf4, 0x68, 0x79, 0xe6, 0x5c, 0x6d, 0xdb,
-0x55, 0x66, 0xd3, 0x50, 0x60, 0xcb, 0x4e, 0x5d, 0xc4, 0x4b, 0x5a, 0xbc,
-0x45, 0x53, 0xb1, 0x89, 0x8d, 0x5e, 0xe2, 0xdc, 0x2d, 0xe2, 0xe0, 0x2b,
-0xe2, 0xe0, 0x2b, 0xe0, 0xde, 0x25, 0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2d,
-0x4d, 0x52, 0x50, 0x21, 0x29, 0x60, 0x20, 0x28, 0x5b, 0x1e, 0x26, 0x57,
-0x1d, 0x24, 0x53, 0x1b, 0x22, 0x4e, 0x28, 0x31, 0x63, 0x46, 0x53, 0x9f,
-0x57, 0x67, 0xcf, 0x57, 0x66, 0xdf, 0xb6, 0xb7, 0x4f, 0xdb, 0xd4, 0x1c,
-0xe2, 0xe0, 0x2d, 0xde, 0xdc, 0x1f, 0xd7, 0xd5, 0x1c, 0xc1, 0xbf, 0x16,
-0x59, 0x66, 0xd4, 0x57, 0x66, 0xd2, 0x55, 0x62, 0xce, 0xc5, 0xc2, 0x32,
-0xd9, 0xd2, 0x1c, 0xde, 0xd8, 0x1f, 0xa2, 0xa4, 0x5b, 0x4f, 0x5b, 0xc2,
-0x4c, 0x57, 0xbe, 0x49, 0x55, 0xba, 0x48, 0x52, 0xb7, 0x45, 0x4f, 0xb3,
-0x44, 0x4e, 0xb0, 0x42, 0x4c, 0xad, 0x3f, 0x4a, 0xa9, 0x3f, 0x47, 0xa6,
-0x3d, 0x46, 0xa3, 0xe4, 0xe2, 0x33, 0xe6, 0xdf, 0x37, 0xe1, 0xdf, 0x2a,
-0xd7, 0xd5, 0x1c, 0xe6, 0xe0, 0x39, 0xe6, 0xdf, 0x37, 0x36, 0x3d, 0x90,
-0x35, 0x3c, 0x8e, 0x34, 0x3b, 0x8c, 0x33, 0x3a, 0x8a, 0x32, 0x3a, 0x87,
-0x31, 0x39, 0x86, 0x31, 0x38, 0x84, 0x6c, 0x6f, 0x59, 0xe4, 0xde, 0x31,
-0xe2, 0xe0, 0x2b, 0xc7, 0xc5, 0x18, 0xcc, 0xc6, 0x19, 0xdf, 0xd9, 0x22,
-0xa8, 0xa5, 0x2c, 0x2b, 0x32, 0x75, 0x2a, 0x31, 0x74, 0x2a, 0x30, 0x72,
-0x29, 0x2f, 0x70, 0x29, 0x2f, 0x6f, 0x28, 0x2e, 0x6e, 0x27, 0x2d, 0x6d,
-0x27, 0x2d, 0x6c, 0x26, 0x2c, 0x6a, 0x26, 0x2b, 0x69, 0x25, 0x29, 0x68,
-0x23, 0x29, 0x66, 0x22, 0x27, 0x65, 0x22, 0x27, 0x64, 0x20, 0x25, 0x63,
-0x20, 0x24, 0x62, 0x1f, 0x23, 0x60, 0x1e, 0x23, 0x5f, 0x1d, 0x22, 0x5e,
-0x1d, 0x21, 0x5d, 0x5f, 0x60, 0x3f, 0xe2, 0xe0, 0x2d, 0xd9, 0xd2, 0x1c,
-0xe1, 0xdf, 0x2a, 0xd7, 0xd0, 0x1c, 0xd9, 0xd2, 0x1c, 0x5d, 0x5d, 0x3b,
-0x2f, 0x32, 0x4d, 0xdd, 0xd6, 0x1c, 0xd1, 0xca, 0x1a, 0x89, 0x87, 0x28,
-0x17, 0x1b, 0x52, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x50,
-0xa0, 0x9d, 0x1f, 0xe1, 0xdf, 0x2a, 0xd7, 0xd0, 0x1c, 0xd4, 0xcd, 0x1b,
-0xd7, 0xd5, 0x1c, 0xa0, 0x9c, 0x1e, 0x14, 0x17, 0x4b, 0x13, 0x17, 0x4a,
-0x13, 0x16, 0x4a, 0xce, 0xc8, 0x0e, 0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2d,
-0x29, 0x2b, 0x3f, 0x12, 0x15, 0x47, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45,
-0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x10, 0x13, 0x43,
-0x10, 0x12, 0x42, 0x10, 0x12, 0x41, 0x10, 0x12, 0x41, 0x10, 0x12, 0x40,
-0x10, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x11, 0x3f,
-0x0f, 0x11, 0x3e, 0x0f, 0x11, 0x3e, 0x0e, 0x0f, 0x37, 0x01, 0x01, 0x05,
-0x13, 0x17, 0x48, 0x28, 0x2e, 0x93, 0x2a, 0x31, 0x99, 0x24, 0x2a, 0x82,
-0x20, 0x26, 0x79, 0x20, 0x26, 0x7b, 0x21, 0x26, 0x7d, 0x21, 0x27, 0x7f,
-0x21, 0x28, 0x81, 0x22, 0x28, 0x83, 0x22, 0x29, 0x85, 0x23, 0x29, 0x87,
-0x23, 0x2a, 0x89, 0x24, 0x2b, 0x8b, 0x25, 0x2c, 0x8d, 0x27, 0x2e, 0x90,
-0x52, 0x56, 0x73, 0xe6, 0xdf, 0x37, 0xe1, 0xdb, 0x28, 0xde, 0xd7, 0x1d,
-0xc9, 0xc7, 0x18, 0xdf, 0xd9, 0x22, 0xe2, 0xdc, 0x2d, 0xd2, 0xcc, 0x18,
-0x3b, 0x43, 0xa8, 0x3d, 0x46, 0xab, 0x41, 0x4b, 0xae, 0x46, 0x50, 0xb1,
-0x46, 0x50, 0xa9, 0x3f, 0x49, 0x93, 0x34, 0x3c, 0x76, 0x23, 0x29, 0x51,
-0x0b, 0x0f, 0x28, 0x0b, 0x0e, 0x27, 0x0b, 0x0f, 0x29, 0x0c, 0x10, 0x2a,
-0x84, 0x82, 0x17, 0xde, 0xdb, 0x1d, 0xc7, 0xc5, 0x18, 0xde, 0xd7, 0x1d,
-0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0x9f, 0x9c, 0x18, 0x2f, 0x38, 0x6f,
-0x44, 0x50, 0x9d, 0x53, 0x63, 0xcc, 0x55, 0x65, 0xda, 0x4e, 0x5e, 0xbe,
-0x3e, 0x4b, 0x95, 0x26, 0x2f, 0x64, 0x16, 0x1d, 0x4b, 0x72, 0x74, 0x2e,
-0xe0, 0xde, 0x25, 0xdf, 0xd8, 0x20, 0xce, 0xc7, 0x19, 0xdf, 0xd8, 0x20,
-0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0x7a, 0x7d, 0x44, 0x29, 0x34, 0x7d,
-0x2d, 0x39, 0x86, 0x31, 0x3d, 0x8e, 0x40, 0x4d, 0xa2, 0x55, 0x62, 0xbc,
-0x70, 0x7e, 0xdb, 0x66, 0x74, 0xd3, 0x5a, 0x69, 0xca, 0x51, 0x60, 0xc2,
-0x4c, 0x5b, 0xbc, 0x46, 0x55, 0xb4, 0x43, 0x52, 0xae, 0x40, 0x4e, 0xa7,
-0x4e, 0x59, 0x8e, 0xe3, 0xdd, 0x30, 0xdf, 0xd8, 0x20, 0xe0, 0xd9, 0x23,
-0xdf, 0xd9, 0x22, 0xe3, 0xdd, 0x2e, 0xe1, 0xdb, 0x2a, 0x8e, 0x8e, 0x31,
-0x20, 0x28, 0x60, 0x1e, 0x26, 0x5a, 0x1d, 0x25, 0x57, 0x1c, 0x23, 0x53,
-0x1a, 0x21, 0x4f, 0x19, 0x20, 0x4b, 0x18, 0x1e, 0x48, 0x2e, 0x38, 0x6e,
-0x4e, 0x5c, 0xb4, 0x5b, 0x6a, 0xde, 0x94, 0x99, 0x7f, 0xde, 0xdb, 0x1d,
-0xde, 0xd7, 0x1d, 0xd9, 0xd2, 0x1c, 0xde, 0xd8, 0x1f, 0xdb, 0xd4, 0x1c,
-0x52, 0x60, 0xe0, 0x57, 0x63, 0xdb, 0x95, 0x99, 0x7a, 0xcf, 0xc9, 0x1a,
-0xd7, 0xd5, 0x1c, 0xc4, 0xc1, 0x32, 0x4f, 0x5a, 0xc5, 0x4d, 0x58, 0xc1,
-0x4a, 0x55, 0xbd, 0x48, 0x53, 0xb9, 0x47, 0x52, 0xb6, 0x46, 0x4f, 0xb2,
-0x43, 0x4d, 0xaf, 0x41, 0x4b, 0xac, 0x40, 0x49, 0xa8, 0x3e, 0x47, 0xa5,
-0x61, 0x66, 0x7f, 0xe0, 0xde, 0x25, 0xdf, 0xd9, 0x22, 0xe2, 0xe0, 0x2d,
-0xe4, 0xe2, 0x35, 0xe6, 0xdf, 0x37, 0xaa, 0xa8, 0x35, 0x32, 0x3b, 0x90,
-0x32, 0x39, 0x8e, 0x31, 0x38, 0x8c, 0x30, 0x37, 0x89, 0x30, 0x36, 0x87,
-0x2f, 0x36, 0x86, 0x2e, 0x35, 0x83, 0x6a, 0x6d, 0x58, 0xde, 0xd8, 0x1f,
-0xdf, 0xd9, 0x22, 0xe1, 0xdf, 0x2a, 0xd5, 0xcf, 0x1c, 0xcb, 0xc4, 0x18,
-0xbb, 0xb7, 0x20, 0x28, 0x2f, 0x75, 0x28, 0x2f, 0x73, 0x28, 0x2f, 0x72,
-0x28, 0x2e, 0x70, 0x28, 0x2d, 0x6f, 0x26, 0x2c, 0x6e, 0x26, 0x2c, 0x6d,
-0x25, 0x2b, 0x6b, 0x25, 0x2a, 0x6a, 0x25, 0x2a, 0x69, 0x24, 0x29, 0x67,
-0x23, 0x29, 0x66, 0x23, 0x28, 0x65, 0x23, 0x28, 0x64, 0x22, 0x27, 0x63,
-0x21, 0x26, 0x61, 0x21, 0x26, 0x60, 0x21, 0x25, 0x5f, 0x20, 0x24, 0x5e,
-0x1f, 0x23, 0x5d, 0x1e, 0x23, 0x5c, 0xce, 0xc7, 0x19, 0xdf, 0xd8, 0x20,
-0xe1, 0xda, 0x26, 0xdb, 0xd4, 0x1c, 0xdf, 0xd9, 0x22, 0x5e, 0x5f, 0x3b,
-0x8a, 0x89, 0x2a, 0xd7, 0xd0, 0x1c, 0xce, 0xc9, 0x0f, 0x2e, 0x31, 0x4a,
-0x18, 0x1c, 0x52, 0x17, 0x1c, 0x51, 0x17, 0x1c, 0x51, 0x16, 0x1b, 0x50,
-0xa0, 0x9d, 0x1f, 0xe0, 0xd9, 0x23, 0xdc, 0xda, 0x1d, 0xd2, 0xcc, 0x1b,
-0xe1, 0xda, 0x26, 0xa0, 0x9d, 0x1e, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a,
-0xa0, 0x9c, 0x1d, 0xe3, 0xdd, 0x2e, 0xe1, 0xdb, 0x2a, 0x59, 0x59, 0x32,
-0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45,
-0x12, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44, 0x11, 0x14, 0x43,
-0x10, 0x13, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x12, 0x40,
-0x10, 0x12, 0x40, 0x10, 0x12, 0x3f, 0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3f,
-0x0f, 0x11, 0x3e, 0x0f, 0x11, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x13, 0x16, 0x48, 0x27, 0x2d, 0x93, 0x29, 0x2f, 0x99, 0x23, 0x28, 0x82,
-0x1f, 0x24, 0x79, 0x1f, 0x25, 0x7b, 0x20, 0x25, 0x7d, 0x21, 0x26, 0x7f,
-0x21, 0x28, 0x81, 0x22, 0x29, 0x82, 0x23, 0x2a, 0x84, 0x25, 0x2c, 0x87,
-0x26, 0x2d, 0x89, 0x28, 0x2e, 0x8a, 0x28, 0x30, 0x8d, 0x2a, 0x32, 0x8f,
-0x2d, 0x34, 0x91, 0xbc, 0xb9, 0x26, 0xe0, 0xda, 0x25, 0xc0, 0xba, 0x15,
-0xe2, 0xdc, 0x2b, 0xe2, 0xdc, 0x2b, 0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20,
-0x8b, 0x8d, 0x60, 0x40, 0x4a, 0x99, 0x37, 0x40, 0x81, 0x30, 0x37, 0x6b,
-0x21, 0x27, 0x4e, 0x0b, 0x0f, 0x27, 0x09, 0x0d, 0x23, 0x09, 0x0d, 0x24,
-0x0a, 0x0e, 0x26, 0x0a, 0x0e, 0x27, 0x0b, 0x0f, 0x28, 0x0b, 0x0f, 0x29,
-0x9d, 0x9a, 0x13, 0xce, 0xcc, 0x19, 0xdf, 0xd8, 0x20, 0xdc, 0xda, 0x1d,
-0xdf, 0xd8, 0x20, 0xde, 0xdb, 0x1d, 0x93, 0x98, 0x7e, 0x4a, 0x59, 0xdd,
-0x4a, 0x59, 0xdc, 0x4f, 0x5f, 0xdb, 0x54, 0x65, 0xda, 0x4c, 0x5b, 0xba,
-0x31, 0x3b, 0x77, 0x14, 0x1b, 0x45, 0x15, 0x1c, 0x49, 0x2c, 0x32, 0x44,
-0xdd, 0xd6, 0x1c, 0xdb, 0xd4, 0x1c, 0xdc, 0xda, 0x1d, 0xc7, 0xc5, 0x18,
-0xc3, 0xbd, 0x16, 0xe1, 0xdb, 0x28, 0xcf, 0xca, 0x12, 0x26, 0x30, 0x75,
-0x29, 0x34, 0x7c, 0x31, 0x3d, 0x88, 0x3e, 0x4a, 0x99, 0x50, 0x5c, 0xae,
-0x5b, 0x68, 0xbc, 0x54, 0x61, 0xb7, 0x4b, 0x59, 0xb0, 0x45, 0x53, 0xab,
-0x41, 0x4e, 0xa6, 0x3c, 0x49, 0x9f, 0x3a, 0x47, 0x9c, 0x38, 0x44, 0x96,
-0xab, 0xaa, 0x34, 0xdf, 0xd8, 0x20, 0xd7, 0xd5, 0x1c, 0xd7, 0xd5, 0x1c,
-0xe0, 0xde, 0x25, 0xe4, 0xe2, 0x33, 0xcf, 0xca, 0x11, 0x20, 0x29, 0x61,
-0x1e, 0x26, 0x5c, 0x1c, 0x24, 0x57, 0x1a, 0x22, 0x53, 0x19, 0x20, 0x4f,
-0x18, 0x1f, 0x4c, 0x17, 0x1e, 0x48, 0x16, 0x1d, 0x45, 0x16, 0x1c, 0x43,
-0x32, 0x3c, 0x75, 0x4f, 0x5d, 0xb8, 0x86, 0x8f, 0x97, 0xd7, 0xd5, 0x1c,
-0xc7, 0xc1, 0x18, 0xdf, 0xd9, 0x22, 0xd7, 0xd5, 0x1c, 0xe0, 0xde, 0x25,
-0x78, 0x7d, 0x96, 0x66, 0x6f, 0xab, 0xde, 0xd7, 0x1d, 0xcb, 0xc4, 0x18,
-0xd4, 0xcf, 0x1d, 0x5c, 0x66, 0xb2, 0x4b, 0x56, 0xc3, 0x4a, 0x55, 0xc0,
-0x49, 0x52, 0xbc, 0x46, 0x51, 0xb8, 0x44, 0x4f, 0xb4, 0x43, 0x4d, 0xb1,
-0x42, 0x4b, 0xae, 0x40, 0x4a, 0xab, 0x40, 0x48, 0xa8, 0x3d, 0x47, 0xa5,
-0x74, 0x77, 0x6e, 0xdc, 0xda, 0x1d, 0xe3, 0xdd, 0x30, 0xe4, 0xde, 0x31,
-0xe3, 0xe1, 0x32, 0xe2, 0xe0, 0x2d, 0xaa, 0xa8, 0x35, 0x32, 0x3a, 0x8f,
-0x31, 0x39, 0x8e, 0x31, 0x37, 0x8b, 0x2f, 0x36, 0x89, 0x2e, 0x35, 0x87,
-0x2c, 0x34, 0x85, 0x2c, 0x33, 0x83, 0x54, 0x57, 0x66, 0xe1, 0xdf, 0x2a,
-0xe0, 0xde, 0x25, 0xdb, 0xd4, 0x1c, 0xdf, 0xd9, 0x22, 0xde, 0xd7, 0x1d,
-0xd5, 0xcf, 0x1c, 0x28, 0x2e, 0x75, 0x27, 0x2d, 0x73, 0x27, 0x2c, 0x72,
-0x26, 0x2c, 0x70, 0x26, 0x2c, 0x6f, 0x25, 0x2a, 0x6e, 0x24, 0x2a, 0x6d,
-0x24, 0x29, 0x6b, 0x23, 0x29, 0x6a, 0x23, 0x28, 0x69, 0x23, 0x27, 0x67,
-0x22, 0x27, 0x66, 0x22, 0x27, 0x65, 0x21, 0x26, 0x64, 0x20, 0x25, 0x62,
-0x20, 0x25, 0x61, 0x20, 0x25, 0x60, 0x20, 0x24, 0x5f, 0x1f, 0x24, 0x5e,
-0x1f, 0x23, 0x5d, 0x1e, 0x23, 0x5c, 0xdc, 0xda, 0x1d, 0xc7, 0xc5, 0x18,
-0xc3, 0xbd, 0x16, 0xe1, 0xdb, 0x28, 0xe1, 0xda, 0x26, 0x75, 0x74, 0x32,
-0xe3, 0xdd, 0x30, 0xe3, 0xdd, 0x30, 0x74, 0x74, 0x31, 0x1a, 0x1e, 0x53,
-0x19, 0x1d, 0x52, 0x18, 0x1c, 0x51, 0x18, 0x1c, 0x51, 0x18, 0x1c, 0x50,
-0xa1, 0x9d, 0x1f, 0xe4, 0xe2, 0x35, 0xe0, 0xde, 0x25, 0xd9, 0xd2, 0x1c,
-0xe4, 0xde, 0x33, 0xa0, 0x9d, 0x1e, 0x15, 0x19, 0x4b, 0x5a, 0x5b, 0x33,
-0xe0, 0xde, 0x25, 0xe4, 0xe2, 0x33, 0xa0, 0x9c, 0x1c, 0x13, 0x17, 0x48,
-0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x16, 0x45, 0x12, 0x15, 0x45,
-0x12, 0x15, 0x45, 0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x11, 0x14, 0x43,
-0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40,
-0x10, 0x13, 0x40, 0x10, 0x12, 0x3f, 0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3e,
-0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x13, 0x16, 0x48, 0x27, 0x2d, 0x93, 0x28, 0x2e, 0x98, 0x23, 0x28, 0x82,
-0x20, 0x26, 0x79, 0x20, 0x27, 0x7b, 0x21, 0x28, 0x7d, 0x22, 0x29, 0x7f,
-0x24, 0x2a, 0x81, 0x25, 0x2b, 0x82, 0x26, 0x2c, 0x84, 0x28, 0x2e, 0x86,
-0x29, 0x30, 0x88, 0x2b, 0x32, 0x8a, 0x2d, 0x34, 0x8c, 0x2f, 0x37, 0x8f,
-0x31, 0x38, 0x91, 0x59, 0x5f, 0x74, 0xdd, 0xd6, 0x1c, 0xe6, 0xdf, 0x37,
-0xe6, 0xe4, 0x39, 0xde, 0xd8, 0x1f, 0xdf, 0xd9, 0x22, 0xe0, 0xd9, 0x23,
-0xd1, 0xcb, 0x12, 0x36, 0x3a, 0x44, 0x10, 0x14, 0x2d, 0x08, 0x0b, 0x20,
-0x08, 0x0c, 0x21, 0x09, 0x0c, 0x22, 0x09, 0x0d, 0x23, 0x09, 0x0d, 0x24,
-0x0a, 0x0d, 0x25, 0x0c, 0x11, 0x2c, 0x23, 0x29, 0x52, 0x36, 0x3f, 0x7b,
-0xd1, 0xcf, 0x1a, 0xd7, 0xd0, 0x1c, 0xd7, 0xd5, 0x1c, 0xde, 0xd7, 0x1d,
-0xdd, 0xd6, 0x1c, 0xe2, 0xdc, 0x2b, 0x78, 0x7f, 0x97, 0x46, 0x54, 0xdd,
-0x4a, 0x59, 0xdc, 0x50, 0x60, 0xdb, 0x53, 0x63, 0xcf, 0x3e, 0x4a, 0x93,
-0x21, 0x2a, 0x5a, 0x22, 0x2a, 0x5c, 0x25, 0x2f, 0x64, 0x37, 0x44, 0x89,
-0x9f, 0xa3, 0x55, 0xe1, 0xda, 0x26, 0xcb, 0xc4, 0x18, 0xd9, 0xd2, 0x1c,
-0xce, 0xc7, 0x19, 0xde, 0xd8, 0x1f, 0xcc, 0xc6, 0x19, 0x79, 0x7b, 0x40,
-0x27, 0x31, 0x74, 0x30, 0x3b, 0x81, 0x3c, 0x47, 0x90, 0x4b, 0x56, 0xa1,
-0x4c, 0x58, 0xa5, 0x47, 0x53, 0xa2, 0x3f, 0x4b, 0x9b, 0x3b, 0x48, 0x98,
-0x39, 0x45, 0x94, 0x35, 0x41, 0x90, 0x33, 0x3f, 0x8c, 0x81, 0x84, 0x4e,
-0xd7, 0xd0, 0x1c, 0xd4, 0xcd, 0x1b, 0xe2, 0xe0, 0x2d, 0xe3, 0xdd, 0x30,
-0xe3, 0xdd, 0x30, 0xcf, 0xca, 0x11, 0x36, 0x3c, 0x58, 0x1e, 0x27, 0x5c,
-0x1d, 0x24, 0x58, 0x33, 0x3f, 0x7e, 0x19, 0x20, 0x50, 0x17, 0x1e, 0x4c,
-0x16, 0x1d, 0x48, 0x16, 0x1c, 0x46, 0x15, 0x1b, 0x43, 0x14, 0x1a, 0x41,
-0x13, 0x19, 0x3e, 0x33, 0x3c, 0x76, 0x83, 0x8b, 0x83, 0xd7, 0xd5, 0x1c,
-0xce, 0xc7, 0x19, 0xd4, 0xcd, 0x1b, 0xdb, 0xd4, 0x1c, 0xcf, 0xc9, 0x1a,
-0x86, 0x8a, 0x7d, 0xd2, 0xcd, 0x1e, 0xde, 0xdb, 0x1d, 0xdc, 0xda, 0x1d,
-0x63, 0x69, 0x9f, 0x40, 0x4b, 0xc6, 0x43, 0x4d, 0xc3, 0x43, 0x4e, 0xbf,
-0x45, 0x50, 0xbb, 0x44, 0x4e, 0xb8, 0x43, 0x4c, 0xb4, 0x41, 0x4b, 0xb0,
-0x40, 0x4a, 0xad, 0x3f, 0x47, 0xaa, 0x3d, 0x47, 0xa7, 0x3c, 0x44, 0xa4,
-0xad, 0xab, 0x3a, 0xe5, 0xdf, 0x34, 0xe1, 0xdb, 0x28, 0xdb, 0xd4, 0x1c,
-0xe3, 0xdd, 0x30, 0xe0, 0xde, 0x25, 0x6e, 0x71, 0x63, 0x32, 0x3a, 0x8f,
-0x31, 0x38, 0x8d, 0x30, 0x36, 0x8b, 0x2e, 0x35, 0x88, 0x2e, 0x35, 0x87,
-0x2c, 0x34, 0x85, 0x2c, 0x33, 0x83, 0x2a, 0x32, 0x81, 0xdc, 0xda, 0x1d,
-0xde, 0xdc, 0x1f, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25, 0xe2, 0xe0, 0x2d,
-0xdd, 0xd6, 0x1c, 0x66, 0x67, 0x50, 0x25, 0x2b, 0x73, 0x25, 0x2a, 0x71,
-0x25, 0x2a, 0x70, 0x24, 0x29, 0x6f, 0x24, 0x29, 0x6d, 0x23, 0x28, 0x6c,
-0x23, 0x28, 0x6b, 0x22, 0x27, 0x6a, 0x22, 0x27, 0x68, 0x21, 0x26, 0x67,
-0x36, 0x3a, 0x5b, 0xb9, 0xb5, 0x1c, 0x20, 0x24, 0x63, 0x1f, 0x24, 0x62,
-0x1f, 0x24, 0x61, 0x1f, 0x23, 0x60, 0x1f, 0x23, 0x5f, 0x1e, 0x22, 0x5e,
-0x1e, 0x22, 0x5d, 0x1e, 0x22, 0x5c, 0xcb, 0xc4, 0x18, 0xd9, 0xd2, 0x1c,
-0xce, 0xc7, 0x19, 0xde, 0xd8, 0x1f, 0xcc, 0xc6, 0x19, 0xe2, 0xe0, 0x2d,
-0xe6, 0xe4, 0x3b, 0xce, 0xc9, 0x0f, 0x1a, 0x1e, 0x54, 0x1a, 0x1e, 0x53,
-0x1a, 0x1e, 0x52, 0x19, 0x1d, 0x51, 0x19, 0x1d, 0x51, 0x19, 0x1d, 0x50,
-0xa1, 0x9e, 0x1f, 0xde, 0xdc, 0x1f, 0xdb, 0xd4, 0x1c, 0xe0, 0xde, 0x25,
-0xd7, 0xd0, 0x1c, 0xa0, 0x9d, 0x1e, 0x2c, 0x2f, 0x43, 0xce, 0xc8, 0x0e,
-0xe3, 0xdd, 0x30, 0xce, 0xc8, 0x0e, 0x14, 0x18, 0x48, 0x14, 0x18, 0x48,
-0x13, 0x17, 0x47, 0x13, 0x17, 0x47, 0x13, 0x16, 0x45, 0x13, 0x16, 0x45,
-0x12, 0x16, 0x45, 0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x12, 0x15, 0x43,
-0x11, 0x15, 0x42, 0x11, 0x14, 0x41, 0x11, 0x14, 0x41, 0x10, 0x14, 0x40,
-0x10, 0x14, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e,
-0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x13, 0x17, 0x48, 0x28, 0x2f, 0x92, 0x2a, 0x32, 0x98, 0x25, 0x2b, 0x82,
-0x22, 0x28, 0x79, 0x23, 0x29, 0x7a, 0x24, 0x2a, 0x7c, 0x26, 0x2b, 0x7e,
-0x27, 0x2d, 0x80, 0x28, 0x2f, 0x81, 0x2a, 0x30, 0x83, 0x2c, 0x32, 0x86,
-0x2d, 0x34, 0x88, 0x2f, 0x36, 0x8a, 0x32, 0x39, 0x8c, 0x33, 0x3b, 0x8e,
-0x37, 0x3f, 0x90, 0x39, 0x41, 0x93, 0xbf, 0xbc, 0x25, 0xe4, 0xde, 0x31,
-0xe4, 0xde, 0x31, 0xe4, 0xe2, 0x35, 0xe6, 0xdf, 0x37, 0xe2, 0xdc, 0x2b,
-0xdc, 0xda, 0x1d, 0x9b, 0x98, 0x0f, 0x08, 0x0b, 0x1f, 0x08, 0x0b, 0x20,
-0x08, 0x0c, 0x21, 0x10, 0x14, 0x30, 0x1f, 0x25, 0x4b, 0x2f, 0x36, 0x69,
-0x3a, 0x43, 0x85, 0x46, 0x51, 0xa6, 0x4f, 0x5b, 0xc7, 0x4b, 0x57, 0xcb,
-0xcc, 0xc6, 0x19, 0xdd, 0xd6, 0x1c, 0xcc, 0xc6, 0x19, 0xd9, 0xd2, 0x1c,
-0xe0, 0xde, 0x25, 0xe0, 0xde, 0x25, 0x53, 0x5d, 0xc7, 0x46, 0x54, 0xde,
-0x4d, 0x5c, 0xdc, 0x56, 0x66, 0xdc, 0x47, 0x54, 0xa9, 0x46, 0x53, 0xa6,
-0x46, 0x54, 0xa9, 0x4b, 0x5b, 0xb8, 0x52, 0x63, 0xd5, 0x4e, 0x61, 0xd3,
-0x15, 0x1c, 0x4a, 0xce, 0xc8, 0x0e, 0xdf, 0xd9, 0x22, 0xe0, 0xde, 0x25,
-0xe2, 0xe0, 0x2d, 0xd2, 0xcc, 0x1b, 0xd2, 0xcc, 0x1b, 0xe6, 0xe0, 0x39,
-0x3b, 0x44, 0x64, 0x2f, 0x39, 0x7a, 0x39, 0x43, 0x87, 0x45, 0x50, 0x95,
-0x41, 0x4c, 0x93, 0x3c, 0x47, 0x8f, 0x37, 0x42, 0x8b, 0x34, 0x3f, 0x89,
-0x32, 0x3d, 0x86, 0x2f, 0x3a, 0x82, 0x6a, 0x6f, 0x57, 0xdf, 0xd8, 0x20,
-0xcf, 0xc9, 0x1a, 0xdf, 0xd9, 0x22, 0xdd, 0xd6, 0x1c, 0xd4, 0xcd, 0x1b,
-0xcf, 0xca, 0x11, 0x35, 0x3c, 0x57, 0x24, 0x2d, 0x66, 0x1d, 0x25, 0x59,
-0x1b, 0x22, 0x54, 0x33, 0x3f, 0x7f, 0x49, 0x59, 0xb1, 0x50, 0x62, 0xc6,
-0x15, 0x1c, 0x46, 0x14, 0x1b, 0x43, 0x14, 0x1a, 0x41, 0x13, 0x19, 0x3e,
-0x12, 0x18, 0x3c, 0x22, 0x29, 0x55, 0x65, 0x6c, 0x75, 0xd5, 0xcf, 0x1c,
-0xc9, 0xc3, 0x18, 0xdb, 0xd4, 0x1c, 0xe0, 0xd9, 0x23, 0xc9, 0xc3, 0x18,
-0xc9, 0xc7, 0x18, 0xd9, 0xd2, 0x1c, 0xde, 0xd7, 0x1d, 0x71, 0x76, 0x8b,
-0x36, 0x3f, 0xc9, 0x36, 0x40, 0xc5, 0x39, 0x42, 0xc1, 0x39, 0x44, 0xbd,
-0x3b, 0x45, 0xba, 0x3b, 0x46, 0xb6, 0x3d, 0x47, 0xb3, 0x3e, 0x47, 0xb0,
-0x3e, 0x47, 0xac, 0x3c, 0x46, 0xa9, 0x3c, 0x45, 0xa6, 0x3a, 0x42, 0xa3,
-0xac, 0xaa, 0x3a, 0xe2, 0xe0, 0x2b, 0xdf, 0xd8, 0x20, 0xe1, 0xdf, 0x2a,
-0xe2, 0xdc, 0x2b, 0xbc, 0xb6, 0x15, 0x6e, 0x71, 0x63, 0x31, 0x39, 0x8e,
-0x31, 0x38, 0x8d, 0x30, 0x36, 0x8a, 0x2e, 0x35, 0x88, 0x2d, 0x35, 0x87,
-0x2d, 0x34, 0x84, 0x2b, 0x32, 0x82, 0x2a, 0x32, 0x80, 0xbb, 0xb7, 0x21,
-0xde, 0xd8, 0x1f, 0xe1, 0xdb, 0x2a, 0xe2, 0xdc, 0x2b, 0xde, 0xd8, 0x1f,
-0xdf, 0xd8, 0x20, 0xd0, 0xca, 0x13, 0x24, 0x2a, 0x73, 0x24, 0x29, 0x71,
-0x23, 0x29, 0x70, 0x23, 0x29, 0x6f, 0x22, 0x28, 0x6d, 0x21, 0x27, 0x6c,
-0x21, 0x27, 0x6b, 0x21, 0x26, 0x69, 0x20, 0x26, 0x68, 0x77, 0x77, 0x3c,
-0xe0, 0xda, 0x25, 0xdf, 0xd8, 0x20, 0x1f, 0x24, 0x63, 0x1e, 0x24, 0x62,
-0x1e, 0x23, 0x61, 0x1e, 0x22, 0x60, 0x1e, 0x22, 0x5f, 0x1d, 0x22, 0x5e,
-0x1d, 0x21, 0x5d, 0x1d, 0x21, 0x5c, 0xdf, 0xd9, 0x22, 0xe0, 0xde, 0x25,
-0xe2, 0xe0, 0x2d, 0xd2, 0xcc, 0x1b, 0xd2, 0xcc, 0x1b, 0xe6, 0xe0, 0x39,
-0xde, 0xdb, 0x1d, 0x73, 0x74, 0x31, 0x19, 0x1e, 0x54, 0x19, 0x1d, 0x53,
-0x19, 0x1d, 0x52, 0x19, 0x1d, 0x51, 0x18, 0x1c, 0x50, 0x18, 0x1c, 0x50,
-0x73, 0x72, 0x2f, 0xd4, 0xcd, 0x1b, 0xe3, 0xdd, 0x30, 0xdf, 0xd8, 0x20,
-0xcf, 0xc9, 0x1a, 0xdf, 0xd9, 0x22, 0xb7, 0xb2, 0x16, 0xd4, 0xcd, 0x1b,
-0xd7, 0xd0, 0x1c, 0x2b, 0x2e, 0x41, 0x15, 0x19, 0x48, 0x15, 0x19, 0x48,
-0x15, 0x18, 0x47, 0x14, 0x18, 0x47, 0x14, 0x17, 0x45, 0x14, 0x17, 0x45,
-0x13, 0x17, 0x45, 0x13, 0x16, 0x44, 0x13, 0x16, 0x44, 0x12, 0x16, 0x43,
-0x12, 0x15, 0x42, 0x12, 0x15, 0x41, 0x11, 0x15, 0x41, 0x11, 0x14, 0x40,
-0x11, 0x14, 0x40, 0x11, 0x14, 0x3f, 0x10, 0x14, 0x3f, 0x10, 0x13, 0x3e,
-0x10, 0x13, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05,
-0x14, 0x18, 0x48, 0x29, 0x32, 0x92, 0x2d, 0x35, 0x98, 0x27, 0x2d, 0x81,
-0x25, 0x2a, 0x78, 0x26, 0x2c, 0x7a, 0x26, 0x2d, 0x7c, 0x28, 0x2f, 0x7e,
-0x2a, 0x30, 0x80, 0x2c, 0x32, 0x81, 0x2d, 0x35, 0x83, 0x2f, 0x36, 0x85,
-0x32, 0x38, 0x87, 0x34, 0x3c, 0x89, 0x37, 0x3f, 0x8b, 0x38, 0x40, 0x89,
-0x34, 0x3c, 0x7c, 0x30, 0x36, 0x6f, 0x3d, 0x42, 0x54, 0xcf, 0xca, 0x0e,
-0xe0, 0xda, 0x25, 0xe3, 0xe1, 0x32, 0xe6, 0xe0, 0x39, 0xe2, 0xe0, 0x2d,
-0xdd, 0xd6, 0x1c, 0xe0, 0xde, 0x25, 0xcf, 0xc9, 0x0e, 0x3d, 0x42, 0x53,
-0x35, 0x3c, 0x77, 0x3d, 0x47, 0x90, 0x46, 0x51, 0xab, 0x49, 0x55, 0xba,
-0x46, 0x51, 0xbe, 0x42, 0x4d, 0xc1, 0x3f, 0x49, 0xc6, 0x74, 0x79, 0x89,
-0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xd1, 0xca, 0x1a, 0xce, 0xc7, 0x19,
-0xd9, 0xd2, 0x1c, 0xde, 0xdb, 0x1d, 0x44, 0x52, 0xdf, 0x4b, 0x59, 0xde,
-0x54, 0x63, 0xdd, 0x56, 0x65, 0xdc, 0x55, 0x64, 0xdb, 0x53, 0x64, 0xd9,
-0x4d, 0x5d, 0xd8, 0x47, 0x57, 0xd7, 0x51, 0x62, 0xd5, 0x13, 0x1a, 0x44,
-0x14, 0x1b, 0x47, 0x2b, 0x31, 0x42, 0xe0, 0xda, 0x25, 0xe3, 0xdd, 0x30,
-0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xe6, 0xdf, 0x37, 0xe2, 0xe0, 0x2d,
-0xd0, 0xca, 0x12, 0x6a, 0x6f, 0x4f, 0x36, 0x40, 0x7f, 0x3b, 0x45, 0x86,
-0x38, 0x42, 0x84, 0x34, 0x3e, 0x81, 0x30, 0x3b, 0x7e, 0x2f, 0x39, 0x7c,
-0x2c, 0x36, 0x7a, 0x91, 0x92, 0x39, 0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25,
-0xe4, 0xde, 0x33, 0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c, 0xcf, 0xca, 0x11,
-0x35, 0x3c, 0x56, 0x1e, 0x26, 0x5c, 0x1d, 0x24, 0x58, 0x42, 0x51, 0xa1,
-0x19, 0x21, 0x50, 0x18, 0x1f, 0x4e, 0x47, 0x56, 0xab, 0x54, 0x65, 0xd7,
-0x4e, 0x5f, 0xd8, 0x43, 0x50, 0x9e, 0x12, 0x18, 0x3e, 0x12, 0x17, 0x3c,
-0x11, 0x16, 0x3a, 0x10, 0x16, 0x38, 0x35, 0x3f, 0x7a, 0xd2, 0xcc, 0x1b,
-0xd9, 0xd2, 0x1c, 0xe1, 0xdb, 0x28, 0xd7, 0xd5, 0x1c, 0xbb, 0xb5, 0x14,
-0xd1, 0xcf, 0x1a, 0xde, 0xd7, 0x1d, 0x99, 0x9a, 0x60, 0x38, 0x43, 0xcb,
-0x37, 0x41, 0xc7, 0x35, 0x3f, 0xc3, 0x33, 0x3d, 0xbf, 0x31, 0x3b, 0xbc,
-0x33, 0x3c, 0xb8, 0x35, 0x3d, 0xb5, 0x35, 0x3e, 0xb2, 0x36, 0x3f, 0xae,
-0x37, 0x3f, 0xab, 0x37, 0x40, 0xa8, 0x38, 0x41, 0xa5, 0x39, 0x42, 0xa2,
-0xdf, 0xd8, 0x20, 0xd2, 0xcc, 0x1b, 0xe2, 0xdc, 0x2b, 0xd4, 0xcd, 0x1b,
-0xe2, 0xe0, 0x2d, 0xe6, 0xe0, 0x3b, 0xbd, 0xb9, 0x25, 0x31, 0x38, 0x8e,
-0x30, 0x36, 0x8c, 0x2f, 0x35, 0x8a, 0x2d, 0x35, 0x87, 0x2d, 0x34, 0x86,
-0x2c, 0x33, 0x84, 0x2b, 0x32, 0x82, 0x2a, 0x32, 0x80, 0x7d, 0x7d, 0x49,
-0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25, 0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20,
-0xde, 0xdc, 0x1f, 0xde, 0xdb, 0x1d, 0xba, 0xb6, 0x1e, 0x39, 0x3c, 0x65,
-0x23, 0x29, 0x6f, 0x22, 0x28, 0x6f, 0x22, 0x28, 0x6d, 0x21, 0x27, 0x6c,
-0x21, 0x26, 0x6a, 0x77, 0x77, 0x3d, 0xcf, 0xc9, 0x12, 0xd9, 0xd2, 0x1c,
-0xdb, 0xd4, 0x1c, 0xd5, 0xcf, 0x1c, 0x1d, 0x23, 0x63, 0x1d, 0x23, 0x62,
-0x1d, 0x22, 0x61, 0x1c, 0x22, 0x60, 0x1d, 0x22, 0x5f, 0x1c, 0x21, 0x5e,
-0x1c, 0x21, 0x5d, 0x1c, 0x21, 0x5c, 0xe0, 0xda, 0x25, 0xe3, 0xdd, 0x30,
-0xdf, 0xd8, 0x20, 0xe0, 0xda, 0x25, 0xe6, 0xdf, 0x37, 0xe2, 0xe0, 0x2d,
-0xb8, 0xb3, 0x18, 0x19, 0x1e, 0x54, 0x19, 0x1d, 0x53, 0x19, 0x1d, 0x53,
-0x18, 0x1c, 0x52, 0x18, 0x1c, 0x51, 0x18, 0x1c, 0x50, 0x18, 0x1c, 0x50,
-0x5c, 0x5c, 0x37, 0xcf, 0xc9, 0x1a, 0xdf, 0xd8, 0x20, 0xe0, 0xde, 0x25,
-0xe4, 0xde, 0x33, 0xdb, 0xd4, 0x1c, 0xd7, 0xd5, 0x1c, 0xdf, 0xd8, 0x20,
-0x5a, 0x5b, 0x33, 0x15, 0x19, 0x49, 0x15, 0x19, 0x48, 0x15, 0x18, 0x48,
-0x14, 0x18, 0x47, 0x14, 0x18, 0x46, 0x14, 0x18, 0x45, 0x14, 0x17, 0x45,
-0x14, 0x17, 0x45, 0x14, 0x17, 0x44, 0x14, 0x17, 0x44, 0x13, 0x17, 0x43,
-0x13, 0x16, 0x42, 0x12, 0x16, 0x41, 0x12, 0x16, 0x41, 0x12, 0x15, 0x40,
-0x12, 0x15, 0x40, 0x11, 0x15, 0x3f, 0x11, 0x14, 0x3f, 0x11, 0x14, 0x3e,
-0x10, 0x14, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05,
-0x16, 0x19, 0x48, 0x2d, 0x33, 0x92, 0x2f, 0x37, 0x97, 0x29, 0x2f, 0x81,
-0x26, 0x2d, 0x78, 0x28, 0x2f, 0x7a, 0x2a, 0x2f, 0x7b, 0x2b, 0x32, 0x7d,
-0x2d, 0x34, 0x7f, 0x2f, 0x36, 0x81, 0x32, 0x39, 0x82, 0x35, 0x3c, 0x85,
-0x34, 0x3c, 0x80, 0x31, 0x38, 0x75, 0x2d, 0x33, 0x69, 0x29, 0x2f, 0x5e,
-0x23, 0x29, 0x50, 0x1b, 0x1f, 0x40, 0x17, 0x1b, 0x37, 0x2a, 0x2c, 0x2b,
-0xcd, 0xc8, 0x0b, 0xe6, 0xe0, 0x3b, 0xe0, 0xde, 0x25, 0xe0, 0xde, 0x25,
-0xde, 0xd7, 0x1d, 0xe0, 0xde, 0x25, 0xde, 0xd7, 0x1d, 0xdc, 0xda, 0x1d,
-0x9d, 0x9d, 0x52, 0x65, 0x6b, 0x8c, 0x3f, 0x49, 0xb6, 0x3b, 0x45, 0xb9,
-0x39, 0x43, 0xbc, 0x36, 0x40, 0xc0, 0x33, 0x3d, 0xc4, 0x82, 0x85, 0x71,
-0xe4, 0xde, 0x33, 0xe1, 0xda, 0x26, 0xdc, 0xda, 0x1d, 0xd1, 0xcf, 0x1a,
-0xde, 0xd8, 0x1f, 0xaf, 0xaf, 0x4f, 0x49, 0x56, 0xdf, 0x4d, 0x5a, 0xde,
-0x4c, 0x5b, 0xdd, 0x4b, 0x59, 0xdd, 0x48, 0x57, 0xdc, 0x43, 0x52, 0xdb,
-0x3f, 0x4d, 0xd9, 0x54, 0x64, 0xd8, 0x11, 0x18, 0x40, 0x12, 0x18, 0x41,
-0x13, 0x19, 0x44, 0x14, 0x1b, 0x47, 0x5b, 0x5d, 0x34, 0xd4, 0xcd, 0x1b,
-0xe1, 0xda, 0x26, 0xe5, 0xdf, 0x34, 0xe0, 0xde, 0x25, 0xe3, 0xdd, 0x2e,
-0xe6, 0xe0, 0x3b, 0xe0, 0xde, 0x25, 0xbd, 0xba, 0x20, 0x6f, 0x73, 0x53,
-0x44, 0x4c, 0x6b, 0x2e, 0x38, 0x76, 0x69, 0x6d, 0x4f, 0x7c, 0x7f, 0x42,
-0xd0, 0xcb, 0x12, 0xe0, 0xd9, 0x23, 0xe2, 0xe0, 0x2b, 0xe2, 0xdc, 0x2b,
-0xd2, 0xcc, 0x1b, 0xc3, 0xbd, 0x16, 0xb9, 0xb6, 0x1b, 0x34, 0x3b, 0x54,
-0x1d, 0x25, 0x5a, 0x1c, 0x24, 0x57, 0x1b, 0x22, 0x53, 0x21, 0x2a, 0x5e,
-0x53, 0x65, 0xd0, 0x28, 0x31, 0x67, 0x22, 0x2b, 0x5c, 0x54, 0x66, 0xd3,
-0x4d, 0x5e, 0xd9, 0x48, 0x58, 0xda, 0x4e, 0x5d, 0xdb, 0x31, 0x3b, 0x74,
-0x10, 0x16, 0x38, 0x10, 0x15, 0x36, 0x19, 0x20, 0x46, 0xd4, 0xcd, 0x1b,
-0xe2, 0xdc, 0x2b, 0xde, 0xdb, 0x1d, 0xd7, 0xd0, 0x1c, 0xcb, 0xc4, 0x18,
-0xdc, 0xda, 0x1d, 0xb0, 0xae, 0x4a, 0x3f, 0x4a, 0xcd, 0x3c, 0x46, 0xc9,
-0x39, 0x43, 0xc5, 0x37, 0x40, 0xc1, 0x34, 0x3e, 0xbe, 0x33, 0x3c, 0xba,
-0x31, 0x3b, 0xb7, 0x30, 0x38, 0xb3, 0x2f, 0x38, 0xb0, 0x30, 0x38, 0xad,
-0x31, 0x3a, 0xaa, 0x31, 0x3a, 0xa7, 0x33, 0x3a, 0xa4, 0x33, 0x3a, 0xa1,
-0xde, 0xd7, 0x1d, 0xd2, 0xcc, 0x1b, 0xd1, 0xca, 0x1a, 0xcc, 0xc6, 0x19,
-0xe2, 0xe0, 0x2d, 0xe1, 0xdf, 0x2a, 0xe6, 0xe4, 0x39, 0xa9, 0xa7, 0x33,
-0x6c, 0x6e, 0x5f, 0x6b, 0x6d, 0x5d, 0x93, 0x93, 0x40, 0xbc, 0xb8, 0x23,
-0x69, 0x6b, 0x59, 0x2a, 0x31, 0x81, 0x2a, 0x31, 0x7f, 0x2a, 0x30, 0x7d,
-0xd0, 0xca, 0x14, 0xe0, 0xd9, 0x23, 0xe1, 0xda, 0x26, 0xe1, 0xdf, 0x2a,
-0xe2, 0xdc, 0x2b, 0xd7, 0xd0, 0x1c, 0xde, 0xd8, 0x1f, 0xe0, 0xde, 0x25,
-0xa5, 0xa2, 0x29, 0xa4, 0xa2, 0x29, 0xa4, 0xa1, 0x28, 0xa4, 0xa1, 0x28,
-0xde, 0xd8, 0x1f, 0xe1, 0xdb, 0x28, 0xde, 0xd8, 0x1f, 0xe1, 0xda, 0x26,
-0xcf, 0xc9, 0x11, 0x49, 0x4d, 0x4f, 0x1d, 0x23, 0x63, 0x1d, 0x22, 0x62,
-0x1c, 0x22, 0x61, 0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5e, 0x1b, 0x21, 0x5d,
-0x1b, 0x20, 0x5c, 0x1b, 0x20, 0x5b, 0xce, 0xc9, 0x10, 0xd4, 0xcd, 0x1b,
-0xe1, 0xda, 0x26, 0xe5, 0xdf, 0x34, 0xe0, 0xde, 0x25, 0xe3, 0xdd, 0x2e,
-0x46, 0x48, 0x43, 0x18, 0x1d, 0x54, 0x18, 0x1c, 0x53, 0x18, 0x1c, 0x53,
-0x18, 0x1c, 0x52, 0x18, 0x1c, 0x51, 0x17, 0x1b, 0x50, 0x17, 0x1b, 0x4f,
-0x5c, 0x5c, 0x37, 0xe0, 0xd9, 0x23, 0xe2, 0xe0, 0x2b, 0xe2, 0xdc, 0x2b,
-0xd2, 0xcc, 0x1b, 0xc3, 0xbd, 0x16, 0xdb, 0xd4, 0x1c, 0x88, 0x86, 0x24,
-0x15, 0x18, 0x49, 0x15, 0x18, 0x49, 0x15, 0x18, 0x48, 0x15, 0x18, 0x48,
-0x14, 0x18, 0x47, 0x14, 0x17, 0x45, 0x14, 0x17, 0x45, 0x13, 0x17, 0x45,
-0x13, 0x17, 0x45, 0x13, 0x16, 0x44, 0x13, 0x16, 0x44, 0x13, 0x16, 0x42,
-0x13, 0x16, 0x42, 0x12, 0x16, 0x41, 0x12, 0x16, 0x41, 0x12, 0x15, 0x40,
-0x12, 0x15, 0x40, 0x12, 0x15, 0x3f, 0x11, 0x15, 0x3f, 0x11, 0x14, 0x3e,
-0x11, 0x14, 0x3e, 0x11, 0x14, 0x3d, 0x10, 0x12, 0x37, 0x01, 0x01, 0x05,
-0x17, 0x1a, 0x48, 0x2f, 0x37, 0x90, 0x32, 0x3b, 0x97, 0x2c, 0x32, 0x80,
-0x2a, 0x30, 0x77, 0x2c, 0x32, 0x79, 0x2d, 0x34, 0x7b, 0x2f, 0x35, 0x7d,
-0x32, 0x39, 0x7f, 0x32, 0x39, 0x7a, 0x30, 0x36, 0x72, 0x2d, 0x32, 0x68,
-0x27, 0x2d, 0x5c, 0x23, 0x29, 0x51, 0x23, 0x28, 0x4f, 0x22, 0x27, 0x4a,
-0x1e, 0x23, 0x45, 0x1e, 0x23, 0x45, 0x23, 0x29, 0x51, 0x28, 0x2f, 0x5c,
-0x41, 0x46, 0x5d, 0xbd, 0xba, 0x20, 0xdd, 0xd6, 0x1c, 0xd7, 0xd0, 0x1c,
-0xe3, 0xdd, 0x2e, 0xdf, 0xd9, 0x22, 0xd5, 0xcf, 0x1c, 0xe0, 0xde, 0x25,
-0xd1, 0xca, 0x1a, 0xd4, 0xcd, 0x1b, 0xe0, 0xd9, 0x23, 0xbd, 0xba, 0x2e,
-0xa9, 0xa8, 0x43, 0xaa, 0xa8, 0x44, 0xcf, 0xc9, 0x1a, 0xe2, 0xe0, 0x2d,
-0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c, 0xd9, 0xd2, 0x1c,
-0xe1, 0xda, 0x26, 0x9e, 0x9f, 0x67, 0x44, 0x51, 0xe0, 0x44, 0x51, 0xdf,
-0x44, 0x51, 0xde, 0x3f, 0x4d, 0xdd, 0x3b, 0x48, 0xdc, 0x3a, 0x48, 0xdb,
-0x56, 0x66, 0xda, 0x10, 0x15, 0x3b, 0x11, 0x16, 0x3d, 0x11, 0x18, 0x40,
-0x12, 0x19, 0x42, 0x13, 0x1a, 0x44, 0x15, 0x1b, 0x47, 0x54, 0x5a, 0x58,
-0xce, 0xc9, 0x0e, 0xd4, 0xcd, 0x1b, 0xe3, 0xdd, 0x30, 0xe2, 0xe0, 0x2d,
-0xdc, 0xda, 0x1d, 0xd1, 0xca, 0x1a, 0xe1, 0xdf, 0x2a, 0xe2, 0xe0, 0x2b,
-0xce, 0xcc, 0x19, 0xcb, 0xc4, 0x18, 0xcb, 0xc4, 0x18, 0xce, 0xcc, 0x19,
-0xe2, 0xdc, 0x2d, 0xe0, 0xde, 0x25, 0xe3, 0xdd, 0x30, 0xe1, 0xdf, 0x2a,
-0xde, 0xd8, 0x1f, 0x77, 0x78, 0x36, 0x1e, 0x26, 0x5b, 0x1d, 0x24, 0x58,
-0x1c, 0x24, 0x56, 0x1a, 0x22, 0x53, 0x19, 0x20, 0x50, 0x18, 0x1f, 0x4d,
-0x46, 0x55, 0xa8, 0x4f, 0x61, 0xd7, 0x43, 0x50, 0x9f, 0x3d, 0x4a, 0x91,
-0x50, 0x61, 0xda, 0x47, 0x56, 0xdb, 0x43, 0x51, 0xdc, 0x41, 0x4f, 0xdd,
-0x55, 0x64, 0xdd, 0x24, 0x2b, 0x58, 0x0e, 0x13, 0x33, 0xe1, 0xdb, 0x2a,
-0xcc, 0xc6, 0x19, 0xce, 0xc7, 0x19, 0xdf, 0xd8, 0x20, 0xe1, 0xdf, 0x2a,
-0xb3, 0xb2, 0x4b, 0x49, 0x55, 0xcf, 0x44, 0x4f, 0xcb, 0x3f, 0x4a, 0xc7,
-0x3c, 0x46, 0xc3, 0x39, 0x42, 0xc0, 0x36, 0x3f, 0xbc, 0x34, 0x3e, 0xb9,
-0x32, 0x3b, 0xb5, 0x30, 0x3a, 0xb2, 0x2f, 0x38, 0xaf, 0x2e, 0x36, 0xac,
-0x2c, 0x35, 0xa9, 0x2c, 0x34, 0xa6, 0x2d, 0x35, 0xa4, 0x2e, 0x36, 0xa0,
-0xbc, 0xb9, 0x28, 0xc9, 0xc3, 0x18, 0xce, 0xc7, 0x19, 0xe1, 0xdf, 0x2a,
-0xeb, 0xe6, 0x4a, 0xe6, 0xe4, 0x39, 0xdb, 0xd4, 0x1c, 0xe0, 0xd9, 0x23,
-0xe2, 0xdc, 0x2b, 0xde, 0xd8, 0x1f, 0xdd, 0xd6, 0x1c, 0xd7, 0xd0, 0x1c,
-0x68, 0x6b, 0x59, 0x2a, 0x31, 0x81, 0x2a, 0x30, 0x7f, 0x29, 0x2e, 0x7d,
-0x3c, 0x41, 0x6f, 0xd0, 0xca, 0x14, 0xe0, 0xd9, 0x23, 0xe1, 0xda, 0x26,
-0xd4, 0xcd, 0x1b, 0xde, 0xd7, 0x1d, 0xcf, 0xc9, 0x1a, 0xe2, 0xe0, 0x2d,
-0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c, 0xd9, 0xd2, 0x1c,
-0xe1, 0xda, 0x26, 0xdf, 0xd8, 0x20, 0xe1, 0xda, 0x26, 0x8c, 0x8b, 0x31,
-0x1e, 0x24, 0x65, 0x1d, 0x23, 0x64, 0x1d, 0x23, 0x63, 0x1d, 0x22, 0x62,
-0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1c, 0x21, 0x5e, 0x1b, 0x20, 0x5d,
-0x1b, 0x20, 0x5c, 0x1b, 0x20, 0x5b, 0xa2, 0x9f, 0x22, 0xdb, 0xd4, 0x1c,
-0xe1, 0xda, 0x26, 0xd4, 0xcd, 0x1b, 0xe3, 0xdd, 0x30, 0xb8, 0xb3, 0x18,
-0x18, 0x1d, 0x55, 0x18, 0x1d, 0x54, 0x18, 0x1c, 0x53, 0x17, 0x1c, 0x52,
-0x17, 0x1c, 0x52, 0x17, 0x1c, 0x51, 0x17, 0x1b, 0x50, 0x16, 0x1b, 0x4f,
-0x5b, 0x5c, 0x37, 0xe0, 0xde, 0x25, 0xe3, 0xdd, 0x30, 0xe1, 0xdf, 0x2a,
-0xde, 0xd8, 0x1f, 0xd1, 0xcf, 0x1a, 0xb7, 0xb2, 0x16, 0x15, 0x19, 0x4a,
-0x14, 0x18, 0x49, 0x14, 0x18, 0x49, 0x14, 0x18, 0x48, 0x14, 0x18, 0x48,
-0x13, 0x17, 0x47, 0x13, 0x17, 0x45, 0x13, 0x17, 0x45, 0x13, 0x17, 0x45,
-0x13, 0x17, 0x45, 0x13, 0x16, 0x44, 0x13, 0x16, 0x44, 0x12, 0x16, 0x42,
-0x12, 0x16, 0x42, 0x12, 0x16, 0x41, 0x12, 0x15, 0x41, 0x12, 0x15, 0x40,
-0x12, 0x15, 0x40, 0x11, 0x15, 0x3f, 0x11, 0x15, 0x3f, 0x11, 0x14, 0x3e,
-0x11, 0x14, 0x3e, 0x11, 0x14, 0x3d, 0x10, 0x12, 0x37, 0x01, 0x01, 0x05,
-0x19, 0x1d, 0x48, 0x33, 0x3b, 0x90, 0x37, 0x3f, 0x97, 0x30, 0x36, 0x80,
-0x2d, 0x34, 0x77, 0x2f, 0x35, 0x79, 0x2f, 0x35, 0x74, 0x2e, 0x34, 0x71,
-0x2c, 0x32, 0x67, 0x2b, 0x30, 0x63, 0x2a, 0x30, 0x5f, 0x2b, 0x30, 0x5c,
-0x28, 0x2e, 0x57, 0x26, 0x2a, 0x53, 0x25, 0x2b, 0x54, 0x29, 0x2f, 0x5e,
-0x2d, 0x33, 0x68, 0x32, 0x39, 0x76, 0x35, 0x3d, 0x80, 0x39, 0x41, 0x8b,
-0x3c, 0x45, 0x97, 0x3b, 0x43, 0x99, 0x85, 0x87, 0x59, 0xd2, 0xcd, 0x18,
-0xd2, 0xcc, 0x1b, 0xde, 0xd8, 0x1f, 0xe2, 0xdc, 0x2b, 0xdf, 0xd9, 0x22,
-0xe0, 0xd9, 0x23, 0xe0, 0xd9, 0x23, 0xdb, 0xd4, 0x1c, 0xdf, 0xd8, 0x20,
-0xdd, 0xd6, 0x1c, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c, 0xdf, 0xd8, 0x20,
-0xe3, 0xe1, 0x32, 0xde, 0xdc, 0x1f, 0xdf, 0xd9, 0x22, 0xc1, 0xbe, 0x34,
-0x89, 0x8d, 0x7a, 0x50, 0x5a, 0xc3, 0x3d, 0x49, 0xdf, 0x3b, 0x47, 0xdf,
-0x38, 0x44, 0xdf, 0x35, 0x41, 0xde, 0x3b, 0x48, 0xdd, 0x57, 0x66, 0xdc,
-0x0f, 0x14, 0x38, 0x0f, 0x15, 0x39, 0x10, 0x16, 0x3b, 0x11, 0x17, 0x3e,
-0x11, 0x18, 0x40, 0x12, 0x19, 0x42, 0x45, 0x53, 0xa8, 0x31, 0x3c, 0x79,
-0x47, 0x50, 0x73, 0xa5, 0xa4, 0x26, 0xe6, 0xdf, 0x37, 0xcc, 0xc6, 0x19,
-0xce, 0xc7, 0x19, 0xe1, 0xda, 0x26, 0xe2, 0xe0, 0x2d, 0xd7, 0xd5, 0x1c,
-0xbc, 0xb6, 0x15, 0xc6, 0xc4, 0x17, 0xdf, 0xd8, 0x20, 0xdf, 0xd8, 0x20,
-0xe2, 0xe0, 0x2d, 0xde, 0xd8, 0x1f, 0xd9, 0xd2, 0x1c, 0xd9, 0xd2, 0x1c,
-0x76, 0x77, 0x34, 0x1d, 0x24, 0x58, 0x1b, 0x23, 0x55, 0x1b, 0x22, 0x53,
-0x1a, 0x21, 0x51, 0x19, 0x20, 0x4e, 0x18, 0x1f, 0x4c, 0x17, 0x1d, 0x49,
-0x29, 0x32, 0x68, 0x53, 0x65, 0xd8, 0x49, 0x5a, 0xd9, 0x55, 0x67, 0xd5,
-0x4f, 0x5f, 0xbf, 0x4c, 0x5b, 0xdb, 0x41, 0x50, 0xdc, 0x3e, 0x4b, 0xdd,
-0x3a, 0x46, 0xde, 0x46, 0x53, 0xdf, 0x77, 0x80, 0xab, 0xd7, 0xd0, 0x1c,
-0xd7, 0xd0, 0x1c, 0xdb, 0xd4, 0x1c, 0xe2, 0xdc, 0x2b, 0xd5, 0xd0, 0x1e,
-0x5f, 0x69, 0xb9, 0x4b, 0x57, 0xcd, 0x48, 0x52, 0xc9, 0x43, 0x4f, 0xc5,
-0x40, 0x4a, 0xc2, 0x3c, 0x46, 0xbe, 0x38, 0x42, 0xba, 0x35, 0x3f, 0xb7,
-0x34, 0x3d, 0xb4, 0x32, 0x3a, 0xb1, 0x30, 0x39, 0xae, 0x2e, 0x37, 0xaa,
-0x2d, 0x35, 0xa7, 0x2c, 0x35, 0xa5, 0x2a, 0x33, 0xa2, 0x29, 0x31, 0x9f,
-0x68, 0x6b, 0x6b, 0xe1, 0xdb, 0x2a, 0xe5, 0xdf, 0x36, 0xe6, 0xdf, 0x37,
-0xe4, 0xe2, 0x35, 0xe0, 0xd9, 0x23, 0xe1, 0xdb, 0x2a, 0xe2, 0xdc, 0x2d,
-0xd4, 0xcd, 0x1b, 0xcc, 0xc6, 0x19, 0xbc, 0xb8, 0x23, 0x7d, 0x7e, 0x4c,
-0x2a, 0x30, 0x82, 0x2a, 0x30, 0x80, 0x28, 0x2e, 0x7e, 0x28, 0x2e, 0x7c,
-0x28, 0x2e, 0x7c, 0x3b, 0x3f, 0x6d, 0xd0, 0xca, 0x13, 0xdf, 0xd8, 0x20,
-0xdd, 0xd6, 0x1c, 0xdd, 0xd6, 0x1c, 0xd9, 0xd2, 0x1c, 0xdf, 0xd8, 0x20,
-0xe3, 0xe1, 0x32, 0xde, 0xdc, 0x1f, 0xdf, 0xd9, 0x22, 0xe2, 0xdc, 0x2b,
-0xd7, 0xd0, 0x1c, 0x8d, 0x8b, 0x32, 0x34, 0x39, 0x5c, 0x1e, 0x24, 0x66,
-0x1e, 0x24, 0x65, 0x1d, 0x23, 0x64, 0x1d, 0x22, 0x62, 0x1c, 0x22, 0x61,
-0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1c, 0x20, 0x5e, 0x1b, 0x20, 0x5d,
-0x1b, 0x20, 0x5c, 0x1b, 0x1f, 0x5b, 0xce, 0xc9, 0x10, 0xdd, 0xd6, 0x1c,
-0xd4, 0xcd, 0x1b, 0xe2, 0xe0, 0x2b, 0xe6, 0xdf, 0x37, 0x2f, 0x32, 0x4d,
-0x18, 0x1c, 0x55, 0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1c, 0x52,
-0x17, 0x1c, 0x52, 0x17, 0x1b, 0x51, 0x16, 0x1b, 0x50, 0x16, 0x1b, 0x4f,
-0x5b, 0x5c, 0x37, 0xde, 0xd8, 0x1f, 0xd9, 0xd2, 0x1c, 0xd9, 0xd2, 0x1c,
-0xe2, 0xe0, 0x2b, 0xce, 0xc8, 0x0e, 0x2b, 0x2e, 0x42, 0x15, 0x19, 0x4a,
-0x14, 0x18, 0x49, 0x14, 0x18, 0x49, 0x14, 0x17, 0x48, 0x13, 0x17, 0x47,
-0x13, 0x17, 0x47, 0x13, 0x17, 0x45, 0x13, 0x17, 0x45, 0x13, 0x16, 0x45,
-0x13, 0x16, 0x45, 0x12, 0x16, 0x44, 0x12, 0x16, 0x44, 0x12, 0x15, 0x42,
-0x12, 0x15, 0x42, 0x12, 0x15, 0x41, 0x12, 0x15, 0x41, 0x11, 0x15, 0x40,
-0x11, 0x15, 0x40, 0x11, 0x14, 0x3f, 0x11, 0x14, 0x3f, 0x11, 0x14, 0x3e,
-0x11, 0x14, 0x3e, 0x10, 0x14, 0x3d, 0x0f, 0x12, 0x37, 0x01, 0x01, 0x05,
-0x1a, 0x1e, 0x48, 0x38, 0x3e, 0x90, 0x3b, 0x45, 0x96, 0x33, 0x3b, 0x7e,
-0x2e, 0x34, 0x6f, 0x2f, 0x34, 0x6d, 0x2e, 0x34, 0x6b, 0x2f, 0x35, 0x68,
-0x2e, 0x35, 0x65, 0x2d, 0x33, 0x62, 0x2a, 0x30, 0x5f, 0x28, 0x2d, 0x5c,
-0x2c, 0x32, 0x66, 0x2f, 0x36, 0x6f, 0x31, 0x39, 0x78, 0x35, 0x3d, 0x82,
-0x38, 0x40, 0x8d, 0x37, 0x3f, 0x8f, 0x36, 0x3e, 0x91, 0x35, 0x3e, 0x93,
-0x35, 0x3c, 0x96, 0x33, 0x3b, 0x98, 0x32, 0x3a, 0x9b, 0x31, 0x39, 0x9d,
-0x6c, 0x6f, 0x6d, 0xa8, 0xa6, 0x3b, 0xd0, 0xcb, 0x19, 0xe1, 0xda, 0x26,
-0xe5, 0xdf, 0x36, 0xe1, 0xdf, 0x2a, 0xe1, 0xdf, 0x2a, 0xd4, 0xcd, 0x1b,
-0xd5, 0xcf, 0x1c, 0xdf, 0xd8, 0x20, 0xdd, 0xd6, 0x1c, 0xab, 0xaa, 0x45,
-0x99, 0x99, 0x5c, 0x75, 0x7a, 0x88, 0x3d, 0x49, 0xcd, 0x3c, 0x48, 0xd0,
-0x3c, 0x47, 0xd5, 0x39, 0x45, 0xd9, 0x36, 0x41, 0xdd, 0x31, 0x3d, 0xdf,
-0x2f, 0x3a, 0xdf, 0x3c, 0x48, 0xde, 0x58, 0x67, 0xdd, 0x0e, 0x13, 0x34,
-0x0e, 0x13, 0x35, 0x0f, 0x14, 0x38, 0x0f, 0x15, 0x39, 0x10, 0x16, 0x3c,
-0x2a, 0x34, 0x6b, 0x53, 0x64, 0xd7, 0x4b, 0x5b, 0xb8, 0x44, 0x53, 0xa6,
-0x4d, 0x5d, 0xbe, 0x17, 0x1e, 0x4a, 0x30, 0x35, 0x47, 0x8c, 0x8b, 0x28,
-0xcf, 0xca, 0x10, 0xe4, 0xe2, 0x33, 0xdf, 0xd9, 0x22, 0xd4, 0xcd, 0x1b,
-0xc9, 0xc7, 0x18, 0xd4, 0xcd, 0x1b, 0xe2, 0xdc, 0x2b, 0xe1, 0xdb, 0x2a,
-0xe2, 0xe0, 0x2d, 0xde, 0xd7, 0x1d, 0xdb, 0xd4, 0x1c, 0xcf, 0xc9, 0x1a,
-0xd1, 0xcc, 0x13, 0x1a, 0x22, 0x53, 0x19, 0x21, 0x50, 0x19, 0x20, 0x4f,
-0x18, 0x1f, 0x4d, 0x17, 0x1e, 0x4a, 0x16, 0x1d, 0x48, 0x15, 0x1c, 0x46,
-0x39, 0x46, 0x88, 0x48, 0x56, 0xab, 0x4a, 0x5a, 0xda, 0x45, 0x54, 0xdb,
-0x51, 0x61, 0xdb, 0x56, 0x66, 0xdc, 0x47, 0x56, 0xdd, 0x3c, 0x4a, 0xde,
-0x39, 0x45, 0xdf, 0x36, 0x42, 0xdf, 0x5f, 0x67, 0xb0, 0xb2, 0xb1, 0x4f,
-0xb3, 0xb3, 0x42, 0xa8, 0xa6, 0x27, 0xaf, 0xae, 0x36, 0x5f, 0x69, 0xa9,
-0x52, 0x5e, 0xce, 0x4e, 0x59, 0xca, 0x49, 0x54, 0xc7, 0x46, 0x51, 0xc3,
-0x42, 0x4d, 0xbf, 0x40, 0x4a, 0xbd, 0x3c, 0x46, 0xb9, 0x38, 0x43, 0xb6,
-0x36, 0x3f, 0xb2, 0x34, 0x3d, 0xaf, 0x32, 0x3a, 0xac, 0x2f, 0x38, 0xaa,
-0x2e, 0x36, 0xa7, 0x2d, 0x35, 0xa4, 0x2b, 0x34, 0xa1, 0x2a, 0x32, 0x9e,
-0x29, 0x31, 0x9c, 0x7b, 0x7c, 0x58, 0xd0, 0xca, 0x17, 0xdb, 0xd4, 0x1c,
-0xd4, 0xcd, 0x1b, 0xde, 0xd7, 0x1d, 0xa6, 0xa4, 0x33, 0xa6, 0xa4, 0x33,
-0x67, 0x6a, 0x5d, 0x29, 0x2f, 0x87, 0x29, 0x2f, 0x85, 0x29, 0x2f, 0x84,
-0x29, 0x2f, 0x82, 0x29, 0x2f, 0x80, 0x28, 0x2e, 0x7e, 0x27, 0x2d, 0x7c,
-0x27, 0x2c, 0x7b, 0x26, 0x2c, 0x79, 0x26, 0x2b, 0x78, 0x65, 0x66, 0x51,
-0xa5, 0xa2, 0x2b, 0xdf, 0xd8, 0x20, 0xdd, 0xd6, 0x1c, 0xe0, 0xda, 0x25,
-0xe4, 0xde, 0x33, 0xe4, 0xde, 0x33, 0xa4, 0xa1, 0x28, 0x77, 0x77, 0x3e,
-0x35, 0x3a, 0x5e, 0x20, 0x25, 0x68, 0x1f, 0x25, 0x67, 0x1e, 0x24, 0x66,
-0x1e, 0x24, 0x65, 0x1d, 0x23, 0x63, 0x1d, 0x22, 0x62, 0x1c, 0x22, 0x61,
-0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1c, 0x20, 0x5e, 0x1b, 0x20, 0x5d,
-0x1b, 0x20, 0x5c, 0x1b, 0x1f, 0x5b, 0xa2, 0x9f, 0x22, 0xa2, 0x9e, 0x22,
-0xa2, 0x9e, 0x22, 0xa1, 0x9e, 0x21, 0x73, 0x72, 0x32, 0x18, 0x1c, 0x55,
-0x18, 0x1c, 0x55, 0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52,
-0x17, 0x1b, 0x51, 0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f,
-0x2c, 0x2f, 0x46, 0xa0, 0x9d, 0x1e, 0xa0, 0x9d, 0x1e, 0xa0, 0x9d, 0x1e,
-0xa0, 0x9d, 0x1e, 0x42, 0x44, 0x3c, 0x15, 0x18, 0x4a, 0x14, 0x17, 0x4a,
-0x13, 0x17, 0x49, 0x13, 0x17, 0x49, 0x13, 0x17, 0x48, 0x13, 0x16, 0x47,
-0x13, 0x16, 0x47, 0x13, 0x16, 0x45, 0x13, 0x16, 0x45, 0x12, 0x16, 0x45,
-0x12, 0x16, 0x45, 0x12, 0x15, 0x44, 0x12, 0x15, 0x43, 0x12, 0x15, 0x42,
-0x11, 0x15, 0x41, 0x11, 0x15, 0x41, 0x11, 0x14, 0x40, 0x11, 0x14, 0x40,
-0x11, 0x14, 0x40, 0x11, 0x14, 0x3f, 0x11, 0x14, 0x3f, 0x10, 0x14, 0x3e,
-0x10, 0x14, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05,
-0x1c, 0x21, 0x48, 0x3b, 0x42, 0x8f, 0x40, 0x48, 0x96, 0x36, 0x3f, 0x7d,
-0x32, 0x39, 0x71, 0x32, 0x38, 0x6d, 0x30, 0x35, 0x6b, 0x2e, 0x34, 0x6a,
-0x2c, 0x32, 0x67, 0x2c, 0x34, 0x6b, 0x2e, 0x35, 0x70, 0x32, 0x39, 0x7b,
-0x35, 0x3c, 0x84, 0x34, 0x3b, 0x86, 0x34, 0x3b, 0x88, 0x32, 0x3b, 0x8a,
-0x31, 0x39, 0x8c, 0x30, 0x39, 0x8e, 0x30, 0x37, 0x90, 0x2f, 0x37, 0x93,
-0x2f, 0x36, 0x95, 0x2d, 0x35, 0x98, 0x2c, 0x34, 0x9a, 0x2b, 0x32, 0x9d,
-0x2a, 0x32, 0x9f, 0x29, 0x31, 0xa1, 0x2a, 0x33, 0xa5, 0x2b, 0x33, 0xa7,
-0x54, 0x5a, 0x86, 0x6a, 0x6e, 0x75, 0x6b, 0x6f, 0x77, 0x6c, 0x70, 0x79,
-0x59, 0x5f, 0x8f, 0x34, 0x3e, 0xb9, 0x37, 0x41, 0xbc, 0x3a, 0x44, 0xc0,
-0x3b, 0x46, 0xc3, 0x3a, 0x45, 0xc7, 0x3a, 0x44, 0xca, 0x39, 0x43, 0xcf,
-0x37, 0x41, 0xd2, 0x32, 0x3d, 0xd6, 0x2e, 0x39, 0xda, 0x2d, 0x37, 0xde,
-0x3c, 0x49, 0xdf, 0x59, 0x68, 0xdf, 0x1e, 0x24, 0x4e, 0x1c, 0x22, 0x4c,
-0x1e, 0x25, 0x50, 0x0e, 0x14, 0x36, 0x0f, 0x14, 0x38, 0x3c, 0x48, 0x8e,
-0x4e, 0x5e, 0xd9, 0x53, 0x63, 0xd8, 0x51, 0x62, 0xcd, 0x52, 0x64, 0xd7,
-0x42, 0x50, 0x9e, 0x17, 0x1d, 0x48, 0x44, 0x52, 0x9f, 0x1c, 0x23, 0x50,
-0x20, 0x27, 0x54, 0x5a, 0x6c, 0xd0, 0x5e, 0x6c, 0x9d, 0x62, 0x65, 0x3d,
-0x62, 0x64, 0x3c, 0x60, 0x63, 0x3b, 0xdf, 0xd8, 0x20, 0xe2, 0xe0, 0x2d,
-0xde, 0xd7, 0x1d, 0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xd7, 0xd5, 0x1c,
-0xdf, 0xd9, 0x22, 0x73, 0x74, 0x2e, 0x18, 0x1f, 0x4c, 0x17, 0x1e, 0x4a,
-0x16, 0x1d, 0x48, 0x16, 0x1c, 0x47, 0x15, 0x1b, 0x45, 0x14, 0x1b, 0x43,
-0x43, 0x50, 0x9e, 0x4e, 0x5d, 0xbb, 0x54, 0x65, 0xdb, 0x43, 0x52, 0xdb,
-0x3f, 0x4e, 0xdc, 0x4a, 0x59, 0xdd, 0x50, 0x5f, 0xde, 0x44, 0x51, 0xdf,
-0x39, 0x45, 0xdf, 0x35, 0x41, 0xe0, 0x32, 0x3d, 0xe1, 0x31, 0x3d, 0xdf,
-0x3f, 0x4b, 0xdb, 0x51, 0x5d, 0xd7, 0x33, 0x3c, 0x74, 0x3d, 0x46, 0x8a,
-0x48, 0x52, 0xa9, 0x50, 0x5c, 0xc8, 0x4a, 0x56, 0xc4, 0x48, 0x53, 0xc1,
-0x44, 0x4f, 0xbe, 0x41, 0x4c, 0xba, 0x3f, 0x49, 0xb7, 0x3b, 0x45, 0xb4,
-0x38, 0x41, 0xb0, 0x36, 0x3f, 0xad, 0x34, 0x3c, 0xab, 0x31, 0x39, 0xa8,
-0x2f, 0x37, 0xa6, 0x2d, 0x35, 0xa2, 0x2c, 0x34, 0xa0, 0x2b, 0x33, 0x9d,
-0x29, 0x31, 0x9b, 0x28, 0x30, 0x98, 0x27, 0x2e, 0x96, 0x27, 0x2d, 0x93,
-0x25, 0x2c, 0x91, 0x25, 0x2c, 0x8f, 0x25, 0x2b, 0x8d, 0x26, 0x2c, 0x8b,
-0x26, 0x2c, 0x89, 0x25, 0x2c, 0x86, 0x25, 0x2c, 0x85, 0x26, 0x2d, 0x83,
-0x26, 0x2c, 0x81, 0x26, 0x2d, 0x7f, 0x26, 0x2d, 0x7d, 0x26, 0x2c, 0x7c,
-0x26, 0x2c, 0x7b, 0x26, 0x2b, 0x79, 0x25, 0x2b, 0x77, 0x24, 0x2a, 0x75,
-0x23, 0x2a, 0x74, 0x23, 0x29, 0x72, 0x23, 0x29, 0x71, 0x22, 0x28, 0x6f,
-0x21, 0x28, 0x6e, 0x21, 0x27, 0x6c, 0x20, 0x26, 0x6c, 0x20, 0x26, 0x6a,
-0x1f, 0x25, 0x69, 0x1f, 0x25, 0x68, 0x1f, 0x25, 0x67, 0x1e, 0x24, 0x65,
-0x1e, 0x23, 0x64, 0x1d, 0x23, 0x63, 0x1c, 0x22, 0x62, 0x1c, 0x22, 0x61,
-0x1c, 0x21, 0x60, 0x1c, 0x21, 0x5f, 0x1c, 0x20, 0x5e, 0x1b, 0x20, 0x5d,
-0x1b, 0x20, 0x5c, 0x1b, 0x1f, 0x5b, 0x1a, 0x1f, 0x5a, 0x1a, 0x1e, 0x59,
-0x1a, 0x1e, 0x58, 0x19, 0x1d, 0x57, 0x19, 0x1d, 0x56, 0x18, 0x1c, 0x55,
-0x18, 0x1c, 0x54, 0x17, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52,
-0x17, 0x1b, 0x51, 0x17, 0x1b, 0x50, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f,
-0x16, 0x1a, 0x4e, 0x16, 0x1a, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c,
-0x15, 0x19, 0x4c, 0x15, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x14, 0x17, 0x4a,
-0x13, 0x17, 0x49, 0x13, 0x17, 0x48, 0x13, 0x17, 0x48, 0x13, 0x16, 0x47,
-0x13, 0x16, 0x47, 0x12, 0x16, 0x45, 0x12, 0x16, 0x45, 0x12, 0x16, 0x45,
-0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x12, 0x15, 0x43, 0x11, 0x15, 0x42,
-0x11, 0x15, 0x41, 0x11, 0x15, 0x41, 0x11, 0x14, 0x40, 0x11, 0x14, 0x40,
-0x11, 0x14, 0x3f, 0x11, 0x14, 0x3f, 0x10, 0x14, 0x3f, 0x10, 0x13, 0x3e,
-0x10, 0x13, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05,
-0x1e, 0x22, 0x47, 0x3f, 0x48, 0x8f, 0x41, 0x4b, 0x95, 0x35, 0x3f, 0x7d,
-0x30, 0x36, 0x70, 0x2e, 0x34, 0x6f, 0x2d, 0x33, 0x6e, 0x2f, 0x35, 0x74,
-0x31, 0x38, 0x7d, 0x31, 0x38, 0x7f, 0x30, 0x37, 0x80, 0x30, 0x37, 0x81,
-0x2f, 0x36, 0x84, 0x2f, 0x36, 0x86, 0x2e, 0x35, 0x87, 0x2d, 0x34, 0x89,
-0x2c, 0x34, 0x8c, 0x2c, 0x33, 0x8d, 0x2c, 0x32, 0x90, 0x2b, 0x31, 0x92,
-0x29, 0x31, 0x94, 0x28, 0x30, 0x97, 0x27, 0x2e, 0x98, 0x27, 0x2f, 0x9b,
-0x28, 0x30, 0x9d, 0x29, 0x32, 0xa1, 0x2b, 0x32, 0xa3, 0x2c, 0x33, 0xa5,
-0x2c, 0x35, 0xa8, 0x2d, 0x36, 0xab, 0x2f, 0x38, 0xae, 0x31, 0x3a, 0xb1,
-0x33, 0x3d, 0xb5, 0x36, 0x3f, 0xb8, 0x38, 0x42, 0xba, 0x38, 0x42, 0xbe,
-0x37, 0x41, 0xc1, 0x37, 0x41, 0xc5, 0x35, 0x40, 0xc8, 0x32, 0x3c, 0xcc,
-0x2f, 0x3a, 0xd0, 0x2c, 0x36, 0xd3, 0x2f, 0x3b, 0xd6, 0x3e, 0x4a, 0xdb,
-0x59, 0x67, 0xde, 0x39, 0x43, 0x84, 0x39, 0x43, 0x84, 0x3c, 0x47, 0x8c,
-0x2d, 0x36, 0x6c, 0x1e, 0x25, 0x51, 0x4a, 0x58, 0xb0, 0x4c, 0x5b, 0xdb,
-0x4b, 0x5a, 0xda, 0x51, 0x60, 0xd9, 0x4d, 0x5e, 0xd9, 0x50, 0x60, 0xd9,
-0x2d, 0x37, 0x6e, 0x3d, 0x49, 0x8d, 0x50, 0x61, 0xbe, 0x1b, 0x22, 0x4c,
-0x47, 0x54, 0x9e, 0x5c, 0x6e, 0xdf, 0x51, 0x61, 0xb9, 0x1e, 0x25, 0x53,
-0x1d, 0x24, 0x52, 0x1c, 0x23, 0x51, 0x8b, 0x8a, 0x27, 0xe3, 0xdd, 0x2e,
-0xe1, 0xda, 0x26, 0xe1, 0xda, 0x26, 0xd5, 0xcf, 0x1c, 0xdb, 0xd4, 0x1c,
-0xdd, 0xd6, 0x1c, 0xd4, 0xcd, 0x1b, 0x2c, 0x32, 0x40, 0x16, 0x1c, 0x47,
-0x15, 0x1b, 0x45, 0x14, 0x1b, 0x43, 0x14, 0x1a, 0x42, 0x13, 0x19, 0x40,
-0x12, 0x18, 0x3e, 0x54, 0x63, 0xd0, 0x56, 0x65, 0xdc, 0x4b, 0x5a, 0xdc,
-0x3d, 0x4a, 0xdd, 0x3b, 0x48, 0xde, 0x45, 0x53, 0xdf, 0x4a, 0x58, 0xdf,
-0x3f, 0x4b, 0xe0, 0x35, 0x42, 0xe1, 0x31, 0x3d, 0xe0, 0x30, 0x3b, 0xdc,
-0x2f, 0x3a, 0xd7, 0x37, 0x42, 0xd4, 0x45, 0x51, 0xd1, 0x4d, 0x58, 0xb9,
-0x39, 0x42, 0x82, 0x45, 0x4f, 0xa2, 0x4c, 0x57, 0xb9, 0x4a, 0x55, 0xbf,
-0x46, 0x50, 0xbb, 0x43, 0x4d, 0xb8, 0x3f, 0x49, 0xb5, 0x3d, 0x46, 0xb2,
-0x3a, 0x44, 0xaf, 0x38, 0x42, 0xac, 0x36, 0x3f, 0xa9, 0x33, 0x3b, 0xa6,
-0x31, 0x39, 0xa4, 0x2f, 0x36, 0xa1, 0x2d, 0x35, 0x9e, 0x2b, 0x33, 0x9c,
-0x29, 0x31, 0x99, 0x29, 0x31, 0x97, 0x27, 0x2f, 0x95, 0x27, 0x2e, 0x92,
-0x26, 0x2d, 0x91, 0x25, 0x2c, 0x8e, 0x25, 0x2a, 0x8c, 0x23, 0x2a, 0x8a,
-0x23, 0x29, 0x88, 0x23, 0x29, 0x86, 0x23, 0x29, 0x85, 0x23, 0x29, 0x82,
-0x24, 0x2a, 0x80, 0x24, 0x2a, 0x7f, 0x24, 0x2a, 0x7d, 0x23, 0x2a, 0x7b,
-0x24, 0x2a, 0x7a, 0x23, 0x2a, 0x78, 0x23, 0x2a, 0x77, 0x23, 0x2a, 0x75,
-0x23, 0x29, 0x73, 0x23, 0x29, 0x72, 0x22, 0x28, 0x70, 0x21, 0x28, 0x6f,
-0x21, 0x27, 0x6e, 0x20, 0x26, 0x6c, 0x20, 0x26, 0x6b, 0x1f, 0x25, 0x6a,
-0x1f, 0x25, 0x69, 0x1f, 0x25, 0x68, 0x1e, 0x24, 0x66, 0x1e, 0x23, 0x65,
-0x1d, 0x23, 0x64, 0x1d, 0x22, 0x63, 0x1c, 0x22, 0x62, 0x1c, 0x22, 0x61,
-0x1c, 0x21, 0x5f, 0x1c, 0x20, 0x5e, 0x1b, 0x20, 0x5d, 0x1b, 0x20, 0x5c,
-0x1b, 0x1f, 0x5b, 0x1b, 0x1f, 0x5a, 0x1a, 0x1f, 0x5a, 0x1a, 0x1e, 0x59,
-0x1a, 0x1e, 0x58, 0x19, 0x1d, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55,
-0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52,
-0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f,
-0x16, 0x1a, 0x4e, 0x16, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c,
-0x15, 0x18, 0x4b, 0x15, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x17, 0x49,
-0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47,
-0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45,
-0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42,
-0x11, 0x14, 0x41, 0x11, 0x14, 0x41, 0x11, 0x14, 0x40, 0x11, 0x14, 0x40,
-0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e,
-0x10, 0x13, 0x3e, 0x10, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05,
-0x1e, 0x22, 0x47, 0x3c, 0x43, 0x8e, 0x3e, 0x46, 0x95, 0x32, 0x3a, 0x7e,
-0x2e, 0x34, 0x75, 0x2e, 0x34, 0x77, 0x2d, 0x33, 0x78, 0x2d, 0x33, 0x7a,
-0x2c, 0x33, 0x7c, 0x2c, 0x34, 0x7e, 0x2b, 0x32, 0x7f, 0x2b, 0x32, 0x81,
-0x2b, 0x32, 0x83, 0x2a, 0x30, 0x85, 0x29, 0x30, 0x86, 0x29, 0x2f, 0x88,
-0x28, 0x2f, 0x8b, 0x27, 0x2e, 0x8c, 0x26, 0x2e, 0x8f, 0x26, 0x2d, 0x91,
-0x26, 0x2c, 0x93, 0x26, 0x2d, 0x95, 0x26, 0x2e, 0x97, 0x27, 0x2f, 0x9a,
-0x29, 0x31, 0x9c, 0x2a, 0x31, 0x9f, 0x2a, 0x32, 0xa1, 0x2b, 0x34, 0xa4,
-0x2d, 0x36, 0xa7, 0x2f, 0x37, 0xaa, 0x31, 0x3a, 0xac, 0x33, 0x3c, 0xaf,
-0x36, 0x3f, 0xb2, 0x36, 0x3e, 0xb5, 0x35, 0x3e, 0xb9, 0x35, 0x3e, 0xbc,
-0x34, 0x3e, 0xbf, 0x32, 0x3c, 0xc2, 0x2f, 0x39, 0xc5, 0x2d, 0x36, 0xc9,
-0x2a, 0x34, 0xcd, 0x32, 0x3d, 0xd0, 0x41, 0x4d, 0xd4, 0x4f, 0x5b, 0xbf,
-0x46, 0x50, 0xa1, 0x4c, 0x58, 0xb4, 0x4d, 0x58, 0xb5, 0x46, 0x51, 0xa2,
-0x3c, 0x47, 0x8c, 0x54, 0x62, 0xcd, 0x49, 0x58, 0xdc, 0x44, 0x52, 0xdc,
-0x4a, 0x59, 0xdb, 0x49, 0x58, 0xdb, 0x47, 0x56, 0xda, 0x56, 0x66, 0xd5,
-0x37, 0x42, 0x81, 0x56, 0x67, 0xdc, 0x3a, 0x45, 0x85, 0x1a, 0x20, 0x49,
-0x56, 0x67, 0xe0, 0x56, 0x68, 0xdf, 0x54, 0x64, 0xc1, 0x1c, 0x22, 0x4d,
-0x1b, 0x21, 0x4d, 0x1a, 0x20, 0x4c, 0x2f, 0x34, 0x43, 0xd4, 0xcf, 0x19,
-0xd1, 0xcf, 0x1a, 0xce, 0xc7, 0x19, 0xcc, 0xc6, 0x19, 0xe0, 0xde, 0x25,
-0xde, 0xd8, 0x1f, 0xde, 0xd7, 0x1d, 0xce, 0xc8, 0x0e, 0x2b, 0x30, 0x3c,
-0x14, 0x1a, 0x42, 0x13, 0x19, 0x40, 0x13, 0x19, 0x3f, 0x12, 0x18, 0x3e,
-0x11, 0x17, 0x3c, 0x3f, 0x4b, 0x93, 0x51, 0x61, 0xdd, 0x4e, 0x5c, 0xdd,
-0x43, 0x52, 0xde, 0x38, 0x44, 0xdf, 0x37, 0x43, 0xdf, 0x40, 0x4c, 0xe0,
-0x46, 0x53, 0xe0, 0x3b, 0x46, 0xe0, 0x34, 0x3f, 0xdd, 0x31, 0x3c, 0xd9,
-0x2f, 0x3a, 0xd5, 0x2f, 0x39, 0xd1, 0x31, 0x3c, 0xce, 0x3c, 0x47, 0xca,
-0x49, 0x55, 0xc6, 0x3d, 0x46, 0x8b, 0x41, 0x4a, 0x96, 0x49, 0x54, 0xb0,
-0x49, 0x54, 0xba, 0x44, 0x4e, 0xb6, 0x40, 0x4b, 0xb3, 0x3d, 0x48, 0xb0,
-0x3b, 0x45, 0xad, 0x39, 0x42, 0xab, 0x37, 0x40, 0xa8, 0x34, 0x3e, 0xa5,
-0x33, 0x3b, 0xa2, 0x31, 0x39, 0xa0, 0x2f, 0x36, 0x9d, 0x2d, 0x35, 0x9b,
-0x2b, 0x33, 0x98, 0x29, 0x31, 0x96, 0x28, 0x30, 0x94, 0x27, 0x2f, 0x92,
-0x26, 0x2d, 0x90, 0x25, 0x2c, 0x8d, 0x25, 0x2b, 0x8c, 0x24, 0x2a, 0x89,
-0x23, 0x29, 0x87, 0x22, 0x28, 0x85, 0x21, 0x28, 0x84, 0x21, 0x28, 0x82,
-0x22, 0x27, 0x80, 0x22, 0x27, 0x7e, 0x21, 0x27, 0x7c, 0x22, 0x27, 0x7b,
-0x21, 0x27, 0x79, 0x22, 0x28, 0x78, 0x22, 0x27, 0x76, 0x22, 0x27, 0x74,
-0x21, 0x27, 0x73, 0x21, 0x27, 0x71, 0x21, 0x27, 0x70, 0x21, 0x27, 0x6e,
-0x20, 0x26, 0x6d, 0x20, 0x26, 0x6c, 0x1f, 0x25, 0x6b, 0x1f, 0x25, 0x6a,
-0x1f, 0x25, 0x69, 0x1e, 0x24, 0x67, 0x1e, 0x23, 0x66, 0x1e, 0x23, 0x65,
-0x1d, 0x22, 0x64, 0x1c, 0x22, 0x63, 0x1c, 0x21, 0x61, 0x1c, 0x21, 0x60,
-0x1c, 0x21, 0x5f, 0x1b, 0x20, 0x5e, 0x1b, 0x20, 0x5d, 0x1b, 0x20, 0x5c,
-0x1b, 0x1f, 0x5b, 0x1a, 0x1f, 0x5a, 0x1a, 0x1e, 0x59, 0x1a, 0x1e, 0x58,
-0x19, 0x1d, 0x57, 0x19, 0x1d, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55,
-0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x52,
-0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x1a, 0x4f,
-0x16, 0x1a, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c,
-0x15, 0x18, 0x4b, 0x15, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49,
-0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47,
-0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45,
-0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42,
-0x11, 0x14, 0x41, 0x11, 0x14, 0x41, 0x10, 0x14, 0x40, 0x10, 0x14, 0x40,
-0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e,
-0x10, 0x13, 0x3e, 0x0f, 0x13, 0x3d, 0x0f, 0x11, 0x37, 0x01, 0x01, 0x05,
-0x1b, 0x1f, 0x46, 0x37, 0x3e, 0x8e, 0x38, 0x40, 0x94, 0x2f, 0x35, 0x7e,
-0x2a, 0x30, 0x75, 0x2a, 0x30, 0x76, 0x2a, 0x30, 0x78, 0x29, 0x2f, 0x7a,
-0x29, 0x2f, 0x7b, 0x28, 0x2e, 0x7d, 0x28, 0x2e, 0x7e, 0x27, 0x2e, 0x80,
-0x27, 0x2e, 0x82, 0x26, 0x2d, 0x84, 0x25, 0x2c, 0x86, 0x25, 0x2c, 0x87,
-0x25, 0x2b, 0x8a, 0x24, 0x2a, 0x8c, 0x24, 0x2b, 0x8d, 0x24, 0x2b, 0x90,
-0x26, 0x2c, 0x92, 0x26, 0x2d, 0x94, 0x27, 0x2f, 0x97, 0x27, 0x2f, 0x99,
-0x28, 0x30, 0x9c, 0x2a, 0x31, 0x9e, 0x2b, 0x33, 0xa0, 0x2c, 0x35, 0xa3,
-0x2f, 0x36, 0xa5, 0x30, 0x39, 0xa8, 0x32, 0x3a, 0xab, 0x33, 0x3c, 0xae,
-0x32, 0x3c, 0xb1, 0x31, 0x3b, 0xb4, 0x32, 0x3b, 0xb7, 0x32, 0x3b, 0xba,
-0x2f, 0x38, 0xbd, 0x2d, 0x37, 0xc0, 0x2b, 0x34, 0xc3, 0x2a, 0x34, 0xc7,
-0x34, 0x3e, 0xca, 0x43, 0x4f, 0xce, 0x47, 0x52, 0xa7, 0x48, 0x54, 0xab,
-0x4e, 0x5b, 0xbc, 0x53, 0x5f, 0xca, 0x53, 0x60, 0xca, 0x4d, 0x58, 0xb5,
-0x56, 0x64, 0xde, 0x45, 0x53, 0xde, 0x3e, 0x4b, 0xde, 0x43, 0x51, 0xdd,
-0x45, 0x53, 0xdc, 0x43, 0x51, 0xdc, 0x4a, 0x59, 0xdc, 0x4b, 0x59, 0xb2,
-0x58, 0x68, 0xdd, 0x51, 0x61, 0xdd, 0x17, 0x1d, 0x43, 0x4e, 0x5c, 0xb1,
-0x4f, 0x5e, 0xe1, 0x52, 0x62, 0xe0, 0x57, 0x68, 0xcd, 0x1a, 0x20, 0x49,
-0x19, 0x1f, 0x48, 0x18, 0x1e, 0x48, 0x2f, 0x3a, 0x72, 0x86, 0x8f, 0x8f,
-0xde, 0xd8, 0x1f, 0xd4, 0xcd, 0x1b, 0xcc, 0xc6, 0x19, 0xe0, 0xde, 0x25,
-0xe0, 0xde, 0x25, 0xdd, 0xd6, 0x1c, 0xc9, 0xc3, 0x18, 0xce, 0xc8, 0x0d,
-0x41, 0x44, 0x32, 0x12, 0x18, 0x3e, 0x12, 0x17, 0x3c, 0x11, 0x17, 0x3b,
-0x11, 0x16, 0x39, 0x27, 0x2c, 0x32, 0x84, 0x8b, 0x95, 0xb2, 0xb2, 0x4e,
-0x48, 0x56, 0xdf, 0x3d, 0x4a, 0xdf, 0x33, 0x3e, 0xe0, 0x34, 0x40, 0xe0,
-0x3b, 0x46, 0xe0, 0x41, 0x4e, 0xdd, 0x3a, 0x45, 0xd9, 0x33, 0x3f, 0xd6,
-0x30, 0x3a, 0xd2, 0x2f, 0x39, 0xce, 0x2e, 0x38, 0xcb, 0x2f, 0x38, 0xc8,
-0x37, 0x40, 0xc4, 0x41, 0x4b, 0xc1, 0x4c, 0x58, 0xbe, 0x3f, 0x49, 0x95,
-0x45, 0x50, 0xa8, 0x48, 0x52, 0xb4, 0x44, 0x4d, 0xb1, 0x3f, 0x49, 0xae,
-0x3d, 0x46, 0xab, 0x3a, 0x43, 0xa9, 0x37, 0x41, 0xa6, 0x36, 0x3f, 0xa4,
-0x34, 0x3d, 0xa1, 0x33, 0x3a, 0x9f, 0x30, 0x38, 0x9c, 0x2e, 0x35, 0x9a,
-0x2d, 0x34, 0x97, 0x2a, 0x32, 0x95, 0x29, 0x30, 0x93, 0x28, 0x2f, 0x91,
-0x26, 0x2e, 0x8e, 0x25, 0x2c, 0x8c, 0x24, 0x2b, 0x8b, 0x24, 0x2a, 0x88,
-0x23, 0x29, 0x86, 0x22, 0x28, 0x84, 0x22, 0x28, 0x83, 0x21, 0x27, 0x81,
-0x20, 0x26, 0x7f, 0x1f, 0x25, 0x7d, 0x1f, 0x25, 0x7b, 0x20, 0x25, 0x7b,
-0x20, 0x25, 0x79, 0x20, 0x25, 0x77, 0x1f, 0x25, 0x75, 0x20, 0x25, 0x74,
-0x20, 0x25, 0x72, 0x20, 0x25, 0x71, 0x20, 0x25, 0x6f, 0x20, 0x25, 0x6e,
-0x1f, 0x25, 0x6c, 0x1f, 0x25, 0x6c, 0x1f, 0x25, 0x6a, 0x1f, 0x25, 0x69,
-0x1f, 0x24, 0x68, 0x1e, 0x23, 0x67, 0x1e, 0x23, 0x66, 0x1e, 0x23, 0x65,
-0x1c, 0x22, 0x63, 0x1c, 0x22, 0x62, 0x1c, 0x21, 0x61, 0x1c, 0x21, 0x60,
-0x1c, 0x21, 0x5f, 0x1b, 0x20, 0x5e, 0x1b, 0x20, 0x5d, 0x1b, 0x1f, 0x5c,
-0x1a, 0x1f, 0x5b, 0x1a, 0x1f, 0x5a, 0x1a, 0x1e, 0x59, 0x1a, 0x1e, 0x58,
-0x19, 0x1d, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55,
-0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x52,
-0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x1a, 0x4f,
-0x16, 0x1a, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c,
-0x15, 0x18, 0x4b, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49,
-0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47,
-0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45,
-0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x11, 0x14, 0x42, 0x11, 0x14, 0x42,
-0x11, 0x14, 0x41, 0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40,
-0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e, 0x10, 0x13, 0x3e,
-0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x1a, 0x1d, 0x46, 0x32, 0x39, 0x8d, 0x34, 0x3b, 0x94, 0x2a, 0x30, 0x7d,
-0x27, 0x2d, 0x75, 0x27, 0x2d, 0x76, 0x26, 0x2d, 0x77, 0x26, 0x2c, 0x79,
-0x25, 0x2c, 0x7b, 0x24, 0x2b, 0x7d, 0x25, 0x2a, 0x7e, 0x24, 0x2a, 0x7f,
-0x24, 0x2a, 0x81, 0x23, 0x29, 0x83, 0x22, 0x29, 0x85, 0x22, 0x29, 0x87,
-0x22, 0x2a, 0x89, 0x23, 0x2a, 0x8b, 0x24, 0x2a, 0x8c, 0x25, 0x2b, 0x8f,
-0x25, 0x2c, 0x91, 0x26, 0x2d, 0x93, 0x26, 0x2e, 0x96, 0x28, 0x30, 0x97,
-0x29, 0x31, 0x9a, 0x2b, 0x32, 0x9c, 0x2c, 0x35, 0x9f, 0x2e, 0x35, 0xa1,
-0x2f, 0x38, 0xa4, 0x31, 0x3a, 0xa7, 0x31, 0x3a, 0xa9, 0x30, 0x39, 0xac,
-0x30, 0x39, 0xaf, 0x2f, 0x39, 0xb1, 0x2e, 0x37, 0xb4, 0x2c, 0x36, 0xb7,
-0x2b, 0x34, 0xbb, 0x28, 0x32, 0xbe, 0x2c, 0x35, 0xc0, 0x35, 0x3f, 0xc4,
-0x44, 0x50, 0xc7, 0x46, 0x50, 0xa6, 0x49, 0x54, 0xaf, 0x50, 0x5c, 0xc1,
-0x55, 0x62, 0xd2, 0x53, 0x62, 0xce, 0x53, 0x5f, 0xca, 0x51, 0x5f, 0xdf,
-0x43, 0x50, 0xdf, 0x3a, 0x46, 0xdf, 0x3e, 0x4a, 0xde, 0x41, 0x4f, 0xde,
-0x3f, 0x4d, 0xdd, 0x3f, 0x4d, 0xdd, 0x51, 0x60, 0xdd, 0x59, 0x68, 0xdc,
-0x4b, 0x5a, 0xde, 0x5a, 0x6a, 0xdf, 0x16, 0x1c, 0x41, 0x53, 0x62, 0xe1,
-0x4b, 0x5a, 0xe1, 0x4f, 0x5f, 0xe0, 0x59, 0x69, 0xd4, 0x18, 0x1e, 0x45,
-0x17, 0x1d, 0x45, 0x16, 0x1c, 0x43, 0x47, 0x55, 0xa7, 0x53, 0x63, 0xda,
-0xb6, 0xb7, 0x4d, 0xd7, 0xd5, 0x1c, 0xdb, 0xd4, 0x1c, 0xe0, 0xd9, 0x23,
-0xdd, 0xd6, 0x1c, 0xd4, 0xcd, 0x1b, 0xd7, 0xd5, 0x1c, 0xd4, 0xcd, 0x1b,
-0xdb, 0xd4, 0x1c, 0xcd, 0xc8, 0x0c, 0xa3, 0xa1, 0x20, 0xa2, 0x9f, 0x1d,
-0xcd, 0xc8, 0x0c, 0xde, 0xdb, 0x1d, 0xe3, 0xdd, 0x30, 0xdd, 0xd6, 0x1c,
-0x46, 0x52, 0xdf, 0x42, 0x4f, 0xe0, 0x37, 0x43, 0xe1, 0x2e, 0x39, 0xe0,
-0x31, 0x3c, 0xdd, 0x39, 0x44, 0xda, 0x40, 0x4b, 0xd6, 0x39, 0x44, 0xd3,
-0x33, 0x3e, 0xcf, 0x2f, 0x39, 0xcc, 0x2f, 0x38, 0xc8, 0x2c, 0x36, 0xc5,
-0x2b, 0x34, 0xc1, 0x31, 0x3b, 0xbe, 0x39, 0x43, 0xbc, 0x43, 0x4d, 0xb8,
-0x41, 0x4a, 0x9a, 0x43, 0x4d, 0xa0, 0x47, 0x50, 0xb0, 0x42, 0x4b, 0xad,
-0x3e, 0x48, 0xaa, 0x3b, 0x44, 0xa7, 0x39, 0x41, 0xa5, 0x37, 0x40, 0xa2,
-0x35, 0x3e, 0xa0, 0x33, 0x3b, 0x9d, 0x31, 0x39, 0x9b, 0x30, 0x38, 0x98,
-0x2e, 0x35, 0x96, 0x2c, 0x34, 0x94, 0x2a, 0x32, 0x91, 0x29, 0x30, 0x90,
-0x27, 0x2e, 0x8d, 0x26, 0x2d, 0x8b, 0x25, 0x2c, 0x8a, 0x24, 0x2b, 0x88,
-0x23, 0x2a, 0x85, 0x23, 0x29, 0x84, 0x22, 0x28, 0x82, 0x21, 0x27, 0x80,
-0x20, 0x26, 0x7e, 0x20, 0x25, 0x7d, 0x1f, 0x25, 0x7b, 0x1e, 0x24, 0x7a,
-0x1e, 0x24, 0x78, 0x1e, 0x24, 0x77, 0x1e, 0x24, 0x75, 0x1e, 0x23, 0x73,
-0x1e, 0x23, 0x72, 0x1e, 0x23, 0x70, 0x1e, 0x23, 0x6f, 0x1e, 0x23, 0x6e,
-0x1e, 0x23, 0x6c, 0x1e, 0x23, 0x6c, 0x1e, 0x23, 0x6a, 0x1e, 0x23, 0x69,
-0x1e, 0x23, 0x68, 0x1e, 0x23, 0x67, 0x1e, 0x22, 0x65, 0x1d, 0x22, 0x64,
-0x1c, 0x22, 0x63, 0x1c, 0x21, 0x62, 0x1c, 0x21, 0x61, 0x1c, 0x20, 0x60,
-0x1c, 0x20, 0x5f, 0x1b, 0x20, 0x5e, 0x1b, 0x20, 0x5d, 0x1b, 0x1f, 0x5c,
-0x1a, 0x1f, 0x5b, 0x1a, 0x1e, 0x5a, 0x1a, 0x1e, 0x59, 0x19, 0x1d, 0x58,
-0x19, 0x1d, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1c, 0x55, 0x18, 0x1c, 0x55,
-0x18, 0x1c, 0x54, 0x17, 0x1c, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x51,
-0x17, 0x1b, 0x51, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x1a, 0x4e,
-0x16, 0x19, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, 0x15, 0x19, 0x4c,
-0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49,
-0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47,
-0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45,
-0x12, 0x15, 0x44, 0x12, 0x15, 0x44, 0x11, 0x14, 0x42, 0x11, 0x14, 0x42,
-0x10, 0x14, 0x41, 0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40,
-0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3e, 0x0f, 0x12, 0x3e,
-0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x37, 0x01, 0x01, 0x05,
-0x17, 0x1b, 0x45, 0x2e, 0x37, 0x8d, 0x2f, 0x37, 0x93, 0x28, 0x2e, 0x7d,
-0x24, 0x29, 0x74, 0x24, 0x29, 0x75, 0x24, 0x29, 0x77, 0x23, 0x29, 0x78,
-0x22, 0x28, 0x7a, 0x22, 0x27, 0x7c, 0x21, 0x28, 0x7e, 0x21, 0x28, 0x7f,
-0x21, 0x27, 0x80, 0x20, 0x27, 0x82, 0x21, 0x28, 0x85, 0x22, 0x29, 0x86,
-0x23, 0x29, 0x88, 0x23, 0x2a, 0x8a, 0x24, 0x2a, 0x8c, 0x25, 0x2b, 0x8e,
-0x25, 0x2c, 0x90, 0x26, 0x2d, 0x92, 0x27, 0x2f, 0x94, 0x28, 0x30, 0x97,
-0x2a, 0x31, 0x99, 0x2b, 0x33, 0x9c, 0x2d, 0x35, 0x9d, 0x2f, 0x37, 0xa0,
-0x2f, 0x36, 0xa3, 0x2f, 0x36, 0xa5, 0x2e, 0x36, 0xa7, 0x2e, 0x36, 0xab,
-0x2e, 0x36, 0xad, 0x2b, 0x35, 0xb0, 0x2b, 0x33, 0xb3, 0x29, 0x32, 0xb6,
-0x27, 0x30, 0xb9, 0x2d, 0x36, 0xbc, 0x37, 0x40, 0xbe, 0x45, 0x50, 0xc1,
-0x46, 0x51, 0xa7, 0x4b, 0x56, 0xb7, 0x4f, 0x5b, 0xc5, 0x51, 0x5f, 0xce,
-0x53, 0x60, 0xd1, 0x55, 0x62, 0xd2, 0x4f, 0x5d, 0xd8, 0x40, 0x4d, 0xdc,
-0x36, 0x41, 0xdf, 0x39, 0x45, 0xdf, 0x3d, 0x49, 0xdf, 0x3c, 0x48, 0xdf,
-0x3a, 0x46, 0xde, 0x45, 0x52, 0xde, 0x58, 0x67, 0xde, 0x4c, 0x5b, 0xdf,
-0x46, 0x55, 0xe0, 0x50, 0x5e, 0xb9, 0x56, 0x64, 0xc8, 0x45, 0x54, 0xe2,
-0x47, 0x56, 0xe2, 0x4d, 0x5c, 0xe1, 0x5c, 0x6c, 0xde, 0x16, 0x1c, 0x42,
-0x15, 0x1b, 0x41, 0x14, 0x1a, 0x40, 0x57, 0x68, 0xd7, 0x4e, 0x5e, 0xdc,
-0x50, 0x60, 0xdb, 0xb2, 0xb3, 0x41, 0xe1, 0xdf, 0x2a, 0xd7, 0xd5, 0x1c,
-0xbb, 0xb5, 0x14, 0xd7, 0xd0, 0x1c, 0xd9, 0xd2, 0x1c, 0xd1, 0xcf, 0x1a,
-0xdf, 0xd8, 0x20, 0xde, 0xd8, 0x1f, 0xe1, 0xda, 0x26, 0xdf, 0xd9, 0x22,
-0xdf, 0xd9, 0x22, 0xdd, 0xd6, 0x1c, 0xd5, 0xcf, 0x1c, 0xc5, 0xc3, 0x37,
-0x42, 0x4f, 0xe0, 0x40, 0x4d, 0xe1, 0x3c, 0x49, 0xe0, 0x33, 0x3f, 0xdd,
-0x2d, 0x37, 0xd9, 0x31, 0x3c, 0xd6, 0x37, 0x42, 0xd3, 0x3f, 0x4a, 0xcf,
-0x37, 0x42, 0xcc, 0x32, 0x3c, 0xc8, 0x2e, 0x38, 0xc6, 0x2d, 0x36, 0xc2,
-0x2c, 0x35, 0xbf, 0x2b, 0x34, 0xbc, 0x2d, 0x36, 0xb9, 0x34, 0x3d, 0xb6,
-0x3c, 0x46, 0xb3, 0x45, 0x4f, 0xb1, 0x4a, 0x54, 0xad, 0x45, 0x4f, 0xab,
-0x41, 0x4a, 0xa8, 0x3e, 0x47, 0xa6, 0x3a, 0x43, 0xa3, 0x38, 0x41, 0xa1,
-0x36, 0x3e, 0x9e, 0x33, 0x3c, 0x9c, 0x32, 0x3a, 0x9a, 0x30, 0x38, 0x97,
-0x2e, 0x36, 0x95, 0x2d, 0x34, 0x93, 0x2c, 0x33, 0x90, 0x29, 0x31, 0x8f,
-0x28, 0x2f, 0x8c, 0x27, 0x2e, 0x8a, 0x26, 0x2d, 0x89, 0x25, 0x2c, 0x87,
-0x23, 0x2a, 0x85, 0x22, 0x29, 0x83, 0x22, 0x28, 0x81, 0x22, 0x27, 0x80,
-0x21, 0x26, 0x7e, 0x20, 0x25, 0x7c, 0x1f, 0x25, 0x7a, 0x1f, 0x24, 0x79,
-0x1e, 0x23, 0x78, 0x1d, 0x23, 0x76, 0x1c, 0x22, 0x74, 0x1c, 0x22, 0x73,
-0x1c, 0x22, 0x71, 0x1c, 0x22, 0x70, 0x1d, 0x21, 0x6e, 0x1d, 0x21, 0x6d,
-0x1d, 0x22, 0x6c, 0x1d, 0x21, 0x6b, 0x1c, 0x21, 0x6a, 0x1d, 0x22, 0x69,
-0x1c, 0x21, 0x67, 0x1c, 0x21, 0x66, 0x1c, 0x21, 0x65, 0x1c, 0x21, 0x64,
-0x1c, 0x21, 0x63, 0x1c, 0x21, 0x62, 0x1c, 0x21, 0x61, 0x1c, 0x20, 0x5f,
-0x1b, 0x20, 0x5e, 0x1b, 0x1f, 0x5d, 0x1a, 0x1f, 0x5c, 0x1a, 0x1f, 0x5b,
-0x1a, 0x1e, 0x5a, 0x1a, 0x1e, 0x5a, 0x1a, 0x1e, 0x59, 0x19, 0x1d, 0x58,
-0x18, 0x1d, 0x57, 0x18, 0x1c, 0x56, 0x18, 0x1c, 0x55, 0x18, 0x1c, 0x54,
-0x17, 0x1c, 0x54, 0x17, 0x1b, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x51,
-0x16, 0x1a, 0x50, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x19, 0x4e,
-0x16, 0x19, 0x4e, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, 0x15, 0x19, 0x4c,
-0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49,
-0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47,
-0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45,
-0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42, 0x11, 0x14, 0x41,
-0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40,
-0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e,
-0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05,
-0x16, 0x1a, 0x45, 0x2c, 0x32, 0x8b, 0x2d, 0x35, 0x93, 0x26, 0x2b, 0x7c,
-0x21, 0x27, 0x74, 0x21, 0x26, 0x74, 0x20, 0x26, 0x76, 0x20, 0x26, 0x78,
-0x1f, 0x26, 0x79, 0x1f, 0x26, 0x7b, 0x1f, 0x25, 0x7d, 0x1f, 0x25, 0x7e,
-0x20, 0x26, 0x80, 0x20, 0x27, 0x82, 0x21, 0x28, 0x84, 0x22, 0x28, 0x85,
-0x23, 0x28, 0x87, 0x23, 0x29, 0x89, 0x24, 0x2a, 0x8b, 0x24, 0x2b, 0x8d,
-0x25, 0x2c, 0x8f, 0x26, 0x2e, 0x91, 0x28, 0x2f, 0x93, 0x2a, 0x31, 0x96,
-0x2b, 0x33, 0x97, 0x2c, 0x34, 0x9a, 0x2d, 0x35, 0x9c, 0x2d, 0x35, 0x9f,
-0x2c, 0x35, 0xa1, 0x2d, 0x35, 0xa4, 0x2b, 0x34, 0xa6, 0x2b, 0x34, 0xa8,
-0x2a, 0x32, 0xab, 0x29, 0x31, 0xae, 0x27, 0x2f, 0xb1, 0x27, 0x2f, 0xb4,
-0x2e, 0x37, 0xb7, 0x37, 0x40, 0xb9, 0x46, 0x50, 0xbc, 0x48, 0x52, 0xaf,
-0x4c, 0x58, 0xc0, 0x4e, 0x5a, 0xc5, 0x4e, 0x5a, 0xc8, 0x50, 0x5c, 0xcb,
-0x51, 0x5f, 0xce, 0x4c, 0x59, 0xd1, 0x40, 0x4c, 0xd5, 0x36, 0x41, 0xd8,
-0x36, 0x41, 0xdb, 0x38, 0x44, 0xde, 0x39, 0x44, 0xe0, 0x36, 0x42, 0xdf,
-0x3b, 0x47, 0xdf, 0x4b, 0x58, 0xe0, 0x4e, 0x5b, 0xe0, 0x42, 0x50, 0xe0,
-0x4d, 0x5b, 0xe1, 0x3d, 0x48, 0x88, 0x50, 0x5e, 0xe2, 0x41, 0x4f, 0xe3,
-0x43, 0x51, 0xe2, 0x4b, 0x5a, 0xe1, 0x5c, 0x6c, 0xe0, 0x14, 0x1a, 0x3e,
-0x14, 0x19, 0x3d, 0x13, 0x19, 0x3d, 0x54, 0x64, 0xdd, 0x4a, 0x58, 0xdc,
-0x4b, 0x5a, 0xdc, 0x57, 0x68, 0xdc, 0xa0, 0xa3, 0x66, 0xe0, 0xd9, 0x23,
-0xdb, 0xd4, 0x1c, 0xd1, 0xcf, 0x1a, 0xcb, 0xc4, 0x18, 0xcf, 0xc9, 0x1a,
-0xce, 0xcc, 0x19, 0xdb, 0xd4, 0x1c, 0xe5, 0xdf, 0x34, 0xe2, 0xdc, 0x2d,
-0xd3, 0xcf, 0x18, 0x8c, 0x8a, 0x25, 0x3d, 0x3f, 0x28, 0x3e, 0x48, 0x8d,
-0x47, 0x54, 0xe1, 0x3f, 0x4b, 0xdf, 0x3d, 0x49, 0xdc, 0x39, 0x45, 0xd9,
-0x31, 0x3c, 0xd6, 0x2c, 0x36, 0xd3, 0x2f, 0x3a, 0xcf, 0x37, 0x40, 0xcc,
-0x3c, 0x46, 0xc9, 0x37, 0x40, 0xc6, 0x32, 0x3b, 0xc3, 0x2e, 0x36, 0xc0,
-0x2b, 0x35, 0xbd, 0x2a, 0x33, 0xb9, 0x2a, 0x32, 0xb7, 0x2a, 0x32, 0xb4,
-0x2f, 0x39, 0xb1, 0x36, 0x3f, 0xae, 0x3d, 0x47, 0xac, 0x46, 0x50, 0xa9,
-0x43, 0x4d, 0xa6, 0x40, 0x48, 0xa4, 0x3d, 0x45, 0xa2, 0x39, 0x42, 0x9f,
-0x36, 0x3f, 0x9d, 0x34, 0x3d, 0x9a, 0x32, 0x3a, 0x98, 0x31, 0x39, 0x96,
-0x2f, 0x37, 0x94, 0x2e, 0x35, 0x91, 0x2d, 0x34, 0x90, 0x2b, 0x32, 0x8e,
-0x29, 0x31, 0x8b, 0x28, 0x2f, 0x8a, 0x27, 0x2d, 0x88, 0x25, 0x2c, 0x86,
-0x24, 0x2b, 0x84, 0x23, 0x2a, 0x82, 0x22, 0x29, 0x81, 0x22, 0x27, 0x7f,
-0x21, 0x26, 0x7d, 0x20, 0x26, 0x7b, 0x1f, 0x25, 0x7a, 0x1f, 0x24, 0x79,
-0x1e, 0x23, 0x77, 0x1e, 0x23, 0x75, 0x1d, 0x23, 0x74, 0x1c, 0x22, 0x72,
-0x1c, 0x22, 0x71, 0x1b, 0x21, 0x6f, 0x1b, 0x21, 0x6e, 0x1b, 0x20, 0x6c,
-0x1b, 0x20, 0x6c, 0x1b, 0x20, 0x6b, 0x1b, 0x20, 0x6a, 0x1b, 0x20, 0x68,
-0x1b, 0x20, 0x67, 0x1c, 0x20, 0x66, 0x1b, 0x20, 0x65, 0x1b, 0x1f, 0x63,
-0x1b, 0x20, 0x62, 0x1b, 0x20, 0x61, 0x1b, 0x1f, 0x60, 0x1b, 0x20, 0x5f,
-0x1b, 0x1f, 0x5e, 0x1b, 0x1f, 0x5d, 0x1a, 0x1f, 0x5c, 0x1a, 0x1e, 0x5b,
-0x1a, 0x1e, 0x5a, 0x19, 0x1d, 0x59, 0x19, 0x1d, 0x58, 0x19, 0x1d, 0x57,
-0x18, 0x1d, 0x57, 0x18, 0x1c, 0x56, 0x18, 0x1c, 0x55, 0x17, 0x1b, 0x54,
-0x17, 0x1b, 0x53, 0x17, 0x1b, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x51,
-0x16, 0x1a, 0x50, 0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x19, 0x4e,
-0x15, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x19, 0x4c, 0x14, 0x18, 0x4b,
-0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49,
-0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47,
-0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44,
-0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42, 0x10, 0x14, 0x41,
-0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f,
-0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e,
-0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05,
-0x14, 0x17, 0x45, 0x29, 0x2f, 0x8b, 0x2a, 0x31, 0x90, 0x23, 0x29, 0x7c,
-0x1e, 0x24, 0x72, 0x1e, 0x24, 0x74, 0x1e, 0x24, 0x75, 0x1e, 0x24, 0x77,
-0x1d, 0x24, 0x79, 0x1d, 0x24, 0x7a, 0x1e, 0x25, 0x7c, 0x1f, 0x25, 0x7d,
-0x20, 0x26, 0x7f, 0x20, 0x27, 0x81, 0x21, 0x28, 0x83, 0x21, 0x28, 0x84,
-0x22, 0x28, 0x86, 0x24, 0x29, 0x88, 0x24, 0x2a, 0x8a, 0x24, 0x2c, 0x8b,
-0x26, 0x2d, 0x8e, 0x27, 0x2f, 0x90, 0x29, 0x30, 0x92, 0x2a, 0x31, 0x94,
-0x2a, 0x32, 0x96, 0x2a, 0x32, 0x98, 0x2a, 0x32, 0x9b, 0x2b, 0x33, 0x9d,
-0x2b, 0x32, 0xa0, 0x2a, 0x32, 0xa2, 0x29, 0x31, 0xa4, 0x28, 0x30, 0xa7,
-0x27, 0x2f, 0xa9, 0x27, 0x2e, 0xac, 0x28, 0x30, 0xae, 0x2e, 0x37, 0xb1,
-0x38, 0x41, 0xb4, 0x46, 0x51, 0xb7, 0x4c, 0x57, 0xb9, 0x4a, 0x55, 0xbc,
-0x4a, 0x56, 0xbf, 0x4b, 0x56, 0xc2, 0x4c, 0x57, 0xc5, 0x4e, 0x5a, 0xc8,
-0x4a, 0x57, 0xcb, 0x3f, 0x4b, 0xce, 0x36, 0x40, 0xd1, 0x35, 0x40, 0xd4,
-0x36, 0x41, 0xd7, 0x37, 0x43, 0xda, 0x34, 0x40, 0xdd, 0x33, 0x3e, 0xe0,
-0x3f, 0x4b, 0xe0, 0x4f, 0x5d, 0xe0, 0x42, 0x50, 0xe1, 0x3d, 0x49, 0xe1,
-0x54, 0x62, 0xe2, 0x5d, 0x6c, 0xe1, 0x42, 0x50, 0xe3, 0x3e, 0x4b, 0xe3,
-0x40, 0x4e, 0xe3, 0x4a, 0x58, 0xe2, 0x5c, 0x6c, 0xe1, 0x13, 0x18, 0x3b,
-0x13, 0x18, 0x3b, 0x12, 0x17, 0x3a, 0x4d, 0x5c, 0xde, 0x45, 0x53, 0xde,
-0x47, 0x55, 0xdd, 0x52, 0x61, 0xdd, 0x49, 0x56, 0xdd, 0x65, 0x6e, 0xae,
-0x9d, 0x9f, 0x66, 0xd2, 0xcd, 0x1f, 0xd4, 0xcd, 0x1b, 0xd4, 0xcd, 0x1b,
-0xc1, 0xbf, 0x16, 0x9f, 0x9c, 0x18, 0x97, 0x97, 0x3a, 0x74, 0x7e, 0xa3,
-0x55, 0x63, 0xcc, 0x4e, 0x5a, 0xb6, 0x1c, 0x22, 0x49, 0x0d, 0x11, 0x2f,
-0x58, 0x66, 0xde, 0x3e, 0x4a, 0xdb, 0x3c, 0x48, 0xd7, 0x3c, 0x47, 0xd5,
-0x36, 0x41, 0xd2, 0x2f, 0x3a, 0xcf, 0x2b, 0x35, 0xcc, 0x2f, 0x39, 0xc9,
-0x34, 0x3e, 0xc6, 0x3b, 0x45, 0xc3, 0x34, 0x3e, 0xc0, 0x31, 0x39, 0xbd,
-0x2d, 0x36, 0xba, 0x2b, 0x34, 0xb7, 0x2a, 0x32, 0xb5, 0x2a, 0x32, 0xb2,
-0x29, 0x31, 0xaf, 0x2c, 0x34, 0xac, 0x31, 0x3a, 0xa9, 0x37, 0x40, 0xa7,
-0x3e, 0x47, 0xa5, 0x42, 0x4c, 0xa2, 0x3e, 0x47, 0xa0, 0x3b, 0x44, 0x9e,
-0x38, 0x40, 0x9b, 0x35, 0x3d, 0x99, 0x33, 0x3b, 0x97, 0x31, 0x39, 0x94,
-0x30, 0x37, 0x93, 0x2e, 0x36, 0x90, 0x2d, 0x34, 0x8f, 0x2b, 0x32, 0x8c,
-0x2b, 0x32, 0x8a, 0x29, 0x30, 0x89, 0x28, 0x2e, 0x87, 0x27, 0x2d, 0x85,
-0x25, 0x2c, 0x83, 0x24, 0x2b, 0x82, 0x23, 0x2a, 0x80, 0x22, 0x28, 0x7e,
-0x21, 0x27, 0x7c, 0x20, 0x26, 0x7a, 0x20, 0x26, 0x79, 0x1f, 0x24, 0x78,
-0x1e, 0x23, 0x76, 0x1e, 0x23, 0x75, 0x1d, 0x22, 0x73, 0x1c, 0x22, 0x72,
-0x1c, 0x21, 0x70, 0x1c, 0x21, 0x6f, 0x1b, 0x20, 0x6e, 0x1a, 0x20, 0x6c,
-0x1a, 0x1f, 0x6c, 0x1a, 0x1f, 0x6a, 0x1a, 0x1f, 0x69, 0x1a, 0x1f, 0x68,
-0x1a, 0x1f, 0x67, 0x19, 0x1e, 0x65, 0x1a, 0x1e, 0x64, 0x1a, 0x1e, 0x63,
-0x1a, 0x1e, 0x62, 0x1a, 0x1e, 0x61, 0x1a, 0x1e, 0x60, 0x1a, 0x1f, 0x5f,
-0x19, 0x1e, 0x5e, 0x1a, 0x1e, 0x5d, 0x1a, 0x1e, 0x5c, 0x19, 0x1e, 0x5b,
-0x1a, 0x1e, 0x5a, 0x19, 0x1d, 0x59, 0x19, 0x1d, 0x58, 0x18, 0x1c, 0x57,
-0x18, 0x1c, 0x56, 0x18, 0x1c, 0x56, 0x18, 0x1c, 0x55, 0x17, 0x1b, 0x54,
-0x17, 0x1b, 0x53, 0x17, 0x1b, 0x52, 0x17, 0x1b, 0x52, 0x16, 0x1a, 0x51,
-0x16, 0x1a, 0x50, 0x16, 0x1a, 0x4f, 0x16, 0x1a, 0x4f, 0x16, 0x19, 0x4e,
-0x15, 0x19, 0x4d, 0x15, 0x19, 0x4d, 0x15, 0x18, 0x4c, 0x14, 0x18, 0x4b,
-0x14, 0x18, 0x4b, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49,
-0x13, 0x16, 0x48, 0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45,
-0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44,
-0x12, 0x15, 0x44, 0x12, 0x14, 0x43, 0x11, 0x14, 0x42, 0x10, 0x14, 0x41,
-0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f,
-0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e,
-0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05,
-0x13, 0x16, 0x45, 0x25, 0x2d, 0x8a, 0x27, 0x2e, 0x90, 0x21, 0x27, 0x7b,
-0x1d, 0x22, 0x72, 0x1d, 0x22, 0x74, 0x1d, 0x22, 0x75, 0x1d, 0x23, 0x76,
-0x1d, 0x23, 0x78, 0x1e, 0x24, 0x7a, 0x1e, 0x25, 0x7b, 0x1f, 0x25, 0x7d,
-0x20, 0x26, 0x7e, 0x21, 0x27, 0x80, 0x21, 0x27, 0x82, 0x22, 0x28, 0x84,
-0x23, 0x28, 0x85, 0x24, 0x2a, 0x87, 0x24, 0x2b, 0x89, 0x26, 0x2d, 0x8b,
-0x26, 0x2e, 0x8c, 0x28, 0x2f, 0x8f, 0x29, 0x30, 0x91, 0x29, 0x30, 0x93,
-0x29, 0x30, 0x95, 0x29, 0x30, 0x97, 0x29, 0x30, 0x99, 0x29, 0x30, 0x9b,
-0x28, 0x30, 0x9e, 0x27, 0x2f, 0xa0, 0x26, 0x2e, 0xa3, 0x26, 0x2d, 0xa5,
-0x24, 0x2d, 0xa7, 0x28, 0x31, 0xaa, 0x2f, 0x38, 0xad, 0x38, 0x41, 0xaf,
-0x45, 0x50, 0xb2, 0x48, 0x52, 0xb4, 0x47, 0x52, 0xb7, 0x48, 0x52, 0xba,
-0x47, 0x53, 0xbc, 0x49, 0x54, 0xbf, 0x4b, 0x56, 0xc2, 0x49, 0x55, 0xc5,
-0x3f, 0x49, 0xc7, 0x36, 0x40, 0xcb, 0x33, 0x3d, 0xce, 0x35, 0x3f, 0xd1,
-0x37, 0x41, 0xd3, 0x34, 0x3f, 0xd6, 0x32, 0x3d, 0xd9, 0x38, 0x43, 0xdc,
-0x44, 0x50, 0xdf, 0x43, 0x50, 0xe2, 0x3a, 0x46, 0xe2, 0x42, 0x4f, 0xe2,
-0x5c, 0x6b, 0xe3, 0x4c, 0x5a, 0xe3, 0x39, 0x45, 0xe4, 0x3b, 0x47, 0xe4,
-0x3f, 0x4b, 0xe3, 0x49, 0x56, 0xe2, 0x5d, 0x6c, 0xe2, 0x12, 0x17, 0x39,
-0x11, 0x16, 0x38, 0x21, 0x29, 0x54, 0x47, 0x56, 0xdf, 0x41, 0x4f, 0xde,
-0x42, 0x50, 0xde, 0x4c, 0x5a, 0xde, 0x46, 0x53, 0xde, 0x3d, 0x4a, 0xde,
-0x3f, 0x4c, 0xde, 0x3b, 0x47, 0xdf, 0x32, 0x3e, 0xdf, 0x3e, 0x4b, 0xdf,
-0x54, 0x62, 0xdf, 0x44, 0x4f, 0x9c, 0x35, 0x3f, 0x7b, 0x56, 0x63, 0xcf,
-0x59, 0x68, 0xe1, 0x5a, 0x68, 0xe1, 0x48, 0x54, 0xa8, 0x0d, 0x11, 0x30,
-0x2e, 0x35, 0x69, 0x4b, 0x58, 0xd7, 0x3b, 0x47, 0xd4, 0x3a, 0x46, 0xd1,
-0x3a, 0x44, 0xce, 0x34, 0x3e, 0xcc, 0x2f, 0x38, 0xc8, 0x2a, 0x33, 0xc6,
-0x2e, 0x37, 0xc3, 0x33, 0x3d, 0xc0, 0x39, 0x42, 0xbd, 0x33, 0x3d, 0xbb,
-0x2f, 0x39, 0xb8, 0x2c, 0x34, 0xb5, 0x2a, 0x32, 0xb3, 0x29, 0x31, 0xb0,
-0x28, 0x30, 0xad, 0x27, 0x2f, 0xaa, 0x29, 0x31, 0xa8, 0x2d, 0x35, 0xa6,
-0x33, 0x3c, 0xa3, 0x39, 0x41, 0xa1, 0x3f, 0x48, 0x9e, 0x3d, 0x45, 0x9c,
-0x3a, 0x42, 0x99, 0x37, 0x40, 0x98, 0x35, 0x3c, 0x95, 0x31, 0x3a, 0x94,
-0x30, 0x37, 0x91, 0x2e, 0x37, 0x8f, 0x2d, 0x35, 0x8d, 0x2d, 0x33, 0x8b,
-0x2b, 0x31, 0x89, 0x2a, 0x31, 0x88, 0x28, 0x2f, 0x86, 0x27, 0x2e, 0x84,
-0x27, 0x2d, 0x82, 0x25, 0x2b, 0x81, 0x23, 0x2a, 0x7f, 0x22, 0x29, 0x7d,
-0x21, 0x28, 0x7b, 0x21, 0x27, 0x7a, 0x20, 0x26, 0x78, 0x20, 0x25, 0x77,
-0x1f, 0x24, 0x76, 0x1e, 0x23, 0x74, 0x1e, 0x22, 0x73, 0x1d, 0x22, 0x71,
-0x1c, 0x21, 0x70, 0x1c, 0x21, 0x6e, 0x1b, 0x20, 0x6d, 0x1b, 0x1f, 0x6b,
-0x1a, 0x1f, 0x6b, 0x1a, 0x1e, 0x69, 0x19, 0x1e, 0x69, 0x19, 0x1d, 0x67,
-0x19, 0x1d, 0x66, 0x19, 0x1d, 0x65, 0x19, 0x1d, 0x64, 0x19, 0x1d, 0x63,
-0x19, 0x1d, 0x62, 0x19, 0x1d, 0x61, 0x19, 0x1d, 0x60, 0x19, 0x1d, 0x5e,
-0x18, 0x1d, 0x5d, 0x19, 0x1d, 0x5d, 0x19, 0x1d, 0x5c, 0x18, 0x1d, 0x5b,
-0x19, 0x1d, 0x5a, 0x18, 0x1d, 0x59, 0x18, 0x1c, 0x58, 0x18, 0x1c, 0x57,
-0x18, 0x1c, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x54, 0x17, 0x1b, 0x54,
-0x17, 0x1b, 0x53, 0x17, 0x1b, 0x52, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x51,
-0x16, 0x1a, 0x50, 0x16, 0x19, 0x4f, 0x15, 0x19, 0x4e, 0x15, 0x19, 0x4e,
-0x15, 0x19, 0x4d, 0x15, 0x18, 0x4c, 0x15, 0x18, 0x4c, 0x14, 0x18, 0x4b,
-0x14, 0x18, 0x4a, 0x14, 0x18, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49,
-0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45,
-0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44,
-0x12, 0x15, 0x44, 0x11, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x14, 0x41,
-0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f,
-0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d,
-0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05,
-0x12, 0x16, 0x44, 0x24, 0x2b, 0x8a, 0x25, 0x2c, 0x8f, 0x1f, 0x25, 0x7a,
-0x1c, 0x21, 0x72, 0x1c, 0x21, 0x72, 0x1d, 0x22, 0x74, 0x1d, 0x23, 0x76,
-0x1d, 0x23, 0x77, 0x1e, 0x24, 0x79, 0x1e, 0x25, 0x7b, 0x1f, 0x25, 0x7c,
-0x1f, 0x26, 0x7d, 0x20, 0x27, 0x7f, 0x21, 0x27, 0x81, 0x22, 0x28, 0x83,
-0x23, 0x29, 0x84, 0x24, 0x2a, 0x86, 0x25, 0x2c, 0x88, 0x26, 0x2e, 0x8a,
-0x27, 0x2e, 0x8b, 0x27, 0x2f, 0x8d, 0x27, 0x2f, 0x90, 0x27, 0x2f, 0x91,
-0x28, 0x2f, 0x94, 0x27, 0x2f, 0x96, 0x27, 0x2f, 0x98, 0x26, 0x2d, 0x9a,
-0x25, 0x2d, 0x9c, 0x25, 0x2c, 0x9f, 0x24, 0x2b, 0xa1, 0x24, 0x2c, 0xa3,
-0x29, 0x31, 0xa6, 0x2f, 0x38, 0xa8, 0x38, 0x41, 0xaa, 0x44, 0x4e, 0xad,
-0x44, 0x4e, 0xb0, 0x44, 0x4f, 0xb2, 0x44, 0x4e, 0xb4, 0x45, 0x4f, 0xb7,
-0x46, 0x50, 0xba, 0x47, 0x53, 0xbc, 0x47, 0x51, 0xbf, 0x3d, 0x48, 0xc2,
-0x36, 0x40, 0xc5, 0x31, 0x3b, 0xc8, 0x33, 0x3d, 0xca, 0x35, 0x3f, 0xcd,
-0x34, 0x3e, 0xd0, 0x32, 0x3c, 0xd2, 0x33, 0x3e, 0xd5, 0x3d, 0x49, 0xd8,
-0x46, 0x52, 0xdb, 0x3c, 0x47, 0xde, 0x36, 0x42, 0xe1, 0x48, 0x54, 0xe3,
-0x59, 0x67, 0xe4, 0x40, 0x4d, 0xe4, 0x36, 0x42, 0xe5, 0x38, 0x44, 0xe4,
-0x3d, 0x49, 0xe3, 0x47, 0x54, 0xe3, 0x5d, 0x6b, 0xe1, 0x19, 0x1f, 0x44,
-0x10, 0x15, 0x36, 0x41, 0x4c, 0x93, 0x42, 0x50, 0xe0, 0x3d, 0x4a, 0xe0,
-0x3e, 0x4b, 0xe0, 0x47, 0x54, 0xdf, 0x43, 0x50, 0xdf, 0x39, 0x45, 0xdf,
-0x3b, 0x48, 0xdf, 0x39, 0x46, 0xdf, 0x30, 0x3c, 0xdf, 0x35, 0x42, 0xe0,
-0x48, 0x56, 0xe0, 0x5b, 0x6a, 0xe0, 0x35, 0x3f, 0x7a, 0x56, 0x64, 0xd0,
-0x53, 0x61, 0xdf, 0x55, 0x62, 0xdd, 0x57, 0x64, 0xda, 0x39, 0x42, 0x82,
-0x0b, 0x10, 0x2b, 0x4b, 0x56, 0xb0, 0x43, 0x4f, 0xd1, 0x3a, 0x44, 0xce,
-0x39, 0x43, 0xcb, 0x38, 0x42, 0xc8, 0x32, 0x3c, 0xc6, 0x2c, 0x36, 0xc3,
-0x2a, 0x32, 0xc0, 0x2e, 0x36, 0xbd, 0x31, 0x3b, 0xbb, 0x37, 0x40, 0xb8,
-0x32, 0x3b, 0xb5, 0x2e, 0x37, 0xb3, 0x2b, 0x33, 0xb1, 0x29, 0x30, 0xad,
-0x28, 0x30, 0xab, 0x27, 0x30, 0xa9, 0x26, 0x2e, 0xa6, 0x26, 0x2f, 0xa4,
-0x2a, 0x33, 0xa2, 0x2f, 0x37, 0x9f, 0x34, 0x3b, 0x9d, 0x39, 0x41, 0x9a,
-0x3c, 0x44, 0x98, 0x39, 0x41, 0x96, 0x36, 0x3e, 0x94, 0x34, 0x3c, 0x92,
-0x31, 0x39, 0x90, 0x2f, 0x37, 0x8e, 0x2d, 0x35, 0x8c, 0x2d, 0x33, 0x8a,
-0x2c, 0x32, 0x89, 0x2a, 0x31, 0x87, 0x29, 0x30, 0x85, 0x27, 0x2f, 0x83,
-0x27, 0x2d, 0x81, 0x26, 0x2c, 0x80, 0x25, 0x2a, 0x7e, 0x23, 0x29, 0x7c,
-0x22, 0x29, 0x7b, 0x21, 0x28, 0x79, 0x20, 0x26, 0x78, 0x20, 0x25, 0x77,
-0x1f, 0x24, 0x75, 0x1e, 0x23, 0x73, 0x1e, 0x23, 0x72, 0x1d, 0x22, 0x70,
-0x1c, 0x21, 0x6f, 0x1c, 0x21, 0x6e, 0x1b, 0x20, 0x6c, 0x1b, 0x1f, 0x6b,
-0x1a, 0x1f, 0x6a, 0x1a, 0x1e, 0x69, 0x1a, 0x1e, 0x68, 0x19, 0x1d, 0x67,
-0x19, 0x1d, 0x66, 0x18, 0x1c, 0x65, 0x17, 0x1c, 0x63, 0x18, 0x1c, 0x62,
-0x18, 0x1c, 0x61, 0x18, 0x1c, 0x60, 0x18, 0x1c, 0x5f, 0x18, 0x1c, 0x5e,
-0x18, 0x1c, 0x5d, 0x17, 0x1c, 0x5c, 0x17, 0x1c, 0x5b, 0x18, 0x1c, 0x5a,
-0x18, 0x1c, 0x59, 0x18, 0x1c, 0x58, 0x18, 0x1c, 0x58, 0x18, 0x1c, 0x57,
-0x17, 0x1b, 0x56, 0x17, 0x1b, 0x55, 0x17, 0x1b, 0x54, 0x17, 0x1b, 0x53,
-0x17, 0x1b, 0x53, 0x16, 0x1a, 0x52, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x50,
-0x16, 0x1a, 0x50, 0x16, 0x19, 0x4f, 0x15, 0x19, 0x4e, 0x15, 0x19, 0x4e,
-0x15, 0x19, 0x4d, 0x15, 0x18, 0x4c, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b,
-0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49,
-0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45,
-0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44,
-0x12, 0x15, 0x44, 0x11, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x14, 0x41,
-0x10, 0x14, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f,
-0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d,
-0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05,
-0x11, 0x14, 0x44, 0x23, 0x28, 0x89, 0x24, 0x2a, 0x8e, 0x1f, 0x25, 0x7a,
-0x1c, 0x21, 0x71, 0x1c, 0x21, 0x72, 0x1d, 0x22, 0x74, 0x1d, 0x22, 0x75,
-0x1d, 0x23, 0x76, 0x1e, 0x24, 0x78, 0x1e, 0x25, 0x7a, 0x1f, 0x25, 0x7b,
-0x20, 0x26, 0x7d, 0x21, 0x27, 0x7e, 0x22, 0x28, 0x80, 0x23, 0x29, 0x82,
-0x24, 0x2a, 0x84, 0x24, 0x2b, 0x85, 0x25, 0x2d, 0x87, 0x26, 0x2d, 0x89,
-0x26, 0x2e, 0x8b, 0x26, 0x2d, 0x8c, 0x26, 0x2d, 0x8e, 0x26, 0x2e, 0x91,
-0x25, 0x2d, 0x92, 0x25, 0x2c, 0x94, 0x25, 0x2c, 0x96, 0x24, 0x2b, 0x99,
-0x23, 0x2a, 0x9b, 0x22, 0x2a, 0x9d, 0x25, 0x2c, 0x9f, 0x29, 0x30, 0xa1,
-0x30, 0x38, 0xa3, 0x39, 0x41, 0xa6, 0x40, 0x4a, 0xa8, 0x41, 0x4a, 0xaa,
-0x40, 0x4b, 0xad, 0x41, 0x4b, 0xb0, 0x41, 0x4b, 0xb2, 0x43, 0x4e, 0xb5,
-0x45, 0x4f, 0xb7, 0x45, 0x4f, 0xba, 0x3c, 0x46, 0xbc, 0x35, 0x3f, 0xbf,
-0x30, 0x3a, 0xc1, 0x31, 0x3c, 0xc4, 0x33, 0x3d, 0xc7, 0x33, 0x3d, 0xc9,
-0x32, 0x3c, 0xcc, 0x2f, 0x3a, 0xcf, 0x38, 0x43, 0xd1, 0x42, 0x4e, 0xd4,
-0x3e, 0x4a, 0xd7, 0x36, 0x42, 0xd9, 0x3c, 0x47, 0xdc, 0x4f, 0x5c, 0xdf,
-0x49, 0x56, 0xe2, 0x37, 0x42, 0xe4, 0x33, 0x3e, 0xe5, 0x35, 0x41, 0xe5,
-0x3c, 0x47, 0xe4, 0x45, 0x52, 0xe3, 0x5d, 0x6c, 0xe3, 0x27, 0x2e, 0x5c,
-0x10, 0x14, 0x34, 0x54, 0x60, 0xc6, 0x3e, 0x4a, 0xe1, 0x3a, 0x46, 0xe1,
-0x3b, 0x46, 0xe0, 0x43, 0x50, 0xe0, 0x40, 0x4d, 0xe0, 0x38, 0x43, 0xe0,
-0x37, 0x44, 0xe0, 0x39, 0x44, 0xe0, 0x30, 0x3b, 0xe0, 0x2f, 0x3a, 0xe1,
-0x3e, 0x4a, 0xe1, 0x4f, 0x5d, 0xe0, 0x4f, 0x5c, 0xba, 0x4f, 0x5b, 0xb9,
-0x54, 0x61, 0xdb, 0x51, 0x5d, 0xd8, 0x52, 0x60, 0xd6, 0x50, 0x5b, 0xc0,
-0x2a, 0x31, 0x61, 0x1e, 0x25, 0x4a, 0x4e, 0x5b, 0xcc, 0x3b, 0x46, 0xca,
-0x37, 0x42, 0xc8, 0x37, 0x41, 0xc5, 0x35, 0x3f, 0xc2, 0x2f, 0x39, 0xc0,
-0x2a, 0x34, 0xbd, 0x29, 0x31, 0xbb, 0x2d, 0x36, 0xb8, 0x30, 0x39, 0xb6,
-0x35, 0x3d, 0xb3, 0x31, 0x39, 0xb1, 0x2d, 0x36, 0xae, 0x2a, 0x32, 0xab,
-0x28, 0x30, 0xa9, 0x27, 0x2f, 0xa6, 0x25, 0x2e, 0xa4, 0x25, 0x2d, 0xa2,
-0x25, 0x2c, 0xa0, 0x27, 0x2f, 0x9d, 0x2b, 0x32, 0x9b, 0x30, 0x37, 0x99,
-0x34, 0x3c, 0x97, 0x39, 0x40, 0x94, 0x38, 0x3f, 0x93, 0x35, 0x3d, 0x91,
-0x33, 0x3a, 0x8e, 0x31, 0x38, 0x8d, 0x2f, 0x35, 0x8b, 0x2d, 0x34, 0x89,
-0x2c, 0x33, 0x88, 0x2b, 0x31, 0x86, 0x29, 0x30, 0x84, 0x28, 0x2f, 0x82,
-0x27, 0x2d, 0x81, 0x26, 0x2c, 0x7f, 0x25, 0x2b, 0x7d, 0x24, 0x2a, 0x7b,
-0x23, 0x29, 0x7a, 0x22, 0x28, 0x78, 0x20, 0x27, 0x77, 0x20, 0x26, 0x76,
-0x20, 0x25, 0x74, 0x1f, 0x24, 0x73, 0x1e, 0x23, 0x71, 0x1d, 0x22, 0x70,
-0x1d, 0x21, 0x6e, 0x1c, 0x21, 0x6d, 0x1c, 0x20, 0x6c, 0x1b, 0x1f, 0x6b,
-0x1a, 0x1f, 0x69, 0x1a, 0x1f, 0x69, 0x1a, 0x1e, 0x68, 0x19, 0x1d, 0x66,
-0x18, 0x1d, 0x65, 0x18, 0x1c, 0x64, 0x18, 0x1c, 0x63, 0x18, 0x1b, 0x62,
-0x17, 0x1b, 0x61, 0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1b, 0x5e,
-0x17, 0x1b, 0x5d, 0x17, 0x1b, 0x5c, 0x16, 0x1b, 0x5b, 0x17, 0x1b, 0x5a,
-0x17, 0x1b, 0x59, 0x17, 0x1b, 0x58, 0x17, 0x1b, 0x57, 0x16, 0x1a, 0x56,
-0x17, 0x1b, 0x56, 0x16, 0x1a, 0x55, 0x16, 0x1a, 0x54, 0x16, 0x1a, 0x53,
-0x16, 0x1a, 0x52, 0x16, 0x1a, 0x52, 0x16, 0x1a, 0x51, 0x16, 0x1a, 0x50,
-0x16, 0x19, 0x4f, 0x16, 0x19, 0x4f, 0x15, 0x19, 0x4e, 0x15, 0x19, 0x4d,
-0x15, 0x19, 0x4d, 0x15, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b,
-0x14, 0x18, 0x4a, 0x13, 0x17, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48,
-0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45,
-0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x15, 0x44, 0x12, 0x14, 0x44,
-0x11, 0x14, 0x43, 0x10, 0x14, 0x42, 0x10, 0x14, 0x41, 0x10, 0x14, 0x41,
-0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f,
-0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d,
-0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05,
-0x11, 0x14, 0x44, 0x23, 0x28, 0x89, 0x24, 0x2a, 0x8e, 0x20, 0x24, 0x79,
-0x1c, 0x21, 0x71, 0x1c, 0x22, 0x72, 0x1c, 0x22, 0x73, 0x1d, 0x23, 0x74,
-0x1d, 0x23, 0x76, 0x1e, 0x24, 0x77, 0x1e, 0x25, 0x79, 0x1f, 0x26, 0x7b,
-0x20, 0x26, 0x7c, 0x21, 0x27, 0x7d, 0x22, 0x28, 0x7f, 0x23, 0x29, 0x81,
-0x24, 0x2b, 0x83, 0x24, 0x2b, 0x84, 0x24, 0x2b, 0x85, 0x24, 0x2b, 0x87,
-0x24, 0x2c, 0x8a, 0x24, 0x2b, 0x8b, 0x24, 0x2c, 0x8d, 0x25, 0x2b, 0x8f,
-0x24, 0x2b, 0x91, 0x23, 0x2a, 0x93, 0x22, 0x2a, 0x95, 0x22, 0x29, 0x97,
-0x21, 0x29, 0x99, 0x25, 0x2c, 0x9b, 0x29, 0x31, 0x9d, 0x2f, 0x38, 0x9f,
-0x39, 0x41, 0xa2, 0x3e, 0x48, 0xa4, 0x3e, 0x48, 0xa6, 0x3e, 0x48, 0xa9,
-0x3f, 0x47, 0xab, 0x3e, 0x48, 0xad, 0x40, 0x4b, 0xb0, 0x41, 0x4b, 0xb2,
-0x43, 0x4c, 0xb4, 0x3b, 0x44, 0xb7, 0x34, 0x3d, 0xb9, 0x2e, 0x38, 0xbc,
-0x30, 0x3a, 0xbf, 0x31, 0x3b, 0xc1, 0x33, 0x3d, 0xc3, 0x30, 0x3b, 0xc5,
-0x2f, 0x39, 0xc8, 0x33, 0x3e, 0xcb, 0x3c, 0x46, 0xce, 0x41, 0x4d, 0xd0,
-0x39, 0x44, 0xd3, 0x34, 0x3e, 0xd5, 0x41, 0x4d, 0xd8, 0x56, 0x63, 0xdb,
-0x40, 0x4c, 0xdd, 0x31, 0x3b, 0xdf, 0x32, 0x3d, 0xe1, 0x33, 0x3f, 0xe2,
-0x3b, 0x46, 0xe3, 0x45, 0x52, 0xe4, 0x5c, 0x6a, 0xe3, 0x37, 0x41, 0x7c,
-0x20, 0x27, 0x4f, 0x58, 0x67, 0xe2, 0x3a, 0x46, 0xe1, 0x37, 0x43, 0xe1,
-0x37, 0x43, 0xe1, 0x3e, 0x4b, 0xe1, 0x3e, 0x4a, 0xe1, 0x35, 0x41, 0xe1,
-0x35, 0x40, 0xe1, 0x36, 0x42, 0xe1, 0x2f, 0x3a, 0xe0, 0x2a, 0x34, 0xde,
-0x37, 0x42, 0xdd, 0x48, 0x55, 0xdb, 0x56, 0x64, 0xda, 0x46, 0x52, 0xa3,
-0x56, 0x62, 0xd6, 0x4d, 0x5a, 0xd4, 0x4f, 0x5c, 0xd2, 0x4f, 0x5c, 0xd0,
-0x45, 0x50, 0xa1, 0x20, 0x25, 0x4d, 0x3d, 0x47, 0x8c, 0x46, 0x51, 0xc6,
-0x37, 0x41, 0xc4, 0x36, 0x40, 0xc1, 0x35, 0x3f, 0xbf, 0x33, 0x3d, 0xbd,
-0x2d, 0x36, 0xba, 0x2a, 0x32, 0xb8, 0x28, 0x30, 0xb5, 0x2b, 0x34, 0xb3,
-0x2e, 0x38, 0xb1, 0x32, 0x3b, 0xae, 0x2f, 0x38, 0xac, 0x2c, 0x34, 0xa9,
-0x29, 0x31, 0xa7, 0x26, 0x2e, 0xa5, 0x26, 0x2e, 0xa2, 0x25, 0x2d, 0xa0,
-0x24, 0x2c, 0x9e, 0x24, 0x2b, 0x9c, 0x25, 0x2c, 0x99, 0x28, 0x30, 0x98,
-0x2c, 0x33, 0x95, 0x30, 0x38, 0x93, 0x34, 0x3c, 0x91, 0x36, 0x3f, 0x8f,
-0x34, 0x3b, 0x8d, 0x31, 0x39, 0x8c, 0x30, 0x37, 0x8a, 0x2d, 0x35, 0x87,
-0x2c, 0x33, 0x86, 0x2a, 0x31, 0x84, 0x2a, 0x30, 0x83, 0x28, 0x2f, 0x81,
-0x27, 0x2e, 0x7f, 0x26, 0x2c, 0x7e, 0x25, 0x2b, 0x7c, 0x25, 0x2b, 0x7b,
-0x24, 0x29, 0x79, 0x22, 0x29, 0x78, 0x21, 0x28, 0x77, 0x20, 0x27, 0x75,
-0x1f, 0x26, 0x74, 0x1f, 0x25, 0x72, 0x1f, 0x24, 0x71, 0x1e, 0x23, 0x6f,
-0x1d, 0x22, 0x6e, 0x1d, 0x21, 0x6d, 0x1c, 0x20, 0x6b, 0x1b, 0x20, 0x6b,
-0x1a, 0x1f, 0x69, 0x1a, 0x1f, 0x68, 0x19, 0x1e, 0x67, 0x19, 0x1e, 0x66,
-0x19, 0x1d, 0x65, 0x18, 0x1d, 0x64, 0x18, 0x1c, 0x63, 0x18, 0x1c, 0x62,
-0x17, 0x1b, 0x61, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e, 0x16, 0x1a, 0x5d,
-0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a,
-0x16, 0x1a, 0x59, 0x16, 0x1a, 0x58, 0x16, 0x1a, 0x57, 0x16, 0x1a, 0x56,
-0x15, 0x19, 0x55, 0x16, 0x1a, 0x55, 0x15, 0x19, 0x54, 0x16, 0x1a, 0x53,
-0x15, 0x19, 0x52, 0x15, 0x19, 0x51, 0x15, 0x19, 0x51, 0x15, 0x19, 0x50,
-0x15, 0x19, 0x4f, 0x16, 0x19, 0x4f, 0x15, 0x19, 0x4e, 0x15, 0x19, 0x4d,
-0x15, 0x19, 0x4d, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x18, 0x4b,
-0x14, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48,
-0x13, 0x16, 0x48, 0x13, 0x16, 0x47, 0x13, 0x16, 0x46, 0x12, 0x15, 0x45,
-0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44,
-0x11, 0x14, 0x43, 0x10, 0x14, 0x42, 0x10, 0x14, 0x41, 0x10, 0x14, 0x41,
-0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f,
-0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d,
-0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x05,
-0x11, 0x14, 0x44, 0x22, 0x28, 0x87, 0x24, 0x2a, 0x8d, 0x1f, 0x24, 0x79,
-0x1b, 0x21, 0x70, 0x1b, 0x21, 0x71, 0x1c, 0x22, 0x72, 0x1c, 0x22, 0x73,
-0x1d, 0x23, 0x75, 0x1e, 0x24, 0x76, 0x1f, 0x25, 0x78, 0x20, 0x26, 0x7a,
-0x20, 0x26, 0x7b, 0x21, 0x27, 0x7d, 0x22, 0x28, 0x7e, 0x24, 0x2a, 0x80,
-0x23, 0x29, 0x81, 0x23, 0x29, 0x83, 0x23, 0x2a, 0x84, 0x24, 0x2a, 0x86,
-0x24, 0x2a, 0x88, 0x24, 0x2a, 0x8a, 0x23, 0x29, 0x8b, 0x23, 0x2a, 0x8e,
-0x22, 0x29, 0x90, 0x21, 0x29, 0x91, 0x21, 0x28, 0x93, 0x21, 0x29, 0x96,
-0x25, 0x2c, 0x97, 0x2a, 0x31, 0x9a, 0x30, 0x38, 0x9b, 0x37, 0x41, 0x9e,
-0x3c, 0x45, 0xa0, 0x3c, 0x45, 0xa2, 0x3c, 0x45, 0xa4, 0x3b, 0x44, 0xa6,
-0x3c, 0x46, 0xa9, 0x3e, 0x47, 0xab, 0x3f, 0x49, 0xae, 0x40, 0x4b, 0xb0,
-0x39, 0x43, 0xb2, 0x33, 0x3d, 0xb4, 0x2e, 0x37, 0xb7, 0x2e, 0x37, 0xb9,
-0x30, 0x3a, 0xbc, 0x32, 0x3b, 0xbe, 0x30, 0x3a, 0xc0, 0x2e, 0x38, 0xc2,
-0x2f, 0x3a, 0xc5, 0x37, 0x41, 0xc8, 0x3f, 0x4a, 0xca, 0x3b, 0x45, 0xcc,
-0x34, 0x3f, 0xcf, 0x38, 0x43, 0xd1, 0x46, 0x53, 0xd4, 0x4a, 0x56, 0xd6,
-0x39, 0x43, 0xd9, 0x31, 0x3b, 0xdb, 0x33, 0x3d, 0xdc, 0x34, 0x3f, 0xdd,
-0x3c, 0x47, 0xde, 0x47, 0x54, 0xdf, 0x59, 0x67, 0xd9, 0x3c, 0x45, 0x87,
-0x2b, 0x32, 0x62, 0x52, 0x5f, 0xdf, 0x36, 0x42, 0xe0, 0x35, 0x40, 0xe0,
-0x34, 0x40, 0xe0, 0x3b, 0x46, 0xdf, 0x3c, 0x48, 0xde, 0x35, 0x40, 0xde,
-0x33, 0x3e, 0xdd, 0x34, 0x3f, 0xdc, 0x30, 0x3b, 0xdb, 0x2a, 0x34, 0xda,
-0x31, 0x3c, 0xd8, 0x41, 0x4d, 0xd7, 0x4e, 0x5a, 0xd5, 0x49, 0x54, 0xab,
-0x52, 0x5d, 0xc5, 0x4d, 0x59, 0xd0, 0x4c, 0x58, 0xce, 0x4b, 0x58, 0xcc,
-0x51, 0x5d, 0xca, 0x3a, 0x43, 0x85, 0x17, 0x1c, 0x3c, 0x4d, 0x59, 0xbd,
-0x3e, 0x49, 0xc1, 0x35, 0x3f, 0xbe, 0x34, 0x3e, 0xbc, 0x33, 0x3d, 0xb9,
-0x31, 0x39, 0xb7, 0x2c, 0x34, 0xb5, 0x28, 0x31, 0xb3, 0x28, 0x2f, 0xb1,
-0x2a, 0x33, 0xae, 0x2d, 0x36, 0xac, 0x30, 0x39, 0xa9, 0x2e, 0x36, 0xa7,
-0x2b, 0x33, 0xa5, 0x28, 0x30, 0xa2, 0x26, 0x2e, 0xa1, 0x24, 0x2d, 0x9e,
-0x24, 0x2b, 0x9c, 0x24, 0x2b, 0x9a, 0x23, 0x2a, 0x98, 0x23, 0x2a, 0x96,
-0x26, 0x2d, 0x93, 0x29, 0x31, 0x92, 0x2c, 0x34, 0x90, 0x30, 0x37, 0x8e,
-0x34, 0x3b, 0x8c, 0x32, 0x3b, 0x8a, 0x31, 0x38, 0x88, 0x2f, 0x35, 0x87,
-0x2c, 0x34, 0x85, 0x2c, 0x32, 0x83, 0x2a, 0x30, 0x81, 0x28, 0x2f, 0x80,
-0x27, 0x2e, 0x7f, 0x26, 0x2c, 0x7d, 0x25, 0x2c, 0x7b, 0x25, 0x2b, 0x7a,
-0x24, 0x2a, 0x78, 0x23, 0x28, 0x77, 0x22, 0x27, 0x76, 0x21, 0x27, 0x74,
-0x20, 0x26, 0x73, 0x1f, 0x25, 0x71, 0x1e, 0x25, 0x70, 0x1e, 0x24, 0x6f,
-0x1e, 0x22, 0x6d, 0x1d, 0x22, 0x6c, 0x1c, 0x21, 0x6b, 0x1b, 0x20, 0x69,
-0x1b, 0x1f, 0x68, 0x1a, 0x1f, 0x68, 0x1a, 0x1e, 0x66, 0x19, 0x1e, 0x66,
-0x19, 0x1d, 0x64, 0x18, 0x1d, 0x63, 0x18, 0x1c, 0x62, 0x17, 0x1c, 0x61,
-0x17, 0x1b, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1a, 0x5e, 0x16, 0x1a, 0x5d,
-0x16, 0x1a, 0x5c, 0x15, 0x19, 0x5b, 0x15, 0x1a, 0x5a, 0x15, 0x19, 0x59,
-0x15, 0x19, 0x58, 0x15, 0x19, 0x58, 0x15, 0x19, 0x57, 0x15, 0x19, 0x56,
-0x15, 0x19, 0x55, 0x15, 0x19, 0x54, 0x15, 0x19, 0x54, 0x15, 0x19, 0x53,
-0x15, 0x19, 0x52, 0x15, 0x19, 0x51, 0x14, 0x18, 0x50, 0x15, 0x19, 0x50,
-0x15, 0x18, 0x4f, 0x15, 0x18, 0x4e, 0x15, 0x18, 0x4e, 0x14, 0x18, 0x4d,
-0x14, 0x18, 0x4c, 0x14, 0x18, 0x4c, 0x14, 0x18, 0x4b, 0x14, 0x17, 0x4a,
-0x14, 0x17, 0x4a, 0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48,
-0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45,
-0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44,
-0x10, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41,
-0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f,
-0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d,
-0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x04,
-0x11, 0x14, 0x43, 0x22, 0x28, 0x86, 0x23, 0x2a, 0x8d, 0x1f, 0x24, 0x78,
-0x1b, 0x21, 0x6f, 0x1b, 0x21, 0x71, 0x1c, 0x22, 0x71, 0x1d, 0x23, 0x73,
-0x1e, 0x24, 0x74, 0x1f, 0x24, 0x76, 0x1f, 0x25, 0x77, 0x20, 0x26, 0x79,
-0x21, 0x27, 0x7a, 0x22, 0x27, 0x7b, 0x22, 0x28, 0x7d, 0x22, 0x28, 0x7f,
-0x22, 0x28, 0x80, 0x22, 0x28, 0x82, 0x22, 0x28, 0x84, 0x23, 0x28, 0x85,
-0x23, 0x28, 0x87, 0x22, 0x29, 0x89, 0x21, 0x28, 0x8b, 0x21, 0x27, 0x8c,
-0x20, 0x27, 0x8e, 0x20, 0x26, 0x90, 0x21, 0x28, 0x92, 0x25, 0x2c, 0x94,
-0x2a, 0x31, 0x96, 0x2f, 0x37, 0x98, 0x37, 0x3f, 0x9a, 0x3a, 0x42, 0x9c,
-0x39, 0x42, 0x9e, 0x3a, 0x42, 0xa0, 0x3a, 0x43, 0xa3, 0x3a, 0x43, 0xa4,
-0x3b, 0x44, 0xa6, 0x3c, 0x46, 0xa9, 0x3e, 0x48, 0xab, 0x38, 0x41, 0xae,
-0x32, 0x3b, 0xb0, 0x2e, 0x37, 0xb2, 0x2d, 0x36, 0xb4, 0x2e, 0x37, 0xb7,
-0x2f, 0x39, 0xb9, 0x2f, 0x39, 0xbb, 0x2e, 0x37, 0xbd, 0x2d, 0x37, 0xc0,
-0x32, 0x3c, 0xc2, 0x3a, 0x44, 0xc4, 0x3c, 0x47, 0xc7, 0x36, 0x40, 0xc9,
-0x31, 0x3b, 0xcb, 0x3d, 0x47, 0xcd, 0x4d, 0x58, 0xd0, 0x41, 0x4c, 0xd2,
-0x32, 0x3d, 0xd5, 0x31, 0x3b, 0xd6, 0x31, 0x3b, 0xd7, 0x35, 0x3f, 0xd8,
-0x3b, 0x46, 0xd9, 0x48, 0x54, 0xd9, 0x52, 0x5e, 0xc1, 0x3e, 0x48, 0x8b,
-0x2b, 0x33, 0x62, 0x4d, 0x59, 0xda, 0x35, 0x40, 0xda, 0x34, 0x3f, 0xdb,
-0x34, 0x3e, 0xda, 0x39, 0x45, 0xda, 0x3d, 0x47, 0xd9, 0x35, 0x40, 0xd9,
-0x32, 0x3d, 0xd7, 0x34, 0x3f, 0xd7, 0x30, 0x3b, 0xd6, 0x2b, 0x35, 0xd5,
-0x2d, 0x37, 0xd4, 0x3a, 0x45, 0xd3, 0x47, 0x53, 0xd1, 0x52, 0x60, 0xcf,
-0x4c, 0x58, 0xb6, 0x4e, 0x5a, 0xcc, 0x48, 0x54, 0xca, 0x49, 0x54, 0xc8,
-0x4a, 0x55, 0xc6, 0x4a, 0x55, 0xb4, 0x32, 0x3a, 0x70, 0x32, 0x3a, 0x72,
-0x47, 0x51, 0xbe, 0x38, 0x43, 0xbc, 0x34, 0x3d, 0xb9, 0x33, 0x3c, 0xb7,
-0x31, 0x3b, 0xb5, 0x2e, 0x38, 0xb3, 0x2a, 0x33, 0xb1, 0x27, 0x2f, 0xae,
-0x27, 0x2f, 0xac, 0x29, 0x31, 0xa9, 0x2c, 0x34, 0xa7, 0x2e, 0x37, 0xa5,
-0x2d, 0x36, 0xa3, 0x2a, 0x32, 0xa1, 0x28, 0x2f, 0x9e, 0x25, 0x2d, 0x9d,
-0x24, 0x2b, 0x9a, 0x23, 0x2a, 0x98, 0x22, 0x29, 0x96, 0x22, 0x29, 0x94,
-0x22, 0x28, 0x93, 0x23, 0x2b, 0x90, 0x27, 0x2d, 0x8e, 0x29, 0x30, 0x8d,
-0x2c, 0x34, 0x8b, 0x30, 0x37, 0x89, 0x32, 0x39, 0x87, 0x30, 0x37, 0x86,
-0x2d, 0x35, 0x84, 0x2c, 0x33, 0x82, 0x2b, 0x31, 0x80, 0x29, 0x30, 0x7f,
-0x27, 0x2e, 0x7e, 0x26, 0x2d, 0x7c, 0x25, 0x2c, 0x7a, 0x25, 0x2b, 0x79,
-0x24, 0x2a, 0x77, 0x23, 0x29, 0x76, 0x22, 0x27, 0x75, 0x21, 0x27, 0x74,
-0x21, 0x26, 0x72, 0x20, 0x26, 0x71, 0x1f, 0x25, 0x6f, 0x1e, 0x24, 0x6e,
-0x1d, 0x23, 0x6d, 0x1d, 0x22, 0x6b, 0x1d, 0x21, 0x6a, 0x1c, 0x21, 0x69,
-0x1b, 0x20, 0x68, 0x1a, 0x1f, 0x66, 0x1a, 0x1f, 0x66, 0x19, 0x1e, 0x65,
-0x19, 0x1d, 0x64, 0x19, 0x1d, 0x63, 0x18, 0x1c, 0x62, 0x18, 0x1c, 0x61,
-0x18, 0x1c, 0x60, 0x17, 0x1b, 0x5f, 0x17, 0x1b, 0x5e, 0x16, 0x1a, 0x5d,
-0x16, 0x1a, 0x5c, 0x16, 0x1a, 0x5b, 0x15, 0x1a, 0x5a, 0x15, 0x19, 0x59,
-0x14, 0x19, 0x58, 0x14, 0x18, 0x57, 0x14, 0x18, 0x56, 0x15, 0x18, 0x56,
-0x14, 0x18, 0x55, 0x15, 0x18, 0x54, 0x14, 0x18, 0x53, 0x14, 0x18, 0x52,
-0x14, 0x18, 0x52, 0x14, 0x18, 0x51, 0x14, 0x18, 0x50, 0x14, 0x18, 0x50,
-0x14, 0x18, 0x4f, 0x14, 0x18, 0x4e, 0x14, 0x17, 0x4d, 0x14, 0x17, 0x4d,
-0x14, 0x17, 0x4c, 0x14, 0x17, 0x4c, 0x14, 0x17, 0x4b, 0x14, 0x17, 0x4a,
-0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48,
-0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45,
-0x12, 0x15, 0x45, 0x12, 0x15, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44,
-0x10, 0x14, 0x42, 0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41,
-0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x10, 0x13, 0x3f,
-0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d,
-0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x04,
-0x11, 0x13, 0x42, 0x22, 0x28, 0x86, 0x23, 0x29, 0x8c, 0x1f, 0x24, 0x77,
-0x1b, 0x21, 0x6f, 0x1b, 0x22, 0x70, 0x1c, 0x22, 0x71, 0x1d, 0x23, 0x72,
-0x1e, 0x24, 0x73, 0x1f, 0x24, 0x75, 0x1f, 0x25, 0x76, 0x20, 0x26, 0x78,
-0x21, 0x26, 0x79, 0x21, 0x27, 0x7b, 0x21, 0x27, 0x7c, 0x21, 0x27, 0x7d,
-0x21, 0x27, 0x7f, 0x21, 0x27, 0x81, 0x21, 0x27, 0x83, 0x21, 0x27, 0x84,
-0x20, 0x27, 0x86, 0x20, 0x27, 0x88, 0x1f, 0x26, 0x8a, 0x1f, 0x26, 0x8b,
-0x1f, 0x25, 0x8d, 0x21, 0x28, 0x8f, 0x25, 0x2c, 0x91, 0x29, 0x30, 0x92,
-0x2f, 0x38, 0x95, 0x37, 0x3f, 0x96, 0x37, 0x40, 0x98, 0x37, 0x40, 0x9b,
-0x37, 0x40, 0x9c, 0x37, 0x41, 0x9f, 0x38, 0x41, 0xa0, 0x3a, 0x42, 0xa3,
-0x3a, 0x43, 0xa4, 0x3b, 0x44, 0xa6, 0x37, 0x3f, 0xa9, 0x32, 0x3a, 0xab,
-0x2d, 0x36, 0xad, 0x2b, 0x34, 0xaf, 0x2d, 0x36, 0xb1, 0x2e, 0x37, 0xb4,
-0x2f, 0x37, 0xb6, 0x2e, 0x37, 0xb7, 0x2c, 0x35, 0xba, 0x2f, 0x38, 0xbc,
-0x35, 0x3f, 0xbe, 0x3d, 0x47, 0xc1, 0x37, 0x41, 0xc3, 0x32, 0x3c, 0xc5,
-0x34, 0x3e, 0xc8, 0x41, 0x4c, 0xca, 0x49, 0x55, 0xcc, 0x39, 0x43, 0xce,
-0x2e, 0x38, 0xd0, 0x30, 0x3a, 0xd1, 0x31, 0x3b, 0xd2, 0x35, 0x40, 0xd3,
-0x3c, 0x47, 0xd3, 0x49, 0x55, 0xd4, 0x4d, 0x58, 0xb2, 0x3f, 0x49, 0x8e,
-0x31, 0x3a, 0x6f, 0x49, 0x55, 0xd5, 0x35, 0x3f, 0xd6, 0x33, 0x3e, 0xd6,
-0x33, 0x3e, 0xd6, 0x38, 0x42, 0xd5, 0x3b, 0x47, 0xd5, 0x34, 0x3f, 0xd4,
-0x31, 0x3c, 0xd3, 0x32, 0x3d, 0xd3, 0x31, 0x3c, 0xd1, 0x2b, 0x35, 0xd0,
-0x2a, 0x34, 0xcf, 0x34, 0x3f, 0xce, 0x42, 0x4c, 0xcc, 0x4c, 0x57, 0xcb,
-0x46, 0x52, 0xa5, 0x4f, 0x5b, 0xc8, 0x48, 0x53, 0xc6, 0x46, 0x51, 0xc4,
-0x47, 0x53, 0xc2, 0x49, 0x55, 0xc1, 0x43, 0x4d, 0x9f, 0x2a, 0x31, 0x60,
-0x42, 0x4b, 0x9b, 0x3f, 0x49, 0xb8, 0x34, 0x3d, 0xb6, 0x31, 0x3a, 0xb4,
-0x31, 0x3a, 0xb2, 0x30, 0x39, 0xb0, 0x2d, 0x35, 0xad, 0x29, 0x30, 0xab,
-0x26, 0x2e, 0xa9, 0x26, 0x2d, 0xa7, 0x28, 0x30, 0xa5, 0x2b, 0x33, 0xa3,
-0x2d, 0x35, 0xa1, 0x2d, 0x34, 0x9f, 0x29, 0x31, 0x9d, 0x27, 0x2e, 0x9b,
-0x24, 0x2b, 0x98, 0x23, 0x2a, 0x97, 0x22, 0x2a, 0x95, 0x22, 0x28, 0x93,
-0x22, 0x28, 0x91, 0x21, 0x27, 0x8f, 0x21, 0x28, 0x8d, 0x24, 0x2b, 0x8c,
-0x26, 0x2e, 0x8a, 0x2a, 0x30, 0x88, 0x2c, 0x34, 0x86, 0x30, 0x37, 0x85,
-0x2f, 0x36, 0x83, 0x2d, 0x34, 0x81, 0x2b, 0x32, 0x7f, 0x2a, 0x30, 0x7e,
-0x28, 0x2f, 0x7d, 0x27, 0x2e, 0x7b, 0x25, 0x2c, 0x79, 0x25, 0x2b, 0x78,
-0x24, 0x2a, 0x77, 0x23, 0x29, 0x76, 0x22, 0x27, 0x74, 0x21, 0x27, 0x73,
-0x21, 0x26, 0x71, 0x20, 0x26, 0x70, 0x1f, 0x25, 0x6f, 0x1e, 0x24, 0x6d,
-0x1d, 0x24, 0x6c, 0x1d, 0x23, 0x6b, 0x1c, 0x21, 0x69, 0x1c, 0x21, 0x68,
-0x1b, 0x20, 0x68, 0x1b, 0x20, 0x66, 0x1b, 0x1f, 0x66, 0x19, 0x1e, 0x65,
-0x19, 0x1d, 0x63, 0x19, 0x1d, 0x62, 0x18, 0x1c, 0x61, 0x18, 0x1c, 0x60,
-0x18, 0x1c, 0x5f, 0x17, 0x1b, 0x5e, 0x17, 0x1b, 0x5d, 0x16, 0x1a, 0x5c,
-0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a, 0x15, 0x19, 0x59,
-0x15, 0x19, 0x58, 0x14, 0x19, 0x57, 0x14, 0x18, 0x56, 0x14, 0x18, 0x55,
-0x14, 0x18, 0x55, 0x14, 0x18, 0x54, 0x14, 0x17, 0x53, 0x14, 0x17, 0x52,
-0x13, 0x17, 0x51, 0x14, 0x17, 0x51, 0x14, 0x17, 0x50, 0x14, 0x17, 0x4f,
-0x14, 0x17, 0x4f, 0x14, 0x17, 0x4e, 0x13, 0x17, 0x4d, 0x13, 0x17, 0x4d,
-0x13, 0x17, 0x4c, 0x13, 0x16, 0x4b, 0x13, 0x17, 0x4b, 0x13, 0x16, 0x4a,
-0x13, 0x16, 0x49, 0x13, 0x16, 0x49, 0x13, 0x16, 0x48, 0x13, 0x16, 0x48,
-0x13, 0x16, 0x47, 0x13, 0x16, 0x47, 0x12, 0x15, 0x45, 0x12, 0x15, 0x45,
-0x12, 0x14, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44, 0x11, 0x14, 0x43,
-0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40,
-0x10, 0x13, 0x40, 0x10, 0x13, 0x40, 0x10, 0x13, 0x3f, 0x0f, 0x12, 0x3f,
-0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d,
-0x0f, 0x12, 0x3c, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x04,
-0x11, 0x14, 0x42, 0x22, 0x28, 0x85, 0x23, 0x2a, 0x8b, 0x1f, 0x25, 0x77,
-0x1c, 0x21, 0x6e, 0x1c, 0x22, 0x6f, 0x1d, 0x23, 0x71, 0x1e, 0x23, 0x71,
-0x1e, 0x23, 0x72, 0x1f, 0x24, 0x74, 0x1f, 0x25, 0x75, 0x20, 0x25, 0x77,
-0x20, 0x25, 0x79, 0x20, 0x25, 0x7a, 0x20, 0x25, 0x7b, 0x20, 0x26, 0x7c,
-0x20, 0x26, 0x7e, 0x20, 0x26, 0x80, 0x1f, 0x26, 0x82, 0x1f, 0x26, 0x83,
-0x1f, 0x25, 0x84, 0x1e, 0x25, 0x86, 0x1e, 0x25, 0x88, 0x1e, 0x24, 0x8a,
-0x21, 0x28, 0x8b, 0x24, 0x2c, 0x8d, 0x29, 0x30, 0x8f, 0x2f, 0x36, 0x90,
-0x35, 0x3d, 0x93, 0x35, 0x3d, 0x95, 0x36, 0x3d, 0x96, 0x35, 0x3d, 0x98,
-0x36, 0x3d, 0x9b, 0x36, 0x3e, 0x9c, 0x36, 0x3f, 0x9f, 0x38, 0x41, 0xa0,
-0x3a, 0x42, 0xa3, 0x35, 0x3d, 0xa4, 0x31, 0x39, 0xa6, 0x2c, 0x35, 0xa8,
-0x2a, 0x32, 0xab, 0x2b, 0x34, 0xad, 0x2d, 0x36, 0xae, 0x2e, 0x36, 0xb1,
-0x2c, 0x36, 0xb3, 0x2c, 0x34, 0xb5, 0x2c, 0x35, 0xb7, 0x31, 0x3a, 0xb9,
-0x38, 0x41, 0xbb, 0x39, 0x42, 0xbd, 0x33, 0x3c, 0xbf, 0x2f, 0x38, 0xc2,
-0x38, 0x42, 0xc3, 0x44, 0x50, 0xc6, 0x40, 0x4b, 0xc8, 0x34, 0x3d, 0xca,
-0x2f, 0x38, 0xcc, 0x2f, 0x39, 0xcd, 0x31, 0x3b, 0xce, 0x36, 0x40, 0xce,
-0x3d, 0x47, 0xcf, 0x4a, 0x56, 0xd0, 0x4a, 0x55, 0xab, 0x3e, 0x47, 0x8b,
-0x3b, 0x44, 0x85, 0x45, 0x51, 0xd1, 0x33, 0x3e, 0xd1, 0x32, 0x3c, 0xd1,
-0x31, 0x3c, 0xd1, 0x37, 0x42, 0xd0, 0x3b, 0x47, 0xd0, 0x34, 0x3f, 0xcf,
-0x30, 0x3a, 0xcf, 0x31, 0x3b, 0xce, 0x31, 0x3c, 0xcd, 0x2d, 0x36, 0xcc,
-0x28, 0x32, 0xcb, 0x2f, 0x3a, 0xca, 0x3c, 0x46, 0xc8, 0x46, 0x51, 0xc7,
-0x4f, 0x5a, 0xc3, 0x4e, 0x5a, 0xc2, 0x49, 0x53, 0xc2, 0x44, 0x4f, 0xc1,
-0x44, 0x4f, 0xbe, 0x44, 0x50, 0xbd, 0x4b, 0x56, 0xbb, 0x3c, 0x44, 0x8b,
-0x27, 0x2e, 0x5a, 0x47, 0x51, 0xb5, 0x3a, 0x43, 0xb3, 0x31, 0x3a, 0xb1,
-0x31, 0x39, 0xaf, 0x2f, 0x38, 0xad, 0x2e, 0x37, 0xab, 0x2b, 0x33, 0xa9,
-0x28, 0x30, 0xa7, 0x25, 0x2c, 0xa5, 0x24, 0x2c, 0xa3, 0x27, 0x2f, 0xa1,
-0x29, 0x32, 0x9f, 0x2c, 0x34, 0x9d, 0x2a, 0x32, 0x9b, 0x27, 0x2f, 0x98,
-0x26, 0x2d, 0x97, 0x24, 0x2b, 0x95, 0x22, 0x29, 0x93, 0x22, 0x28, 0x91,
-0x22, 0x28, 0x8f, 0x21, 0x27, 0x8d, 0x21, 0x26, 0x8c, 0x21, 0x27, 0x8a,
-0x22, 0x29, 0x88, 0x25, 0x2b, 0x86, 0x26, 0x2d, 0x85, 0x2a, 0x30, 0x83,
-0x2c, 0x33, 0x82, 0x2e, 0x34, 0x80, 0x2c, 0x33, 0x7e, 0x2a, 0x31, 0x7d,
-0x29, 0x2f, 0x7c, 0x28, 0x2e, 0x7a, 0x26, 0x2d, 0x79, 0x25, 0x2b, 0x77,
-0x24, 0x2a, 0x75, 0x23, 0x29, 0x75, 0x22, 0x28, 0x73, 0x22, 0x27, 0x72,
-0x21, 0x26, 0x71, 0x20, 0x26, 0x6f, 0x1f, 0x25, 0x6e, 0x1f, 0x25, 0x6d,
-0x1e, 0x24, 0x6b, 0x1d, 0x23, 0x6a, 0x1d, 0x22, 0x69, 0x1d, 0x22, 0x68,
-0x1c, 0x21, 0x67, 0x1c, 0x20, 0x66, 0x1b, 0x1f, 0x65, 0x1a, 0x1f, 0x64,
-0x1a, 0x1e, 0x63, 0x19, 0x1d, 0x62, 0x18, 0x1d, 0x61, 0x18, 0x1c, 0x60,
-0x18, 0x1c, 0x5f, 0x17, 0x1b, 0x5e, 0x17, 0x1b, 0x5d, 0x16, 0x1a, 0x5c,
-0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a, 0x15, 0x19, 0x59, 0x15, 0x19, 0x58,
-0x15, 0x19, 0x58, 0x14, 0x19, 0x57, 0x14, 0x18, 0x56, 0x14, 0x18, 0x55,
-0x14, 0x17, 0x54, 0x13, 0x17, 0x53, 0x13, 0x17, 0x53, 0x13, 0x17, 0x52,
-0x13, 0x17, 0x51, 0x13, 0x17, 0x50, 0x13, 0x17, 0x50, 0x13, 0x17, 0x4f,
-0x13, 0x16, 0x4e, 0x13, 0x17, 0x4e, 0x13, 0x16, 0x4d, 0x13, 0x16, 0x4c,
-0x13, 0x16, 0x4c, 0x12, 0x16, 0x4b, 0x13, 0x16, 0x4b, 0x12, 0x16, 0x4a,
-0x12, 0x16, 0x49, 0x12, 0x16, 0x49, 0x12, 0x16, 0x48, 0x12, 0x16, 0x48,
-0x12, 0x15, 0x47, 0x12, 0x14, 0x45, 0x12, 0x15, 0x45, 0x12, 0x14, 0x45,
-0x12, 0x14, 0x45, 0x12, 0x14, 0x44, 0x12, 0x14, 0x44, 0x11, 0x14, 0x43,
-0x10, 0x14, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40,
-0x10, 0x13, 0x40, 0x10, 0x12, 0x3f, 0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3f,
-0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d,
-0x0f, 0x12, 0x3c, 0x0f, 0x12, 0x3c, 0x0f, 0x10, 0x36, 0x01, 0x01, 0x04,
-0x11, 0x14, 0x42, 0x22, 0x28, 0x84, 0x23, 0x2a, 0x8b, 0x1f, 0x25, 0x76,
-0x1c, 0x21, 0x6d, 0x1d, 0x22, 0x6f, 0x1d, 0x23, 0x70, 0x1e, 0x23, 0x71,
-0x1e, 0x24, 0x72, 0x1e, 0x24, 0x73, 0x1f, 0x24, 0x75, 0x1f, 0x25, 0x76,
-0x1f, 0x25, 0x78, 0x1f, 0x25, 0x79, 0x1f, 0x25, 0x7b, 0x1f, 0x25, 0x7b,
-0x1f, 0x25, 0x7d, 0x1e, 0x25, 0x7f, 0x1e, 0x24, 0x80, 0x1e, 0x24, 0x82,
-0x1d, 0x24, 0x83, 0x1e, 0x23, 0x85, 0x1e, 0x25, 0x87, 0x21, 0x28, 0x89,
-0x24, 0x2c, 0x8a, 0x29, 0x30, 0x8c, 0x2e, 0x36, 0x8e, 0x32, 0x3b, 0x90,
-0x33, 0x3b, 0x91, 0x33, 0x3b, 0x93, 0x32, 0x3b, 0x95, 0x33, 0x3b, 0x96,
-0x34, 0x3d, 0x99, 0x36, 0x3d, 0x9b, 0x36, 0x3e, 0x9c, 0x36, 0x3f, 0x9f,
-0x34, 0x3d, 0xa0, 0x30, 0x38, 0xa2, 0x2c, 0x34, 0xa4, 0x29, 0x31, 0xa6,
-0x2b, 0x32, 0xa8, 0x2b, 0x34, 0xaa, 0x2c, 0x35, 0xac, 0x2b, 0x34, 0xae,
-0x2b, 0x33, 0xb0, 0x2b, 0x33, 0xb2, 0x2d, 0x37, 0xb4, 0x34, 0x3d, 0xb6,
-0x39, 0x44, 0xb8, 0x34, 0x3d, 0xba, 0x2f, 0x39, 0xbd, 0x32, 0x3b, 0xbe,
-0x3b, 0x46, 0xc0, 0x48, 0x52, 0xc2, 0x39, 0x43, 0xc4, 0x2f, 0x39, 0xc6,
-0x2e, 0x38, 0xc7, 0x2e, 0x39, 0xc8, 0x30, 0x3b, 0xca, 0x35, 0x40, 0xca,
-0x3d, 0x48, 0xca, 0x4b, 0x57, 0xcc, 0x49, 0x54, 0xab, 0x3f, 0x48, 0x8f,
-0x43, 0x4d, 0x99, 0x42, 0x4c, 0xcd, 0x32, 0x3d, 0xcd, 0x31, 0x3b, 0xcc,
-0x31, 0x3b, 0xcc, 0x36, 0x40, 0xcc, 0x3b, 0x45, 0xcb, 0x34, 0x3f, 0xcb,
-0x2f, 0x38, 0xca, 0x2f, 0x3a, 0xca, 0x31, 0x3c, 0xc8, 0x2d, 0x37, 0xc8,
-0x29, 0x32, 0xc7, 0x2c, 0x37, 0xc6, 0x37, 0x40, 0xc4, 0x40, 0x4a, 0xc3,
-0x49, 0x54, 0xc1, 0x49, 0x53, 0xb0, 0x49, 0x53, 0xbe, 0x43, 0x4d, 0xbd,
-0x41, 0x4c, 0xbc, 0x42, 0x4d, 0xb9, 0x43, 0x4d, 0xb8, 0x46, 0x51, 0xaa,
-0x35, 0x3d, 0x7a, 0x3a, 0x42, 0x85, 0x40, 0x4a, 0xb1, 0x34, 0x3d, 0xae,
-0x30, 0x38, 0xac, 0x2f, 0x38, 0xaa, 0x2e, 0x36, 0xa9, 0x2c, 0x34, 0xa6,
-0x29, 0x31, 0xa5, 0x26, 0x2e, 0xa2, 0x24, 0x2b, 0xa1, 0x24, 0x2c, 0x9f,
-0x26, 0x2e, 0x9d, 0x27, 0x30, 0x9b, 0x2a, 0x32, 0x99, 0x2a, 0x31, 0x97,
-0x27, 0x2e, 0x95, 0x25, 0x2c, 0x93, 0x23, 0x2a, 0x92, 0x22, 0x29, 0x90,
-0x21, 0x27, 0x8e, 0x21, 0x26, 0x8d, 0x21, 0x26, 0x8b, 0x20, 0x25, 0x89,
-0x1f, 0x25, 0x87, 0x20, 0x27, 0x86, 0x22, 0x29, 0x84, 0x25, 0x2b, 0x82,
-0x27, 0x2d, 0x80, 0x2a, 0x30, 0x7f, 0x2b, 0x33, 0x7e, 0x2b, 0x32, 0x7c,
-0x2a, 0x30, 0x7b, 0x29, 0x2e, 0x79, 0x27, 0x2d, 0x78, 0x25, 0x2c, 0x76,
-0x24, 0x2b, 0x75, 0x24, 0x29, 0x74, 0x23, 0x28, 0x73, 0x22, 0x27, 0x71,
-0x21, 0x26, 0x70, 0x20, 0x26, 0x6f, 0x1f, 0x25, 0x6d, 0x1f, 0x24, 0x6c,
-0x1e, 0x24, 0x6b, 0x1d, 0x23, 0x69, 0x1d, 0x23, 0x68, 0x1d, 0x22, 0x68,
-0x1c, 0x21, 0x66, 0x1c, 0x20, 0x66, 0x1b, 0x20, 0x65, 0x1b, 0x1f, 0x64,
-0x1a, 0x1e, 0x63, 0x19, 0x1d, 0x61, 0x18, 0x1d, 0x60, 0x18, 0x1d, 0x5f,
-0x18, 0x1c, 0x5e, 0x17, 0x1b, 0x5d, 0x17, 0x1b, 0x5d, 0x17, 0x1b, 0x5c,
-0x16, 0x1a, 0x5b, 0x16, 0x1a, 0x5a, 0x16, 0x1a, 0x59, 0x15, 0x19, 0x58,
-0x15, 0x19, 0x57, 0x15, 0x18, 0x56, 0x14, 0x18, 0x56, 0x14, 0x18, 0x55,
-0x14, 0x18, 0x54, 0x13, 0x17, 0x53, 0x13, 0x17, 0x52, 0x13, 0x17, 0x52,
-0x13, 0x16, 0x51, 0x12, 0x16, 0x50, 0x13, 0x16, 0x50, 0x12, 0x16, 0x4f,
-0x12, 0x16, 0x4e, 0x12, 0x16, 0x4d, 0x12, 0x16, 0x4d, 0x12, 0x16, 0x4c,
-0x12, 0x16, 0x4c, 0x12, 0x16, 0x4b, 0x12, 0x15, 0x4a, 0x12, 0x15, 0x49,
-0x12, 0x15, 0x49, 0x12, 0x15, 0x49, 0x12, 0x16, 0x48, 0x12, 0x15, 0x47,
-0x12, 0x15, 0x47, 0x12, 0x14, 0x45, 0x12, 0x14, 0x45, 0x11, 0x14, 0x45,
-0x12, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x44, 0x10, 0x13, 0x42,
-0x10, 0x13, 0x42, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40,
-0x10, 0x13, 0x40, 0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3e,
-0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d,
-0x0e, 0x11, 0x3c, 0x0e, 0x11, 0x3c, 0x0e, 0x10, 0x35, 0x01, 0x01, 0x04,
-0x11, 0x14, 0x42, 0x22, 0x28, 0x84, 0x24, 0x2a, 0x8a, 0x1f, 0x25, 0x75,
-0x1c, 0x22, 0x6d, 0x1d, 0x23, 0x6e, 0x1d, 0x23, 0x6f, 0x1d, 0x23, 0x70,
-0x1e, 0x23, 0x71, 0x1d, 0x23, 0x72, 0x1e, 0x24, 0x74, 0x1e, 0x24, 0x75,
-0x1e, 0x24, 0x77, 0x1e, 0x24, 0x78, 0x1e, 0x24, 0x7a, 0x1d, 0x24, 0x7b,
-0x1e, 0x23, 0x7c, 0x1d, 0x23, 0x7e, 0x1d, 0x23, 0x7f, 0x1d, 0x22, 0x81,
-0x1d, 0x22, 0x83, 0x1e, 0x24, 0x83, 0x21, 0x27, 0x85, 0x24, 0x2c, 0x87,
-0x29, 0x30, 0x89, 0x2e, 0x35, 0x8a, 0x31, 0x38, 0x8c, 0x31, 0x38, 0x8e,
-0x32, 0x39, 0x90, 0x32, 0x39, 0x91, 0x31, 0x39, 0x93, 0x32, 0x3a, 0x95,
-0x33, 0x3b, 0x96, 0x34, 0x3d, 0x99, 0x36, 0x3d, 0x9b, 0x32, 0x3b, 0x9c,
-0x2f, 0x37, 0x9e, 0x2b, 0x33, 0xa0, 0x28, 0x30, 0xa2, 0x29, 0x32, 0xa4,
-0x2a, 0x32, 0xa6, 0x2b, 0x33, 0xa7, 0x2b, 0x33, 0xa9, 0x2a, 0x32, 0xab,
-0x2a, 0x32, 0xad, 0x2b, 0x33, 0xaf, 0x30, 0x38, 0xb1, 0x36, 0x40, 0xb3,
-0x35, 0x3e, 0xb5, 0x31, 0x3a, 0xb7, 0x2e, 0x36, 0xb9, 0x34, 0x3e, 0xbb,
-0x3e, 0x49, 0xbc, 0x3f, 0x49, 0xbe, 0x34, 0x3d, 0xc0, 0x2d, 0x36, 0xc2,
-0x2d, 0x36, 0xc3, 0x2e, 0x37, 0xc4, 0x31, 0x3a, 0xc5, 0x36, 0x40, 0xc6,
-0x3e, 0x48, 0xc6, 0x4b, 0x56, 0xc7, 0x49, 0x54, 0xaa, 0x41, 0x4a, 0x92,
-0x49, 0x54, 0xab, 0x3e, 0x4a, 0xc8, 0x31, 0x3b, 0xc8, 0x30, 0x3a, 0xc8,
-0x2f, 0x3a, 0xc8, 0x34, 0x3e, 0xc7, 0x39, 0x43, 0xc7, 0x33, 0x3d, 0xc7,
-0x2f, 0x38, 0xc6, 0x2f, 0x39, 0xc6, 0x31, 0x3b, 0xc4, 0x2d, 0x37, 0xc4,
-0x29, 0x32, 0xc3, 0x2a, 0x33, 0xc1, 0x32, 0x3c, 0xc1, 0x3c, 0x46, 0xbf,
-0x44, 0x4f, 0xbe, 0x4a, 0x54, 0xb6, 0x49, 0x54, 0xbb, 0x43, 0x4e, 0xb9,
-0x3f, 0x49, 0xb8, 0x40, 0x4a, 0xb6, 0x40, 0x4a, 0xb5, 0x44, 0x4e, 0xb3,
-0x40, 0x49, 0x99, 0x31, 0x39, 0x71, 0x44, 0x4e, 0xa8, 0x3a, 0x43, 0xac,
-0x30, 0x39, 0xa9, 0x2e, 0x37, 0xa8, 0x2d, 0x35, 0xa6, 0x2d, 0x35, 0xa4,
-0x2a, 0x33, 0xa2, 0x28, 0x2f, 0xa1, 0x24, 0x2d, 0x9e, 0x23, 0x2a, 0x9d,
-0x23, 0x2a, 0x9b, 0x25, 0x2c, 0x99, 0x27, 0x2e, 0x97, 0x29, 0x31, 0x95,
-0x28, 0x30, 0x93, 0x27, 0x2d, 0x92, 0x24, 0x2b, 0x90, 0x22, 0x29, 0x8e,
-0x21, 0x27, 0x8d, 0x21, 0x27, 0x8b, 0x20, 0x26, 0x89, 0x20, 0x25, 0x87,
-0x1f, 0x25, 0x86, 0x1f, 0x24, 0x84, 0x1f, 0x25, 0x83, 0x20, 0x27, 0x81,
-0x22, 0x28, 0x7f, 0x25, 0x2b, 0x7e, 0x27, 0x2d, 0x7d, 0x2a, 0x2f, 0x7b,
-0x2b, 0x31, 0x7a, 0x29, 0x2f, 0x78, 0x28, 0x2e, 0x77, 0x26, 0x2d, 0x75,
-0x25, 0x2b, 0x75, 0x24, 0x2a, 0x73, 0x24, 0x29, 0x72, 0x22, 0x27, 0x70,
-0x21, 0x27, 0x6f, 0x21, 0x26, 0x6e, 0x20, 0x25, 0x6d, 0x1f, 0x24, 0x6b,
-0x1e, 0x24, 0x6a, 0x1d, 0x23, 0x69, 0x1d, 0x23, 0x68, 0x1c, 0x22, 0x67,
-0x1c, 0x22, 0x65, 0x1b, 0x21, 0x65, 0x1a, 0x20, 0x63, 0x1a, 0x1f, 0x63,
-0x1a, 0x1f, 0x62, 0x1a, 0x1e, 0x61, 0x19, 0x1d, 0x60, 0x19, 0x1d, 0x5f,
-0x18, 0x1c, 0x5e, 0x17, 0x1c, 0x5d, 0x17, 0x1b, 0x5c, 0x16, 0x1b, 0x5b,
-0x16, 0x1a, 0x5a, 0x16, 0x1a, 0x59, 0x16, 0x1a, 0x59, 0x15, 0x19, 0x58,
-0x15, 0x19, 0x57, 0x15, 0x18, 0x56, 0x14, 0x18, 0x55, 0x14, 0x18, 0x54,
-0x14, 0x18, 0x54, 0x14, 0x17, 0x53, 0x13, 0x17, 0x52, 0x13, 0x17, 0x51,
-0x13, 0x17, 0x51, 0x13, 0x16, 0x50, 0x12, 0x16, 0x4f, 0x12, 0x16, 0x4f,
-0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d, 0x12, 0x16, 0x4d, 0x12, 0x15, 0x4c,
-0x12, 0x15, 0x4b, 0x12, 0x15, 0x4b, 0x12, 0x15, 0x4a, 0x11, 0x15, 0x49,
-0x11, 0x15, 0x49, 0x12, 0x15, 0x48, 0x12, 0x15, 0x48, 0x11, 0x14, 0x47,
-0x12, 0x15, 0x47, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45,
-0x11, 0x14, 0x45, 0x11, 0x14, 0x44, 0x11, 0x14, 0x43, 0x10, 0x13, 0x42,
-0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40,
-0x10, 0x13, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3e,
-0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d,
-0x0e, 0x11, 0x3c, 0x0e, 0x11, 0x3c, 0x0e, 0x10, 0x35, 0x01, 0x01, 0x04,
-0x11, 0x14, 0x41, 0x22, 0x29, 0x83, 0x24, 0x2a, 0x88, 0x20, 0x25, 0x75,
-0x1c, 0x22, 0x6c, 0x1d, 0x22, 0x6d, 0x1c, 0x22, 0x6e, 0x1d, 0x23, 0x70,
-0x1c, 0x23, 0x71, 0x1d, 0x23, 0x71, 0x1d, 0x23, 0x73, 0x1d, 0x23, 0x74,
-0x1d, 0x23, 0x76, 0x1d, 0x23, 0x77, 0x1d, 0x23, 0x79, 0x1c, 0x23, 0x7a,
-0x1c, 0x22, 0x7b, 0x1d, 0x22, 0x7c, 0x1c, 0x22, 0x7e, 0x1d, 0x22, 0x80,
-0x1e, 0x24, 0x81, 0x21, 0x27, 0x83, 0x24, 0x2b, 0x84, 0x29, 0x30, 0x86,
-0x2e, 0x35, 0x87, 0x2f, 0x37, 0x89, 0x2f, 0x37, 0x8a, 0x2f, 0x38, 0x8c,
-0x2f, 0x37, 0x8e, 0x2f, 0x37, 0x90, 0x31, 0x38, 0x91, 0x31, 0x39, 0x93,
-0x32, 0x3a, 0x95, 0x33, 0x3b, 0x96, 0x31, 0x39, 0x98, 0x2e, 0x36, 0x9b,
-0x2a, 0x32, 0x9c, 0x27, 0x2f, 0x9e, 0x28, 0x2f, 0x9f, 0x28, 0x31, 0xa1,
-0x2a, 0x32, 0xa4, 0x2a, 0x32, 0xa5, 0x29, 0x32, 0xa7, 0x29, 0x31, 0xa8,
-0x29, 0x31, 0xab, 0x2d, 0x35, 0xac, 0x31, 0x3b, 0xae, 0x36, 0x3f, 0xb0,
-0x31, 0x3b, 0xb2, 0x2d, 0x37, 0xb4, 0x2e, 0x37, 0xb6, 0x37, 0x41, 0xb8,
-0x42, 0x4c, 0xba, 0x39, 0x42, 0xbb, 0x2f, 0x38, 0xbc, 0x2c, 0x35, 0xbe,
-0x2c, 0x36, 0xc0, 0x2e, 0x37, 0xc0, 0x31, 0x3b, 0xc1, 0x36, 0x40, 0xc2,
-0x3f, 0x49, 0xc3, 0x4b, 0x56, 0xc3, 0x48, 0x53, 0xaa, 0x41, 0x4b, 0x96,
-0x4d, 0x58, 0xb8, 0x3c, 0x46, 0xc3, 0x31, 0x3a, 0xc4, 0x30, 0x39, 0xc4,
-0x2e, 0x38, 0xc4, 0x33, 0x3c, 0xc3, 0x37, 0x41, 0xc3, 0x32, 0x3c, 0xc2,
-0x2e, 0x38, 0xc2, 0x2d, 0x37, 0xc2, 0x2f, 0x39, 0xc1, 0x2e, 0x37, 0xc0,
-0x29, 0x32, 0xbe, 0x27, 0x30, 0xbe, 0x2e, 0x37, 0xbd, 0x37, 0x40, 0xbc,
-0x3f, 0x4a, 0xba, 0x47, 0x51, 0xb9, 0x49, 0x54, 0xb8, 0x43, 0x4d, 0xb6,
-0x3f, 0x48, 0xb5, 0x3f, 0x48, 0xb3, 0x3e, 0x47, 0xb1, 0x3e, 0x48, 0xb0,
-0x45, 0x4e, 0xae, 0x3b, 0x44, 0x8c, 0x33, 0x3a, 0x74, 0x40, 0x4a, 0xa9,
-0x35, 0x3e, 0xa7, 0x2d, 0x35, 0xa6, 0x2d, 0x35, 0xa4, 0x2c, 0x34, 0xa2,
-0x2b, 0x33, 0xa0, 0x29, 0x31, 0x9e, 0x26, 0x2e, 0x9d, 0x24, 0x2b, 0x9b,
-0x22, 0x28, 0x98, 0x22, 0x2a, 0x97, 0x24, 0x2b, 0x95, 0x26, 0x2d, 0x93,
-0x28, 0x30, 0x92, 0x27, 0x2e, 0x90, 0x25, 0x2c, 0x8e, 0x23, 0x2a, 0x8d,
-0x21, 0x29, 0x8b, 0x20, 0x26, 0x89, 0x20, 0x25, 0x87, 0x1f, 0x25, 0x86,
-0x1f, 0x24, 0x85, 0x1e, 0x24, 0x83, 0x1d, 0x23, 0x81, 0x1e, 0x24, 0x80,
-0x1f, 0x25, 0x7e, 0x20, 0x27, 0x7d, 0x23, 0x28, 0x7c, 0x24, 0x2b, 0x7a,
-0x27, 0x2d, 0x79, 0x29, 0x2f, 0x77, 0x28, 0x2e, 0x76, 0x27, 0x2d, 0x75,
-0x25, 0x2c, 0x74, 0x24, 0x2b, 0x72, 0x24, 0x29, 0x71, 0x23, 0x28, 0x70,
-0x21, 0x27, 0x6e, 0x21, 0x26, 0x6d, 0x20, 0x25, 0x6c, 0x1f, 0x24, 0x6b,
-0x1e, 0x23, 0x69, 0x1e, 0x23, 0x68, 0x1d, 0x23, 0x67, 0x1c, 0x22, 0x66,
-0x1c, 0x22, 0x65, 0x1b, 0x21, 0x65, 0x1b, 0x21, 0x63, 0x1a, 0x20, 0x63,
-0x1a, 0x1f, 0x62, 0x1a, 0x1e, 0x60, 0x19, 0x1e, 0x5f, 0x19, 0x1d, 0x5f,
-0x18, 0x1c, 0x5e, 0x18, 0x1c, 0x5d, 0x17, 0x1c, 0x5c, 0x17, 0x1b, 0x5b,
-0x17, 0x1b, 0x5a, 0x16, 0x1a, 0x59, 0x16, 0x1a, 0x58, 0x15, 0x19, 0x57,
-0x15, 0x19, 0x57, 0x15, 0x19, 0x56, 0x14, 0x18, 0x55, 0x14, 0x18, 0x54,
-0x14, 0x17, 0x53, 0x14, 0x17, 0x53, 0x13, 0x17, 0x52, 0x13, 0x17, 0x51,
-0x13, 0x16, 0x50, 0x13, 0x16, 0x50, 0x12, 0x16, 0x4f, 0x12, 0x16, 0x4e,
-0x12, 0x16, 0x4e, 0x12, 0x15, 0x4d, 0x12, 0x15, 0x4c, 0x12, 0x15, 0x4c,
-0x11, 0x15, 0x4b, 0x11, 0x15, 0x4a, 0x11, 0x15, 0x4a, 0x11, 0x15, 0x49,
-0x11, 0x15, 0x49, 0x11, 0x14, 0x48, 0x11, 0x14, 0x48, 0x11, 0x14, 0x47,
-0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45, 0x11, 0x14, 0x45,
-0x11, 0x14, 0x44, 0x11, 0x14, 0x44, 0x11, 0x14, 0x43, 0x10, 0x13, 0x42,
-0x10, 0x13, 0x41, 0x10, 0x13, 0x41, 0x10, 0x13, 0x40, 0x10, 0x13, 0x40,
-0x10, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3e,
-0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3d, 0x0f, 0x12, 0x3d, 0x0e, 0x11, 0x3c,
-0x0e, 0x11, 0x3c, 0x0e, 0x11, 0x3c, 0x0e, 0x10, 0x35, 0x01, 0x01, 0x04,
-0x10, 0x14, 0x41, 0x22, 0x29, 0x83, 0x23, 0x2a, 0x82, 0x1b, 0x21, 0x68,
-0x19, 0x1d, 0x5c, 0x18, 0x1d, 0x5d, 0x19, 0x1e, 0x5f, 0x19, 0x1e, 0x60,
-0x19, 0x1e, 0x61, 0x19, 0x1e, 0x62, 0x19, 0x1e, 0x63, 0x19, 0x1e, 0x64,
-0x19, 0x1e, 0x65, 0x19, 0x1d, 0x66, 0x19, 0x1e, 0x67, 0x19, 0x1d, 0x68,
-0x19, 0x1d, 0x6a, 0x18, 0x1c, 0x6a, 0x19, 0x1e, 0x6c, 0x1a, 0x20, 0x6d,
-0x1e, 0x22, 0x6f, 0x20, 0x25, 0x70, 0x24, 0x29, 0x71, 0x27, 0x2e, 0x72,
-0x28, 0x2e, 0x73, 0x28, 0x2e, 0x75, 0x28, 0x2e, 0x77, 0x28, 0x2e, 0x77,
-0x28, 0x2f, 0x79, 0x29, 0x30, 0x7b, 0x29, 0x30, 0x7d, 0x2b, 0x31, 0x7d,
-0x2b, 0x32, 0x7e, 0x2a, 0x31, 0x80, 0x27, 0x2e, 0x81, 0x25, 0x2b, 0x83,
-0x22, 0x29, 0x85, 0x22, 0x28, 0x86, 0x22, 0x29, 0x88, 0x23, 0x2b, 0x8a,
-0x25, 0x2b, 0x8a, 0x24, 0x2b, 0x8c, 0x23, 0x2a, 0x8d, 0x22, 0x29, 0x8f,
-0x25, 0x2d, 0x91, 0x29, 0x30, 0x92, 0x2e, 0x35, 0x94, 0x2c, 0x32, 0x96,
-0x28, 0x30, 0x96, 0x25, 0x2d, 0x97, 0x2b, 0x32, 0x99, 0x32, 0x3a, 0x9b,
-0x36, 0x3e, 0x9d, 0x2d, 0x34, 0x9f, 0x26, 0x2e, 0xa0, 0x25, 0x2e, 0xa1,
-0x26, 0x2e, 0xa2, 0x27, 0x2f, 0xa2, 0x2b, 0x33, 0xa3, 0x2f, 0x37, 0xa3,
-0x36, 0x3e, 0xa3, 0x40, 0x4b, 0xa3, 0x3f, 0x48, 0x96, 0x39, 0x40, 0x81,
-0x43, 0x4b, 0xa4, 0x32, 0x3b, 0xa5, 0x29, 0x32, 0xa5, 0x28, 0x31, 0xa5,
-0x28, 0x31, 0xa5, 0x2b, 0x33, 0xa5, 0x2e, 0x37, 0xa4, 0x2c, 0x34, 0xa4,
-0x28, 0x30, 0xa3, 0x27, 0x2f, 0xa3, 0x28, 0x30, 0xa2, 0x28, 0x30, 0xa2,
-0x24, 0x2c, 0xa2, 0x22, 0x29, 0xa1, 0x25, 0x2e, 0xa0, 0x2d, 0x35, 0x9f,
-0x32, 0x3b, 0x9d, 0x39, 0x41, 0x9d, 0x3f, 0x48, 0x9b, 0x3b, 0x44, 0x9a,
-0x37, 0x3e, 0x98, 0x34, 0x3b, 0x97, 0x34, 0x3d, 0x96, 0x34, 0x3d, 0x95,
-0x37, 0x3f, 0x94, 0x39, 0x42, 0x8d, 0x30, 0x37, 0x6f, 0x35, 0x3c, 0x7e,
-0x32, 0x3b, 0x8e, 0x2b, 0x32, 0x8c, 0x26, 0x2e, 0x8b, 0x26, 0x2d, 0x8a,
-0x25, 0x2d, 0x89, 0x24, 0x2c, 0x87, 0x22, 0x29, 0x85, 0x21, 0x26, 0x83,
-0x1e, 0x25, 0x82, 0x1d, 0x23, 0x80, 0x1e, 0x23, 0x7e, 0x1f, 0x25, 0x7e,
-0x21, 0x26, 0x7d, 0x22, 0x28, 0x7b, 0x22, 0x27, 0x7a, 0x20, 0x25, 0x78,
-0x1e, 0x25, 0x77, 0x1d, 0x23, 0x75, 0x1c, 0x22, 0x73, 0x1b, 0x20, 0x73,
-0x1a, 0x20, 0x71, 0x1a, 0x20, 0x70, 0x1a, 0x20, 0x6f, 0x19, 0x1f, 0x6d,
-0x19, 0x1e, 0x6d, 0x1a, 0x1f, 0x6b, 0x1b, 0x22, 0x6a, 0x1d, 0x22, 0x68,
-0x1f, 0x23, 0x67, 0x20, 0x25, 0x66, 0x22, 0x26, 0x65, 0x22, 0x27, 0x64,
-0x22, 0x26, 0x64, 0x21, 0x26, 0x63, 0x20, 0x25, 0x61, 0x1f, 0x24, 0x60,
-0x1e, 0x22, 0x5f, 0x1d, 0x22, 0x5d, 0x1c, 0x21, 0x5c, 0x1b, 0x20, 0x5c,
-0x1b, 0x20, 0x5b, 0x1a, 0x1f, 0x5a, 0x19, 0x1e, 0x58, 0x19, 0x1e, 0x57,
-0x19, 0x1e, 0x57, 0x18, 0x1d, 0x56, 0x18, 0x1d, 0x56, 0x17, 0x1c, 0x55,
-0x17, 0x1b, 0x54, 0x17, 0x1a, 0x53, 0x17, 0x1a, 0x52, 0x17, 0x19, 0x51,
-0x16, 0x19, 0x50, 0x16, 0x19, 0x50, 0x15, 0x19, 0x4f, 0x15, 0x18, 0x4e,
-0x15, 0x18, 0x4e, 0x15, 0x18, 0x4d, 0x14, 0x17, 0x4c, 0x13, 0x17, 0x4b,
-0x13, 0x17, 0x4b, 0x13, 0x16, 0x4a, 0x13, 0x16, 0x4a, 0x12, 0x16, 0x49,
-0x12, 0x16, 0x48, 0x12, 0x15, 0x47, 0x11, 0x15, 0x47, 0x11, 0x15, 0x46,
-0x11, 0x15, 0x45, 0x10, 0x14, 0x45, 0x10, 0x14, 0x45, 0x10, 0x14, 0x44,
-0x10, 0x13, 0x43, 0x10, 0x13, 0x43, 0x10, 0x13, 0x42, 0x10, 0x13, 0x42,
-0x0f, 0x13, 0x41, 0x0f, 0x12, 0x40, 0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3f,
-0x0f, 0x12, 0x3f, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e, 0x0f, 0x12, 0x3e,
-0x0f, 0x12, 0x3c, 0x0f, 0x12, 0x3c, 0x0e, 0x12, 0x3c, 0x0f, 0x12, 0x3c,
-0x0e, 0x12, 0x3b, 0x0e, 0x12, 0x3b, 0x0e, 0x10, 0x39, 0x0e, 0x10, 0x39,
-0x0e, 0x10, 0x39, 0x0e, 0x10, 0x39, 0x0e, 0x10, 0x38, 0x0e, 0x10, 0x38,
-0x0d, 0x10, 0x37, 0x0d, 0x10, 0x37, 0x0d, 0x10, 0x36, 0x0d, 0x10, 0x36,
-0x0d, 0x10, 0x36, 0x0d, 0x10, 0x35, 0x0d, 0x10, 0x35, 0x0c, 0x0f, 0x34,
-0x0c, 0x0f, 0x34, 0x0c, 0x0f, 0x34, 0x0c, 0x0f, 0x32, 0x01, 0x01, 0x04,
-0x02, 0x02, 0x08, 0x0a, 0x0d, 0x29, 0x02, 0x03, 0x09, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02, 0x00, 0x00, 0x01,
-0x00, 0x01, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x01, 0x02, 0x00, 0x01, 0x02,
-0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02,
-0x00, 0x00, 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01,
-0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
index 6901f69..67beddc 100644 (file)
 /*
- * GQview image viewer
- * (C)2000 John Ellis
+ * GQview
+ * (C) 2004 John Ellis
  *
  * Author: John Ellis
  *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
  */
 
+
 #include "gqview.h"
+
+#include "cache.h"
+#include "collect.h"
+#include "collect-io.h"
+#include "dnd.h"
+#include "editors.h"
+#include "filelist.h"
+#include "img-view.h"
+#include "layout.h"
+#include "layout_image.h"
+#include "menu.h"
+#include "preferences.h"
+#include "rcfile.h"
+#include "remote.h"
+#include "similar.h"
+#include "slideshow.h"
+#include "utilops.h"
+#include "ui_bookmark.h"
+#include "ui_help.h"
+#include "ui_fileops.h"
+#include "ui_tabcomp.h"
+#include "ui_utildlg.h"
+
 #include <gdk/gdkkeysyms.h> /* for keyboard values */
 
-static void parse_command_line(int argc, char *argv[], gchar **path, gchar **file);
-static void setup_default_options();
+#include "icons/icon.xpm"
+
+
+#include <math.h>
+
+
+static RemoteConnection *gqview_remote = NULL;
+static CollectionData *gqview_command_collection = NULL;
+
 
 /*
  *-----------------------------------------------------------------------------
- * path manipulation routines (public)
+ * misc (public)
  *-----------------------------------------------------------------------------
  */ 
 
-gchar *filename_from_path(char *t)
+typedef struct _WindowIconData WindowIconData;
+struct _WindowIconData
+{
+       const char **icon;
+       gchar *path;
+};
+
+static void window_set_icon_cb(GtkWidget *widget, gpointer data)
+{
+       WindowIconData *wid = data;
+       GdkPixbuf *pb;
+       GdkPixmap *pixmap;
+       GdkBitmap *mask;
+
+       if (wid->icon)
+               {
+               pb = gdk_pixbuf_new_from_xpm_data(wid->icon);
+               }
+       else
+               {
+               pb = gdk_pixbuf_new_from_file(wid->path, NULL);
+               }
+
+       g_free(wid->path);
+       g_free(wid);
+
+       if (!pb) return;
+
+       gdk_pixbuf_render_pixmap_and_mask(pb, &pixmap, &mask, 128);
+       gdk_pixbuf_unref(pb);
+
+       gdk_window_set_icon(widget->window, NULL, pixmap, mask);
+       /* apparently, gdk_window_set_icon does not ref the pixmap and mask, so don't unref it (leak?) */
+}
+
+void window_set_icon(GtkWidget *window, const char **icon, const gchar *file)
 {
-       char *p;
+       WindowIconData *wid;
+
+       if (!icon && !file) icon = (const char **)icon_xpm;
+
+       wid = g_new0(WindowIconData, 1);
+       wid->icon = icon;
+       wid->path = g_strdup(file);
 
-       p = t + strlen(t);
-       while(p > t && p[0] != '/') p--;
-       if (p[0] == '/') p++;
-       return p;
+       g_signal_connect(G_OBJECT(window), "realize",
+                        G_CALLBACK(window_set_icon_cb), wid);
 }
 
-gchar *remove_level_from_path(gchar *path)
+gint window_maximized(GtkWidget *window)
 {
-       gchar *new_path;
-       gchar *ptr = path;
-       gint p;
+       GdkWindowState state;
 
-       if (!path) return NULL;
+       if (!window || !window->window) return FALSE;
 
-       p = strlen(path) - 1;
-       if (p < 0) return NULL;
-       while(ptr[p] != '/' && p > 0) p--;
-       if (p == 0 && ptr[p] == '/') p++;
-       new_path = g_strndup(path, (guint)p);
-       return new_path;
+       state = gdk_window_get_state(window->window);
+       return (state & GDK_WINDOW_STATE_MAXIMIZED);
+}
+
+gdouble get_zoom_increment(void)
+{
+       return ((zoom_increment != 0) ? (gdouble)zoom_increment / 10.0 : 1.0);
 }
 
-void parse_out_relatives(gchar *path)
+/*
+ *-----------------------------------------------------------------------------
+ * Open  browser with the help Documentation
+ *-----------------------------------------------------------------------------
+ */
+
+static gchar *command_result(const gchar *binary, const gchar *command)
 {
-       gint s, t;
+       gchar *result = NULL;
+       FILE *f;
+       char buf[2048];
+       int l;
+
+       if (!binary) return NULL;
+       if (!file_in_path(binary)) return NULL;
 
-       if (!path) return;
+       if (!command) return g_strdup(binary);
+       if (command[0] == '!') return g_strdup(command + 1);
 
-       s = t = 0;
+       f = popen(command, "r");
+       if (!f) return NULL;
 
-       while (path[s] != '\0')
+       while ((l = fread(buf, sizeof(char), sizeof(buf), f)) > 0)
                {
-               if (path[s] == '/' && path[s+1] == '.' && (path[s+2] == '/' || path[s+2] == '\0') )
-                       {
-                       s += 2;
-                       }
-               else if (path[s] == '/' && path[s+1] == '.' && path[s+2] == '.' && (path[s+3] == '/' || path[s+3] == '\0') )
-                       {
-                       s += 3;
-                       if (t > 0) t--;
-                       while (path[t] != '/' && t > 0) t--;
-                       }
-               else
+               if (!result)
                        {
-                       if (s != t) path[t] = path[s];
-                       t++;
-                       s++;
+                       int n = 0;
+
+                       while (n < l && buf[n] != '\n' && buf[n] != '\r') n++;
+                       if (n > 0) result = g_strndup(buf, n);
                        }
                }
-       if (t == 0 && path[t] == '/') t++;
-       if (t > 1 && path[t-1] == '/') t--;
-       path[t] = '\0';
+
+       pclose(f);
+
+       return result;
+}
+
+static void help_browser_command(const gchar *command, const gchar *path)
+{
+       gchar *result;
+       gchar *buf;
+       gchar *begin;
+       gchar *end;
+
+       if (!command || !path) return;
+
+       if (debug) printf("Help command pre \"%s\", \"%s\"\n", command, path);
+
+       buf = g_strdup(command);
+       begin = strstr(buf, "%s");
+       if (begin)
+               {
+               *begin = '\0';
+               end = begin + 2;
+               begin = buf;
+
+               result = g_strdup_printf("%s%s%s &", begin, path, end);
+               }
+       else
+               {
+               result = g_strdup_printf("%s \"%s\" &", command, path);
+               }
+       g_free(buf);
+
+       if (debug) printf("Help command post [%s]\n", result);
+
+       system(result);
+
+       g_free(result);
+}
+
+/*
+ * each set of 2 strings is one browser:
+ *   the 1st is the binary to look for in the path
+ *   the 2nd has 3 capabilities:
+ *        NULL     exec binary with html file path as command line
+ *        string   exec string and use results for command line
+ *        !string  use text following ! as command line, replacing optional %s with html file path
+*/
+static gchar *html_browsers[] =
+{
+       /* Redhat has a nifty htmlview script to start the user's preferred browser */
+       "htmlview",     NULL,
+       /* GNOME 2 */
+       "gconftool-2",  "gconftool-2 -g /desktop/gnome/url-handlers/http/command",
+       /* KDE */
+       "kfmclient",    "!kfmclient exec \"%s\"",
+       /* use fallbacks */
+       "firefox",      NULL,
+       "mozilla",      NULL,
+       "konqueror",    NULL,
+       "netscape",     NULL,
+       NULL,           NULL
+};
+
+static void help_browser_run(void)
+{
+       gchar *result = NULL;
+       gint i;
+
+       i = 0;
+       while (!result && html_browsers[i])
+               {
+               result = command_result(html_browsers[i], html_browsers[i+1]);
+               i += 2;
+               }
+
+       if (!result)
+               {
+               printf("Unable to detect an installed browser.\n");
+               return;
+               }
+
+       help_browser_command(result, GQVIEW_HTMLDIR "/index.html");
+
+       g_free(result);
 }
 
 /*
  *-----------------------------------------------------------------------------
- * external editor start routines (public)
+ * help window
  *-----------------------------------------------------------------------------
  */ 
 
-void start_editor_from_file(gint n, gchar *path)
-{
-       gchar *cmd;
-       if (!path) return;
-       cmd = g_strdup_printf("%s \"%s\" &", editor_command[n], path);
-       printf(_("GQview running: %s\n"),cmd);
-       system(cmd);
-       g_free(cmd);
-}
+static GtkWidget *help_window = NULL;
 
-void start_editor_from_image(gint n)
+static void help_window_destroy_cb(GtkWidget *window, gpointer data)
 {
-       start_editor_from_file(n, image_get_path());
+       help_window = NULL;
 }
 
-void start_editor_from_list(gint n)
+void help_window_show(const gchar *key)
 {
-       gchar *cmd;
-       gchar *buf;
-       GList *list = file_get_selected_list();
-       GList *work;
-       if (!list) return;
-       work = list;
-       cmd = g_strconcat(editor_command[n], " ", NULL);
-       while(work)
+       if (key && strcmp(key, "html_contents") == 0)
                {
-               buf = cmd;
-               cmd = g_strconcat(buf, "\"", work->data, "\" ", NULL);
-               g_free(buf);
-               work = work->next;
+               help_browser_run();
+               return;
                }
-       buf = cmd;
-       cmd = g_strconcat(buf, "&", NULL);
-       g_free(buf);
-       printf(_("GQview running: %s\n"),cmd);
-       system(cmd);
-       g_free(cmd);
-       free_selected_list(list);
+
+       if (help_window)
+               {
+               gtk_window_present(GTK_WINDOW(help_window));
+               if (key) help_window_set_key(help_window, key);
+               return;
+               }
+
+       help_window = help_window_new(_("Help - GQview"), "GQview", "help",
+                                      GQVIEW_HELPDIR "/README", key);
+       g_signal_connect(G_OBJECT(help_window), "destroy",
+                        G_CALLBACK(help_window_destroy_cb), NULL);
 }
 
+
 /*
  *-----------------------------------------------------------------------------
  * keyboard functions
@@ -134,6 +282,16 @@ void keyboard_scroll_calc(gint *x, gint *y, GdkEventKey *event)
        static guint32 time_old = 0;
        static guint keyval_old = 0;
 
+       if (event->state & GDK_CONTROL_MASK)
+               {
+               if (*x < 0) *x = G_MININT / 2;
+               if (*x > 0) *x = G_MAXINT / 2;
+               if (*y < 0) *y = G_MININT / 2;
+               if (*y > 0) *y = G_MAXINT / 2;
+
+               return;
+               }
+
        if (progressive_key_scrolling)
                {
                guint32 time_diff;
@@ -157,103 +315,494 @@ void keyboard_scroll_calc(gint *x, gint *y, GdkEventKey *event)
        *y = *y * delta;
 }
 
-gint key_press_cb(GtkWidget *widget, GdkEventKey *event)
+
+/*
+ *-----------------------------------------------------------------------------
+ * remote functions
+ *-----------------------------------------------------------------------------
+ */
+
+static void gr_image_next(const gchar *text, gpointer data)
+{
+       layout_image_next(NULL);
+}
+
+static void gr_image_prev(const gchar *text, gpointer data)
+{
+       layout_image_prev(NULL);
+}
+
+static void gr_image_first(const gchar *text, gpointer data)
+{
+       layout_image_first(NULL);
+}
+
+static void gr_image_last(const gchar *text, gpointer data)
+{
+       layout_image_last(NULL);
+}
+
+static void gr_fullscreen_toggle(const gchar *text, gpointer data)
 {
-       gint stop_signal = FALSE;
-       gint x = 0;
-       gint y = 0;
+       layout_image_full_screen_toggle(NULL);
+}
 
-       if (GTK_WIDGET_HAS_FOCUS(path_entry))
+static void gr_fullscreen_start(const gchar *text, gpointer data)
+{
+       layout_image_full_screen_start(NULL);
+}
+
+static void gr_fullscreen_stop(const gchar *text, gpointer data)
+{
+       layout_image_full_screen_stop(NULL);
+}
+
+static void gr_slideshow_start_rec(const gchar *text, gpointer data)
+{
+       GList *list;
+
+       list = path_list_recursive(text);
+       if (!list) return;
+printf("length: %d\n", g_list_length(list));
+       layout_image_slideshow_stop(NULL);
+       layout_image_slideshow_start_from_list(NULL, list);
+}
+
+static void gr_slideshow_toggle(const gchar *text, gpointer data)
+{
+       layout_image_slideshow_toggle(NULL);
+}
+
+static void gr_slideshow_start(const gchar *text, gpointer data)
+{
+       layout_image_slideshow_start(NULL);
+}
+
+static void gr_slideshow_stop(const gchar *text, gpointer data)
+{
+       layout_image_slideshow_stop(NULL);
+}
+
+static void gr_slideshow_delay(const gchar *text, gpointer data)
+{
+       gdouble n;
+
+       n = strtod(text, NULL);
+       if (n < SLIDESHOW_MIN_SECONDS || n > SLIDESHOW_MAX_SECONDS)
+               {
+               gchar *buf;
+
+               buf = g_strdup_printf("Remote slideshow delay out of range (%.1f to %.1f)\n",
+                                     SLIDESHOW_MIN_SECONDS, SLIDESHOW_MAX_SECONDS);
+               print_term(buf);
+               g_free(buf);
+
+               return;
+               }
+       slideshow_delay = (gint)(n * 10.0 + 0.01);
+}
+
+static void gr_tools_show(const gchar *text, gpointer data)
+{
+       gint popped;
+       gint hidden;
+
+       if (layout_tools_float_get(NULL, &popped, &hidden) && hidden)
+               {
+               layout_tools_float_set(NULL, popped, FALSE);
+               }
+}
+
+static void gr_tools_hide(const gchar *text, gpointer data)
+{
+       gint popped;
+       gint hidden;
+
+       if (layout_tools_float_get(NULL, &popped, &hidden) && !hidden)
                {
-               if (event->keyval == GDK_Escape)
-                       gtk_entry_set_text(GTK_ENTRY(path_entry), current_path);
-               return stop_signal;
+               layout_tools_float_set(NULL, popped, TRUE);
                }
+}
+
+static gint gr_quit_idle_cb(gpointer data)
+{
+       exit_gqview();
 
-       if (full_screen_window || GTK_WIDGET_HAS_FOCUS(main_image->viewport))
+       return FALSE;
+}
+
+static void gr_quit(const gchar *text, gpointer data)
+{
+       /* schedule exit when idle, if done from within a
+        * remote handler remote_close will crash
+        */
+       g_idle_add(gr_quit_idle_cb, NULL);
+}
+
+static void gr_file_load(const gchar *text, gpointer data)
+{
+       if (isfile(text))
                {
-               switch (event->keyval)
+               if (file_extension_match(text, ".gqv"))
                        {
-                       case GDK_Left:
-                               x -= 1;
-                               stop_signal = TRUE;
-                               break;
-                       case GDK_Right:
-                               x += 1;
-                               stop_signal = TRUE;
-                               break;
-                       case GDK_Up:
-                               y -= 1;
-                               stop_signal = TRUE;
-                               break;
-                       case GDK_Down:
-                               y += 1;
-                               stop_signal = TRUE;
-                               break;
-                       case GDK_BackSpace:
-                               file_prev_image();
-                               stop_signal = TRUE;
-                               break;
-                       case GDK_space:
-                               file_next_image();
-                               stop_signal = TRUE;
-                               break;
+                       collection_window_new(text);
                        }
+               else
+                       {
+                       layout_set_path(NULL, text);
+                       }
+               }
+       else if (isdir(text))
+               {
+               layout_set_path(NULL, text);
+               }
+       else
+               {
+               printf("remote sent filename that does not exist:\"%s\"\n", text);
                }
+}
 
-       switch (event->keyval)
-               {
-               case '+':
-                       image_adjust_zoom(1);
-                       break;
-               case GDK_Page_Up:
-                       file_prev_image();
-                       stop_signal = TRUE;
-                       break;
-               case GDK_Page_Down:
-                       file_next_image();
-                       stop_signal = TRUE;
-                       break;
-               case GDK_Home:
-                       file_first_image();
-                       stop_signal = TRUE;
-                       break;
-               case GDK_End:
-                       file_last_image();
-                       stop_signal = TRUE;
-                       break;
-               case GDK_Delete:
-                       file_util_delete(image_get_path(), NULL);
-                       stop_signal = TRUE;
-                       break;
-               case GDK_Escape:
-                       interrupt_thumbs();
-                       stop_signal = TRUE;
-                       break;
-               case 'Q': case 'q':
-                       if (event->state == 0 || (event->state & GDK_MODIFIER_MASK) == GDK_LOCK_MASK)
+static void gr_file_view(const gchar *text, gpointer data)
+{
+       view_window_new(text);
+}
+
+static void gr_list_clear(const gchar *text, gpointer data)
+{
+       if (gqview_command_collection) collection_unref(gqview_command_collection);
+       gqview_command_collection = NULL;
+}
+
+static void gr_list_add(const gchar *text, gpointer data)
+{
+       gint new = TRUE;
+
+       if (!gqview_command_collection)
+               {
+               CollectionData *cd;
+
+               cd = collection_new("");
+
+               g_free(cd->path);
+               cd->path = NULL;
+               g_free(cd->name);
+               cd->name = g_strdup(_("Command line"));
+
+               gqview_command_collection = cd;
+               }
+       else
+               {
+               new = (!collection_get_first(gqview_command_collection));
+               }
+
+       if (collection_add(gqview_command_collection, text, FALSE) && new)
+               {
+               layout_image_set_collection(NULL, gqview_command_collection,
+                                           collection_get_first(gqview_command_collection));
+               }
+}
+
+static void gr_raise(const gchar *text, gpointer data)
+{
+       LayoutWindow *lw = NULL;
+
+       if (layout_valid(&lw))
+               {
+               gtk_window_present(GTK_WINDOW(lw->window));
+               }
+}
+
+typedef struct _RemoteCommandEntry RemoteCommandEntry;
+struct _RemoteCommandEntry {
+       gchar *opt_s;
+       gchar *opt_l;
+       void (*func)(const gchar *text, gpointer data);
+       gint needs_extra;
+       gint prefer_command_line;
+       gchar *description;
+};
+
+static RemoteCommandEntry remote_commands[] = {
+       /* short, long                  callback,               extra, prefer,description */
+       { "-n", "--next",               gr_image_next,          FALSE, FALSE, N_("next image") },
+       { "-b", "--back",               gr_image_prev,          FALSE, FALSE, N_("previous image") },
+       { NULL, "--first",              gr_image_first,         FALSE, FALSE, N_("first image") },
+        { NULL, "--last",               gr_image_last,          FALSE, FALSE, N_("last image") },
+       { "-f", "--fullscreen",         gr_fullscreen_toggle,   FALSE, TRUE,  N_("toggle full screen") },
+       { "-fs","--fullscreen-start",   gr_fullscreen_start,    FALSE, FALSE, N_("start full screen") },
+       { "-fS","--fullscreen-stop",    gr_fullscreen_stop,     FALSE, FALSE, N_("stop full screen") },
+       { "-s", "--slideshow",          gr_slideshow_toggle,    FALSE, TRUE,  N_("toggle slide show") },
+       { "-ss","--slideshow-start",    gr_slideshow_start,     FALSE, FALSE, N_("start slide show") },
+       { "-sS","--slideshow-stop",     gr_slideshow_stop,      FALSE, FALSE, N_("stop slide show") },
+       { "-sr","--slideshow-recurse",  gr_slideshow_start_rec, TRUE,  FALSE, N_("start recursive slide show") },
+       { "-d", "--delay=",             gr_slideshow_delay,     TRUE,  FALSE, N_("set slide show delay in seconds") },
+       { "+t", "--tools-show",         gr_tools_show,          FALSE, TRUE,  N_("show tools") },
+       { "-t", "--tools-hide",         gr_tools_hide,          FALSE, TRUE,  N_("hide tools") },
+       { "-q", "--quit",               gr_quit,                FALSE, FALSE, N_("quit") },
+       { NULL, "file:",                gr_file_load,           TRUE,  FALSE, N_("open file") },
+       { NULL, "view:",                gr_file_view,           TRUE,  FALSE, N_("open file in new window") },
+       { NULL, "--list-clear",         gr_list_clear,          FALSE, FALSE, NULL },
+       { NULL, "--list-add:",          gr_list_add,            TRUE,  FALSE, NULL },
+       { NULL, "raise",                gr_raise,               FALSE, FALSE, NULL },
+       { NULL, NULL, NULL, FALSE, FALSE, NULL }
+};
+
+static RemoteCommandEntry *gqview_remote_command_find(const gchar *text, const gchar **offset)
+{
+       gint match = FALSE;
+       gint i;
+
+       i = 0;
+       while (!match && remote_commands[i].func != NULL)
+               {
+               if (remote_commands[i].needs_extra)
+                       {
+                       if (remote_commands[i].opt_s &&
+                           strncmp(remote_commands[i].opt_s, text, strlen(remote_commands[i].opt_s)) == 0)
                                {
-                               exit_gqview();
-                               return FALSE;
+                               if (offset) *offset = text + strlen(remote_commands[i].opt_s);
+                               return &remote_commands[i];
                                }
-                       break;
+                       else if (remote_commands[i].opt_l &&
+                                strncmp(remote_commands[i].opt_l, text, strlen(remote_commands[i].opt_l)) == 0)
+                               {
+                               if (offset) *offset = text + strlen(remote_commands[i].opt_l);
+                               return &remote_commands[i];
+                               }
+                       }
+               else
+                       {
+                       if ((remote_commands[i].opt_s && strcmp(remote_commands[i].opt_s, text) == 0) ||
+                           (remote_commands[i].opt_l && strcmp(remote_commands[i].opt_l, text) == 0))
+                               {
+                               if (offset) *offset = text;
+                               return &remote_commands[i];
+                               }
+                       }
+
+               i++;
+               }
+
+       return NULL;
+}
+
+static void gqview_remote_cb(RemoteConnection *rc, const gchar *text, gpointer data)
+{
+       RemoteCommandEntry *entry;
+       const gchar *offset;
+
+       entry = gqview_remote_command_find(text, &offset);
+       if (entry && entry->func)
+               {
+               entry->func(offset, data);
+               }
+       else
+               {
+               printf("unknown remote command:%s\n", text);
+               }
+}
+
+static void gqview_remote_help(void)
+{
+       gint i;
+
+       print_term(_("Remote command list:\n"));
+
+       i = 0;
+       while (remote_commands[i].func != NULL)
+               {
+               if (remote_commands[i].description)
+                       {
+                       gchar *buf;
+
+                       buf = g_strdup_printf("  %-3s%s %-20s %s\n",
+                               (remote_commands[i].opt_s) ? remote_commands[i].opt_s : "",
+                               (remote_commands[i].opt_s && remote_commands[i].opt_l) ? "," : " ",
+                               (remote_commands[i].opt_l) ? remote_commands[i].opt_l : "",
+                               _(remote_commands[i].description));
+
+                       print_term(buf);
+                       g_free(buf);
+                       }
+               i++;
                }
+}
+
+static GList *gqview_remote_build_list(GList *list, int argc, char *argv[])
+{
+       gint i;
 
-       if (event->state & GDK_SHIFT_MASK)
+       i = 1;
+       while (i < argc)
                {
-               x *= 3;
-               y *= 3;
+               RemoteCommandEntry *entry;
+
+               entry = gqview_remote_command_find(argv[i], NULL);
+               if (entry)
+                       {
+                       list = g_list_append(list, argv[i]);
+                       }
+               i++;
                }
 
-       if (x != 0 || y!= 0)
+       return list;
+}
+
+static void gqview_remote_control(const gchar *arg_exec, GList *remote_list, const gchar *path,
+                                 GList *cmd_list, GList *collection_list)
+{
+       RemoteConnection *rc;
+       gint started = FALSE;
+       gchar *buf;
+
+       buf = g_strconcat(homedir(), "/", GQVIEW_RC_DIR, "/.command", NULL);
+       rc = remote_client_open(buf);
+       if (!rc)
                {
-               keyboard_scroll_calc(&x, &y, event);
-               image_scroll(x, y);
+               GString *command;
+               GList *work;
+               gint retry_count = 12;
+               gint blank = FALSE;
+
+               print_term(_("Remote GQview not running, starting..."));
+               command = g_string_new(arg_exec);
+
+               work = remote_list;
+               while (work)
+                       {
+                       gchar *text;
+                       RemoteCommandEntry *entry;
+
+                       text = work->data;
+                       work = work->next;
+
+                       entry = gqview_remote_command_find(text, NULL);
+                       if (entry)
+                               {
+                               if (entry->prefer_command_line)
+                                       {
+                                       remote_list = g_list_remove(remote_list, text);
+                                       g_string_append(command, " ");
+                                       g_string_append(command, text);
+                                       }
+                               if (entry->opt_l && strcmp(entry->opt_l, "file:") == 0)
+                                       {
+                                       blank = TRUE;
+                                       }
+                               }
+                       }
+
+               if (blank || cmd_list || path) g_string_append(command, " --blank");
+               if (debug) g_string_append(command, " --debug");
+
+               g_string_append(command, " &");
+               system(command->str);
+               g_string_free(command, TRUE);
+
+               while (!rc && retry_count > 0)
+                       {
+                       usleep((retry_count > 10) ? 500000 : 1000000);
+                       rc = remote_client_open(buf);
+                       if (!rc) print_term(".");
+                       retry_count--;
+                       }
+
+               print_term("\n");
+
+               started = TRUE;
                }
+       g_free(buf);
+
+       if (rc)
+               {
+               GList *work;
+               const gchar *prefix;
+               gint use_path = TRUE;
+               gint sent = FALSE;
+
+               work = remote_list;
+               while (work)
+                       {
+                       gchar *text;
+                       RemoteCommandEntry *entry;
+
+                       text = work->data;
+                       work = work->next;
+
+                       entry = gqview_remote_command_find(text, NULL);
+                       if (entry &&
+                           entry->opt_l &&
+                           strcmp(entry->opt_l, "file:") == 0) use_path = FALSE;
+
+                       remote_client_send(rc, text);
+
+                       sent = TRUE;
+                       }
+
+               if (cmd_list && cmd_list->next)
+                       {
+                       prefix = "--list-add:";
+                       remote_client_send(rc, "--list-clear");
+                       }
+               else
+                       {
+                       prefix = "file:";
+                       }
+
+               work = cmd_list;
+               while (work)
+                       {
+                       const gchar *name;
+                       gchar *text;
+
+                       name = work->data;
+                       work = work->next;
+
+                       text = g_strconcat(prefix, name, NULL);
+                       remote_client_send(rc, text);
+                       g_free(text);
+
+                       sent = TRUE;
+                       }
+
+               if (path && !cmd_list && use_path)
+                       {
+                       gchar *text;
+
+                       text = g_strdup_printf("file:%s", path);
+                       remote_client_send(rc, text);
+                       g_free(text);
+
+                       sent = TRUE;
+                       }
+
+               work = collection_list;
+               while (work)
+                       {
+                       const gchar *name;
+                       gchar *text;
+
+                       name = work->data;
+                       work = work->next;
+
+                       text = g_strdup_printf("file:%s", name);
+                       remote_client_send(rc, text);
+                       g_free(text);
+
+                       sent = TRUE;
+                       }
 
-       if (stop_signal) gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event");
+               if (!started && !sent)
+                       {
+                       remote_client_send(rc, "raise");
+                       }
+               }
+       else
+               {
+               print_term(_("Remote not available\n"));
+               }
 
-       return stop_signal;
+       _exit(0);
 }
 
 /*
@@ -262,11 +811,39 @@ gint key_press_cb(GtkWidget *widget, GdkEventKey *event)
  *-----------------------------------------------------------------------------
  */ 
 
+static gint startup_blank = FALSE;
 static gint startup_full_screen = FALSE;
 static gint startup_in_slideshow = FALSE;
+static gint startup_command_line_collection = FALSE;
+
 
-static void parse_command_line(int argc, char *argv[], gchar **path, gchar **file)
+static void parse_command_line_add_file(const gchar *new_path, gchar **path, gchar **file,
+                                       GList **list, GList **collection_list)
 {
+       gchar *path_parsed;
+
+       path_parsed = g_strdup(new_path);
+       parse_out_relatives(path_parsed);
+
+       if (file_extension_match(new_path, ".gqv"))
+               {
+               *collection_list = g_list_append(*collection_list, path_parsed);
+               }
+       else
+               {
+               if (!*path) *path = remove_level_from_path(path_parsed);
+               if (!*file) *file = g_strdup(path_parsed);
+               *list = g_list_append(*list, path_parsed);
+               }
+}
+
+static void parse_command_line(int argc, char *argv[], gchar **path, gchar **file,
+                              GList **cmd_list, GList **collection_list)
+{
+       GList *list = NULL;
+       GList *remote_list = NULL;
+       gint remote_do = FALSE;
+
        if (argc > 1)
                {
                gint i;
@@ -274,8 +851,8 @@ static void parse_command_line(int argc, char *argv[], gchar **path, gchar **fil
                i = 1;
                while (i < argc)
                        {
-                       gchar *cmd_line = argv[i];
-                       gchar *cmd_all = g_strconcat(base_dir, "/", cmd_line, NULL);
+                       const gchar *cmd_line = argv[i];
+                       gchar *cmd_all = concat_dir_and_file(base_dir, cmd_line);
 
                        if (!*path && cmd_line[0] == '/' && isdir(cmd_line))
                                {
@@ -285,33 +862,34 @@ static void parse_command_line(int argc, char *argv[], gchar **path, gchar **fil
                                {
                                *path = g_strdup(cmd_all);
                                }
-                       else if (!*file && cmd_line[0] == '/' && isfile(cmd_line))
+                       else if (cmd_line[0] == '/' && isfile(cmd_line))
                                {
-                               g_free(*path);
-                               *path = remove_level_from_path(cmd_line);
-                               *file = g_strdup(cmd_line);
+                               parse_command_line_add_file(cmd_line, path, file, &list, collection_list);
                                }
-                       else if (!*file && isfile(cmd_all))
+                       else if (isfile(cmd_all))
                                {
-                               g_free(*path);
-                               *path = remove_level_from_path(cmd_all);
-                               *file = g_strdup(cmd_all);
+                               parse_command_line_add_file(cmd_all, path, file, &list, collection_list);
                                }
                        else if (strcmp(cmd_line, "--debug") == 0)
                                {
-                               debug = TRUE;
-                               printf("debugging output enabled\n");
+                               /* we now increment the debug state for verbosity */
+                               debug++;
+                               printf("debugging output enabled (level %d)\n", debug);
                                }
                        else if (strcmp(cmd_line, "+t") == 0 ||
                                 strcmp(cmd_line, "--with-tools") == 0)
                                {
                                tools_float = FALSE;
                                tools_hidden = FALSE;
+
+                               remote_list = g_list_append(remote_list, "+t");
                                }
                        else if (strcmp(cmd_line, "-t") == 0 ||
                                 strcmp(cmd_line, "--without-tools") == 0)
                                {
                                tools_hidden = TRUE;
+
+                               remote_list = g_list_append(remote_list, "-t");
                                }
                        else if (strcmp(cmd_line, "-f") == 0 ||
                                 strcmp(cmd_line, "--fullscreen") == 0)
@@ -323,24 +901,76 @@ static void parse_command_line(int argc, char *argv[], gchar **path, gchar **fil
                                {
                                startup_in_slideshow = TRUE;
                                }
+                       else if (strcmp(cmd_line, "-l") == 0 ||
+                                strcmp(cmd_line, "--list") == 0)
+                               {
+                               startup_command_line_collection = TRUE;
+                               }
+                       else if (strcmp(cmd_line, "-r") == 0 ||
+                                strcmp(cmd_line, "--remote") == 0)
+                               {
+                               if (!remote_do)
+                                       {
+                                       remote_do = TRUE;
+                                       remote_list = gqview_remote_build_list(remote_list, argc, argv);
+                                       }
+                               }
+                       else if (strcmp(cmd_line, "-rh") == 0 ||
+                                strcmp(cmd_line, "--remote-help") == 0)
+                               {
+                               gqview_remote_help();
+                               exit (0);
+                               }
+                       else if (strcmp(cmd_line, "--blank") == 0)
+                               {
+                               startup_blank = TRUE;
+                               }
+                       else if (strcmp(cmd_line, "-v") == 0 ||
+                                strcmp(cmd_line, "--version") == 0)
+                               {
+                               printf("GQview %s\n", VERSION);
+                               exit (0);
+                               }
+                       else if (strcmp(cmd_line, "--alternate") == 0)
+                               {
+                               /* enable faster experimental algorithm */
+                               printf("Alternate similarity algorithm enabled\n");
+                               image_sim_alternate_set(TRUE);
+                               }
                        else if (strcmp(cmd_line, "-h") == 0 ||
                                 strcmp(cmd_line, "--help") == 0)
                                {
-                               printf("GQview version %s\n", VERSION);
-                               printf(_("Usage: gqview [options] [path]\n\n"));
-                               printf(_("valid options are:\n"));
-                               printf(_("  +t, --with-tools           force show of tools\n"));
-                               printf(_("  -t, --without-tools        force hide of tools\n"));
-                               printf(_("  -f, --fullscreen           start in full screen mode\n"));
-                               printf(_("  -s, --slideshow            start in slideshow mode\n"));
-                               printf(_("  --debug                    turn on debug output\n"));
-                               printf(_("  -h, --help                 show this message\n\n"));
+                               printf("GQview %s\n", VERSION);
+                               print_term(_("Usage: gqview [options] [path]\n\n"));
+                               print_term(_("valid options are:\n"));
+                               print_term(_("  +t, --with-tools           force show of tools\n"));
+                               print_term(_("  -t, --without-tools        force hide of tools\n"));
+                               print_term(_("  -f, --fullscreen           start in full screen mode\n"));
+                               print_term(_("  -s, --slideshow            start in slideshow mode\n"));
+                               print_term(_("  -l, --list                 open collection window for command line\n"));
+                               print_term(_("  -r, --remote               send following commands to open window\n"));
+                               print_term(_("  -rh,--remote-help          print remote command list\n"));
+                               print_term(_("  --debug                    turn on debug output\n"));
+                               print_term(_("  -v, --version              print version info\n"));
+                               print_term(_("  -h, --help                 show this message\n\n"));
+                               
+#if 0
+                               /* these options are not officially supported!
+                                * only for testing new features, no need to translate them */
+                               print_term(  "  --alternate                use alternate similarity algorithm\n");
+#endif
+                               
                                exit (0);
                                }
-                       else 
+                       else if (!remote_do)
                                {
-                               printf(_("invalid or ignored: %s\nUse -help for options\n"), cmd_line);
+                               gchar *buf;
+
+                               buf = g_strdup_printf(_("invalid or ignored: %s\nUse --help for options\n"), cmd_line);
+                               print_term(buf);
+                               g_free(buf);
                                }
+
                        g_free(cmd_all);
                        i++;
                        }
@@ -348,6 +978,22 @@ static void parse_command_line(int argc, char *argv[], gchar **path, gchar **fil
                parse_out_relatives(*path);
                parse_out_relatives(*file);
                }
+
+       if (remote_do)
+               {
+               gqview_remote_control(argv[0], remote_list, *path, list, *collection_list);
+               }
+       g_list_free(remote_list);
+
+       if (list && list->next)
+               {
+               *cmd_list = list;
+               }
+       else
+               {
+               path_list_free(list);
+               *cmd_list = NULL;
+               }
 }
 
 /*
@@ -356,100 +1002,365 @@ static void parse_command_line(int argc, char *argv[], gchar **path, gchar **fil
  *-----------------------------------------------------------------------------
  */ 
 
-static void setup_default_options()
+#define RC_HISTORY_NAME "history"
+
+static void keys_load(void)
 {
+       gchar *path;
+
+       path = g_strconcat(homedir(), "/", GQVIEW_RC_DIR, "/", RC_HISTORY_NAME, NULL);
+       history_list_load(path);
+       g_free(path);
+}
+
+static void keys_save(void)
+{
+       gchar *path;
+
+       path = g_strconcat(homedir(), "/", GQVIEW_RC_DIR, "/", RC_HISTORY_NAME, NULL);
+       history_list_save(path);
+       g_free(path);
+}
+
+static void check_for_home_path(gchar *path)
+{
+       gchar *buf;
+
+       buf = g_strconcat(homedir(), "/", path, NULL);
+       if (!isdir(buf))
+               {
+               gchar *tmp;
+
+               tmp = g_strdup_printf(_("Creating GQview dir:%s\n"), buf);
+               print_term(tmp);
+               g_free(tmp);
+
+               if (!mkdir_utf8(buf, 0755))
+                       {
+                       tmp = g_strdup_printf(_("Could not create dir:%s\n"), buf);
+                       print_term(tmp);
+                       g_free(tmp);
+                       }
+               }
+       g_free(buf);
+}
+
+static void setup_default_options(void)
+{
+       gchar *path;
        gint i;
 
-       for(i=0; i<8; i++)
+       for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
                {
                editor_name[i] = NULL;
                editor_command[i] = NULL;
                }
 
-       editor_name[0] = g_strdup(_("The Gimp"));
-       editor_command[0] = g_strdup("gimp");
-
-       editor_name[1] = g_strdup(_("Electric Eyes"));
-       editor_command[1] = g_strdup("ee");
+       editor_reset_defaults();
 
-       editor_name[2] = g_strdup(_("XV"));
-       editor_command[2] = g_strdup("xv");
+       bookmark_add_default(_("Home"), homedir());
+       path = concat_dir_and_file(homedir(), "Desktop");
+       bookmark_add_default(_("Desktop"), path);
+       g_free(path);
+       path = concat_dir_and_file(homedir(), GQVIEW_RC_DIR_COLLECTIONS);
+       bookmark_add_default(_("Collections"), path);
+       g_free(path);
 
-       editor_name[3] = g_strdup(_("Xpaint"));
-       editor_command[3] = g_strdup("xpaint");
-
-       custom_filter = g_strdup(".eim;");
+       g_free(safe_delete_path);
+       safe_delete_path = concat_dir_and_file(homedir(), GQVIEW_RC_DIR_TRASH);
 }
 
-void exit_gqview()
+static void exit_gqview_final(void)
 {
-       full_screen_stop();
+       gchar *path;
+       gchar *pathl;
+       LayoutWindow *lw = NULL;
+
+       remote_close(gqview_remote);
 
-       gdk_window_get_position (mainwindow->window, &main_window_x, &main_window_y);
-       gdk_window_get_size(mainwindow->window, &main_window_w, &main_window_h);
+       collect_manager_flush();
 
-       if (toolwindow)
+       if (layout_valid(&lw))
                {
-               gdk_window_get_position (toolwindow->window, &float_window_x, &float_window_y);
-               gdk_window_get_size(toolwindow->window, &float_window_w, &float_window_h);
+               main_window_maximized =  window_maximized(lw->window);
+               if (!main_window_maximized)
+                       {
+                       layout_geometry_get(NULL, &main_window_x, &main_window_y,
+                                           &main_window_w, &main_window_h);
+                       }
                }
+
+       layout_geometry_get_dividers(NULL, &window_hdivider_pos, &window_vdivider_pos);
+
+       layout_views_get(NULL, &layout_view_tree, &layout_view_icons);
+
+       thumbnails_enabled = layout_thumb_get(NULL);
+       layout_sort_get(NULL, &file_sort_method, &file_sort_ascending);
+
+       layout_geometry_get_tools(NULL, &float_window_x, &float_window_y,
+                                 &float_window_w, &float_window_h, &float_window_divider);
+       layout_tools_float_get(NULL, &tools_float, &tools_hidden);
+       toolbar_hidden = layout_toolbar_hidden(NULL);
+
        save_options();
+       keys_save();
+
+       path = g_strconcat(homedir(), "/", GQVIEW_RC_DIR, "/accels", NULL);
+       pathl = path_from_utf8(path);
+       gtk_accel_map_save(pathl);
+       g_free(pathl);
+       g_free(path);
 
        gtk_main_quit();
 }
 
+static GenericDialog *exit_dialog = NULL;
+
+static void exit_confirm_cancel_cb(GenericDialog *gd, gpointer data)
+{
+       exit_dialog = NULL;
+       generic_dialog_close(gd);
+}
+
+static void exit_confirm_exit_cb(GenericDialog *gd, gpointer data)
+{
+       exit_dialog = NULL;
+       generic_dialog_close(gd);
+       exit_gqview_final();
+}
+
+static gint exit_confirm_dlg(void)
+{
+       GtkWidget *parent;
+       LayoutWindow *lw;
+
+       if (exit_dialog)
+               {
+               gtk_window_present(GTK_WINDOW(exit_dialog->dialog));
+               return TRUE;
+               }
+
+       if (!collection_window_modified_exists()) return FALSE;
+
+       parent = NULL;
+       lw = NULL;
+       if (layout_valid(&lw))
+               {
+               parent = lw->window;
+               }
+
+       exit_dialog = generic_dialog_new(_("GQview - exit"),
+                               "GQview", "exit", parent, FALSE,
+                               exit_confirm_cancel_cb, NULL);
+       generic_dialog_add_message(exit_dialog, GTK_STOCK_DIALOG_QUESTION,
+                                  _("Quit GQview"), _("Collections have been modified. Quit anyway?"));
+       generic_dialog_add_button(exit_dialog, GTK_STOCK_QUIT, NULL, exit_confirm_exit_cb, TRUE);
+
+       gtk_widget_show(exit_dialog->dialog);
+
+       return TRUE;
+}
+
+void exit_gqview(void)
+{
+       layout_image_full_screen_stop(NULL);
+
+       if (exit_confirm_dlg()) return;
+
+       exit_gqview_final();
+}
+
 int main (int argc, char *argv[])
 {
+       LayoutWindow *lw;
+       gchar *path = NULL;
        gchar *cmd_path = NULL;
        gchar *cmd_file = NULL;
+       GList *cmd_list = NULL;
+       GList *collection_list = NULL;
+       CollectionData *first_collection = NULL;
+       gchar *buf;
+       gchar *bufl;
 
        /* setup locale, i18n */
        gtk_set_locale();
        bindtextdomain (PACKAGE, LOCALEDIR);
+       bind_textdomain_codeset (PACKAGE, "UTF-8");
        textdomain (PACKAGE);
 
        /* setup random seed for random slideshow */
-        srand (time (0));
+        srand(time(NULL));
 
-       gtk_init (&argc, &argv);
-       gdk_imlib_init();
-
-       /* push the correct color depths to gtk, (for 8-bit psuedo color displays)
-        * they should be popped, too, I guess...
-        */
-       gtk_widget_push_visual(gdk_imlib_get_visual());
-       gtk_widget_push_colormap(gdk_imlib_get_colormap());
+#if 0
+       printf("GQview %s, This is a beta release.\n", VERSION);
+#endif
 
+       layout_order = g_strdup("123");
        setup_default_options();
        load_options();
 
-       parse_command_line(argc, argv, &cmd_path, &cmd_file);
+       parse_command_line(argc, argv, &cmd_path, &cmd_file, &cmd_list, &collection_list);
+
+       gtk_init (&argc, &argv);
+
+       if (gtk_major_version < GTK_MAJOR_VERSION ||
+           (gtk_major_version == GTK_MAJOR_VERSION && gtk_minor_version < GTK_MINOR_VERSION) )
+               {
+               gchar *msg;
+               print_term("!!! This is a friendly warning.\n");
+               print_term("!!! The version of GTK+ in use now is older than when GQview was compiled.\n");
+               msg = g_strdup_printf("!!!  compiled with GTK+-%d.%d\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION);
+               print_term(msg);
+               g_free(msg);
+               msg = g_strdup_printf("!!!   running with GTK+-%d.%d\n", gtk_major_version, gtk_minor_version);
+               print_term(msg);
+               g_free(msg);
+               print_term("!!! GQview may quit unexpectedly with a relocation error.\n");
+               }
+
+       check_for_home_path(GQVIEW_RC_DIR);
+       check_for_home_path(GQVIEW_RC_DIR_COLLECTIONS);
+       check_for_home_path(GQVIEW_CACHE_RC_THUMB);
+       check_for_home_path(GQVIEW_CACHE_RC_METADATA);
 
-       if (cmd_path)
-               current_path = g_strdup(cmd_path);
+       keys_load();
+       filter_add_defaults();
+       filter_rebuild();
+
+       buf = g_strconcat(homedir(), "/", GQVIEW_RC_DIR, "/accels", NULL);
+       bufl = path_from_utf8(buf);
+       gtk_accel_map_load(bufl);
+       g_free(bufl);
+       g_free(buf);
+
+       if (startup_blank)
+               {
+               g_free(cmd_path);
+               cmd_path = NULL;
+               g_free(cmd_file);
+               cmd_file = NULL;
+               path_list_free(cmd_list);
+               cmd_list = NULL;
+               path_list_free(collection_list);
+               collection_list = NULL;
+
+               path = NULL;
+               }
+       else if (cmd_path)
+               {
+               path = g_strdup(cmd_path);
+               }
        else if (startup_path_enable && startup_path && isdir(startup_path))
-               current_path = g_strdup(startup_path);
+               {
+               path = g_strdup(startup_path);
+               }
        else
-               current_path = get_current_dir();
+               {
+               path = get_current_dir();
+               }
+
+       lw = layout_new(NULL, tools_float, tools_hidden);
+       layout_sort_set(lw, file_sort_method, file_sort_ascending);
+
+       if (collection_list && !startup_command_line_collection)
+               {
+               GList *work;
 
-       create_main_window();
-       update_edit_menus(mainwindow_accel_grp);
-       rebuild_file_filter();
-       filelist_refresh();
+               work = collection_list;
+               while (work)
+                       {
+                       CollectWindow *cw;
+                       const gchar *path;
+
+                       path = work->data;
+                       work = work->next;
 
-       init_dnd();
+                       cw = collection_window_new(path);
+                       if (!first_collection && cw) first_collection = cw->cd;
+                       }
+               }
 
-       while(gtk_events_pending()) gtk_main_iteration();
-       image_change_to(cmd_file);
+       if (cmd_list ||
+           (startup_command_line_collection && collection_list))
+               {
+               CollectionData *cd;
+               GList *work;
+
+               if (startup_command_line_collection)
+                       {
+                       CollectWindow *cw;
+
+                       cw = collection_window_new("");
+                       cd = cw->cd;
+                       }
+               else
+                       {
+                       cd = collection_new("");        /* if we pass NULL, untitled counter is falsely increm. */
+                       gqview_command_collection = cd;
+                       }
+
+               g_free(cd->path);
+               cd->path = NULL;
+               g_free(cd->name);
+               cd->name = g_strdup(_("Command line"));
+
+               collection_path_changed(cd);
+
+               work = cmd_list;
+               while (work)
+                       {
+                       collection_add(cd, (gchar *)work->data, FALSE);
+                       work = work->next;
+                       }
+
+               work = collection_list;
+               while (work)
+                       {
+                       collection_load(cd, (gchar *)work->data, TRUE);
+                       work = work->next;
+                       }
+
+               layout_set_path(lw, path);
+               if (cd->list) layout_image_set_collection(lw, cd, cd->list->data);
+
+               /* mem leak, we never unref this collection when !startup_command_line_collection
+                * (the image view of the main window does not hold a ref to the collection)
+                * this is sort of unavoidable, for if it did hold a ref, next/back
+                * may not work as expected when closing collection windows.
+                *
+                * collection_unref(cd);
+                */
+
+               }
+       else if (cmd_file)
+               {
+               layout_set_path(lw, cmd_file);
+               }
+       else
+               {
+               layout_set_path(lw, path);
+               if (first_collection)
+                       {
+                       layout_image_set_collection(lw, first_collection,
+                                                   collection_get_first(first_collection));
+                       }
+               }
 
        g_free(cmd_path);
        g_free(cmd_file);
+       path_list_free(cmd_list);
+       path_list_free(collection_list);
+       g_free(path);
 
-       if (startup_full_screen) full_screen_toggle();
-       if (startup_in_slideshow) slideshow_start();
+       if (startup_full_screen) layout_image_full_screen_start(lw);
+       if (startup_in_slideshow) layout_image_slideshow_start(lw);
+
+       buf = g_strconcat(homedir(), "/", GQVIEW_RC_DIR, "/.command", NULL);
+       gqview_remote = remote_server_open(buf);
+       remote_server_subscribe(gqview_remote, gqview_remote_cb, NULL);
+       g_free(buf);
 
        gtk_main ();
        return 0;
 }
 
-
diff --git a/src/md5-util.c b/src/md5-util.c
new file mode 100644 (file)
index 0000000..a66ab26
--- /dev/null
@@ -0,0 +1,424 @@
+/*
+ * This code implements the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest.  This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
+ *
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to md5_init, call md5_update as
+ * needed on buffers full of bytes, and then call md5_Final, which
+ * will fill a supplied 16-byte array with the digest.
+ */
+
+/* parts of this file are :
+ * Written March 1993 by Branko Lankester
+ * Modified June 1993 by Colin Plumb for altered md5.c.
+ * Modified October 1995 by Erik Troan for RPM
+ */
+
+/*
+ * Pulled from evolution for use in GQview, their version is nicely glib'ed
+ * GNOME CVS HEAD evolution/e-util/md5-utils.[ch] September 8, 2004
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+#include "md5-util.h"
+
+#include "ui_fileops.h"        /* for utf-8 filename conversion */
+
+
+static void md5_transform (guint32 buf[4], const guint32 in[16]);
+
+static gint _ie = 0x44332211;
+static union _endian { gint i; gchar b[4]; } *_endian = (union _endian *)&_ie;
+#define        IS_BIG_ENDIAN()         (_endian->b[0] == '\x44')
+#define        IS_LITTLE_ENDIAN()      (_endian->b[0] == '\x11')
+
+
+/*
+ * Note: this code is harmless on little-endian machines.
+ */
+static void 
+_byte_reverse (guchar *buf, guint32 longs)
+{
+       guint32 t;
+       do {
+               t = (guint32) ((guint32) buf[3] << 8 | buf[2]) << 16 |
+                       ((guint32) buf[1] << 8 | buf[0]);
+               *(guint32 *) buf = t;
+               buf += 4;
+       } while (--longs);
+}
+
+/**
+ * md5_init: Initialise an md5 context object
+ * @ctx: md5 context 
+ * 
+ * Initialise an md5 buffer. 
+ *
+ **/
+void 
+md5_init (MD5Context *ctx)
+{
+       ctx->buf[0] = 0x67452301;
+       ctx->buf[1] = 0xefcdab89;
+       ctx->buf[2] = 0x98badcfe;
+       ctx->buf[3] = 0x10325476;
+       
+       ctx->bits[0] = 0;
+       ctx->bits[1] = 0;
+       
+       if (IS_BIG_ENDIAN())    
+               ctx->doByteReverse = 1;         
+       else 
+               ctx->doByteReverse = 0; 
+}
+
+
+
+/**
+ * md5_update: add a buffer to md5 hash computation
+ * @ctx: conetxt object used for md5 computaion
+ * @buf: buffer to add
+ * @len: buffer length
+ * 
+ * Update context to reflect the concatenation of another buffer full
+ * of bytes. Use this to progressively construct an md5 hash.
+ **/
+void 
+md5_update (MD5Context *ctx, const guchar *buf, guint32 len)
+{
+       guint32 t;
+       
+       /* Update bitcount */
+       
+       t = ctx->bits[0];
+       if ((ctx->bits[0] = t + ((guint32) len << 3)) < t)
+               ctx->bits[1]++;         /* Carry from low to high */
+       ctx->bits[1] += len >> 29;
+       
+       t = (t >> 3) & 0x3f;    /* Bytes already in shsInfo->data */
+       
+       /* Handle any leading odd-sized chunks */
+       
+       if (t) {
+               guchar *p = (guchar *) ctx->in + t;
+               
+               t = 64 - t;
+               if (len < t) {
+                       memcpy (p, buf, len);
+                       return;
+               }
+               memcpy (p, buf, t);
+               if (ctx->doByteReverse)
+                       _byte_reverse (ctx->in, 16);
+               md5_transform (ctx->buf, (guint32 *) ctx->in);
+               buf += t;
+               len -= t;
+       }
+       /* Process data in 64-byte chunks */
+       
+       while (len >= 64) {
+               memcpy (ctx->in, buf, 64);
+               if (ctx->doByteReverse)
+                       _byte_reverse (ctx->in, 16);
+               md5_transform (ctx->buf, (guint32 *) ctx->in);
+               buf += 64;
+               len -= 64;
+       }
+       
+       /* Handle any remaining bytes of data. */
+       
+       memcpy (ctx->in, buf, len);
+}
+
+
+
+
+
+/*
+ * Final wrapup - pad to 64-byte boundary with the bit pattern 
+ * 1 0* (64-bit count of bits processed, MSB-first)
+ */
+/**
+ * md5_final: copy the final md5 hash to a bufer
+ * @digest: 16 bytes buffer
+ * @ctx: context containing the calculated md5
+ * 
+ * copy the final md5 hash to a bufer
+ **/
+void 
+md5_final (MD5Context *ctx, guchar digest[16])
+{
+       guint32 count;
+       guchar *p;
+       
+       /* Compute number of bytes mod 64 */
+       count = (ctx->bits[0] >> 3) & 0x3F;
+       
+       /* Set the first char of padding to 0x80.  This is safe since there is
+          always at least one byte free */
+       p = ctx->in + count;
+       *p++ = 0x80;
+       
+       /* Bytes of padding needed to make 64 bytes */
+       count = 64 - 1 - count;
+       
+       /* Pad out to 56 mod 64 */
+       if (count < 8) {
+               /* Two lots of padding:  Pad the first block to 64 bytes */
+               memset (p, 0, count);
+               if (ctx->doByteReverse)
+                       _byte_reverse (ctx->in, 16);
+               md5_transform (ctx->buf, (guint32 *) ctx->in);
+               
+               /* Now fill the next block with 56 bytes */
+               memset (ctx->in, 0, 56);
+       } else {
+               /* Pad block to 56 bytes */
+               memset (p, 0, count - 8);
+       }
+       if (ctx->doByteReverse)
+               _byte_reverse (ctx->in, 14);
+       
+       /* Append length in bits and transform */
+       ((guint32 *) ctx->in)[14] = ctx->bits[0];
+       ((guint32 *) ctx->in)[15] = ctx->bits[1];
+       
+       md5_transform (ctx->buf, (guint32 *) ctx->in);
+       if (ctx->doByteReverse)
+               _byte_reverse ((guchar *) ctx->buf, 4);
+       memcpy (digest, ctx->buf, 16);
+}
+
+
+
+
+/* The four core functions - F1 is optimized somewhat */
+
+/* #define F1(x, y, z) (x & y | ~x & z) */
+#define F1(x, y, z) (z ^ (x & (y ^ z)))
+#define F2(x, y, z) F1(z, x, y)
+#define F3(x, y, z) (x ^ y ^ z)
+#define F4(x, y, z) (y ^ (x | ~z))
+
+/* This is the central step in the MD5 algorithm. */
+#define MD5STEP(f, w, x, y, z, data, s) \
+       ( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
+
+/*
+ * The core of the MD5 algorithm, this alters an existing MD5 hash to
+ * reflect the addition of 16 longwords of new data.  md5_Update blocks
+ * the data and converts bytes into longwords for this routine.
+ */
+static void 
+md5_transform (guint32 buf[4], const guint32 in[16])
+{
+       register guint32 a, b, c, d;
+       
+       a = buf[0];
+       b = buf[1];
+       c = buf[2];
+       d = buf[3];
+       
+       MD5STEP (F1, a, b, c, d, in[0] + 0xd76aa478, 7);
+       MD5STEP (F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
+       MD5STEP (F1, c, d, a, b, in[2] + 0x242070db, 17);
+       MD5STEP (F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
+       MD5STEP (F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
+       MD5STEP (F1, d, a, b, c, in[5] + 0x4787c62a, 12);
+       MD5STEP (F1, c, d, a, b, in[6] + 0xa8304613, 17);
+       MD5STEP (F1, b, c, d, a, in[7] + 0xfd469501, 22);
+       MD5STEP (F1, a, b, c, d, in[8] + 0x698098d8, 7);
+       MD5STEP (F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
+       MD5STEP (F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
+       MD5STEP (F1, b, c, d, a, in[11] + 0x895cd7be, 22);
+       MD5STEP (F1, a, b, c, d, in[12] + 0x6b901122, 7);
+       MD5STEP (F1, d, a, b, c, in[13] + 0xfd987193, 12);
+       MD5STEP (F1, c, d, a, b, in[14] + 0xa679438e, 17);
+       MD5STEP (F1, b, c, d, a, in[15] + 0x49b40821, 22);
+       
+       MD5STEP (F2, a, b, c, d, in[1] + 0xf61e2562, 5);
+       MD5STEP (F2, d, a, b, c, in[6] + 0xc040b340, 9);
+       MD5STEP (F2, c, d, a, b, in[11] + 0x265e5a51, 14);
+       MD5STEP (F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
+       MD5STEP (F2, a, b, c, d, in[5] + 0xd62f105d, 5);
+       MD5STEP (F2, d, a, b, c, in[10] + 0x02441453, 9);
+       MD5STEP (F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
+       MD5STEP (F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
+       MD5STEP (F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
+       MD5STEP (F2, d, a, b, c, in[14] + 0xc33707d6, 9);
+       MD5STEP (F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
+       MD5STEP (F2, b, c, d, a, in[8] + 0x455a14ed, 20);
+       MD5STEP (F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
+       MD5STEP (F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
+       MD5STEP (F2, c, d, a, b, in[7] + 0x676f02d9, 14);
+       MD5STEP (F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
+       
+       MD5STEP (F3, a, b, c, d, in[5] + 0xfffa3942, 4);
+       MD5STEP (F3, d, a, b, c, in[8] + 0x8771f681, 11);
+       MD5STEP (F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
+       MD5STEP (F3, b, c, d, a, in[14] + 0xfde5380c, 23);
+       MD5STEP (F3, a, b, c, d, in[1] + 0xa4beea44, 4);
+       MD5STEP (F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
+       MD5STEP (F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
+       MD5STEP (F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
+       MD5STEP (F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
+       MD5STEP (F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
+       MD5STEP (F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
+       MD5STEP (F3, b, c, d, a, in[6] + 0x04881d05, 23);
+       MD5STEP (F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
+       MD5STEP (F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
+       MD5STEP (F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
+       MD5STEP (F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
+       
+       MD5STEP (F4, a, b, c, d, in[0] + 0xf4292244, 6);
+       MD5STEP (F4, d, a, b, c, in[7] + 0x432aff97, 10);
+       MD5STEP (F4, c, d, a, b, in[14] + 0xab9423a7, 15);
+       MD5STEP (F4, b, c, d, a, in[5] + 0xfc93a039, 21);
+       MD5STEP (F4, a, b, c, d, in[12] + 0x655b59c3, 6);
+       MD5STEP (F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
+       MD5STEP (F4, c, d, a, b, in[10] + 0xffeff47d, 15);
+       MD5STEP (F4, b, c, d, a, in[1] + 0x85845dd1, 21);
+       MD5STEP (F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
+       MD5STEP (F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
+       MD5STEP (F4, c, d, a, b, in[6] + 0xa3014314, 15);
+       MD5STEP (F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
+       MD5STEP (F4, a, b, c, d, in[4] + 0xf7537e82, 6);
+       MD5STEP (F4, d, a, b, c, in[11] + 0xbd3af235, 10);
+       MD5STEP (F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
+       MD5STEP (F4, b, c, d, a, in[9] + 0xeb86d391, 21);
+       
+       buf[0] += a;
+       buf[1] += b;
+       buf[2] += c;
+       buf[3] += d;
+}
+
+
+
+
+/**
+ * md5_get_digest: get the md5 hash of a buffer
+ * @buffer: byte buffer
+ * @buffer_size: buffer size (in bytes)
+ * @digest: 16 bytes buffer receiving the hash code.
+ * 
+ * Get the md5 hash of a buffer. The result is put in 
+ * the 16 bytes buffer @digest .
+ **/
+void
+md5_get_digest (const gchar *buffer, gint buffer_size, guchar digest[16])
+{      
+       MD5Context ctx;
+
+       md5_init (&ctx);
+       md5_update (&ctx, buffer, buffer_size);
+       md5_final (&ctx, digest);
+       
+}
+
+/* modified for GQView, starting here */
+
+/**
+ * md5_get_digest_from_file: get the md5 hash of a file
+ * @filename: file name
+ * @digest: 16 bytes buffer receiving the hash code.
+ * @return: TRUE on success
+ * 
+ * Get the md5 hash of a file. The result is put in 
+ * the 16 bytes buffer @digest .
+ **/
+gboolean md5_get_digest_from_file(const gchar *path, guchar digest[16])
+{      
+       MD5Context ctx;
+       guchar tmp_buf[1024];
+       gint nb_bytes_read;
+       FILE *fp;
+       gint success;
+
+       fp = fopen(path, "r");
+       if (!fp) return FALSE;
+
+       md5_init(&ctx);
+       
+       while ((nb_bytes_read = fread (tmp_buf, sizeof (guchar), 1024, fp)) > 0)
+               {
+               md5_update (&ctx, tmp_buf, nb_bytes_read);
+               }
+       
+       success = (ferror(fp) == 0);
+       fclose(fp);
+       if (!success) return FALSE;
+
+       md5_final (&ctx, digest);
+       return TRUE;
+}
+
+/* does filename utf8 to filesystem encoding first */
+gboolean md5_get_digest_from_file_utf8(const gchar *path, guchar digest[16])
+{
+       gboolean success;
+       gchar *pathl;
+
+       pathl = path_from_utf8(path);
+       success = md5_get_digest_from_file(pathl, digest);
+       g_free(pathl);
+
+       return success;
+}
+
+/* these to and from text string converters were borrowed from
+ * the libgnomeui library, where they are name thumb_digest_to/from_ascii
+ *
+ * this version of the from text util does buffer length checking,
+ * and assumes a NULL terminated string.
+ */
+
+gchar *md5_digest_to_text(guchar digest[16])
+{
+       static gchar hex_digits[] = "0123456789abcdef";
+       gchar *result;
+       gint i;
+
+       result = g_malloc(33);
+       for (i = 0; i < 16; i++)
+               {
+               result[2*i] = hex_digits[digest[i] >> 4];
+               result[2*i+1] = hex_digits[digest[i] & 0xf];
+               }
+       result[32] = '\0';
+
+       return result;
+}
+
+gboolean md5_digest_from_text(const gchar *text, guchar digest[16])
+{
+       gint i;
+
+       for (i = 0; i < 16; i++)
+               {
+               if (text[2*i] == '\0' || text[2*i+1] == '\0') return FALSE;
+               digest[i] = g_ascii_xdigit_value (text[2*i]) << 4 |
+                           g_ascii_xdigit_value (text[2*i + 1]);
+       }
+
+       return TRUE;
+}
+
+gchar *md5_text_from_file_utf8(const gchar *path, const gchar *error_text)
+{
+       guchar digest[16];
+
+       if (!md5_get_digest_from_file_utf8(path, digest)) return g_strdup(error_text);
+
+       return md5_digest_to_text(digest);
+}
+
diff --git a/src/md5-util.h b/src/md5-util.h
new file mode 100644 (file)
index 0000000..dfc0fee
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * This code implements the MD5 message-digest algorithm.
+ * The algorithm is due to Ron Rivest.  This code was
+ * written by Colin Plumb in 1993, no copyright is claimed.
+ * This code is in the public domain; do with it what you wish.
+ *
+ * Equivalent code is available from RSA Data Security, Inc.
+ * This code has been tested against that, and is equivalent,
+ * except that you don't need to include two pages of legalese
+ * with every copy.
+ *
+ * To compute the message digest of a chunk of bytes, declare an
+ * MD5Context structure, pass it to rpmMD5Init, call rpmMD5Update as
+ * needed on buffers full of bytes, and then call rpmMD5Final, which
+ * will fill a supplied 16-byte array with the digest.
+ */
+
+/* parts of this file are :
+ * Written March 1993 by Branko Lankester
+ * Modified June 1993 by Colin Plumb for altered md5.c.
+ * Modified October 1995 by Erik Troan for RPM
+ */
+
+
+#ifndef MD5_UTIL_H
+#define MD5_UTIL_H
+
+#include <glib.h>
+
+
+typedef struct _MD5Context {
+       guint32 buf[4];
+       guint32 bits[2];
+       guchar in[64];
+       gint doByteReverse;
+} MD5Context;
+
+
+/* raw routines */
+void md5_init (MD5Context *ctx);
+void md5_update (MD5Context *ctx, const guchar *buf, guint32 len);
+void md5_final (MD5Context *ctx, guchar digest[16]);
+
+/* generate digest from memory buffer */
+void md5_get_digest (const gchar *buffer, gint buffer_size, guchar digest[16]);
+
+/* generate digest from file */
+gboolean md5_get_digest_from_file(const gchar *path, guchar digest[16]);
+gboolean md5_get_digest_from_file_utf8(const gchar *path, guchar digest[16]);
+
+/* generate md5 string from file,
+ * on failure returns newly allocated copy of error_text, error_text may be NULL
+  */
+gchar *md5_text_from_file_utf8(const gchar *path, const gchar *error_text);
+
+/* convert digest to/from a NULL terminated text string, in ascii encoding */
+gchar *md5_digest_to_text(guchar digest[16]);
+gboolean md5_digest_from_text(const gchar *text, guchar digest[16]);
+
+
+#endif /* MD5_UTILS_H */
+
index 978d760..c355f68 100644 (file)
 /*
- * GQview image viewer
- * (C)2000 John Ellis
+ * GQview
+ * (C) 2004 John Ellis
  *
  * Author: John Ellis
  *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
  */
 
-#include "gqview.h"
-
-#include "icons/icon_thumb.xpm"
-#include "icons/icon_home.xpm"
-#include "icons/icon_reload.xpm"
-#include "icons/icon_zoom_in.xpm"
-#include "icons/icon_zoom_out.xpm"
-#include "icons/icon_zoom_fit.xpm"
-#include "icons/icon_zoom_norm.xpm"
-#include "icons/icon_config.xpm"
-#include "icons/icon_float.xpm"
-
-
-static void add_menu_item(GtkWidget *menu, gchar *label, GtkAccelGroup *accel_group,
-                               guint accel_key, guint accel_mods, GtkSignalFunc func, gpointer data);
 
-static void add_edit_items(GtkWidget *menu, GtkSignalFunc func, GtkAccelGroup *accel_grp);
-
-static void add_button_to_bar(GtkWidget *hbox, gchar **pixmap_data,
-                             GtkTooltips *tooltips, gchar *tip_text,
-                             GtkSignalFunc func, gpointer data);
-
-static void set_thumbnails(gint mode)
-{
-       if (thumbnails_enabled == mode) return;
-       thumbnails_enabled = mode;
-       gtk_check_menu_item_set_state(GTK_CHECK_MENU_ITEM(thumb_menu_item), thumbnails_enabled);
-       gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(thumb_button), thumbnails_enabled);
-       filelist_populate_clist();
-}
+#include "gqview.h"
+#include "menu.h"
+
+#include "cache_maint.h"
+#include "collect.h"
+#include "collect-dlg.h"
+#include "dupe.h"
+#include "filelist.h"
+#include "img-view.h"
+#include "preferences.h"
+#include "slideshow.h"
+#include "utilops.h"
+#include "ui_fileops.h"
+#include "ui_tabcomp.h"
+#include "ui_menu.h"
+
+static GtkWidget *real_submenu_add_alter(GtkWidget *menu, GCallback func, gpointer data,
+                                        GtkAccelGroup *accel_group);
 
 /*
  *-----------------------------------------------------------------------------
- * menu and button callbacks (private)
+ * menu utils
  *-----------------------------------------------------------------------------
  */ 
 
-static void exit_cb(GtkWidget *widget, gpointer data)
-{
-       exit_gqview();
-}
-
-static void about_cb(GtkWidget *widget, gpointer data)
-{
-       show_about_window();
-}
-
-static void create_dir_cb(GtkWidget *widget, gpointer data)
-{
-       file_util_create_dir(current_path);
-}
-
-static void zoom_in_cb(GtkWidget *widget, gpointer data)
-{
-       image_adjust_zoom(1);
-}
-
-static void zoom_out_cb(GtkWidget *widget, gpointer data)
+static GtkWidget *add_menu_item(GtkWidget *menu, gchar *label, GtkAccelGroup *accel_group,
+                               guint accel_key, guint accel_mods, GCallback func, gpointer data)
 {
-       image_adjust_zoom(-1);
-}
-
-static void zoom_1_1_cb(GtkWidget *widget, gpointer data)
-{
-       image_set_zoom(1);
-}
-
-static void zoom_fit_cb(GtkWidget *widget, gpointer data)
-{
-       image_set_zoom(0);
-}
-
-static void thumb_menu_cb(GtkWidget *widget, gpointer data)
-{
-       set_thumbnails(GTK_CHECK_MENU_ITEM(widget)->active);
-}
-
-static void thumb_button_cb(GtkWidget *widget, gpointer data)
-{
-       set_thumbnails(GTK_TOGGLE_BUTTON(widget)->active);
-}
-
-static void refresh_cb(GtkWidget *widget, gpointer data)
-{
-       gchar *buf = g_strdup(current_path);
-       filelist_change_to(buf);
-       g_free(buf);
-}
-
-static void float_cb(GtkWidget *widget, gpointer data)
-{
-       toolwindow_float();
-}
-
-static void hide_cb(GtkWidget *widget, gpointer data)
-{
-       toolwindow_hide();
-}
-
-static void slideshow_cb(GtkWidget *widget, gpointer data)
-{
-       slideshow_toggle();
-}
-
-static void home_dir_cb(GtkWidget *widget, gpointer data)
-{
-       gchar *path = homedir();
-       if (path) filelist_change_to(path);
-}
+       GtkWidget *item;
 
-static void config_cb(GtkWidget *widget, gpointer data)
-{
-       show_config_window();
-}
+       item = gtk_menu_item_new_with_label(label);
+       gtk_widget_add_accelerator (item, "activate", accel_group, accel_key, accel_mods, GTK_ACCEL_VISIBLE);
+       g_signal_connect(G_OBJECT(item), "activate", func, data);
+       gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+       gtk_widget_show(item);
 
-static void remove_thumb_cb(GtkWidget *widget, gpointer data)
-{
-       maintain_thumbnail_dir("/", TRUE);
+       return item;
 }
 
-static void full_screen_cb(GtkWidget *widget, gpointer data)
+gpointer submenu_item_get_data(GtkWidget *menu)
 {
-       full_screen_toggle();
-}
+       if (!menu->parent || !GTK_IS_MENU(menu->parent)) return NULL;
 
-static void wallpaper_image_cb(GtkWidget *widget, gpointer data)
-{
-       image_to_root();
+       return g_object_get_data(G_OBJECT(menu->parent), "submenu_data");
 }
 
 /*
  *-----------------------------------------------------------------------------
- * image menu callbacks (private)
+ * edit menu
  *-----------------------------------------------------------------------------
  */ 
 
-static void copy_image_cb(GtkWidget *widget, gpointer data)
+static void add_edit_items(GtkWidget *menu, GCallback func, GtkAccelGroup *accel_grp)
 {
-       full_screen_stop();
-       file_util_copy(image_get_path(), NULL, current_path);
+       gint i;
+       for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
+               {
+               if (editor_command[i] && strlen(editor_command[i]) > 0)
+                       {
+                       gchar *text;
+                       if (editor_name[i] && strlen(editor_name[i]) > 0)
+                               text = g_strdup_printf(_("in %s..."), editor_name[i]);
+                       else
+                               text = g_strdup(_("in (unknown)..."));
+                       if (accel_grp)
+                               add_menu_item(menu, text, accel_grp, i + 49, GDK_CONTROL_MASK, func, GINT_TO_POINTER(i));
+                       else
+                               menu_item_add_simple(menu, text, func, GINT_TO_POINTER(i));
+                       g_free(text);
+                       }
+               }
 }
 
-static void move_image_cb(GtkWidget *widget, gpointer data)
+GtkWidget *submenu_add_edit(GtkWidget *menu, GtkWidget **menu_item, GCallback func, gpointer data)
 {
-       full_screen_stop();
-       file_util_move(image_get_path(), NULL, current_path);
-}
+       GtkWidget *item;
+       GtkWidget *submenu;
 
-static void rename_image_cb(GtkWidget *widget, gpointer data)
-{
-       full_screen_stop();
-       file_util_rename(image_get_path(), NULL);
-}
+       item = menu_item_add(menu, _("_Edit"), NULL, NULL);
 
-static void delete_image_cb(GtkWidget *widget, gpointer data)
-{
-       full_screen_stop();
-       file_util_delete(image_get_path(), NULL);
-}
+       submenu = gtk_menu_new();
+       g_object_set_data(G_OBJECT(submenu), "submenu_data", data);
+       add_edit_items(submenu, func, NULL);
 
-/*
- *-----------------------------------------------------------------------------
- * file menu callbacks (private)
- *-----------------------------------------------------------------------------
- */ 
+       gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
 
-static void copy_file_cb(GtkWidget *widget, gpointer data)
-{
-       file_util_copy(NULL, file_get_selected_list(), current_path);
-}
-
-static void move_file_cb(GtkWidget *widget, gpointer data)
-{
-       file_util_move(NULL, file_get_selected_list(), current_path);
-}
-
-static void rename_file_cb(GtkWidget *widget, gpointer data)
-{
-       file_util_rename(NULL, file_get_selected_list());
-}
+       if (menu_item) *menu_item = item;
 
-static void delete_file_cb(GtkWidget *widget, gpointer data)
-{
-       file_util_delete(NULL, file_get_selected_list());
+       return submenu;
 }
 
 /*
  *-----------------------------------------------------------------------------
- * filelist popup menu callbacks (private)
+ * sorting
  *-----------------------------------------------------------------------------
- */ 
+ */
 
-static void popup_copy_file_cb(GtkWidget *widget, gpointer data)
+gchar *sort_type_get_text(SortType method)
 {
-       if (file_clicked_is_selected())
-               {
-               file_util_copy(NULL, file_get_selected_list(), current_path);
-               }
-       else
+       switch (method)
                {
-               gchar *path = file_clicked_get_path();
-               file_util_copy(path, NULL, current_path);
-               g_free(path);
+               case SORT_SIZE:
+                       return _("Sort by size");
+                       break;
+               case SORT_TIME:
+                       return _("Sort by date");
+                       break;
+               case SORT_NONE:
+                       return _("Unsorted");
+                       break;
+               case SORT_PATH:
+                       return _("Sort by path");
+                       break;
+               case SORT_NUMBER:
+                       return _("Sort by number");
+                       break;
+               case SORT_NAME:
+               default:
+                       return _("Sort by name");
+                       break;
                }
-}
 
-static void popup_move_file_cb(GtkWidget *widget, gpointer data)
-{
-       if (file_clicked_is_selected())
-               {
-               file_util_move(NULL, file_get_selected_list(), current_path);
-               }
-       else
-               {
-               gchar *path = file_clicked_get_path();
-               file_util_move(path, NULL, current_path);
-               g_free(path);
-               }
+       return "";
 }
 
-static void popup_rename_file_cb(GtkWidget *widget, gpointer data)
+static void submenu_add_sort_item(GtkWidget *menu, GCallback func, SortType type,
+                                 gint show_current, SortType show_type)
 {
-       if (file_clicked_is_selected())
+       if (show_current)
                {
-               file_util_rename(NULL, file_get_selected_list());
+               menu_item_add_check(menu, sort_type_get_text(type), (type == show_type),
+                                   func, GINT_TO_POINTER((gint)type));
                }
        else
                {
-               gchar *path = file_clicked_get_path();
-               file_util_rename(path, NULL);
-               g_free(path);
+               menu_item_add(menu, sort_type_get_text(type),
+                             func, GINT_TO_POINTER((gint)type));
                }
 }
 
-static void popup_delete_file_cb(GtkWidget *widget, gpointer data)
+GtkWidget *submenu_add_sort(GtkWidget *menu, GCallback func, gpointer data,
+                           gint include_none, gint include_path,
+                           gint show_current, SortType type)
 {
-       if (file_clicked_is_selected())
-               {
-               file_util_delete(NULL, file_get_selected_list());
-               }
-       else
-               {
-               gchar *path = file_clicked_get_path();
-               file_util_delete(path, NULL);
-               g_free(path);
-               }
-}
+       GtkWidget *submenu;
 
-static void edit_image_cb(GtkWidget *widget, gpointer data)
-{
-       gint n = GPOINTER_TO_INT(data);
-       start_editor_from_image(n);
-}
-
-static void edit_list_cb(GtkWidget *widget, gpointer data)
-{
-       gint n = GPOINTER_TO_INT(data);
-       start_editor_from_list(n);
-}
-
-static void edit_full_cb(GtkWidget *widget, gpointer data)
-{
-       gint n = GPOINTER_TO_INT(data);
-       full_screen_stop();
-       start_editor_from_image(n);
-}
-
-static void edit_view_cb(GtkWidget *widget, gpointer data)
-{
-       gint n = GPOINTER_TO_INT(data);
-       view_window_active_edit(n);
-}
-
-static void wallpaper_view_cb(GtkWidget *widget, gpointer data)
-{
-       gint n = GPOINTER_TO_INT(data);
-       view_window_active_to_root(n);
-}
+       submenu = gtk_menu_new();
+       g_object_set_data(G_OBJECT(submenu), "submenu_data", data);
 
-static void popup_edit_list_cb(GtkWidget *widget, gpointer data)
-{
-       gint n = GPOINTER_TO_INT(data);
+       submenu_add_sort_item(submenu, func, SORT_NAME, show_current, type);
+#ifdef HAVE_STRVERSCMP
+       submenu_add_sort_item(submenu, func, SORT_NUMBER, show_current, type);
+#endif
+       submenu_add_sort_item(submenu, func, SORT_TIME, show_current, type);
+       submenu_add_sort_item(submenu, func, SORT_SIZE, show_current, type);
+       if (include_path) submenu_add_sort_item(submenu, func, SORT_PATH, show_current, type);
+       if (include_none) submenu_add_sort_item(submenu, func, SORT_NONE, show_current, type);
 
-       if (file_clicked_is_selected())
-               {
-               start_editor_from_list(n);
-               }
-       else
+       if (menu)
                {
-               gchar *path;
-               start_editor_from_file(n, path);
-               g_free(path);
-               }
-}
-
-static void new_window_file_cb(GtkWidget *widget, gpointer data)
-{
-       gchar *path = file_clicked_get_path();
-       view_window_new(path);
-       g_free(path);
-}
+               GtkWidget *item;
 
-static void new_window_image_cb(GtkWidget *widget, gpointer data)
-{
-       view_window_new(image_get_path());
-}
-
-static void menu_file_popup_hide_cb(GtkWidget *widget, gpointer data)
-{
-       file_clist_highlight_unset();
-}
-
-
-/*
- *-----------------------------------------------------------------------------
- * menu addition utilities (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void add_menu_item(GtkWidget *menu, gchar *label, GtkAccelGroup *accel_group,
-                               guint accel_key, guint accel_mods, GtkSignalFunc func, gpointer data)
-{
-       GtkWidget *item;
-
-       item = gtk_menu_item_new_with_label(label);
-       gtk_widget_add_accelerator (item, "activate", accel_group, accel_key, accel_mods, GTK_ACCEL_VISIBLE);
-       gtk_signal_connect (GTK_OBJECT (item), "activate",(GtkSignalFunc) func, data);
-       gtk_menu_append(GTK_MENU(menu), item);
-       gtk_widget_show(item);
-}
-
-void add_menu_popup_item(GtkWidget *menu, gchar *label,
-                        GtkSignalFunc func, gpointer data)
-{
-       GtkWidget *item;
-
-       item = gtk_menu_item_new_with_label(label);
-       gtk_signal_connect (GTK_OBJECT (item), "activate",(GtkSignalFunc) func, data);
-       gtk_menu_append(GTK_MENU(menu), item);
-       gtk_widget_show(item);
-}
+               item = menu_item_add(menu, _("Sort"), NULL, NULL);
+               gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
+               return item;
+               }
 
-void add_menu_divider(GtkWidget *menu)
-{
-       GtkWidget *item = gtk_menu_item_new();
-        gtk_menu_append(GTK_MENU(menu),item);
-        gtk_widget_show(item);
+       return submenu;
 }
 
 /*
  *-----------------------------------------------------------------------------
- * edit menu routines
+ * altering
  *-----------------------------------------------------------------------------
- */ 
+ */
 
-static void add_edit_items(GtkWidget *menu, GtkSignalFunc func, GtkAccelGroup *accel_grp)
+gchar *alter_type_get_text(AlterType type)
 {
-       gint i;
-       for (i = 0; i < 8; i++)
+       switch (type)
                {
-               if (editor_command[i] && strlen(editor_command[i]) > 0)
-                       {
-                       gchar *text;
-                       if (editor_name[i] && strlen(editor_name[i]) > 0)
-                               text = g_strdup_printf(_("in %s..."), editor_name[i]);
-                       else
-                               text = g_strdup(_("in (unknown)..."));
-                       if (accel_grp)
-                               add_menu_item(menu, text, accel_grp, i + 49, GDK_CONTROL_MASK, func, GINT_TO_POINTER(i));
-                       else
-                               add_menu_popup_item(menu, text, func, GINT_TO_POINTER(i));
-                       g_free(text);
-                       }
+               case ALTER_ROTATE_90:
+                       return _("_Rotate clockwise");
+                       break;
+               case ALTER_ROTATE_90_CC:
+                       return _("Rotate _counterclockwise");
+                       break;
+               case ALTER_ROTATE_180:
+                       return _("Rotate _180");
+                       break;
+               case ALTER_MIRROR:
+                       return _("_Mirror");
+                       break;
+               case ALTER_FLIP:
+                       return _("_Flip");
+                       break;
+               default:
+                       break;
                }
-}
 
-void update_edit_menus(GtkAccelGroup *accel_grp)
-{
-       GtkWidget *menu;
-
-       /* main edit menu */
-
-       menu = gtk_menu_new();
-       add_edit_items(menu, edit_list_cb, accel_grp);
-       add_menu_divider(menu);
-       add_menu_item(menu, _("Options..."), accel_grp, 'O', GDK_CONTROL_MASK, config_cb, NULL);
-       add_menu_divider(menu);
-       add_menu_item(menu, _("Remove old thumbnails"), accel_grp, 'T', GDK_CONTROL_MASK, remove_thumb_cb, NULL);
-       add_menu_divider(menu);
-       add_menu_item(menu, _("Set as wallpaper"), accel_grp, 'W', GDK_CONTROL_MASK, wallpaper_image_cb, NULL);
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_edit), menu);
-
-       /* file edit popup */
-       menu = gtk_menu_new();
-       add_edit_items(menu, popup_edit_list_cb, NULL);
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_filelist_edit), menu);
-
-       /* image edit popup */
-       menu = gtk_menu_new();
-       add_edit_items(menu, edit_image_cb, NULL);
-       add_menu_divider(menu);
-       add_menu_popup_item(menu, _("Set as wallpaper"), wallpaper_image_cb, NULL);
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_image_edit), menu);
-
-       /* full screen edit popup */
-       menu = gtk_menu_new();
-       add_edit_items(menu, edit_full_cb, NULL);
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_window_full_edit), menu);
-
-       /* view edit popup */
-       menu = gtk_menu_new();
-       add_edit_items(menu, edit_view_cb, NULL);
-       add_menu_divider(menu);
-       add_menu_popup_item(menu, _("Set as wallpaper"), wallpaper_view_cb, NULL);
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_window_view_edit), menu);
+       return "";
 }
 
-/*
- *-----------------------------------------------------------------------------
- * menu bar setup routines
- *-----------------------------------------------------------------------------
- */ 
-
-GtkWidget *create_menu_bar(GtkAccelGroup *accel_grp)
+static void submenu_add_alter_item(GtkWidget *menu, GCallback func, AlterType type,
+                                  GtkAccelGroup *accel_group, guint accel_key, guint accel_mods)
 {
-       GtkWidget *bar;
-       GtkWidget *menu;
-
-       bar = gtk_menu_bar_new();
-
-       /* file menu */
-       menu_file = gtk_menu_item_new_with_label(_("File"));
-       gtk_widget_show(menu_file);
-
-       menu = gtk_menu_new();
-       add_menu_item(menu, _("Create Dir..."), accel_grp, 'N', GDK_CONTROL_MASK, create_dir_cb, NULL);
-       add_menu_divider(menu);
-       add_menu_item(menu, _("Copy..."), accel_grp, 'C', GDK_CONTROL_MASK, copy_file_cb, NULL);
-       add_menu_item(menu, _("Move..."), accel_grp, 'M', GDK_CONTROL_MASK, move_file_cb, NULL);
-       add_menu_item(menu, _("Rename..."), accel_grp, 'R', GDK_CONTROL_MASK, rename_file_cb, NULL);
-       add_menu_item(menu, _("Delete..."), accel_grp, 'D', GDK_CONTROL_MASK, delete_file_cb, NULL);
-       add_menu_divider(menu);
-       add_menu_item(menu, _("Exit"), accel_grp, 'Q', GDK_CONTROL_MASK, exit_cb, NULL);
-
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_file),menu);
-       gtk_menu_bar_append(GTK_MENU_BAR(bar),menu_file);
-
-       /* edit menu */
-       menu_edit = gtk_menu_item_new_with_label(_("Edit"));
-       gtk_widget_show(menu_edit);
-
-       menu = gtk_menu_new();
-
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_edit), menu);
-       gtk_menu_bar_append(GTK_MENU_BAR(bar), menu_edit);
-
-       /* view menu */
-       menu_view = gtk_menu_item_new_with_label(_("View"));
-       gtk_widget_show(menu_view);
-
-       menu = gtk_menu_new();
-       add_menu_item(menu, _("Zoom in"), accel_grp, '=', FALSE, zoom_in_cb, NULL);
-       add_menu_item(menu, _("Zoom out"), accel_grp, '-', FALSE, zoom_out_cb, NULL);
-       add_menu_item(menu, _("Zoom 1:1"), accel_grp, 'Z', FALSE, zoom_1_1_cb, NULL);
-       add_menu_item(menu, _("Fit image to window"), accel_grp, 'X', FALSE, zoom_fit_cb, NULL);
-       add_menu_divider(menu);
-
-       add_menu_item(menu, _("Full screen"), accel_grp, 'V', FALSE, full_screen_cb, NULL);
-       thumb_menu_item = gtk_check_menu_item_new_with_label(_("Thumbnails"));
-       gtk_check_menu_item_set_state(GTK_CHECK_MENU_ITEM(thumb_menu_item), thumbnails_enabled);
-       gtk_widget_add_accelerator (thumb_menu_item, "activate", accel_grp, 'T', FALSE, GTK_ACCEL_VISIBLE);
-       gtk_signal_connect (GTK_OBJECT (thumb_menu_item), "activate",(GtkSignalFunc) thumb_menu_cb, thumb_menu_item);
-       gtk_menu_append(GTK_MENU(menu), thumb_menu_item);
-       gtk_widget_show(thumb_menu_item);
-
-       add_menu_divider(menu);
-       add_menu_item(menu, _("Refresh Lists"), accel_grp, 'R', FALSE, refresh_cb, NULL);
-       add_menu_item(menu, _("(Un)Float file list"), accel_grp, 'F', FALSE, float_cb, NULL);
-       add_menu_item(menu, _("(Un)Hide file list"), accel_grp, 'H', FALSE, hide_cb, NULL);
-
-       add_menu_divider(menu);
-       add_menu_item(menu, _("Toggle slideshow"), accel_grp, 'S', FALSE, slideshow_cb, NULL);
-
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_view), menu);
-       gtk_menu_bar_append(GTK_MENU_BAR(bar), menu_view);
-
-       /* help menu */
-       menu_help = gtk_menu_item_new_with_label(_("Help"));
-       gtk_widget_show(menu_help);
-
-       menu = gtk_menu_new();
-       add_menu_item(menu, _("About"), accel_grp, 'A', GDK_CONTROL_MASK, about_cb, NULL);
-
-       gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_help), menu);
-       gtk_menu_bar_append(GTK_MENU_BAR(bar), menu_help);
-
-       return bar;
+       if (accel_group)
+               {
+               add_menu_item(menu, alter_type_get_text(type), accel_group,
+                             accel_key, accel_mods, func, GINT_TO_POINTER((gint)type));
+               
+               }
+       else
+               {
+               menu_item_add(menu, alter_type_get_text(type), func, GINT_TO_POINTER((gint)type));
+               }
 }
 
-/*
- *-----------------------------------------------------------------------------
- * menu file list routines (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void create_menu_file_list_popup()
+static GtkWidget *real_submenu_add_alter(GtkWidget *menu, GCallback func, gpointer data,
+                                        GtkAccelGroup *accel_group)
 {
-       menu_file_popup = gtk_menu_new();
-       gtk_signal_connect(GTK_OBJECT(menu_file_popup), "hide", (GtkSignalFunc) menu_file_popup_hide_cb, NULL);
-
-       menu_filelist_edit = gtk_menu_item_new_with_label(_("Edit"));
-       gtk_menu_append(GTK_MENU(menu_file_popup), menu_filelist_edit);
-       gtk_widget_show(menu_filelist_edit);
-
-       add_menu_popup_item(menu_file_popup, _("View in new window"), new_window_file_cb, NULL);
-
-       add_menu_divider(menu_file_popup);
-       add_menu_popup_item(menu_file_popup, _("Copy..."), popup_copy_file_cb, NULL);
-       add_menu_popup_item(menu_file_popup, _("Move..."), popup_move_file_cb, NULL);
-       add_menu_popup_item(menu_file_popup, _("Rename..."), popup_rename_file_cb, NULL);
-       add_menu_popup_item(menu_file_popup, _("Delete..."), popup_delete_file_cb, NULL);
-       add_menu_divider(menu_file_popup);
-       add_menu_popup_item(menu_file_popup, _("Refresh"), refresh_cb, NULL);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * menu image routines (private)
- *-----------------------------------------------------------------------------
- */ 
+       GtkWidget *submenu;
 
-static void create_menu_image_popup()
-{
-       menu_image_popup = gtk_menu_new();
-
-       add_menu_popup_item(menu_image_popup, _("Zoom in"), zoom_in_cb, NULL);
-       add_menu_popup_item(menu_image_popup, _("Zoom out"), zoom_out_cb, NULL);
-       add_menu_popup_item(menu_image_popup, _("Zoom 1:1"), zoom_1_1_cb, NULL);
-       add_menu_popup_item(menu_image_popup, _("Fit image to window"), zoom_fit_cb, NULL);
-       add_menu_divider(menu_image_popup);
-
-       menu_image_edit = gtk_menu_item_new_with_label(_("Edit"));
-       gtk_menu_append(GTK_MENU(menu_image_popup), menu_image_edit);
-       gtk_widget_show(menu_image_edit);
-
-       add_menu_popup_item(menu_image_popup, _("View in new window"), new_window_image_cb, NULL);
-
-       add_menu_divider(menu_image_popup);
-       add_menu_popup_item(menu_image_popup, _("Copy..."), copy_image_cb, NULL);
-       add_menu_popup_item(menu_image_popup, _("Move..."), move_image_cb, NULL);
-       add_menu_popup_item(menu_image_popup, _("Rename..."), rename_image_cb, NULL);
-       add_menu_popup_item(menu_image_popup, _("Delete..."), delete_image_cb, NULL);
-       add_menu_divider(menu_image_popup);
-       add_menu_popup_item(menu_image_popup, _("(Un)Hide file list"), hide_cb, NULL);
-       add_menu_popup_item(menu_image_popup, _("Full screen"), full_screen_cb, NULL);
-}
+       submenu = gtk_menu_new();
+       g_object_set_data(G_OBJECT(submenu), "submenu_data", data);
 
-/*
- *-----------------------------------------------------------------------------
- * menu full screen routines (private)
- *-----------------------------------------------------------------------------
- */ 
+       submenu_add_alter_item(submenu, func, ALTER_ROTATE_90, accel_group, ']', 0);
+       submenu_add_alter_item(submenu, func, ALTER_ROTATE_90_CC, accel_group, '[', 0);
+       submenu_add_alter_item(submenu, func, ALTER_ROTATE_180, accel_group, 'R', GDK_SHIFT_MASK);
+       submenu_add_alter_item(submenu, func, ALTER_MIRROR, accel_group, 'M', GDK_SHIFT_MASK);
+       submenu_add_alter_item(submenu, func, ALTER_FLIP, accel_group, 'F', GDK_SHIFT_MASK);
 
-/* this re-grabs the keyboard when the menu closes, needed for override redirect */
-static void menu_full_popup_hide_cb(GtkWidget *widget, gpointer data)
-{
-       if (full_screen_window)
+       if (menu)
                {
-               gdk_keyboard_grab(full_screen_window->window, TRUE, GDK_CURRENT_TIME);
+               GtkWidget *item;
+
+               item = menu_item_add(menu, _("_Adjust"), NULL, NULL);
+               gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
+               return item;
                }
-}
 
-static void create_menu_full_screen_popup()
-{
-       menu_window_full = gtk_menu_new();
-       add_menu_popup_item(menu_window_full, _("Zoom in"), zoom_in_cb, NULL);
-       add_menu_popup_item(menu_window_full, _("Zoom out"), zoom_out_cb, NULL);
-       add_menu_popup_item(menu_window_full, _("Zoom 1:1"), zoom_1_1_cb, NULL);
-       add_menu_popup_item(menu_window_full, _("Fit image to window"), zoom_fit_cb, NULL);
-       add_menu_divider(menu_window_full);
-
-       menu_window_full_edit = gtk_menu_item_new_with_label(_("Edit"));
-       gtk_menu_append(GTK_MENU(menu_window_full), menu_window_full_edit);
-       gtk_widget_show(menu_window_full_edit);
-
-       add_menu_divider(menu_window_full);
-       add_menu_popup_item(menu_window_full, _("Copy..."), copy_image_cb, NULL);
-       add_menu_popup_item(menu_window_full, _("Move..."), move_image_cb, NULL);
-       add_menu_popup_item(menu_window_full, _("Rename..."), rename_image_cb, NULL);
-       add_menu_popup_item(menu_window_full, _("Delete..."), delete_image_cb, NULL);
-
-       add_menu_divider(menu_window_full);
-       add_menu_popup_item(menu_window_full, _("Exit full screen"), full_screen_cb, NULL);
-
-       gtk_signal_connect(GTK_OBJECT(menu_window_full), "hide", (GtkSignalFunc) menu_full_popup_hide_cb, NULL);
+       return submenu;
 }
 
-void create_menu_popups()
+GtkWidget *submenu_add_alter(GtkWidget *menu, GCallback func, gpointer data)
 {
-       create_menu_file_list_popup();
-       create_menu_image_popup();
-       create_menu_full_screen_popup();
-       create_menu_view_popup();
+       return real_submenu_add_alter(menu, func, data, NULL);
 }
 
-/*
- *-----------------------------------------------------------------------------
- * toolbar routines
- *-----------------------------------------------------------------------------
- */ 
-
-static void add_button_to_bar(GtkWidget *hbox, gchar **pixmap_data,
-                             GtkTooltips *tooltips, gchar *tip_text,
-                             GtkSignalFunc func, gpointer data)
-{
-       GtkWidget *button;
-       GtkStyle *style;
-       GtkWidget *pixmapwid;
-       GdkPixmap *pixmap;
-       GdkBitmap *mask;
-
-       style = gtk_widget_get_style(mainwindow);
-
-       button = gtk_button_new ();
-       gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) func, thumb_button);
-       gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
-       gtk_widget_show (button);
-       gtk_tooltips_set_tip (tooltips, button, tip_text, NULL);
-
-       pixmap = gdk_pixmap_create_from_xpm_d(mainwindow->window,  &mask,
-                 &style->bg[GTK_STATE_NORMAL], (gchar **)pixmap_data);
-       pixmapwid = gtk_pixmap_new(pixmap, mask);
-       gtk_widget_show(pixmapwid);
-       gtk_container_add(GTK_CONTAINER(button), pixmapwid);
-}
-
-GtkWidget *create_button_bar(GtkTooltips *tooltips)
-{
-       GtkWidget *hbox;
-       GtkStyle *style;
-       GtkWidget *pixmapwid;
-       GdkPixmap *pixmap;
-       GdkBitmap *mask;
-
-       style = gtk_widget_get_style(mainwindow);
-       hbox = gtk_hbox_new(FALSE, 0);
-
-       thumb_button = gtk_toggle_button_new ();
-       gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(thumb_button), thumbnails_enabled);
-       gtk_signal_connect (GTK_OBJECT (thumb_button), "clicked",(GtkSignalFunc) thumb_button_cb, thumb_button);
-       gtk_box_pack_start (GTK_BOX (hbox), thumb_button, FALSE, FALSE, 0);
-       gtk_widget_show (thumb_button);
-       gtk_tooltips_set_tip (tooltips, thumb_button, _("Create thumbnails"), NULL);
-
-       pixmap = gdk_pixmap_create_from_xpm_d(mainwindow->window,  &mask,
-                 &style->bg[GTK_STATE_NORMAL], (gchar **)icon_thumb_xpm );
-       pixmapwid = gtk_pixmap_new(pixmap, mask);
-       gtk_widget_show(pixmapwid);
-       gtk_container_add(GTK_CONTAINER(thumb_button), pixmapwid);
-
-       add_button_to_bar(hbox, (gchar **)icon_home_xpm,
-                        tooltips, _("Change to home directory"), home_dir_cb, NULL);
-       add_button_to_bar(hbox, (gchar **)icon_reload_xpm,
-                        tooltips, _("Refresh file list"), refresh_cb, NULL);
-       add_button_to_bar(hbox, (gchar **)icon_zoom_in_xpm,
-                        tooltips, _("Zoom in"), zoom_in_cb, NULL);
-       add_button_to_bar(hbox, (gchar **)icon_zoom_out_xpm,
-                        tooltips, _("Zoom out"), zoom_out_cb, NULL);
-       add_button_to_bar(hbox, (gchar **)icon_zoom_fit_xpm,
-                        tooltips, _("Fit image to window"), zoom_fit_cb, NULL);
-       add_button_to_bar(hbox, (gchar **)icon_zoom_norm_xpm,
-                        tooltips, _("Set zoom 1:1"), zoom_1_1_cb, NULL);
-       add_button_to_bar(hbox, (gchar **)icon_config_xpm,
-                        tooltips, _("Configure options"), config_cb, NULL);
-       add_button_to_bar(hbox, (gchar **)icon_float_xpm,
-                        tooltips, _("Float Controls"), float_cb, NULL);
-
-       return hbox;
-}
 
diff --git a/src/menu.h b/src/menu.h
new file mode 100644 (file)
index 0000000..5dc9223
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef MENU_H
+#define MENU_H
+
+
+gpointer submenu_item_get_data(GtkWidget *menu);
+
+GtkWidget *submenu_add_edit(GtkWidget *menu, GtkWidget **menu_item, GtkSignalFunc func, gpointer data);
+
+gchar *sort_type_get_text(SortType method);
+GtkWidget *submenu_add_sort(GtkWidget *menu, GtkSignalFunc func, gpointer data,
+                           gint include_none, gint include_path,
+                           gint show_current, SortType type);
+
+gchar *alter_type_get_text(AlterType type);
+GtkWidget *submenu_add_alter(GtkWidget *menu, GtkSignalFunc func, gpointer data);
+
+
+#endif
diff --git a/src/pathsel.c b/src/pathsel.c
deleted file mode 100644 (file)
index 164df2b..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * GQview image viewer
- * (C)2000 John Ellis
- *
- * Author: John Ellis
- *
- */
-
-#include "gqview.h"
-
-#define DEST_WIDTH 250
-#define DEST_HEIGHT 100
-
-typedef struct _Dest_Data Dest_Data;
-struct _Dest_Data
-{
-       GtkWidget *d_clist;
-       GtkWidget *f_clist;
-       GtkWidget *entry;
-       gchar *filter;
-       gchar *path;
-};
-
-static void dest_free_data(GtkWidget *widget, gpointer data);
-static gint dest_check_filter(gchar *filter, gchar *file);
-static gint dest_sort_cb(void *a, void *b);
-static void dest_populate(Dest_Data *dd, gchar *path);
-static void dest_select_cb(GtkWidget *clist, gint row, gint column,
-                         GdkEventButton *bevent, gpointer data);
-
-/*
- *-----------------------------------------------------------------------------
- * destination widget routines (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void dest_free_data(GtkWidget *widget, gpointer data)
-{
-       Dest_Data *dd = data;
-       g_free(dd->filter);
-       g_free(dd->path);
-       g_free(dd);
-}
-
-static gint dest_check_filter(gchar *filter, gchar *file)
-{
-       gchar *f_ptr = filter;
-       gchar *file_ptr;
-       gchar *strt_ptr;
-       gint i;
-
-       if (filter[0] == '*') return TRUE;
-       while (f_ptr < filter + strlen(filter))
-               {
-               strt_ptr = f_ptr;
-               i=0;
-               while (*f_ptr != ';' && *f_ptr != '\0')
-                       {
-                       f_ptr++;
-                       i++;
-                       }
-               f_ptr++;
-               file_ptr = file + strlen(file) - i;
-               if (!strncasecmp(file_ptr, strt_ptr, i)) return TRUE;
-               }
-       return FALSE;
-}
-
-static gint dest_sort_cb(void *a, void *b)
-{
-       return strcmp((gchar *)a, (gchar *)b);
-}
-
-static void dest_populate(Dest_Data *dd, gchar *path)
-{
-       DIR *dp;
-       struct dirent *dir;
-       struct stat ent_sbuf;
-       gchar *buf[2];
-       GList *path_list = NULL;
-       GList *file_list = NULL;
-       GList *list;
-
-       buf[1] = NULL;
-
-       if((dp = opendir(path))==NULL)
-               {
-               /* dir not found */
-               return;
-               }
-       while ((dir = readdir(dp)) != NULL)
-               {
-               /* skips removed files */
-               if (dir->d_ino > 0)
-                       {
-                       gchar *name = dir->d_name;
-                       gchar *filepath = g_strconcat(path, "/", name, NULL);
-                       if (stat(filepath,&ent_sbuf) >= 0 && S_ISDIR(ent_sbuf.st_mode))
-                               {
-                               path_list = g_list_prepend(path_list, g_strdup(name));
-                               }
-                       else if (dd->f_clist)
-                               {
-                               if (!dd->filter || (dd->filter && dest_check_filter(dd->filter, name)))
-                                       file_list = g_list_prepend(file_list, g_strdup(name));
-                               }
-                       g_free(filepath);
-                       }
-               }
-       closedir(dp);
-
-       path_list = g_list_sort(path_list, (GCompareFunc) dest_sort_cb);
-       file_list = g_list_sort(file_list, (GCompareFunc) dest_sort_cb);
-
-       gtk_clist_freeze(GTK_CLIST(dd->d_clist));
-       gtk_clist_clear(GTK_CLIST(dd->d_clist));
-
-       list = path_list;
-       while (list)
-               {
-               gint row;
-               gchar *filepath;
-               if (strcmp(list->data, ".") == 0)
-                       {
-                       filepath = g_strdup(path);
-                       }
-               else if (strcmp(list->data, "..") == 0)
-                       {
-                       gchar *p;
-                       filepath = g_strdup(path);
-                       p = filename_from_path(filepath);
-                       if (p - 1 != filepath) p--;
-                       p[0] = '\0';
-                       }
-               else if (strcmp(path, "/") == 0)
-                       {
-                       filepath = g_strconcat("/", list->data, NULL);
-                       }
-               else
-                       filepath = g_strconcat(path, "/", list->data, NULL);
-               
-               buf[0] = list->data;
-               row = gtk_clist_append(GTK_CLIST(dd->d_clist),buf);
-               gtk_clist_set_row_data_full(GTK_CLIST(dd->d_clist), row,
-                                           filepath, (GtkDestroyNotify) g_free);
-               g_free(list->data);
-               list = list->next;
-               }
-
-       g_list_free(path_list);
-
-       gtk_clist_thaw(GTK_CLIST(dd->d_clist));
-
-       if (dd->f_clist)
-               {
-               gtk_clist_freeze(GTK_CLIST(dd->f_clist));
-               gtk_clist_clear(GTK_CLIST(dd->f_clist));
-
-               list = file_list;
-               while (list)
-                       {
-                       gint row;
-                       gchar *filepath;
-                       filepath = g_strconcat(path, "/", list->data, NULL);
-               
-                       buf[0] = list->data;
-                       row = gtk_clist_append(GTK_CLIST(dd->f_clist),buf);
-                       gtk_clist_set_row_data_full(GTK_CLIST(dd->f_clist), row,
-                                           filepath, (GtkDestroyNotify) g_free);
-                       g_free(list->data);
-                       list = list->next;
-                       }
-
-               g_list_free(file_list);
-
-               gtk_clist_thaw(GTK_CLIST(dd->f_clist));
-               }
-
-       g_free(dd->path);
-       dd->path = g_strdup(path);
-}
-
-static void dest_select_cb(GtkWidget *clist, gint row, gint column,
-                         GdkEventButton *bevent, gpointer data)
-{
-       Dest_Data *dd = data;
-       gchar *path = g_strdup(gtk_clist_get_row_data(GTK_CLIST(clist), row));
-       gtk_entry_set_text(GTK_ENTRY(dd->entry),path);
-
-       if (clist == dd->d_clist) dest_populate(dd, path);
-       g_free(path);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * destination widget setup routines (public)
- *-----------------------------------------------------------------------------
- */ 
-
-GtkWidget *destination_widget_new_with_files(gchar *path, gchar *filter, GtkWidget *entry)
-{
-       GtkWidget *vbox;
-       Dest_Data *dd;
-       GtkWidget *scrolled;
-
-       dd = g_new0(Dest_Data, 1);
-
-       vbox = gtk_vbox_new(FALSE, 5);
-       gtk_widget_show(vbox);
-
-       dd->entry = entry;
-       gtk_object_set_data(GTK_OBJECT(dd->entry), "destination_data", dd);
-
-       scrolled = gtk_scrolled_window_new(NULL, NULL);
-       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
-                               GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
-       gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0);
-       gtk_widget_show(scrolled);
-
-       dd->d_clist=gtk_clist_new (1);
-       gtk_clist_set_column_auto_resize(GTK_CLIST(dd->d_clist), 0, TRUE);
-        gtk_signal_connect (GTK_OBJECT (dd->d_clist), "select_row",(GtkSignalFunc) dest_select_cb, dd);
-       gtk_signal_connect(GTK_OBJECT(dd->d_clist), "destroy", (GtkSignalFunc) dest_free_data, dd);
-       gtk_widget_set_usize(dd->d_clist, DEST_WIDTH, DEST_HEIGHT);
-       gtk_container_add (GTK_CONTAINER (scrolled), dd->d_clist);
-        gtk_widget_show (dd->d_clist);
-
-       if (filter)
-               {
-               scrolled = gtk_scrolled_window_new(NULL, NULL);
-               gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
-                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
-               gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0);
-               gtk_widget_show(scrolled);
-
-               dd->f_clist=gtk_clist_new (1);
-               gtk_clist_set_column_auto_resize(GTK_CLIST(dd->f_clist), 0, TRUE);
-               gtk_widget_set_usize(dd->f_clist, DEST_WIDTH, DEST_HEIGHT);
-               gtk_signal_connect (GTK_OBJECT (dd->f_clist), "select_row",(GtkSignalFunc) dest_select_cb, dd);
-               gtk_container_add (GTK_CONTAINER (scrolled), dd->f_clist);
-               gtk_widget_show (dd->f_clist);
-
-               dd->filter = g_strdup(filter);
-               }
-
-       if (isdir(path))
-               {
-               dest_populate(dd, path);
-               }
-       else
-               {
-               gchar *buf = remove_level_from_path(path);
-               if (isdir(buf))
-                       {
-                       dest_populate(dd, buf);
-                       }
-               else
-                       {
-                       dest_populate(dd, homedir());
-                       }
-               g_free(buf);
-               }
-       return vbox;
-}
-
-GtkWidget *destination_widget_new(gchar *path, GtkWidget *entry)
-{
-       return destination_widget_new_with_files(path, NULL, entry);
-}
-
-void destination_widget_sync_to_entry(GtkWidget *entry)
-{
-       Dest_Data *dd = gtk_object_get_data(GTK_OBJECT(entry), "destination_data");
-       gchar *path;
-
-       if (!dd) return;
-
-       path = gtk_entry_get_text(GTK_ENTRY(entry));
-       
-       if (isdir(path) && strcmp(path, dd->path) != 0)
-               {
-               dest_populate(dd, path);
-               }
-       else
-               {
-               gchar *buf = remove_level_from_path(path);
-               if (isdir(buf) && strcmp(buf, dd->path) != 0)
-                       {
-                       dest_populate(dd, buf);
-                       }
-               g_free(buf);
-               }
-}
-
diff --git a/src/pixbuf_util.c b/src/pixbuf_util.c
new file mode 100644 (file)
index 0000000..319a23d
--- /dev/null
@@ -0,0 +1,626 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "pixbuf_util.h"
+
+#include "icons/icons_inline.h"
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * png save
+ *-----------------------------------------------------------------------------
+ */
+
+gboolean pixbuf_to_file_as_png (GdkPixbuf *pixbuf, const char *filename)
+{
+       GError *error = NULL;
+       gint ret;
+
+       if (!pixbuf || !filename) return FALSE;
+
+       ret = gdk_pixbuf_save(pixbuf, filename, "png", &error,
+                             "tEXt::Software", "GQview "VERSION, NULL);
+
+       if (error)
+               {
+               printf("Error saving png file: %s\n", error->message);
+               g_error_free(error);
+               }
+
+       return ret;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * jpeg save
+ *-----------------------------------------------------------------------------
+ */
+
+gboolean pixbuf_to_file_as_jpg(GdkPixbuf *pixbuf, const gchar *filename, gint quality)
+{
+       GError *error = NULL;
+       gchar *qbuf;
+       gboolean ret;
+
+       if (!pixbuf || !filename) return FALSE;
+
+       if (quality == -1) quality = 75;
+       if (quality < 1 || quality > 100)
+               {
+               printf("Jpeg not saved, invalid quality %d\n", quality);
+               return FALSE;
+               }
+
+       qbuf = g_strdup_printf("%d", quality);
+       ret = gdk_pixbuf_save(pixbuf, filename, "jpeg", &error, "quality", qbuf, NULL);
+       g_free(qbuf);
+
+       if (error)
+               {
+               printf("Error saving jpeg to %s\n%s\n", filename, error->message);
+               g_error_free(error);
+               }
+
+       return ret;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * pixbuf from inline
+ *-----------------------------------------------------------------------------
+ */
+
+typedef struct _PixbufInline PixbufInline;
+struct _PixbufInline
+{
+       const gchar *key;
+       const guint8 *data;
+};
+
+static PixbufInline inline_pixbuf_data[] = {
+       { PIXBUF_INLINE_FOLDER_CLOSED,  folder_closed },
+       { PIXBUF_INLINE_FOLDER_LOCKED,  folder_locked },
+       { PIXBUF_INLINE_FOLDER_OPEN,    folder_open },
+       { PIXBUF_INLINE_FOLDER_UP,      folder_up },
+       { PIXBUF_INLINE_SCROLLER,       icon_scroller },
+       { PIXBUF_INLINE_BROKEN,         icon_broken },
+       { PIXBUF_INLINE_LOGO,           gqview_logo },
+       { NULL, NULL }
+};
+
+GdkPixbuf *pixbuf_inline(const gchar *key)
+{
+       gint i;
+
+       if (!key) return NULL;
+
+       i = 0;
+       while (inline_pixbuf_data[i].key)
+               {
+               if (strcmp(inline_pixbuf_data[i].key, key) == 0)
+                       {
+                       return gdk_pixbuf_new_from_inline(-1, inline_pixbuf_data[i].data, FALSE, NULL);
+                       }
+               i++;
+               }
+
+       printf("warning: inline pixbuf key \"%s\" not found.\n", key);
+
+       return NULL;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * pixbuf rotation
+ *-----------------------------------------------------------------------------
+ */
+
+static void pixbuf_copy_block_rotate(guchar *src, gint src_row_stride, gint x, gint y,
+                                    guchar *dest, gint dest_row_stride, gint w, gint h,
+                                    gint bytes_per_pixel, gint counter_clockwise)
+{
+       gint i, j;
+       guchar *sp;
+       guchar *dp;
+
+       for (i = 0; i < h; i++)
+               {
+               sp = src + ((i + y) * src_row_stride) + (x * bytes_per_pixel);
+               for (j = 0; j < w; j++)
+                       {
+                       if (counter_clockwise)
+                               {
+                               dp = dest + ((w - j - 1) * dest_row_stride) + (i * bytes_per_pixel);
+                               }
+                       else
+                               {
+                               dp = dest + (j * dest_row_stride) + ((h - i - 1) * bytes_per_pixel);
+                               }
+                       *(dp++) = *(sp++);      /* r */
+                       *(dp++) = *(sp++);      /* g */
+                       *(dp++) = *(sp++);      /* b */
+                       if (bytes_per_pixel == 4) *(dp) = *(sp++);      /* a */
+                       }
+               }
+       
+}
+
+static void pixbuf_copy_block(guchar *src, gint src_row_stride, gint w, gint h,
+                             guchar *dest, gint dest_row_stride, gint x, gint y, gint bytes_per_pixel)
+{
+       gint i;
+       guchar *sp;
+       guchar *dp;
+
+       for (i = 0; i < h; i++)
+               {
+               sp = src + (i * src_row_stride);
+               dp = dest + ((y + i) * dest_row_stride) + (x * bytes_per_pixel);
+               memcpy(dp, sp, w * bytes_per_pixel);
+               }
+}
+
+#define ROTATE_BUFFER_WIDTH 48
+#define ROTATE_BUFFER_HEIGHT 48
+
+/*
+ * Returns a copy of pixbuf src rotated 90 degrees clockwise or 90 counterclockwise
+ *
+ */
+GdkPixbuf *pixbuf_copy_rotate_90(GdkPixbuf *src, gint counter_clockwise)
+{
+       GdkPixbuf *dest;
+       gint has_alpha;
+       gint sw, sh, srs;
+       gint dw, dh, drs;
+       guchar *s_pix;
+        guchar *d_pix;
+#if 0
+       guchar *sp;
+        guchar *dp;
+#endif
+       gint i, j;
+       gint a;
+       GdkPixbuf *buffer;
+        guchar *b_pix;
+       gint brs;
+       gint w, h;
+
+       if (!src) return NULL;
+
+       sw = gdk_pixbuf_get_width(src);
+       sh = gdk_pixbuf_get_height(src);
+       has_alpha = gdk_pixbuf_get_has_alpha(src);
+       srs = gdk_pixbuf_get_rowstride(src);
+       s_pix = gdk_pixbuf_get_pixels(src);
+
+       dw = sh;
+       dh = sw;
+       dest = gdk_pixbuf_new(GDK_COLORSPACE_RGB, has_alpha, 8, dw, dh);
+       drs = gdk_pixbuf_get_rowstride(dest);
+       d_pix = gdk_pixbuf_get_pixels(dest);
+
+       a = (has_alpha ? 4 : 3);
+
+       buffer = gdk_pixbuf_new(GDK_COLORSPACE_RGB, has_alpha, 8,
+                               ROTATE_BUFFER_WIDTH, ROTATE_BUFFER_HEIGHT);
+       b_pix = gdk_pixbuf_get_pixels(buffer);
+       brs = gdk_pixbuf_get_rowstride(buffer);
+
+       for (i = 0; i < sh; i+= ROTATE_BUFFER_WIDTH)
+               {
+               w = MIN(ROTATE_BUFFER_WIDTH, (sh - i));
+               for (j = 0; j < sw; j += ROTATE_BUFFER_HEIGHT)
+                       {
+                       gint x, y;
+
+                       h = MIN(ROTATE_BUFFER_HEIGHT, (sw - j));
+                       pixbuf_copy_block_rotate(s_pix, srs, j, i,
+                                                b_pix, brs, h, w,
+                                                a, counter_clockwise);
+
+                       if (counter_clockwise)
+                               {
+                               x = i;
+                               y = sw - h - j;
+                               }
+                       else
+                               {
+                               x = sh - w - i;
+                               y = j;
+                               }
+                       pixbuf_copy_block(b_pix, brs, w, h,
+                                         d_pix, drs, x, y, a);
+                       }
+               }
+
+       gdk_pixbuf_unref(buffer);
+
+#if 0
+       /* this is the simple version of rotation (roughly 2-4x slower) */
+
+       for (i = 0; i < sh; i++)
+               {
+               sp = s_pix + (i * srs);
+               for (j = 0; j < sw; j++)
+                       {
+                       if (counter_clockwise)
+                               {
+                               dp = d_pix + ((dh - j - 1) * drs) + (i * a);
+                               }
+                       else
+                               {
+                               dp = d_pix + (j * drs) + ((dw - i - 1) * a);
+                               }
+
+                       *(dp++) = *(sp++);      /* r */
+                       *(dp++) = *(sp++);      /* g */
+                       *(dp++) = *(sp++);      /* b */
+                       if (has_alpha) *(dp) = *(sp++); /* a */
+                       }
+               }
+#endif
+
+       return dest;
+}
+
+/*
+ * Returns a copy of pixbuf mirrored and or flipped.
+ * TO do a 180 degree rotations set both mirror and flipped TRUE
+ * if mirror and flip are FALSE, result is a simple copy.
+ */
+GdkPixbuf *pixbuf_copy_mirror(GdkPixbuf *src, gint mirror, gint flip)
+{
+       GdkPixbuf *dest;
+       gint has_alpha;
+       gint w, h, srs;
+       gint drs;
+       guchar *s_pix;
+        guchar *d_pix;
+       guchar *sp;
+        guchar *dp;
+       gint i, j;
+       gint a;
+
+       if (!src) return NULL;
+
+       w = gdk_pixbuf_get_width(src);
+       h = gdk_pixbuf_get_height(src);
+       has_alpha = gdk_pixbuf_get_has_alpha(src);
+       srs = gdk_pixbuf_get_rowstride(src);
+       s_pix = gdk_pixbuf_get_pixels(src);
+
+       dest = gdk_pixbuf_new(GDK_COLORSPACE_RGB, has_alpha, 8, w, h);
+       drs = gdk_pixbuf_get_rowstride(dest);
+       d_pix = gdk_pixbuf_get_pixels(dest);
+
+       a = has_alpha ? 4 : 3;
+
+       for (i = 0; i < h; i++)
+               {
+               sp = s_pix + (i * srs);
+               if (flip)
+                       {
+                       dp = d_pix + ((h - i - 1) * drs);
+                       }
+               else
+                       {
+                       dp = d_pix + (i * drs);
+                       }
+               if (mirror)
+                       {
+                       dp += (w - 1) * a;
+                       for (j = 0; j < w; j++)
+                               {
+                               *(dp++) = *(sp++);      /* r */
+                               *(dp++) = *(sp++);      /* g */
+                               *(dp++) = *(sp++);      /* b */
+                               if (has_alpha) *(dp) = *(sp++); /* a */
+                               dp -= (a + 3);
+                               }
+                       }
+               else
+                       {
+                       for (j = 0; j < w; j++)
+                               {
+                               *(dp++) = *(sp++);      /* r */
+                               *(dp++) = *(sp++);      /* g */
+                               *(dp++) = *(sp++);      /* b */
+                               if (has_alpha) *(dp++) = *(sp++);       /* a */
+                               }
+                       }
+               }
+
+       return dest;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * pixbuf drawing
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ * Fills region of pixbuf at x,y over w,h
+ * with colors red (r), green (g), blue (b)
+ * applying alpha (a), use a=255 for solid.
+ */
+void pixbuf_draw_rect_fill(GdkPixbuf *pb,
+                          gint x, gint y, gint w, gint h,
+                          gint r, gint g, gint b, gint a)
+{
+       gint p_alpha;
+       gint pw, ph, prs;
+       guchar *p_pix;
+       guchar *pp;
+       gint i, j;
+
+       if (!pb) return;
+
+       pw = gdk_pixbuf_get_width(pb);
+       ph = gdk_pixbuf_get_height(pb);
+
+       if (x < 0 || x + w > pw) return;
+       if (y < 0 || y + h > ph) return;
+
+       p_alpha = gdk_pixbuf_get_has_alpha(pb);
+       prs = gdk_pixbuf_get_rowstride(pb);
+       p_pix = gdk_pixbuf_get_pixels(pb);
+
+        for (i = 0; i < h; i++)
+               {
+               pp = p_pix + (y + i) * prs + (x * (p_alpha ? 4 : 3));
+               for (j = 0; j < w; j++)
+                       {
+                       *pp = (r * a + *pp * (256-a)) >> 8;
+                       pp++;
+                       *pp = (g * a + *pp * (256-a)) >> 8;
+                       pp++;
+                       *pp = (b * a + *pp * (256-a)) >> 8;
+                       pp++;
+                       if (p_alpha) pp++;
+                       }
+               }
+}
+
+void pixbuf_draw_rect(GdkPixbuf *pb,
+                     gint x, gint y, gint w, gint h,
+                     gint r, gint g, gint b, gint a,
+                     gint left, gint right, gint top, gint bottom)
+{
+       pixbuf_draw_rect_fill(pb, x + left, y, w - left - right, top,
+                             r, g, b ,a);
+       pixbuf_draw_rect_fill(pb, x + w - right, y, right, h,
+                             r, g, b ,a);
+       pixbuf_draw_rect_fill(pb, x + left, y + h - bottom, w - left - right, bottom,
+                             r, g, b ,a);
+       pixbuf_draw_rect_fill(pb, x, y, left, h,
+                             r, g, b ,a);
+}
+
+void pixbuf_set_rect_fill(GdkPixbuf *pb,
+                         gint x, gint y, gint w, gint h,
+                         gint r, gint g, gint b, gint a)
+{
+       gint p_alpha;
+       gint pw, ph, prs;
+       guchar *p_pix;
+       guchar *pp;
+       gint i, j;
+
+       if (!pb) return;
+
+       pw = gdk_pixbuf_get_width(pb);
+       ph = gdk_pixbuf_get_height(pb);
+
+       if (x < 0 || x + w > pw) return;
+       if (y < 0 || y + h > ph) return;
+
+       p_alpha = gdk_pixbuf_get_has_alpha(pb);
+       prs = gdk_pixbuf_get_rowstride(pb);
+       p_pix = gdk_pixbuf_get_pixels(pb);
+
+        for (i = 0; i < h; i++)
+               {
+               pp = p_pix + (y + i) * prs + (x * (p_alpha ? 4 : 3));
+               for (j = 0; j < w; j++)
+                       {
+                       *pp = r; pp++;
+                       *pp = g; pp++;
+                       *pp = b; pp++;
+                       if (p_alpha) { *pp = a; pp++; }
+                       }
+               }
+}
+
+void pixbuf_set_rect(GdkPixbuf *pb,
+                    gint x, gint y, gint w, gint h,
+                    gint r, gint g, gint b, gint a,
+                    gint left, gint right, gint top, gint bottom)
+{
+       pixbuf_set_rect_fill(pb, x + left, y, w - left - right, top,
+                            r, g, b ,a);
+       pixbuf_set_rect_fill(pb, x + w - right, y, right, h,
+                            r, g, b ,a);
+       pixbuf_set_rect_fill(pb, x + left, y + h - bottom, w - left - right, bottom,
+                            r, g, b ,a);
+       pixbuf_set_rect_fill(pb, x, y, left, h,
+                            r, g, b ,a);
+}
+
+void pixbuf_pixel_set(GdkPixbuf *pb, gint x, gint y, gint r, gint g, gint b, gint a)
+{
+       guchar *buf;
+       gint has_alpha;
+       gint rowstride;
+       guchar *p;
+
+       if (x < 0 || x >= gdk_pixbuf_get_width(pb) ||
+            y < 0 || y >= gdk_pixbuf_get_height(pb)) return;
+
+       buf = gdk_pixbuf_get_pixels(pb);
+       has_alpha = gdk_pixbuf_get_has_alpha(pb);
+       rowstride = gdk_pixbuf_get_rowstride(pb);
+
+        p = buf + (y * rowstride) + (x * (has_alpha ? 4 : 3));
+       *p = r; p++;
+       *p = g; p++;
+       *p = b; p++;
+       if (has_alpha) *p = a;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * pixbuf text rendering
+ *-----------------------------------------------------------------------------
+ */
+
+static void pixbuf_copy_font(GdkPixbuf *src, gint sx, gint sy,
+                            GdkPixbuf *dest, gint dx, gint dy,
+                            gint w, gint h,
+                            guint8 r, guint8 g, guint8 b, guint8 a)
+{
+       gint sw, sh, srs;
+       gint s_alpha;
+       gint s_step;
+       guchar *s_pix;
+       gint dw, dh, drs;
+       gint d_alpha;
+       gint d_step;
+       guchar *d_pix;
+
+       guchar *sp;
+       guchar *dp;
+       gint i, j;
+
+       if (!src || !dest) return;
+
+       sw = gdk_pixbuf_get_width(src);
+       sh = gdk_pixbuf_get_height(src);
+
+       if (sx < 0 || sx + w > sw) return;
+       if (sy < 0 || sy + h > sh) return;
+
+       dw = gdk_pixbuf_get_width(dest);
+       dh = gdk_pixbuf_get_height(dest);
+
+       if (dx < 0 || dx + w > dw) return;
+       if (dy < 0 || dy + h > dh) return;
+
+       s_alpha = gdk_pixbuf_get_has_alpha(src);
+       d_alpha = gdk_pixbuf_get_has_alpha(dest);
+       srs = gdk_pixbuf_get_rowstride(src);
+       drs = gdk_pixbuf_get_rowstride(dest);
+       s_pix = gdk_pixbuf_get_pixels(src);
+       d_pix = gdk_pixbuf_get_pixels(dest);
+
+       s_step = (s_alpha) ? 4 : 3;
+       d_step = (d_alpha) ? 4 : 3;
+
+       for (i = 0; i < h; i++)
+               {
+               sp = s_pix + (sy + i) * srs + sx * s_step;
+               dp = d_pix + (dy + i) * drs + dx * d_step;
+               for (j = 0; j < w; j++)
+                       {
+                       if (*sp)
+                               {
+                               guint8 asub;
+
+                               asub = a * sp[0] / 255;
+                               *dp = (r * asub + *dp * (256-asub)) >> 8;
+                               dp++;
+                               asub = a * sp[1] / 255;
+                               *dp = (g * asub + *dp * (256-asub)) >> 8;
+                               dp++;
+                               asub = a * sp[2] / 255;
+                               *dp = (b * asub + *dp * (256-asub)) >> 8;
+                               dp++;
+
+                               if (d_alpha)
+                                       {
+                                       *dp = MAX(*dp, a * ((sp[0] + sp[1] + sp[2]) / 3) / 255);
+                                       dp++;
+                                       }
+                               }
+                       else
+                               {
+                               dp += d_step;
+                               }
+
+                       sp += s_step;
+                       }
+               }
+}
+
+void pixbuf_draw_layout(GdkPixbuf *pixbuf, PangoLayout *layout, GtkWidget *widget,
+                       gint x, gint y,
+                       guint8 r, guint8 g, guint8 b, guint8 a)
+{
+       GdkPixmap *pixmap;
+       GdkPixbuf *buffer;
+       gint w, h;
+       GdkGC *gc;
+       gint sx, sy;
+       gint dw, dh;
+
+       if (!widget || !widget->window) return;
+
+       pango_layout_get_pixel_size(layout, &w, &h);
+       pixmap = gdk_pixmap_new(widget->window, w, h, -1);
+
+       gc = gdk_gc_new(widget->window);
+       gdk_gc_copy(gc, widget->style->black_gc);
+       gdk_draw_rectangle(pixmap, gc, TRUE, 0, 0, w, h);
+       gdk_gc_copy(gc, widget->style->white_gc);
+       gdk_draw_layout(pixmap, gc, 0, 0, layout);
+       g_object_unref(gc);
+
+       buffer = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, w, h);
+       gdk_pixbuf_get_from_drawable(buffer, pixmap,
+                                    gdk_drawable_get_colormap(widget->window),
+                                    0, 0, 0, 0, w, h);
+       g_object_unref(pixmap);
+
+       sx = 0;
+       sy = 0;
+       dw = gdk_pixbuf_get_width(pixbuf);
+       dh = gdk_pixbuf_get_height(pixbuf);
+
+       if (x < 0)
+               {
+               w += x;
+               sx = -x;
+               x = 0;
+               }
+
+       if (y < 0)
+               {
+               h += y;
+               sy = -y;
+               y = 0;
+               }
+
+       if (x + w > dw) w = dw - x;
+       if (y + h > dh) h = dh - y;
+
+       pixbuf_copy_font(buffer, 0, 0,
+                        pixbuf, x, y, w, h,
+                        r, g, b, a);
+
+       g_object_unref(buffer);
+}
+
diff --git a/src/pixbuf_util.h b/src/pixbuf_util.h
new file mode 100644 (file)
index 0000000..87cae56
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef PIXBUF_UTIL_H
+#define PIXBUF_UTIL_H
+
+
+gboolean pixbuf_to_file_as_png (GdkPixbuf *pixbuf, const char *filename);
+gboolean pixbuf_to_file_as_jpg(GdkPixbuf *pixbuf, const gchar *filename, gint quality);
+
+
+GdkPixbuf *pixbuf_inline(const gchar *key);
+
+#define PIXBUF_INLINE_FOLDER_CLOSED    "folder_closed"
+#define PIXBUF_INLINE_FOLDER_LOCKED    "folder_locked"
+#define PIXBUF_INLINE_FOLDER_OPEN      "folder_open"
+#define PIXBUF_INLINE_FOLDER_UP                "folder_up"
+#define PIXBUF_INLINE_SCROLLER         "scroller"
+#define PIXBUF_INLINE_BROKEN           "broken"
+#define PIXBUF_INLINE_LOGO             "logo"
+
+
+GdkPixbuf *pixbuf_copy_rotate_90(GdkPixbuf *src, gint counter_clockwise);
+GdkPixbuf *pixbuf_copy_mirror(GdkPixbuf *src, gint mirror, gint flip);
+
+
+void pixbuf_draw_rect_fill(GdkPixbuf *pb,
+                          gint x, gint y, gint w, gint h,
+                          gint r, gint g, gint b, gint a);
+
+void pixbuf_draw_rect(GdkPixbuf *pb,
+                     gint x, gint y, gint w, gint h,
+                     gint r, gint g, gint b, gint a,
+                     gint left, gint right, gint top, gint bottom);
+
+void pixbuf_set_rect_fill(GdkPixbuf *pb,
+                         gint x, gint y, gint w, gint h,
+                         gint r, gint g, gint b, gint a);
+
+void pixbuf_set_rect(GdkPixbuf *pb,
+                    gint x, gint y, gint w, gint h,
+                    gint r, gint g, gint b, gint a,
+                    gint left, gint right, gint top, gint bottom);
+
+void pixbuf_pixel_set(GdkPixbuf *pb, gint x, gint y, gint r, gint g, gint b, gint a);
+
+
+void pixbuf_draw_layout(GdkPixbuf *pixbuf, PangoLayout *layout, GtkWidget *widget,
+                       gint x, gint y,
+                       guint8 r, guint8 g, guint8 b, guint8 a);
+
+
+#endif
+
+
diff --git a/src/preferences.c b/src/preferences.c
new file mode 100644 (file)
index 0000000..8b1c083
--- /dev/null
@@ -0,0 +1,1338 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "preferences.h"
+
+#include "cache_maint.h"
+#include "editors.h"
+#include "filelist.h"
+#include "fullscreen.h"
+#include "img-view.h"
+#include "layout_config.h"
+#include "layout_util.h"
+#include "pixbuf_util.h"
+#include "slideshow.h"
+#include "utilops.h"
+#include "ui_fileops.h"
+#include "ui_misc.h"
+#include "ui_tabcomp.h"
+#include "ui_utildlg.h"
+
+#include "icons/config.xpm"
+
+#include <math.h>
+
+
+#define EDITOR_NAME_MAX_LENGTH 32
+#define EDITOR_COMMAND_MAX_LENGTH 1024
+
+
+typedef struct _ThumbSize ThumbSize;
+struct _ThumbSize
+{
+       gint w;
+       gint h;
+};
+
+static ThumbSize thumb_size_list[] =
+{
+       { 24, 24 },
+       { 32, 32 },
+       { 48, 48 },
+       { 64, 64 },
+       { 96, 72 },
+       { 96, 96 },
+       { 128, 96 },
+       { 128, 128 },
+       { 160, 120 },
+       { 160, 160 },
+       { 192, 144 },
+       { 192, 192 },
+       { 256, 192 },
+       { 256, 256 }
+};
+
+enum {
+       FE_ENABLE,
+       FE_EXTENSION,
+       FE_DESCRIPTION
+};
+
+/* config memory values */
+static gint startup_path_enable_c;
+static gint confirm_delete_c;
+static gint enable_delete_key_c;
+static gint safe_delete_enable_c;
+static gint safe_delete_size_c;
+static gint restore_tool_c;
+static gint save_window_positions_c;
+static gint zoom_mode_c;
+static gint two_pass_zoom_c;
+static gint fit_window_c;
+static gint limit_window_size_c;
+static gint zoom_to_fit_expands_c;
+static gint max_window_size_c;
+static gint progressive_key_scrolling_c;
+static gint thumb_max_width_c;
+static gint thumb_max_height_c;
+static gint enable_thumb_caching_c;
+static gint enable_thumb_dirs_c;
+static gint use_xvpics_thumbnails_c;
+static gint thumbnail_spec_standard_c;
+static gint enable_metadata_dirs_c;
+static gint show_dot_files_c;
+static gint file_filter_disable_c;
+static gint file_sort_case_sensitive_c;
+static gint slideshow_delay_c;
+static gint slideshow_random_c;
+static gint slideshow_repeat_c;
+
+static gint mousewheel_scrolls_c;
+
+static gint enable_in_place_rename_c;
+
+static gint collection_rectangular_selection_c;
+
+static gint tile_cache_max_c;
+
+static gint thumbnail_quality_c;
+static gint zoom_quality_c;
+
+static gint zoom_increment_c;
+
+static gint enable_read_ahead_c;
+
+static gint black_window_background_c;
+
+static gint fullscreen_screen_c;
+static gint fullscreen_clean_flip_c;
+static gint fullscreen_disable_saver_c;
+static gint fullscreen_above_c;
+
+static gint dupe_custom_threshold_c;
+
+static GtkWidget *configwindow = NULL;
+static GtkWidget *startup_path_entry;
+static GtkListStore *filter_store = NULL;
+static GtkWidget *editor_name_entry[GQVIEW_EDITOR_SLOTS];
+static GtkWidget *editor_command_entry[GQVIEW_EDITOR_SLOTS];
+
+static GtkWidget *layout_widget;
+
+static GtkWidget *safe_delete_path_entry;
+
+static gint tree_descend_subdirs_c;
+
+static gint update_on_time_change_c;
+static gint exif_rotate_enable_c;
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * option widget callbacks (private)
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void startup_path_set_current(GtkWidget *widget, gpointer data)
+{
+       gtk_entry_set_text(GTK_ENTRY(startup_path_entry), layout_get_path(NULL));
+}
+
+static void zoom_mode_original_cb(GtkWidget *widget, gpointer data)
+{
+       if (GTK_TOGGLE_BUTTON (widget)->active)
+               zoom_mode_c = ZOOM_RESET_ORIGINAL;
+}
+
+static void zoom_mode_fit_cb(GtkWidget *widget, gpointer data)
+{
+       if (GTK_TOGGLE_BUTTON (widget)->active)
+               zoom_mode_c = ZOOM_RESET_FIT_WINDOW;
+}
+
+static void zoom_mode_none_cb(GtkWidget *widget, gpointer data)
+{
+       if (GTK_TOGGLE_BUTTON (widget)->active)
+               zoom_mode_c = ZOOM_RESET_NONE;
+}
+
+static void zoom_increment_cb(GtkWidget *spin, gpointer data)
+{
+       zoom_increment_c = (gint)(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) * 10.0 + 0.01);
+}
+
+static void slideshow_delay_cb(GtkWidget *spin, gpointer data)
+{
+       slideshow_delay_c = (gint)(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)) *
+                                  (double)SLIDESHOW_SUBSECOND_PRECISION + 0.01);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * sync progam to config window routine (private)
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void config_window_apply(void)
+{
+       const gchar *buf;
+       gchar *l_conf;
+       gint new_style;
+       gint i;
+       gint refresh = FALSE;
+
+       for(i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
+               {
+               g_free(editor_name[i]);
+               editor_name[i] = NULL;
+               buf = gtk_entry_get_text(GTK_ENTRY(editor_name_entry[i]));
+               if (buf && strlen(buf) > 0) editor_name[i] = g_strdup(buf);
+
+               g_free(editor_command[i]);
+               editor_command[i] = NULL;
+               buf = gtk_entry_get_text(GTK_ENTRY(editor_command_entry[i]));
+               if (buf && strlen(buf) > 0) editor_command[i] = g_strdup(buf);
+               }
+       layout_edit_update_all();
+
+       g_free(startup_path);
+       startup_path = NULL;
+       buf = gtk_entry_get_text(GTK_ENTRY(startup_path_entry));
+       if (buf && strlen(buf) > 0) startup_path = remove_trailing_slash(buf);
+
+       g_free(safe_delete_path);
+       safe_delete_path = NULL;
+       buf = gtk_entry_get_text(GTK_ENTRY(safe_delete_path_entry));
+       if (buf && strlen(buf) > 0) safe_delete_path = remove_trailing_slash(buf);
+
+       if (show_dot_files != show_dot_files_c) refresh = TRUE;
+       if (file_sort_case_sensitive != file_sort_case_sensitive_c) refresh = TRUE;
+       if (file_filter_disable != file_filter_disable_c) refresh = TRUE;
+
+       startup_path_enable = startup_path_enable_c;
+       confirm_delete = confirm_delete_c;
+       enable_delete_key = enable_delete_key_c;
+       safe_delete_enable = safe_delete_enable_c;
+       safe_delete_size = safe_delete_size_c;
+       restore_tool = restore_tool_c;
+       save_window_positions = save_window_positions_c;
+       zoom_mode = zoom_mode_c;
+       two_pass_zoom = two_pass_zoom_c;
+       fit_window = fit_window_c;
+       limit_window_size = limit_window_size_c;
+       zoom_to_fit_expands = zoom_to_fit_expands_c;
+       max_window_size = max_window_size_c;
+       progressive_key_scrolling = progressive_key_scrolling_c;
+       thumb_max_width = thumb_max_width_c;
+       thumb_max_height = thumb_max_height_c;
+       enable_thumb_caching = enable_thumb_caching_c;
+       enable_thumb_dirs = enable_thumb_dirs_c;
+       use_xvpics_thumbnails = use_xvpics_thumbnails_c;
+       thumbnail_spec_standard = thumbnail_spec_standard_c;
+       enable_metadata_dirs = enable_metadata_dirs_c;
+       show_dot_files = show_dot_files_c;
+       file_sort_case_sensitive = file_sort_case_sensitive_c;
+       file_filter_disable = file_filter_disable_c;
+
+       slideshow_random = slideshow_random_c;
+       slideshow_repeat = slideshow_repeat_c;
+       slideshow_delay = slideshow_delay_c;
+
+       mousewheel_scrolls = mousewheel_scrolls_c;
+
+       enable_in_place_rename = enable_in_place_rename_c;
+
+       collection_rectangular_selection = collection_rectangular_selection_c;
+
+       tile_cache_max = tile_cache_max_c;
+
+       thumbnail_quality = thumbnail_quality_c;
+       zoom_quality = zoom_quality_c;
+
+       zoom_increment = zoom_increment_c;
+
+       enable_read_ahead = enable_read_ahead_c;
+
+       if (black_window_background != black_window_background_c)
+               {
+               black_window_background = black_window_background_c;
+
+               layout_colors_update();
+               view_window_colors_update();
+               }
+
+       fullscreen_screen = fullscreen_screen_c;
+       fullscreen_clean_flip = fullscreen_clean_flip_c;
+       fullscreen_disable_saver = fullscreen_disable_saver_c;
+       fullscreen_above = fullscreen_above_c;
+
+       update_on_time_change = update_on_time_change_c;
+       exif_rotate_enable = exif_rotate_enable_c;
+
+       dupe_custom_threshold = dupe_custom_threshold_c;
+
+       tree_descend_subdirs = tree_descend_subdirs_c;
+
+       l_conf = layout_config_get(layout_widget, &new_style);
+
+       if (new_style != layout_style ||
+           (l_conf == NULL) != (layout_order == NULL) ||
+           !layout_order ||
+           strcmp(buf, layout_order) != 0)
+               {
+               if (refresh) filter_rebuild();
+               refresh = FALSE;
+
+               g_free(layout_order);
+               layout_order = l_conf;
+               l_conf = NULL;
+
+               layout_style = new_style;
+
+               layout_styles_update();
+               }
+
+       g_free(l_conf);
+
+       if (refresh)
+               {
+               filter_rebuild();
+               layout_refresh(NULL);
+               }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * config window main button callbacks (private)
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void config_window_close_cb(GtkWidget *widget, gpointer data)
+{
+       gtk_widget_destroy(configwindow);
+       configwindow = NULL;
+       filter_store = NULL;
+}
+
+static gint config_window_delete(GtkWidget *w, GdkEventAny *event, gpointer data)
+{
+       config_window_close_cb(NULL, NULL);
+       return TRUE;
+}
+
+static void config_window_ok_cb(GtkWidget *widget, gpointer data)
+{
+       config_window_apply();
+       config_window_close_cb(NULL, NULL);
+}
+
+static void config_window_apply_cb(GtkWidget *widget, gpointer data)
+{
+       config_window_apply();
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * config window setup (private)
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void quality_menu_cb(GtkWidget *combo, gpointer data)
+{
+       gint *option = data;
+
+       switch (gtk_combo_box_get_active(GTK_COMBO_BOX(combo)))
+               {
+               case 0:
+               default:
+                       *option = GDK_INTERP_NEAREST;
+                       break;
+               case 1:
+                       *option = GDK_INTERP_TILES;
+                       break;
+               case 2:
+                       *option = GDK_INTERP_BILINEAR;
+                       break;
+               case 3:
+                       *option = GDK_INTERP_HYPER;
+                       break;
+               }
+}
+
+static void add_quality_menu(GtkWidget *table, gint column, gint row, const gchar *text,
+                            gint option, gint *option_c)
+{
+       GtkWidget *combo;
+       gint current = 0;
+
+       *option_c = option;
+
+       pref_table_label(table, column, row, text, 0.0);
+
+       combo = gtk_combo_box_new_text();
+
+       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Nearest (worst, but fastest)"));
+       if (option == GDK_INTERP_NEAREST) current = 0;
+       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Tiles"));
+       if (option == GDK_INTERP_TILES) current = 1;
+       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Bilinear"));
+       if (option == GDK_INTERP_BILINEAR) current = 2;
+       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _("Hyper (best, but slowest)"));
+       if (option == GDK_INTERP_HYPER) current = 3;
+
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
+
+       g_signal_connect(G_OBJECT(combo), "changed",
+                        G_CALLBACK(quality_menu_cb), option_c);
+
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1,
+                        GTK_EXPAND | GTK_FILL, FALSE, 0, 0);
+       gtk_widget_show(combo);
+}
+
+#if 0
+static void add_dither_menu(gint option, gint *option_c, gchar *text, GtkWidget *box)
+{
+       GtkWidget *hbox;
+       GtkWidget *omenu;
+       GtkWidget *menu;
+
+       *option_c = option;
+
+       hbox = pref_box_new(box, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+       pref_label_new(hbox, text);
+
+       omenu = gtk_option_menu_new();
+       menu = gtk_menu_new();
+
+       add_menu_item(menu, _("None"), option_c, (gint)GDK_RGB_DITHER_NONE);
+       add_menu_item(menu, _("Normal"), option_c, (gint)GDK_RGB_DITHER_NORMAL);
+       add_menu_item(menu, _("Best"), option_c, (gint)GDK_RGB_DITHER_MAX);
+
+       gtk_option_menu_set_menu(GTK_OPTION_MENU(omenu), menu);
+       gtk_option_menu_set_history(GTK_OPTION_MENU(omenu), *option_c);
+
+       gtk_box_pack_start(GTK_BOX(hbox), omenu, FALSE, FALSE, 0);
+       gtk_widget_show(omenu);
+}
+#endif
+
+static void thumb_size_menu_cb(GtkWidget *combo, gpointer data)
+{
+       gint n;
+
+       n = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
+
+       if (n >= 0 && n < sizeof(thumb_size_list) / sizeof(ThumbSize))
+               {
+               thumb_max_width_c = thumb_size_list[n].w;
+               thumb_max_height_c = thumb_size_list[n].h;
+               }
+       else if (n > 0)
+               {
+               thumb_max_width_c = thumb_max_width;
+               thumb_max_height_c = thumb_max_height;
+               }
+}
+
+static void add_thumb_size_menu(GtkWidget *table, gint column, gint row, gchar *text)
+{
+       GtkWidget *combo;
+       gint current;
+       gint last_w, last_h;
+       gint i;
+       gint c;
+
+       thumb_max_width_c = thumb_max_width;
+       thumb_max_height_c = thumb_max_height;
+
+       pref_table_label(table, column, row, text, 0.0);
+
+       combo = gtk_combo_box_new_text();
+
+       last_w = last_h = 0;
+       current = -1;
+       i = 0;
+       c = TRUE;
+       while (c)
+               {
+               gint w, h;
+
+               w = thumb_size_list[i].w;
+               h = thumb_size_list[i].h;
+
+               if ( w > 0 && h > 0)
+                       {
+                       gchar *buf;
+
+                       buf = g_strdup_printf("%d x %d", w, h);
+                       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), buf);
+                       g_free(buf);
+
+                       if (w == thumb_max_width && h == thumb_max_height) current = i;
+
+                       last_w = w;
+                       last_h = h;
+                       }
+               else
+                       {
+                       c = FALSE;
+                       }
+               i++;
+               }
+
+       if (current == -1)
+               {
+               gchar *buf;
+
+               buf = g_strdup_printf("%s %d x %d", _("Custom"), thumb_max_width, thumb_max_height);
+               gtk_combo_box_append_text(GTK_COMBO_BOX(combo), buf);
+               g_free(buf);
+
+               current = i - 1;
+               }
+
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
+       g_signal_connect(G_OBJECT(combo), "changed",
+                        G_CALLBACK(thumb_size_menu_cb), NULL);
+
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1,
+                        GTK_EXPAND | GTK_FILL, FALSE, 0, 0);
+       gtk_widget_show(combo);
+}
+
+static void filter_store_populate(void)
+{
+       GList *work;
+
+       if (!filter_store) return;
+
+       gtk_list_store_clear(filter_store);
+
+       work = filter_get_list();
+       while (work)
+               {
+               FilterEntry *fe;
+               GtkTreeIter iter;
+
+               fe = work->data;
+               work = work->next;
+
+               gtk_list_store_append(filter_store, &iter);
+               gtk_list_store_set(filter_store, &iter, 0, fe, -1);
+               }
+}
+
+static void filter_store_ext_edit_cb(GtkCellRendererText *cell, gchar *path_str,
+                                    gchar *new_text, gpointer data)
+{
+       GtkWidget *model = data;
+       FilterEntry *fe = data;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+
+       if (!new_text || strlen(new_text) < 1) return;
+
+       tpath = gtk_tree_path_new_from_string(path_str);
+       gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath);
+       gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1);
+
+       g_free(fe->extensions);
+       fe->extensions = g_strdup(new_text);
+
+       gtk_tree_path_free(tpath);
+       filter_rebuild();
+}
+
+static void filter_store_desc_edit_cb(GtkCellRendererText *cell, gchar *path_str,
+                                     gchar *new_text, gpointer data)
+{
+       GtkWidget *model = data;
+       FilterEntry *fe;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+
+       if (!new_text || strlen(new_text) < 1) return;
+
+       tpath = gtk_tree_path_new_from_string(path_str);
+       gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath);
+       gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1);
+
+       g_free(fe->description);
+       fe->description = g_strdup(new_text);
+
+       gtk_tree_path_free(tpath);
+}
+
+static void filter_store_enable_cb(GtkCellRendererToggle *renderer,
+                                  gchar *path_str, gpointer data)
+{
+       GtkWidget *model = data;
+       FilterEntry *fe;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+
+       tpath = gtk_tree_path_new_from_string(path_str);
+       gtk_tree_model_get_iter(GTK_TREE_MODEL(model), &iter, tpath);
+       gtk_tree_model_get(GTK_TREE_MODEL(model), &iter, 0, &fe, -1);
+
+       fe->enabled = !fe->enabled;
+
+       gtk_tree_path_free(tpath);
+       filter_rebuild();
+}
+
+static void filter_set_func(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
+                           GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+{
+       FilterEntry *fe;
+
+       gtk_tree_model_get(tree_model, iter, 0, &fe, -1);
+
+       switch(GPOINTER_TO_INT(data))
+               {
+               case FE_ENABLE:
+                       g_object_set(GTK_CELL_RENDERER(cell),
+                                    "active", fe->enabled, NULL);
+                       break;
+               case FE_EXTENSION:
+                       g_object_set(GTK_CELL_RENDERER(cell),
+                                    "text", fe->extensions, NULL);
+                       break;
+               case FE_DESCRIPTION:
+                       g_object_set(GTK_CELL_RENDERER(cell),
+                                    "text", fe->description, NULL);
+                       break;
+               }
+}
+
+static void filter_add_cb(GtkWidget *widget, gpointer data)
+{
+       filter_add_unique("description", ".new", TRUE);
+       filter_store_populate();
+
+       /* FIXME: implement the scroll to/select row stuff for tree view */
+}
+
+static void filter_remove_cb(GtkWidget *widget, gpointer data)
+{
+       GtkWidget *filter_view = data;
+       GtkTreeSelection *selection;
+       GtkTreeIter iter;
+       FilterEntry *fe;
+
+       if (!filter_store) return;
+               selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_view));
+       if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) return;
+       gtk_tree_model_get(GTK_TREE_MODEL(filter_store), &iter, 0, &fe, -1);
+       if (!fe) return;
+
+       filter_remove_entry(fe);
+       filter_rebuild();
+       filter_store_populate();
+}
+
+static void filter_default_ok_cb(GenericDialog *gd, gpointer data)
+{
+       filter_reset();
+       filter_add_defaults();
+       filter_rebuild();
+       filter_store_populate();
+}
+
+static void dummy_cancel_cb(GenericDialog *gd, gpointer data)
+{
+       /* no op, only so cancel button appears */
+}
+
+static void filter_default_cb(GtkWidget *widget, gpointer data)
+{
+       GenericDialog *gd;
+
+       gd = generic_dialog_new(_("Reset filters"),
+                               "GQview", "reset_filter", widget, TRUE,
+                               dummy_cancel_cb, NULL);
+       generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset filters"),
+                                  _("This will reset the file filters to the defaults.\nContinue?"));
+       generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, filter_default_ok_cb, TRUE);
+       gtk_widget_show(gd->dialog);
+}
+
+static void filter_disable_cb(GtkWidget* widget, gpointer data)
+{
+       GtkWidget *frame = data;
+
+       gtk_widget_set_sensitive(frame,
+                                !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)));
+}
+
+static void editor_default_ok_cb(GenericDialog *gd, gpointer data)
+{
+       gint i;
+
+       editor_reset_defaults();
+       if (!configwindow) return;
+
+       for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
+               {
+               gtk_entry_set_text(GTK_ENTRY(editor_name_entry[i]),
+                                  (editor_name[i]) ? editor_name[i] : "");
+               gtk_entry_set_text(GTK_ENTRY(editor_command_entry[i]),
+                                  (editor_command[i]) ? editor_command[i] : "");
+               }
+}
+
+static void editor_default_cb(GtkWidget *widget, gpointer data)
+{
+       GenericDialog *gd;
+
+       gd = generic_dialog_new(_("Reset editors"),
+                               "GQview", "reset_filter", widget, TRUE,
+                               dummy_cancel_cb, NULL);
+       generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Reset editors"),
+                                  _("This will reset the edit commands to the defaults.\nContinue?"));
+       generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, editor_default_ok_cb, TRUE);
+       gtk_widget_show(gd->dialog);
+}
+
+static void editor_help_cb(GtkWidget *widget, gpointer data)
+{
+       help_window_show("editors");
+}
+
+static void safe_delete_view_cb(GtkWidget* widget, gpointer data)
+{
+       layout_set_path(NULL, gtk_entry_get_text(GTK_ENTRY(safe_delete_path_entry)));
+}
+
+static void safe_delete_clear_ok_cb(GenericDialog *gd, gpointer data)
+{
+       file_util_trash_clear();
+}
+
+static void safe_delete_clear_cb(GtkWidget* widget, gpointer data)
+{
+       GenericDialog *gd;
+       GtkWidget *entry;
+       gd = generic_dialog_new(_("Clear trash"),
+                               "GQview", "clear_trash", widget, TRUE,
+                               dummy_cancel_cb, NULL);
+       generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION, _("Clear trash"),
+                                   _("This will remove the trash contents."));
+       generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, safe_delete_clear_ok_cb, TRUE);
+       entry = gtk_entry_new();
+       GTK_WIDGET_UNSET_FLAGS(entry, GTK_CAN_FOCUS);
+       gtk_editable_set_editable(GTK_EDITABLE(entry), FALSE);
+       if (safe_delete_path) gtk_entry_set_text(GTK_ENTRY(entry), safe_delete_path);
+       gtk_box_pack_start(GTK_BOX(gd->vbox), entry, FALSE, FALSE, 0);
+       gtk_widget_show(entry);
+       gtk_widget_show(gd->dialog);
+}
+
+static void config_window_create(void)
+{
+       GtkWidget *win_vbox;
+       GtkWidget *hbox;
+       GtkWidget *notebook;
+       GtkWidget *frame;
+       GtkWidget *label;
+       GtkWidget *vbox;
+       GtkWidget *group;
+       GtkWidget *subgroup;
+       GtkWidget *button;
+       GtkWidget *tabcomp;
+       GtkWidget *ct_button;
+       GtkWidget *table;
+       GtkWidget *spin;
+       GtkWidget *scrolled;
+       GtkWidget *viewport;
+       GtkWidget *filter_view;
+       GtkCellRenderer *renderer;
+       GtkTreeSelection *selection;
+       GtkTreeViewColumn *column;
+       gint i;
+
+       configwindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+       gtk_window_set_type_hint(GTK_WINDOW(configwindow), GDK_WINDOW_TYPE_HINT_DIALOG);
+       g_signal_connect(G_OBJECT (configwindow), "delete_event",
+                        G_CALLBACK(config_window_delete), NULL);
+       gtk_window_set_resizable(GTK_WINDOW(configwindow), FALSE);
+       gtk_window_set_title(GTK_WINDOW(configwindow), _("GQview Preferences"));
+       gtk_window_set_wmclass(GTK_WINDOW(configwindow), "config", "GQview");
+       gtk_container_set_border_width(GTK_CONTAINER(configwindow), PREF_PAD_BORDER);
+
+       window_set_icon(configwindow, (const gchar **)config_xpm, NULL);
+
+       win_vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE);
+       gtk_container_add(GTK_CONTAINER(configwindow), win_vbox);
+       gtk_widget_show(win_vbox);
+
+       hbox = gtk_hbutton_box_new();
+       gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
+       gtk_box_set_spacing(GTK_BOX(hbox), PREF_PAD_BUTTON_GAP);
+       gtk_box_pack_end(GTK_BOX(win_vbox), hbox, FALSE, FALSE, 0);
+       gtk_widget_show(hbox);
+
+       button = pref_button_new(NULL, GTK_STOCK_OK, NULL, FALSE,
+                                G_CALLBACK(config_window_ok_cb), NULL);
+       gtk_container_add(GTK_CONTAINER(hbox), button);
+       GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+       gtk_widget_grab_default(button);
+       gtk_widget_show(button);
+
+       ct_button = button;
+
+       button = pref_button_new(NULL, GTK_STOCK_APPLY, NULL, FALSE,
+                                G_CALLBACK(config_window_apply_cb), NULL);
+       gtk_container_add(GTK_CONTAINER(hbox), button);
+       GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+       gtk_widget_show(button);
+
+       button = pref_button_new(NULL, GTK_STOCK_CANCEL, NULL, FALSE,
+                                G_CALLBACK(config_window_close_cb), NULL);
+       gtk_container_add(GTK_CONTAINER(hbox), button);
+       GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+       gtk_widget_show(button);
+
+       if (!generic_dialog_get_alternative_button_order(configwindow))
+               {
+               gtk_box_reorder_child(GTK_BOX(hbox), ct_button, -1);
+               }
+
+       notebook = gtk_notebook_new();
+       gtk_notebook_set_tab_pos (GTK_NOTEBOOK(notebook), GTK_POS_TOP);
+       gtk_box_pack_start(GTK_BOX(win_vbox), notebook, TRUE, TRUE, 0);
+
+       /* general options tab */
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
+       gtk_widget_show(vbox);
+       label = gtk_label_new(_("General"));
+       gtk_notebook_append_page (GTK_NOTEBOOK(notebook), vbox, label);
+
+       group = pref_group_new(vbox, FALSE, _("Startup"), GTK_ORIENTATION_VERTICAL);
+
+       button = pref_checkbox_new_int(group, _("Change to folder:"),
+                                      startup_path_enable, &startup_path_enable_c);
+
+       hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+       pref_checkbox_link_sensitivity(button, hbox);
+
+       tabcomp = tab_completion_new(&startup_path_entry, startup_path, NULL, NULL);
+       tab_completion_add_select_button(startup_path_entry, NULL, TRUE);
+       gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0);
+       gtk_widget_show(tabcomp);
+
+       button = pref_button_new(hbox, NULL, _("Use current"), FALSE,
+                                G_CALLBACK(startup_path_set_current), NULL);
+
+       group = pref_group_new(vbox, FALSE, _("Thumbnails"), GTK_ORIENTATION_VERTICAL);
+
+       table = pref_table_new(group, 2, 2, FALSE, FALSE);
+       add_thumb_size_menu(table, 0, 0, _("Size:"));
+       add_quality_menu(table, 0, 1, _("Quality:"), thumbnail_quality, &thumbnail_quality_c);
+
+       ct_button = pref_checkbox_new_int(group, _("Cache thumbnails"),
+                                         enable_thumb_caching, &enable_thumb_caching_c);
+
+       subgroup = pref_box_new(group, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
+       pref_checkbox_link_sensitivity(ct_button, subgroup);
+
+       button = pref_checkbox_new_int(subgroup, _("Use shared thumbnail cache"),
+                                      thumbnail_spec_standard, &thumbnail_spec_standard_c);
+
+       subgroup = pref_box_new(subgroup, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
+       pref_checkbox_link_sensitivity_swap(button, subgroup);
+
+       button = pref_checkbox_new_int(subgroup, _("Cache thumbnails into .thumbnails"),
+                                      enable_thumb_dirs, &enable_thumb_dirs_c);
+
+       button = pref_checkbox_new_int(subgroup, _("Use xvpics thumbnails when found (read only)"),
+                                      use_xvpics_thumbnails, &use_xvpics_thumbnails_c);
+
+       group = pref_group_new(vbox, FALSE, _("Slide show"), GTK_ORIENTATION_VERTICAL);
+
+       slideshow_delay_c = slideshow_delay;
+       spin = pref_spin_new(group, _("Delay between image change:"), _("seconds"),
+                            SLIDESHOW_MIN_SECONDS, SLIDESHOW_MAX_SECONDS, 1.0, 1,
+                            slideshow_delay ? (double)slideshow_delay / SLIDESHOW_SUBSECOND_PRECISION : 10.0,
+                            G_CALLBACK(slideshow_delay_cb), NULL);
+       gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
+
+       pref_checkbox_new_int(group, _("Random"), slideshow_random, &slideshow_random_c);
+       pref_checkbox_new_int(group, _("Repeat"), slideshow_repeat, &slideshow_repeat_c);
+
+       /* image tab */
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
+       gtk_widget_show(vbox);
+       label = gtk_label_new(_("Image"));
+       gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox, label);
+
+       group = pref_group_new(vbox, FALSE, _("Zoom"), GTK_ORIENTATION_VERTICAL);
+
+#if 0
+       add_dither_menu(dither_quality, &dither_quality_c, _("Dithering method:"), group);
+#endif
+       table = pref_table_new(group, 2, 1, FALSE, FALSE);
+       add_quality_menu(table, 0, 0, _("Quality:"), zoom_quality, &zoom_quality_c);
+
+       pref_checkbox_new_int(group, _("Two pass zooming"),
+                             two_pass_zoom, &two_pass_zoom_c);
+
+       pref_checkbox_new_int(group, _("Allow enlargement of image for zoom to fit."),
+                             zoom_to_fit_expands, &zoom_to_fit_expands_c);
+
+       zoom_increment_c = zoom_increment;
+       spin = pref_spin_new(group, _("Zoom increment:"), NULL,
+                            0.1, 4.0, 1.0, 1, (float)zoom_increment / 10.0,
+                            G_CALLBACK(zoom_increment_cb), NULL);
+       gtk_spin_button_set_update_policy(GTK_SPIN_BUTTON(spin), GTK_UPDATE_ALWAYS);
+
+       group = pref_group_new(vbox, FALSE, _("When new image is selected:"), GTK_ORIENTATION_VERTICAL);
+
+       zoom_mode_c = zoom_mode;
+       button = pref_radiobutton_new(group, NULL, _("Zoom to original size"),
+                                     (zoom_mode == ZOOM_RESET_ORIGINAL),
+                                     G_CALLBACK(zoom_mode_original_cb), NULL);
+       button = pref_radiobutton_new(group, button, _("Fit image to window"),
+                                     (zoom_mode == ZOOM_RESET_FIT_WINDOW),
+                                     G_CALLBACK(zoom_mode_fit_cb), NULL);
+       button = pref_radiobutton_new(group, button, _("Leave Zoom at previous setting"),
+                                     (zoom_mode == ZOOM_RESET_NONE),
+                                     G_CALLBACK(zoom_mode_none_cb), NULL);
+
+       group = pref_group_new(vbox, FALSE, _("Appearance"), GTK_ORIENTATION_VERTICAL);
+
+       pref_checkbox_new_int(group, _("Black background"),
+                             black_window_background, &black_window_background_c);
+
+       group = pref_group_new(vbox, FALSE, _("Convenience"), GTK_ORIENTATION_VERTICAL);
+
+       pref_checkbox_new_int(group, _("Refresh on file change"),
+                             update_on_time_change, &update_on_time_change_c);
+       pref_checkbox_new_int(group, _("Preload next image"),
+                             enable_read_ahead, &enable_read_ahead_c);
+       pref_checkbox_new_int(group, _("Auto rotate image using Exif information"),
+                             exif_rotate_enable, &exif_rotate_enable_c);
+
+
+       /* window tab */
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
+       gtk_widget_show(vbox);
+       label = gtk_label_new(_("Windows"));
+       gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
+
+       group = pref_group_new(vbox, FALSE, _("State"), GTK_ORIENTATION_VERTICAL);
+
+       pref_checkbox_new_int(group, _("Remember window positions"),
+                             save_window_positions, &save_window_positions_c);
+       pref_checkbox_new_int(group, _("Remember tool state (float/hidden)"),
+                             restore_tool, &restore_tool_c);
+
+       group = pref_group_new(vbox, FALSE, _("Size"), GTK_ORIENTATION_VERTICAL);
+
+       pref_checkbox_new_int(group, _("Fit window to image when tools are hidden/floating"),
+                             fit_window, &fit_window_c);
+
+       hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+       ct_button = pref_checkbox_new_int(hbox, _("Limit size when auto-sizing window (%):"),
+                                         limit_window_size, &limit_window_size_c);
+       spin = pref_spin_new_int(hbox, NULL, NULL,
+                                10, 150, 1,
+                                max_window_size, &max_window_size_c);
+       pref_checkbox_link_sensitivity(ct_button, spin);
+
+       group = pref_group_new(vbox, FALSE, _("Layout"), GTK_ORIENTATION_VERTICAL);
+
+       layout_widget = layout_config_new();
+       layout_config_set(layout_widget, layout_style, layout_order);
+       gtk_box_pack_start(GTK_BOX(group), layout_widget, FALSE, FALSE, 0);
+       gtk_widget_show(layout_widget);
+
+
+       /* filtering tab */
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_set_border_width(GTK_CONTAINER (vbox), PREF_PAD_BORDER);
+       gtk_widget_show(vbox);
+       label = gtk_label_new(_("Filtering"));
+       gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
+
+       group = pref_box_new(vbox, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
+
+       pref_checkbox_new_int(group, _("Show entries that begin with a dot"),
+                             show_dot_files, &show_dot_files_c);
+       pref_checkbox_new_int(group, _("Case sensitive sort"),
+                             file_sort_case_sensitive, &file_sort_case_sensitive_c);
+
+       ct_button = pref_checkbox_new_int(group, _("Disable File Filtering"),
+                                         file_filter_disable, &file_filter_disable_c);
+
+       group = pref_group_new(vbox, TRUE, _("File types"), GTK_ORIENTATION_VERTICAL);
+
+       frame = pref_group_parent(group);
+       g_signal_connect(G_OBJECT(ct_button), "toggled",
+                        G_CALLBACK(filter_disable_cb), frame);
+       gtk_widget_set_sensitive(frame, !file_filter_disable);
+
+       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+       gtk_box_pack_start(GTK_BOX(group), scrolled, TRUE, TRUE, 0);
+       gtk_widget_show(scrolled);
+
+       filter_store = gtk_list_store_new(1, G_TYPE_POINTER);
+       filter_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(filter_store));
+       g_object_unref(filter_store);
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(filter_view));
+       gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_SINGLE);
+
+       gtk_tree_view_set_enable_search(GTK_TREE_VIEW(filter_view), FALSE);
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_title(column, _("Filter"));
+       gtk_tree_view_column_set_resizable(column, TRUE);
+
+       renderer = gtk_cell_renderer_toggle_new();
+       g_signal_connect(G_OBJECT(renderer), "toggled",
+                        G_CALLBACK(filter_store_enable_cb), filter_store);
+       gtk_tree_view_column_pack_start(column, renderer, FALSE);
+       gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
+                                               GINT_TO_POINTER(FE_ENABLE), NULL);
+       
+       renderer = gtk_cell_renderer_text_new();
+       g_signal_connect(G_OBJECT(renderer), "edited",
+                        G_CALLBACK(filter_store_ext_edit_cb), filter_store);
+       gtk_tree_view_column_pack_start(column, renderer, TRUE);
+       g_object_set(G_OBJECT(renderer), "editable", (gboolean)TRUE, NULL);
+       gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
+                                               GINT_TO_POINTER(FE_EXTENSION), NULL);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_title(column, _("Description"));
+       gtk_tree_view_column_set_resizable(column, TRUE);
+       renderer = gtk_cell_renderer_text_new();
+       g_signal_connect(G_OBJECT(renderer), "edited",
+                        G_CALLBACK(filter_store_desc_edit_cb), filter_store);
+       g_object_set(G_OBJECT(renderer), "editable", (gboolean)TRUE, NULL);
+       gtk_tree_view_column_pack_start(column, renderer, FALSE);
+       gtk_tree_view_column_set_cell_data_func(column, renderer, filter_set_func,
+                                               GINT_TO_POINTER(FE_DESCRIPTION), NULL);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(filter_view), column);
+
+       filter_store_populate();
+       gtk_container_add(GTK_CONTAINER(scrolled), filter_view);
+       gtk_widget_show(filter_view);
+
+       hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
+
+       button = pref_button_new(NULL, NULL, _("Defaults"), FALSE,
+                                G_CALLBACK(filter_default_cb), NULL);
+       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       button = pref_button_new(NULL, GTK_STOCK_REMOVE, NULL, FALSE,
+                                G_CALLBACK(filter_remove_cb), filter_view);
+       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       button = pref_button_new(NULL, GTK_STOCK_ADD, NULL, FALSE,
+                                G_CALLBACK(filter_add_cb), NULL);
+       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+
+       /* editor entry tab */
+
+       vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
+       gtk_widget_show(vbox);
+       label = gtk_label_new(_("Editors"));
+       gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
+
+       table = pref_table_new(vbox, 3, 9, FALSE, FALSE);
+       gtk_table_set_col_spacings(GTK_TABLE(table), PREF_PAD_GAP);
+
+       label = pref_table_label(table, 0, 0, _("#"), 1.0);
+       pref_label_bold(label, TRUE, FALSE);
+
+       label = pref_table_label(table, 1, 0, _("Menu name"), 0.0);
+       pref_label_bold(label, TRUE, FALSE);
+
+       label = pref_table_label(table, 2, 0, ("Command Line"), 0.0);
+       pref_label_bold(label, TRUE, FALSE);
+
+       for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
+               {
+               gchar *buf;
+
+               buf = g_strdup_printf("%d", i+1);
+               pref_table_label(table, 0, i+1, buf, 1.0);
+               g_free(buf);
+
+               editor_name_entry[i] = gtk_entry_new();
+               gtk_entry_set_max_length(GTK_ENTRY(editor_name_entry[i]), EDITOR_NAME_MAX_LENGTH);
+               gtk_widget_set_size_request(editor_name_entry[i],80,-1);
+               if (editor_name[i]) gtk_entry_set_text(GTK_ENTRY(editor_name_entry[i]),editor_name[i]);
+               gtk_table_attach(GTK_TABLE (table),editor_name_entry[i],1,2,i+1,i+2,
+                                GTK_FILL | GTK_EXPAND, FALSE, 0, 0);
+               gtk_widget_show(editor_name_entry[i]);
+
+               editor_command_entry[i] = gtk_entry_new();
+               gtk_entry_set_max_length(GTK_ENTRY(editor_command_entry[i]), EDITOR_COMMAND_MAX_LENGTH);
+               gtk_widget_set_size_request(editor_command_entry[i],160,-1);
+               tab_completion_add_to_entry(editor_command_entry[i], NULL, NULL);
+               if (editor_command[i]) gtk_entry_set_text(GTK_ENTRY(editor_command_entry[i]), editor_command[i]);
+               gtk_table_attach(GTK_TABLE (table),editor_command_entry[i],2,3,i+1,i+2,
+                                GTK_FILL | GTK_EXPAND, FALSE, 0, 0);
+               gtk_widget_show(editor_command_entry[i]);
+               }
+
+       hbox = pref_box_new(vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
+
+       button = pref_button_new(NULL, NULL, _("Defaults"), FALSE,
+                                G_CALLBACK(editor_default_cb), NULL);
+       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       button = pref_button_new(NULL, GTK_STOCK_HELP, NULL, FALSE,
+                                G_CALLBACK(editor_help_cb), NULL);
+       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       /* advanced entry tab */
+
+       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_container_set_border_width(GTK_CONTAINER(scrolled), PREF_PAD_BORDER);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
+                                      GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+       label = gtk_label_new(_("Advanced"));
+       gtk_notebook_append_page(GTK_NOTEBOOK(notebook), scrolled, label);
+       gtk_widget_show(scrolled);
+
+       viewport = gtk_viewport_new(NULL, NULL);
+       gtk_viewport_set_shadow_type(GTK_VIEWPORT(viewport), GTK_SHADOW_NONE);
+       gtk_container_add(GTK_CONTAINER(scrolled), viewport);
+       gtk_widget_show(viewport);
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_add(GTK_CONTAINER(viewport), vbox);
+       gtk_widget_show(vbox);
+
+       group = pref_group_new(vbox, FALSE, _("Full screen"), GTK_ORIENTATION_VERTICAL);
+
+       fullscreen_screen_c = fullscreen_screen;
+       fullscreen_above_c = fullscreen_above;
+       hbox = fullscreen_prefs_selection_new(_("Location:"), &fullscreen_screen_c, &fullscreen_above_c);
+       gtk_box_pack_start(GTK_BOX(group), hbox, FALSE, FALSE, 0);
+       gtk_widget_show(hbox);
+
+       pref_checkbox_new_int(group, _("Smooth image flip"),
+                             fullscreen_clean_flip, &fullscreen_clean_flip_c);
+       pref_checkbox_new_int(group, _("Disable screen saver"),
+                             fullscreen_disable_saver, &fullscreen_disable_saver_c);
+
+       group = pref_group_new(vbox, FALSE, _("Delete"), GTK_ORIENTATION_VERTICAL);
+
+       pref_checkbox_new_int(group, _("Confirm file delete"),
+                             confirm_delete, &confirm_delete_c);
+       pref_checkbox_new_int(group, _("Enable Delete key"),
+                             enable_delete_key, &enable_delete_key_c);
+
+       ct_button = pref_checkbox_new_int(group, _("Safe delete"),
+                                         safe_delete_enable, &safe_delete_enable_c);
+
+       hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+       pref_checkbox_link_sensitivity(ct_button, hbox);
+
+       pref_spacer(hbox, PREF_PAD_INDENT - PREF_PAD_SPACE);
+       pref_label_new(hbox, _("Folder:"));
+
+       tabcomp = tab_completion_new(&safe_delete_path_entry, safe_delete_path, NULL, NULL);
+       tab_completion_add_select_button(safe_delete_path_entry, NULL, TRUE);
+       gtk_box_pack_start(GTK_BOX(hbox), tabcomp, TRUE, TRUE, 0);
+       gtk_widget_show(tabcomp);
+
+       hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
+       pref_checkbox_link_sensitivity(ct_button, hbox);
+
+       pref_spacer(hbox, PREF_PAD_INDENT - PREF_PAD_GAP);
+       pref_spin_new_int(hbox, _("Maximum size:"), _("MB"),
+                         1, 500, 1, safe_delete_size, &safe_delete_size_c);
+
+       button = pref_button_new(NULL, NULL, _("View"), FALSE,
+                                G_CALLBACK(safe_delete_view_cb), NULL);
+       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       button = pref_button_new(NULL, GTK_STOCK_CLEAR, NULL, FALSE,
+                                G_CALLBACK(safe_delete_clear_cb), NULL);
+       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       group = pref_group_new(vbox, FALSE, _("Behavior"), GTK_ORIENTATION_VERTICAL);
+
+       pref_checkbox_new_int(group, _("Rectangular selection in icon view"),
+                             collection_rectangular_selection, &collection_rectangular_selection_c);
+
+       pref_checkbox_new_int(group, _("Descend folders in tree view"),
+                             tree_descend_subdirs, &tree_descend_subdirs_c);
+
+       pref_checkbox_new_int(group, _("In place renaming"),
+                             enable_in_place_rename, &enable_in_place_rename_c);
+
+       group = pref_group_new(vbox, FALSE, _("Navigation"), GTK_ORIENTATION_VERTICAL);
+
+       pref_checkbox_new_int(group, _("Progressive keyboard scrolling"),
+                             progressive_key_scrolling, &progressive_key_scrolling_c);
+       pref_checkbox_new_int(group, _("Mouse wheel scrolls image"),
+                             mousewheel_scrolls, &mousewheel_scrolls_c);
+
+       group = pref_group_new(vbox, FALSE, _("Miscellaneous"), GTK_ORIENTATION_VERTICAL);
+
+       pref_checkbox_new_int(group, _("Store keywords and comments local to source images"),
+                             enable_metadata_dirs, &enable_metadata_dirs_c);
+
+       pref_spin_new_int(group, _("Custom similarity threshold:"), NULL,
+                         0, 100, 1, dupe_custom_threshold, &dupe_custom_threshold_c);
+
+       pref_spin_new_int(group, _("Offscreen cache size (Mb per image):"), NULL,
+                         0, 128, 1, tile_cache_max, &tile_cache_max_c);
+
+       gtk_widget_show(notebook);
+
+       gtk_widget_show(configwindow);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * config window show (public)
+ *-----------------------------------------------------------------------------
+ */ 
+
+void show_config_window(void)
+{
+       if (configwindow)
+               {
+               gtk_window_present(GTK_WINDOW(configwindow));
+               return;
+               }
+
+       config_window_create();
+}
+
+/*
+ *-----------------
+ * about window
+ *-----------------
+ */
+
+static GtkWidget *about = NULL;
+
+static gint about_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
+{
+       gtk_widget_destroy(about);
+       about = NULL;
+
+       return TRUE;
+}
+
+static void about_window_close(GtkWidget *widget, gpointer data)
+{
+       if (!about) return;
+
+       gtk_widget_destroy(about);
+       about = NULL;
+}
+
+static void about_credits_cb(GtkWidget *widget, gpointer data)
+{
+       help_window_show("credits");
+}
+
+void show_about_window(void)
+{
+       GtkWidget *vbox;
+       GtkWidget *hbox;
+       GtkWidget *label;
+       GtkWidget *button;
+       GdkPixbuf *pixbuf;
+
+       gchar *buf;
+
+       if (about)
+               {
+               gtk_window_present(GTK_WINDOW(about));
+               return;
+               }
+
+       about = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+       gtk_window_set_type_hint(GTK_WINDOW(about), GDK_WINDOW_TYPE_HINT_DIALOG);
+       gtk_window_set_wmclass(GTK_WINDOW(about), "about", "GQview");
+       g_signal_connect(G_OBJECT(about), "delete_event",
+                        G_CALLBACK(about_delete_cb), NULL);
+
+       gtk_window_set_title(GTK_WINDOW(about), _("About - GQview"));
+       gtk_container_set_border_width(GTK_CONTAINER(about), PREF_PAD_BORDER);
+
+       vbox = gtk_vbox_new(FALSE, PREF_PAD_SPACE);
+       gtk_container_add(GTK_CONTAINER(about), vbox);
+       gtk_widget_show(vbox);
+
+       pixbuf = pixbuf_inline(PIXBUF_INLINE_LOGO);
+       button = gtk_image_new_from_pixbuf(pixbuf);
+       g_object_unref(pixbuf);
+       gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, TRUE, 0);
+       gtk_widget_show(button);
+
+       buf = g_strdup_printf(_("GQview %s\n\nCopyright (c) %s John Ellis\nwebsite: %s\nemail: %s\n\nReleased under the GNU General Public License"),
+                             VERSION,
+                             "2005",
+                             "gqview.sourceforge.net",
+                             "gqview@users.sourceforge.net");
+       label = gtk_label_new(buf);
+       g_free(buf);
+
+       gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
+       gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0);
+       gtk_widget_show(label);
+
+       hbox = gtk_hbutton_box_new();
+       gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
+       gtk_box_set_spacing(GTK_BOX(hbox), PREF_PAD_BUTTON_GAP);
+       gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+       gtk_widget_show(hbox);
+
+       button = pref_button_new(NULL, NULL, _("Credits..."), FALSE,
+                                G_CALLBACK(about_credits_cb), NULL);
+       gtk_container_add(GTK_CONTAINER(hbox), button);
+       GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+       gtk_widget_show(button);
+
+       button = pref_button_new(NULL, GTK_STOCK_CLOSE, NULL, FALSE,
+                                G_CALLBACK(about_window_close), NULL);
+       gtk_container_add(GTK_CONTAINER(hbox), button);
+       GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+       gtk_widget_grab_default(button);
+       gtk_widget_show(button);
+
+       window_set_icon(about, NULL, NULL);
+       gtk_widget_show(about);
+}
+
diff --git a/src/preferences.h b/src/preferences.h
new file mode 100644 (file)
index 0000000..875461e
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef PREFERENCES_H
+#define PREFERENCES_H
+
+
+void show_config_window(void);
+void show_about_window(void);
+
+
+#endif
diff --git a/src/print.c b/src/print.c
new file mode 100644 (file)
index 0000000..e216c4a
--- /dev/null
@@ -0,0 +1,3489 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "print.h"
+
+#include "filelist.h"
+#include "image.h"
+#include "image-load.h"
+#include "pixbuf_util.h"
+#include "thumb.h"
+#include "utilops.h"
+#include "ui_bookmark.h"
+#include "ui_menu.h"
+#include "ui_misc.h"
+#include "ui_utildlg.h"
+#include "ui_fileops.h"
+#include "ui_spinner.h"
+#include "ui_tabcomp.h"
+
+
+#include <locale.h>
+#include <signal.h>
+
+
+#define PRINT_LPR_COMMAND "lpr"
+#define PRINT_LPR_CUSTOM  "lpr -P %s"
+#define PRINT_LPR_QUERY   "lpstat -p"
+
+#define PRINT_DLG_WIDTH 600
+#define PRINT_DLG_HEIGHT 400
+
+#define PRINT_DLG_PREVIEW_WIDTH 270
+#define PRINT_DLG_PREVIEW_HEIGHT -1
+
+/* these are in point units */
+#define PRINT_MIN_WIDTH 100
+#define PRINT_MIN_HEIGHT 100
+#define PRINT_MAX_WIDTH 4000
+#define PRINT_MAX_HEIGHT 4000
+
+#define PRINT_MARGIN_DEFAULT 36
+
+#define PRINT_PROOF_MIN_SIZE 8
+#define PRINT_PROOF_MAX_SIZE 720
+#define PRINT_PROOF_DEFAULT_SIZE 144
+#define PRINT_PROOF_MARGIN 5
+
+/* default page size */
+#define PAGE_LAYOUT_WIDTH 850
+#define PAGE_LAYOUT_HEIGHT 1100
+
+/* preview uses 1 pixel = PRINT_PREVIEW_SCALE points */
+#define PRINT_PREVIEW_SCALE 4
+
+/* default dpi to use for printing ps image data */
+#define PRINT_PS_DPI_DEFAULT 300.0
+#define PRINT_PS_DPI_MIN 150.0
+/* method to use when scaling down image data */
+#define PRINT_PS_MAX_INTERP GDK_INTERP_BILINEAR
+
+/* padding between objects */
+#define PRINT_TEXT_PADDING 3.0
+
+/* locale for postscript portability */
+#define POSTSCRIPT_LOCALE "C"
+
+
+/* group and keys for saving prefs */
+#define PRINT_PREF_GROUP       "print_settings"
+
+#define PRINT_PREF_SAVE                "save_settings"
+
+#define PRINT_PREF_OUTPUT      "output"
+#define PRINT_PREF_FORMAT      "format"
+#define PRINT_PREF_DPI         "dpi"
+#define PRINT_PREF_UNITS       "units"
+#define PRINT_PREF_SIZE                "size"
+#define PRINT_PREF_ORIENTATION "orientation"
+
+#define PRINT_PREF_CUSTOM_WIDTH                "custom_width"
+#define PRINT_PREF_CUSTOM_HEIGHT       "custom_height"
+#define PRINT_PREF_MARGIN_LEFT         "margin_left"
+#define PRINT_PREF_MARGIN_RIGHT                "margin_right"
+#define PRINT_PREF_MARGIN_TOP          "margin_top"
+#define PRINT_PREF_MARGIN_BOTTOM       "margin_bottom"
+#define PRINT_PREF_PROOF_WIDTH         "proof_width"
+#define PRINT_PREF_PROOF_HEIGHT                "proof_height"
+
+#define PRINT_PREF_PRINTERC    "custom_printer"
+
+
+typedef enum {
+       PRINT_SOURCE_IMAGE = 0,
+       PRINT_SOURCE_SELECTION,
+       PRINT_SOURCE_ALL,
+       PRINT_SOURCE_COUNT
+} PrintSource;
+
+const gchar *print_source_text[] = {
+       N_("Image"),
+       N_("Selection"),
+       N_("All"),
+       NULL
+};
+
+typedef enum {
+       PRINT_LAYOUT_IMAGE = 0,
+       PRINT_LAYOUT_PROOF,
+       PRINT_LAYOUT_COUNT
+} PrintLayout;
+
+const gchar *print_layout_text[] = {
+       N_("One image per page"),
+       N_("Proof sheet"),
+       NULL
+};
+
+typedef enum {
+       PRINT_OUTPUT_PS_LPR = 0,
+       PRINT_OUTPUT_PS_CUSTOM,
+       PRINT_OUTPUT_PS_FILE,
+       PRINT_OUTPUT_RGB_FILE,
+       PRINT_OUTPUT_COUNT
+} PrintOutput;
+
+const gchar *print_output_text[] = {
+       N_("Default printer"),
+       N_("Custom printer"),
+       N_("PostScript file"),
+       N_("Image file"),
+       NULL,
+       NULL
+};
+
+typedef enum {
+       PRINT_FILE_JPG_LOW = 0,
+       PRINT_FILE_JPG_NORMAL,
+       PRINT_FILE_JPG_HIGH,
+       PRINT_FILE_PNG,
+       PRINT_FILE_COUNT
+} PrintFileFormat;
+
+const gchar *print_file_format_text[] = {
+       N_("jpeg, low quality"),
+       N_("jpeg, normal quality"),
+       N_("jpeg, high quality"),
+       "png",
+       NULL
+};
+
+typedef enum {
+       RENDER_FORMAT_PREVIEW,
+       RENDER_FORMAT_RGB,
+       RENDER_FORMAT_PS
+} RenderFormat;
+
+typedef enum {
+       TEXT_INFO_FILENAME = 1 << 0,
+       TEXT_INFO_FILEDATE = 1 << 1,
+       TEXT_INFO_FILESIZE = 1 << 2,
+       TEXT_INFO_DIMENSIONS = 1 << 3
+} TextInfo;
+
+typedef struct _PrintWindow PrintWindow;
+struct _PrintWindow
+{
+       GenericDialog *dialog;
+
+       gchar *source_path;
+       GList *source_selection;
+       GList *source_list;
+
+       PrintSource source;
+       PrintLayout layout;
+       PrintOutput output;
+
+       gchar *output_path;
+       gchar *output_custom;
+
+       PrintFileFormat output_format;
+
+       gdouble max_dpi;
+
+       GtkWidget *notebook;
+
+       GtkWidget *path_entry;
+       GtkWidget *custom_entry;
+       GtkWidget *path_format_menu;
+       GtkWidget *max_dpi_menu;
+
+       ImageWindow *layout_image;
+       gdouble layout_width;
+       gdouble layout_height;
+
+       gint layout_idle_id;
+
+       gint image_scale;
+
+       GtkWidget *image_scale_spin;
+
+       gdouble proof_width;
+       gdouble proof_height;
+       gint proof_columns;
+       gint proof_rows;
+       GList *proof_point;
+       gint proof_position;
+       gint proof_page;
+
+       GtkWidget *proof_group;
+       GtkWidget *proof_width_spin;
+       GtkWidget *proof_height_spin;
+
+       GtkWidget *paper_menu;
+       GtkWidget *paper_width_spin;
+       GtkWidget *paper_height_spin;
+       GtkWidget *paper_units_menu;
+       GtkWidget *paper_orientation_menu;
+
+       GtkWidget *margin_left_spin;
+       GtkWidget *margin_right_spin;
+       GtkWidget *margin_top_spin;
+       GtkWidget *margin_bottom_spin;
+
+       gint paper_units;
+       gint paper_size;
+       gdouble paper_width;
+       gdouble paper_height;
+       gint paper_orientation;
+
+       gdouble margin_left;
+       gdouble margin_right;
+       gdouble margin_top;
+       gdouble margin_bottom;
+
+       GtkWidget *button_back;
+       GtkWidget *button_next;
+       GtkWidget *page_label;
+       GtkWidget *print_button;
+
+       gdouble single_scale;
+       gdouble single_x;
+       gdouble single_y;
+
+       GtkWidget *single_scale_spin;
+
+       TextInfo        text_fields;
+       gint            text_points;
+       guint8          text_r;
+       guint8          text_g;
+       guint8          text_b;
+
+       gint save_settings;
+
+       /* job printing */
+
+       GenericDialog   *job_dialog;
+       GtkWidget       *job_progress;
+       GtkWidget       *job_progress_label;
+
+       RenderFormat     job_format;
+       PrintOutput      job_output;
+
+       FILE            *job_file;
+       FILE            *job_pipe;
+       gchar           *job_path;
+
+       GdkPixbuf       *job_pixbuf;
+
+       gint             job_page;
+       ImageLoader     *job_loader;
+};
+
+
+static void print_job_throw_error(PrintWindow *pw, const gchar *message);
+static gint print_job_start(PrintWindow *pw, RenderFormat format, PrintOutput output);
+static void print_job_close(PrintWindow *pw, gint error);
+static void print_window_close(PrintWindow *pw);
+
+
+/* misc utils */
+
+static gint clip_region(gdouble x1, gdouble y1, gdouble w1, gdouble h1,
+                       gdouble x2, gdouble y2, gdouble w2, gdouble h2,
+                       gdouble *rx, gdouble *ry, gdouble *rw, gdouble *rh)
+{
+       if (x2 + w2 <= x1 || x2 >= x1 + w1 ||
+           y2 + h2 <= y1 || y2 >= y1 + h1)
+               {
+               return FALSE;
+               }
+
+       *rx = MAX(x1, x2);
+       *rw = MIN((x1 + w1), (x2 + w2)) - *rx;
+
+       *ry = MAX(y1, y2);
+       *rh = MIN((y1 + h1), (y2 + h2)) - *ry;
+
+       return TRUE;
+}
+
+static const gchar *print_output_name(PrintOutput output)
+{
+       if (output < 0 || output >= PRINT_OUTPUT_COUNT) return "";
+
+       return _(print_output_text[output]);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * data
+ *-----------------------------------------------------------------------------
+ */
+
+
+typedef enum {
+       PAPER_UNIT_POINTS = 0,
+       PAPER_UNIT_MM,
+       PAPER_UNIT_CM,
+       PAPER_UNIT_INCH,
+       PAPER_UNIT_PICAS,
+       PAPER_UNIT_COUNT
+} PaperUnits;
+
+typedef enum {
+       PAPER_ORIENTATION_PORTRAIT = 0,
+       PAPER_ORIENTATION_LANDSCAPE,
+       PAPER_ORIENTATION_COUNT
+} PaperOrientation;
+
+typedef struct _PaperSize PaperSize;
+struct _PaperSize {
+       gchar *description;
+       gint width;
+       gint height;
+       PaperOrientation orientation;
+};
+
+const gchar *print_paper_units[] = {
+       N_("points"),
+       N_("millimeters"),
+       N_("centimeters"),
+       N_("inches"),
+       N_("picas"),
+       NULL
+};
+
+const gchar *print_paper_orientation[] = {
+       N_("Portrait"),
+       N_("Landscape"),
+       NULL
+};
+
+PaperSize print_paper_sizes[] = {
+       { N_("Custom"),         360,    720,    PAPER_ORIENTATION_PORTRAIT },
+       { N_("Letter"),         612,    792,    PAPER_ORIENTATION_PORTRAIT },   /* in 8.5 x 11 */
+       { N_("Legal"),          612,    1008,   PAPER_ORIENTATION_PORTRAIT },   /* in 8.5 x 14 */
+       { N_("Executive"),      522,    756,    PAPER_ORIENTATION_PORTRAIT },   /* in 7.25x 10.5 */
+       { "A0",                 2384,   3370,   PAPER_ORIENTATION_PORTRAIT },   /* mm 841 x 1189 */
+       { "A1",                 1684,   2384,   PAPER_ORIENTATION_PORTRAIT },   /* mm 594 x 841 */
+       { "A2",                 1191,   1684,   PAPER_ORIENTATION_PORTRAIT },   /* mm 420 x 594 */
+       { "A3",                 842,    1191,   PAPER_ORIENTATION_PORTRAIT },   /* mm 297 x 420 */
+       { "A4",                 595,    842,    PAPER_ORIENTATION_PORTRAIT },   /* mm 210 x 297 */
+       { "A5",                 420,    595,    PAPER_ORIENTATION_PORTRAIT },   /* mm 148 x 210 */
+       { "A6",                 298,    420,    PAPER_ORIENTATION_PORTRAIT },   /* mm 105 x 148 */
+       { "B3",                 1001,   1417,   PAPER_ORIENTATION_PORTRAIT },   /* mm 353 x 500 */
+       { "B4",                 709,    1001,   PAPER_ORIENTATION_PORTRAIT },   /* mm 250 x 353 */
+       { "B5",                 499,    709,    PAPER_ORIENTATION_PORTRAIT },   /* mm 176 x 250 */
+       { "B6",                 354,    499,    PAPER_ORIENTATION_PORTRAIT },   /* mm 125 x 176 */
+       { N_("Envelope #10"),   297,    684,    PAPER_ORIENTATION_LANDSCAPE },  /* in 4.125 x 9.5 */
+       { N_("Envelope #9"),    279,    639,    PAPER_ORIENTATION_LANDSCAPE },  /* in 3.875 x 8.875 */
+       { N_("Envelope C4"),    649,    918,    PAPER_ORIENTATION_LANDSCAPE },  /* mm 229 x 324 */
+       { N_("Envelope C5"),    459,    649,    PAPER_ORIENTATION_LANDSCAPE },  /* mm 162 x 229 */
+       { N_("Envelope C6"),    323,    459,    PAPER_ORIENTATION_LANDSCAPE },  /* mm 114 x 162 */
+       { N_("Photo 6x4"),      432,    288,    PAPER_ORIENTATION_PORTRAIT },   /* in 6   x 4 */
+       { N_("Photo 8x10"),     576,    720,    PAPER_ORIENTATION_PORTRAIT },   /* in 8   x 10 */
+       { N_("Postcard"),       284,    419,    PAPER_ORIENTATION_LANDSCAPE },  /* mm 100 x 148 */
+       { N_("Tabloid"),        792,    1224,   PAPER_ORIENTATION_PORTRAIT },   /* in 11  x 17 */
+       { NULL, 0, 0, 0 }
+};
+
+
+static PaperSize *print_paper_size_nth(gint n)
+{
+       PaperSize *ps = NULL;
+       gint i = 0;
+
+       while (i <= n && print_paper_sizes[i].description)
+               {
+               ps = &print_paper_sizes[i];
+               i++;
+               }
+
+       return ps;
+}
+
+static gint print_paper_size_lookup(gint n, gdouble *width, gdouble *height)
+{
+       PaperSize *ps;
+       gdouble w, h;
+
+       ps = print_paper_size_nth(n);
+       if (!ps) return FALSE;
+
+       if (ps->orientation == PAPER_ORIENTATION_PORTRAIT)
+               {
+               w = ps->width;
+               h = ps->height;
+               }
+       else
+               {
+               h = ps->width;
+               w = ps->height;
+               }
+
+       if (width) *width = w;
+       if (height) *height = h;
+
+       return TRUE;
+}
+
+static gdouble print_paper_size_convert_units(gdouble value, PaperUnits src, PaperUnits dst)
+{
+       gdouble ret;
+
+       if (src == dst) return value;
+
+       switch (src)
+               {
+               case PAPER_UNIT_MM:
+                       ret = value / 25.4 * 72.0;
+                       break;
+               case PAPER_UNIT_CM:
+                       ret = value / 2.54 * 72.0;
+                       break;
+               case PAPER_UNIT_INCH:
+                       ret = value * 72.0;
+                       break;
+               case PAPER_UNIT_PICAS:
+                       ret = value * 12.0;
+                       break;
+               case PAPER_UNIT_POINTS:
+               default:
+                       ret = value;
+                       break;
+               }
+
+       switch (dst)
+               {
+               case PAPER_UNIT_MM:
+                       ret = ret / 72.0 * 25.4;
+                       break;
+               case PAPER_UNIT_CM:
+                       ret = ret / 72.0 * 2.54;
+                       break;
+               case PAPER_UNIT_INCH:
+                       ret = ret / 72.0;
+                       break;
+               case PAPER_UNIT_PICAS:
+                       ret = ret / 12.0;
+                       break;
+               case PAPER_UNIT_POINTS:
+               default:
+                       break;
+               }
+
+       return ret;
+}
+
+static PaperUnits paper_unit_default(void)
+{
+       const char *result;
+#if 0
+       /* this is not used because it is not even slightly portable */
+       #include <langinfo.h>
+
+       result = nl_langinfo(_NL_MEASUREMENT_MEASUREMENT);
+       if (result[0] == '2') return PAPER_UNIT_INCH;
+#endif
+
+#ifdef LC_MEASUREMENT
+       result = setlocale(LC_MEASUREMENT, NULL);
+#else
+       result = setlocale(LC_ALL, NULL);
+#endif
+       if (result &&
+           (strstr(result, "_US") || strstr(result, "_PR")) )
+               {
+               return PAPER_UNIT_INCH;
+               }
+
+       return PAPER_UNIT_CM;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * the layout window
+ *-----------------------------------------------------------------------------
+ */
+
+static gint print_layout_page_count(PrintWindow *pw);
+
+
+static gint print_preview_unit(gdouble points)
+{
+       return (int)(points / PRINT_PREVIEW_SCALE);
+}
+
+static void print_proof_size(PrintWindow *pw, gdouble *width, gdouble *height)
+{
+       if (width) *width = pw->proof_width + PRINT_PROOF_MARGIN * 2;
+       if (height)
+               {
+               gdouble h;
+
+               h = pw->proof_height + PRINT_PROOF_MARGIN * 2;
+               if (pw->text_fields != 0) h += PRINT_TEXT_PADDING;
+               if (pw->text_fields & TEXT_INFO_FILENAME) h+= (gdouble)pw->text_points * 1.25;
+               if (pw->text_fields & TEXT_INFO_DIMENSIONS) h+= (gdouble)pw->text_points * 1.25;
+               if (pw->text_fields & TEXT_INFO_FILEDATE) h+= (gdouble)pw->text_points * 1.25;
+               if (pw->text_fields & TEXT_INFO_FILESIZE) h+= (gdouble)pw->text_points * 1.25;
+               *height = h;
+               }
+}
+
+static void print_window_layout_status(PrintWindow *pw)
+{
+       gint total;
+       gchar *buf;
+
+       total = print_layout_page_count(pw);
+       pw->proof_page = CLAMP(pw->proof_page, 0, total - 1);
+
+       buf = g_strdup_printf(_("page %d of %d"), pw->proof_page + 1, (total > 0) ? total : 1);
+       gtk_label_set_text(GTK_LABEL(pw->page_label), buf);
+       g_free(buf);
+
+       gtk_widget_set_sensitive(pw->page_label, (total > 0));
+
+       gtk_widget_set_sensitive(pw->button_back, (pw->proof_page > 0));
+       gtk_widget_set_sensitive(pw->button_next, (pw->proof_page < total - 1));
+
+       gtk_widget_set_sensitive(pw->print_button, total > 0);
+}
+
+static void print_window_layout_render_stop(PrintWindow *pw)
+{
+       if (pw->layout_idle_id != -1)
+               {
+               g_source_remove(pw->layout_idle_id);
+               pw->layout_idle_id = -1;
+               }
+}
+
+static gboolean print_window_layout_render_idle(gpointer data)
+{
+       PrintWindow *pw = data;
+
+       print_job_close(pw, FALSE);
+       print_job_start(pw, RENDER_FORMAT_PREVIEW, 0);
+
+       pw->layout_idle_id = -1;
+       return FALSE;
+}
+
+static void print_window_layout_render(PrintWindow *pw)
+{
+       gdouble proof_w, proof_h;
+
+       print_proof_size(pw, &proof_w, &proof_h);
+       pw->proof_columns = (pw->layout_width - pw->margin_left - pw->margin_right) / proof_w;
+       pw->proof_rows = (pw->layout_height - pw->margin_top - pw->margin_bottom) / proof_h;
+
+       print_window_layout_status(pw);
+
+       if (pw->layout_idle_id == -1)
+               {
+               pw->layout_idle_id = g_idle_add(print_window_layout_render_idle, pw);
+               }
+}
+
+static void print_window_layout_size(PrintWindow *pw)
+{
+       GdkPixbuf *pixbuf;
+       gdouble width;
+       gdouble height;
+       gint sw, sh;
+
+       if (!pw->layout_image) return;
+
+       if (pw->paper_orientation == PAPER_ORIENTATION_LANDSCAPE)
+               {
+               width = pw->paper_height;
+               height = pw->paper_width;
+               }
+       else
+               {
+               width = pw->paper_width;
+               height = pw->paper_height;
+               }
+
+       pw->layout_width = width;
+       pw->layout_height = height;
+
+       sw = print_preview_unit(width);
+       sh = print_preview_unit(height);
+       pixbuf = pw->layout_image->pixbuf;
+       if (!pixbuf ||
+           gdk_pixbuf_get_width(pixbuf) != sw ||
+           gdk_pixbuf_get_height(pixbuf) != sh)
+               {
+               pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, sw, sh);
+               image_change_pixbuf(pw->layout_image, pixbuf, 0.0);
+               g_object_unref(pixbuf);
+               }
+
+       print_window_layout_render(pw);
+       print_window_layout_status(pw);
+}
+
+static gint print_layout_page_count(PrintWindow *pw)
+{
+       gint images;
+       gint images_per_page;
+       gint pages;
+
+       if (pw->layout_width - pw->margin_left - pw->margin_right <= 0.0 ||
+           pw->layout_height - pw->margin_top - pw->margin_bottom <= 0.0)
+               {
+               return 0;
+               }
+
+       switch (pw->source)
+               {
+               case PRINT_SOURCE_ALL:
+                       images = g_list_length(pw->source_list);
+                       break;
+               case PRINT_SOURCE_SELECTION:
+                       images = g_list_length(pw->source_selection);
+                       break;
+               case PRINT_SOURCE_IMAGE:
+               default:
+                       images = (pw->source_path) ? 1 : 0;
+                       break;
+               }
+
+       switch (pw->layout)
+               {
+               case PRINT_LAYOUT_PROOF:
+                       images_per_page = pw->proof_columns * pw->proof_rows;
+                       break;
+               case PRINT_LAYOUT_IMAGE:
+               default:
+                       images_per_page = 1;
+                       break;
+               }
+
+       if (images < 1 || images_per_page < 1) return 0;
+
+       pages = images / images_per_page;
+       if (pages * images_per_page < images) pages++;
+
+       return pages;
+}
+
+static void print_layout_page_step(PrintWindow *pw, gint step)
+{
+       gint max;
+       gint page;
+
+       max = print_layout_page_count(pw);
+       page = pw->proof_page + step;
+
+       if (page >= max) page = max - 1;
+       if (page < 0) page = 0;
+
+       if (page == pw->proof_page) return;
+
+       pw->proof_page = page;
+       print_window_layout_size(pw);
+}
+
+static void print_layout_page_back_cb(GtkWidget *widget, gpointer data)
+{
+       PrintWindow *pw = data;
+
+       print_layout_page_step(pw, -1);
+}
+
+static void print_layout_page_next_cb(GtkWidget *widget, gpointer data)
+{
+       PrintWindow *pw = data;
+
+       print_layout_page_step(pw, 1);
+}
+
+static void print_layout_zoom_in_cb(GtkWidget *widget, gpointer data)
+{
+       PrintWindow *pw = data;
+       image_zoom_adjust(pw->layout_image, 0.25);
+}
+
+static void print_layout_zoom_out_cb(GtkWidget *widget, gpointer data)
+{
+       PrintWindow *pw = data;
+       image_zoom_adjust(pw->layout_image, -0.25);
+}
+
+static void print_layout_zoom_original_cb(GtkWidget *widget, gpointer data)
+{
+       PrintWindow *pw = data;
+       gdouble zoom;
+
+       zoom = image_zoom_get(pw->layout_image);
+       image_zoom_set(pw->layout_image, (zoom == 1.0) ? 0.0 : 1.0);
+}
+
+static GtkWidget *print_window_layout_setup(PrintWindow *pw, GtkWidget *box)
+{
+       GtkWidget *vbox;
+       GtkWidget *hbox;
+       GtkWidget *group;
+       GtkWidget *button;
+
+       vbox = pref_box_new(box, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
+       group = pref_frame_new(vbox, TRUE, _("Preview"), GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
+
+       pw->layout_idle_id = -1;
+
+       pw->layout_image = image_new(FALSE);
+       gtk_widget_set_size_request(pw->layout_image->widget, PRINT_DLG_PREVIEW_WIDTH, PRINT_DLG_PREVIEW_HEIGHT);
+
+       gtk_box_pack_start(GTK_BOX(group), pw->layout_image->widget, TRUE, TRUE, 0);
+       gtk_widget_show(pw->layout_image->widget);
+
+       hbox = pref_box_new(group, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+       pw->button_back = pref_button_new(hbox, GTK_STOCK_GO_BACK, NULL, TRUE,
+                                         G_CALLBACK(print_layout_page_back_cb), pw);
+       pw->button_next = pref_button_new(hbox, GTK_STOCK_GO_FORWARD, NULL, TRUE,
+                                         G_CALLBACK(print_layout_page_next_cb), pw);
+       pw->page_label = pref_label_new(hbox, "");
+
+       button = pref_button_new(NULL, GTK_STOCK_ZOOM_OUT, NULL, TRUE,
+                                G_CALLBACK(print_layout_zoom_out_cb), pw);
+       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+       button = pref_button_new(NULL, GTK_STOCK_ZOOM_IN, NULL, TRUE,
+                                G_CALLBACK(print_layout_zoom_in_cb), pw);
+       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+       button = pref_button_new(NULL, GTK_STOCK_ZOOM_100, NULL, TRUE,
+                                G_CALLBACK(print_layout_zoom_original_cb), pw);
+       gtk_box_pack_end(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       print_window_layout_size(pw);
+
+       return vbox;
+}
+
+static void print_window_spin_set(GtkSpinButton *spin, gpointer block_data,
+                                 gdouble value, gdouble min, gdouble max,
+                                 gdouble step, gdouble page, gint digits)
+{
+       if (block_data) g_signal_handlers_block_matched(G_OBJECT(spin), G_SIGNAL_MATCH_DATA,
+                                                       0, 0, NULL, NULL, block_data);
+       gtk_spin_button_set_digits(spin, digits);
+       gtk_spin_button_set_increments(spin, step, page);
+       gtk_spin_button_set_range(spin, min, max);
+       gtk_spin_button_set_value(spin, value);
+
+       if (block_data) g_signal_handlers_unblock_matched(G_OBJECT(spin), G_SIGNAL_MATCH_DATA,
+                                                         0, 0, NULL, NULL, block_data);
+}
+
+static void print_window_layout_sync_layout(PrintWindow *pw)
+{
+       gtk_widget_set_sensitive(pw->image_scale_spin, (pw->layout == PRINT_LAYOUT_IMAGE));
+       gtk_widget_set_sensitive(pw->proof_group, (pw->layout == PRINT_LAYOUT_PROOF));
+}
+
+static void print_window_layout_sync_paper(PrintWindow *pw)
+{
+       gdouble width, height;
+       gint digits;
+       gdouble step;
+       gdouble page;
+
+       gtk_widget_set_sensitive(pw->paper_width_spin, (pw->paper_size == 0));
+       gtk_widget_set_sensitive(pw->paper_height_spin, (pw->paper_size == 0));
+
+       width = print_paper_size_convert_units((gdouble)pw->paper_width, PAPER_UNIT_POINTS, pw->paper_units);
+       height = print_paper_size_convert_units((gdouble)pw->paper_height, PAPER_UNIT_POINTS, pw->paper_units);
+
+       switch (pw->paper_units)
+               {
+               case PAPER_UNIT_MM:
+                       digits = 1;
+                       step = 1.0;
+                       page = 10.0;
+                       break;
+               case PAPER_UNIT_CM:
+                       digits = 2;
+                       step = 0.5;
+                       page = 1.0;
+                       break;
+               case PAPER_UNIT_INCH:
+                       digits = 3;
+                       step = 0.25;
+                       page = 1.0;
+                       break;
+               case PAPER_UNIT_PICAS:
+                       digits = 2;
+                       step = 1.0;
+                       page = 6.0;
+                       break;
+               case PAPER_UNIT_POINTS:
+               default:
+                       digits = 1;
+                       step = 1.0;
+                       page = 10.0;
+                       break;
+               }
+
+       print_window_spin_set(GTK_SPIN_BUTTON(pw->paper_width_spin), pw, width,
+                             print_paper_size_convert_units(PRINT_MIN_WIDTH, PAPER_UNIT_POINTS, pw->paper_units),
+                             print_paper_size_convert_units(PRINT_MAX_WIDTH, PAPER_UNIT_POINTS, pw->paper_units),
+                             step, page, digits);
+
+       print_window_spin_set(GTK_SPIN_BUTTON(pw->paper_height_spin), pw, height,
+                             print_paper_size_convert_units(PRINT_MIN_HEIGHT, PAPER_UNIT_POINTS, pw->paper_units),
+                             print_paper_size_convert_units(PRINT_MAX_HEIGHT, PAPER_UNIT_POINTS, pw->paper_units),
+                             step, page, digits);
+
+       print_window_spin_set(GTK_SPIN_BUTTON(pw->margin_left_spin), pw,
+                             print_paper_size_convert_units(pw->margin_left, PAPER_UNIT_POINTS, pw->paper_units),
+                             0.0,
+                             print_paper_size_convert_units(PRINT_MAX_WIDTH, PAPER_UNIT_POINTS, pw->paper_units),
+                             step, page, digits);
+
+       print_window_spin_set(GTK_SPIN_BUTTON(pw->margin_right_spin), pw,
+                             print_paper_size_convert_units(pw->margin_right, PAPER_UNIT_POINTS, pw->paper_units),
+                             0.0,
+                             print_paper_size_convert_units(PRINT_MAX_WIDTH, PAPER_UNIT_POINTS, pw->paper_units),
+                             step, page, digits);
+
+       print_window_spin_set(GTK_SPIN_BUTTON(pw->margin_top_spin), pw,
+                             print_paper_size_convert_units(pw->margin_top, PAPER_UNIT_POINTS, pw->paper_units),
+                             0.0,
+                             print_paper_size_convert_units(PRINT_MAX_HEIGHT, PAPER_UNIT_POINTS, pw->paper_units),
+                             step, page, digits);
+
+       print_window_spin_set(GTK_SPIN_BUTTON(pw->margin_bottom_spin), pw,
+                             print_paper_size_convert_units(pw->margin_bottom, PAPER_UNIT_POINTS, pw->paper_units),
+                             0.0,
+                             print_paper_size_convert_units(PRINT_MAX_HEIGHT, PAPER_UNIT_POINTS, pw->paper_units),
+                             step, page, digits);
+
+       print_window_spin_set(GTK_SPIN_BUTTON(pw->proof_width_spin), pw,
+                             print_paper_size_convert_units(pw->proof_width, PAPER_UNIT_POINTS, pw->paper_units),
+                             print_paper_size_convert_units(PRINT_PROOF_MIN_SIZE, PAPER_UNIT_POINTS, pw->paper_units),
+                             print_paper_size_convert_units(PRINT_PROOF_MAX_SIZE, PAPER_UNIT_POINTS, pw->paper_units),
+                             step, page, digits);
+
+       print_window_spin_set(GTK_SPIN_BUTTON(pw->proof_height_spin), pw,
+                             print_paper_size_convert_units(pw->proof_height, PAPER_UNIT_POINTS, pw->paper_units),
+                             print_paper_size_convert_units(PRINT_PROOF_MIN_SIZE, PAPER_UNIT_POINTS, pw->paper_units),
+                             print_paper_size_convert_units(PRINT_PROOF_MAX_SIZE, PAPER_UNIT_POINTS, pw->paper_units),
+                             step, page, digits);
+}
+
+static void print_window_layout_set_size(PrintWindow *pw, gdouble width, gdouble height)
+{
+       pw->paper_width = width;
+       pw->paper_height = height;
+
+       print_window_layout_sync_paper(pw);
+
+       print_window_layout_size(pw);
+}
+
+static void print_window_layout_set_orientation(PrintWindow *pw, PaperOrientation o)
+{
+       if (pw->paper_orientation == o) return;
+
+       pw->paper_orientation = o;
+
+       print_window_layout_size(pw);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * list printers
+ *-----------------------------------------------------------------------------
+ */
+
+static GList *print_window_list_printers(void)
+{
+       FILE *p;
+       GList *list = NULL;
+       gchar buffer[2048];
+
+       p = popen(PRINT_LPR_QUERY, "r");
+       if (!p) return NULL;
+
+       while (fgets(buffer, sizeof(buffer), p) != NULL)
+               {
+               gchar *ptr;
+               gchar *end;
+
+               ptr = buffer;
+               if (strncmp(ptr, "printer ", 8) != 0) continue;
+               if (strstr(ptr, "enabled") == NULL) continue;
+               ptr += 8;
+               end = ptr;
+               while (*end != '\0' && *end != '\n' && *end != ' ' && *end != '\t') end++;
+               *end = '\0';
+               list = g_list_append(list, g_strdup(ptr));
+               if (debug) printf("adding printer: %s\n", ptr);
+               }
+
+       pclose(p);
+
+       return list;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * print ps
+ *-----------------------------------------------------------------------------
+ */
+
+typedef struct _PipeError PipeError;
+struct _PipeError {
+       struct sigaction old_action;
+       sig_atomic_t *error;
+};
+
+static sig_atomic_t pipe_handler_error = FALSE;
+static PipeError *pipe_handler_data = NULL;
+
+static void pipe_handler_sigpipe_cb(int fd)
+{
+       pipe_handler_error = TRUE;
+}
+
+static PipeError *pipe_handler_new(void)
+{
+       struct sigaction new_action;
+       PipeError *pe;
+
+       if (pipe_handler_data)
+               {
+               printf("warning SIGPIPE handler already in use\n");
+               return NULL;
+               }
+
+       pe = g_new0(PipeError, 1);
+
+       pipe_handler_error = FALSE;
+       pe->error = &pipe_handler_error;
+
+       new_action.sa_handler = pipe_handler_sigpipe_cb;
+       sigemptyset (&new_action.sa_mask);
+       new_action.sa_flags = 0;
+
+       /* setup our signal handler */
+       sigaction (SIGPIPE, &new_action, &pe->old_action);
+
+       pipe_handler_data = pe;
+       return pe;
+}
+
+static void pipe_handler_free(PipeError *pe)
+{
+       if (!pe) return;
+       if (pe != pipe_handler_data) printf("warning SIGPIPE handler not closing same data\n");
+
+       /* restore the original signal handler */
+       sigaction (SIGPIPE, &pe->old_action, NULL);
+
+       pipe_handler_data = NULL;
+       g_free(pe);
+}
+
+static gint pipe_handler_check(PipeError *pe)
+{
+       if (!pe) return FALSE;
+       return *pe->error;
+}
+
+static FILE *print_job_ps_fd(PrintWindow *pw)
+{
+       if (pw->job_file) return pw->job_file;
+       if (pw->job_pipe) return pw->job_pipe;
+       return NULL;
+}
+
+static gint print_job_ps_init(PrintWindow *pw)
+{
+       FILE *f;
+       PipeError *pe;
+       const gchar *cmd = NULL;
+       const gchar *path = NULL;
+       gchar *lc_pointer;
+       gint ret;
+
+       if (pw->job_file != NULL || pw->job_pipe != NULL) return FALSE;
+
+       switch (pw->job_output)
+               {
+               case PRINT_OUTPUT_PS_LPR:
+                       cmd = PRINT_LPR_COMMAND;
+                       break;
+               case PRINT_OUTPUT_PS_CUSTOM:
+                       cmd = pw->output_custom;
+                       break;
+               case PRINT_OUTPUT_PS_FILE:
+                       path = pw->output_path;
+                       break;
+               default:
+                       return FALSE;
+                       break;
+               }
+
+       if (cmd)
+               {
+               pw->job_pipe = popen(cmd, "w");
+
+               if (!pw->job_pipe)
+                       {
+                       gchar *buf;
+
+                       buf = g_strdup_printf(_("Unable to open pipe for writing.\n\"%s\""), cmd);
+                       print_job_throw_error(pw, buf);
+                       g_free(buf);
+
+                       return FALSE;
+                       }
+               }
+       else if (path)
+               {
+               gchar *pathl;
+
+               if (isfile(path))
+                       {
+                       gchar *buf;
+
+                       buf = g_strdup_printf(_("A file with name %s already exists."), path);
+                       print_job_throw_error(pw, buf);
+                       g_free(buf);
+
+                       return FALSE;
+                       }
+
+               pathl = path_from_utf8(path);
+               pw->job_file = fopen(pathl, "w");
+               g_free(pathl);
+
+               if (!pw->job_file)
+                       {
+                       gchar *buf;
+
+                       buf = g_strdup_printf(_("Failure writing to file %s"), path);
+                       print_job_throw_error(pw, buf);
+                       g_free(buf);
+
+                       return FALSE;
+                       }
+
+               g_free(pw->job_path);
+               pw->job_path = g_strdup(path);
+               }
+
+       f = print_job_ps_fd(pw);
+       if (!f) return FALSE;
+
+       lc_pointer = g_strdup(setlocale(LC_NUMERIC, NULL));
+       setlocale(LC_NUMERIC, POSTSCRIPT_LOCALE);
+
+       pe = pipe_handler_new();
+
+       /* comments, etc. */
+       fprintf(f, "%%!PS-Adobe-3.0\n");
+       fprintf(f, "%%%%Creator: GQview Version %s\n", VERSION);
+       fprintf(f, "%%%%CreationDate: \n");
+       fprintf(f, "%%%%LanguageLevel 2\n");
+       fprintf(f, "%%%%DocumentMedia: \n");
+       fprintf(f, "%%%%Orientation: %s\n",
+               (pw->paper_orientation == PAPER_ORIENTATION_PORTRAIT) ? "Portrait" : "Landscape");
+       fprintf(f, "%%%%BoundingBox: %f %f %f %f\n",
+               0.0, 0.0, pw->paper_width, pw->paper_height);
+       fprintf(f, "%%%%Pages: %d\n", print_layout_page_count(pw));
+       fprintf(f, "%%%%PageOrder: Ascend\n");
+       fprintf(f, "%%%%Title:\n");
+
+       /* setup page size, coordinates (do we really need this?) */
+#if 0
+       fprintf(f, "<<\n");
+       fprintf(f, "/PageSize [%f %f]\n", pw->layout_width, pw->layout_height);
+       fprintf(f, "/ImagingBBox [%f %f %f %f]\n", /* l b r t */
+               pw->margin_left, pw->margin_bottom,
+               pw->layout_width - pw->margin_right, pw->layout_height - pw->margin_top);
+       fprintf(f, "/Orientation %d\n",
+               (pw->paper_orientation == PAPER_ORIENTATION_PORTRAIT) ? 0 : 1);
+       fprintf(f, ">> setpagedevice\n");
+#endif
+
+       ret = !pipe_handler_check(pe);
+       pipe_handler_free(pe);
+
+       if (lc_pointer)
+               {
+               setlocale(LC_NUMERIC, lc_pointer);
+               g_free(lc_pointer);
+               }
+
+       if (!ret) print_job_throw_error(pw, _("SIGPIPE error writing to printer."));
+
+       return ret;
+}
+
+static gint print_job_ps_page_new(PrintWindow *pw, gint page)
+{
+       FILE *f;
+       PipeError *pe;
+       gchar *lc_pointer;
+       gint ret;
+
+       f= print_job_ps_fd(pw);
+       if (!f) return FALSE;
+
+       lc_pointer = g_strdup(setlocale(LC_NUMERIC, NULL));
+       setlocale(LC_NUMERIC, POSTSCRIPT_LOCALE);
+
+       pe = pipe_handler_new();
+
+       fprintf(f, "%%%% page %d\n", page + 1);
+
+       if (pw->paper_orientation == PAPER_ORIENTATION_LANDSCAPE)
+               {
+               fprintf(f, "/pagelevel save def\n");
+               fprintf(f, "%d 0 translate 90 rotate\n", (gint)pw->layout_height);
+               }
+
+       ret = !pipe_handler_check(pe);
+       pipe_handler_free(pe);
+
+       if (lc_pointer)
+               {
+               setlocale(LC_NUMERIC, lc_pointer);
+               g_free(lc_pointer);
+               }
+
+       if (!ret) print_job_throw_error(pw, _("SIGPIPE error writing to printer."));
+
+       return ret;
+}
+
+static gint print_job_ps_page_done(PrintWindow *pw)
+{
+       FILE *f;
+       PipeError *pe;
+       gchar *lc_pointer;
+       gint ret;
+
+       f = print_job_ps_fd(pw);
+       if (!f) return FALSE;
+
+       lc_pointer = g_strdup(setlocale(LC_NUMERIC, NULL));
+       setlocale(LC_NUMERIC, POSTSCRIPT_LOCALE);
+
+       pe = pipe_handler_new();
+
+       if (pw->paper_orientation == PAPER_ORIENTATION_LANDSCAPE)
+               {
+               fprintf(f, "pagelevel restore\n");
+               }
+
+       fprintf(f, "showpage\n");
+
+       ret = !pipe_handler_check(pe);
+       pipe_handler_free(pe);
+
+       if (lc_pointer)
+               {
+               setlocale(LC_NUMERIC, lc_pointer);
+               g_free(lc_pointer);
+               }
+
+       if (!ret) print_job_throw_error(pw, _("SIGPIPE error writing to printer."));
+
+       return ret;
+}
+
+static void print_job_ps_page_image_pixel(FILE *f, guchar *pix)
+{
+       static gchar hex_digits[] = "0123456789abcdef";
+       gchar text[8];
+       gint i;
+
+       for (i = 0; i < 3; i++)
+               {
+               text[i*2] = hex_digits[pix[i] >> 4];
+               text[i*2+1] = hex_digits[pix[i] & 0xf];
+               }
+       text[6] = '\0';
+
+       fprintf(f, text);
+}                                                                                                                         
+static gint print_job_ps_page_image(PrintWindow *pw, GdkPixbuf *pixbuf,
+                                   gdouble x, gdouble y, gdouble w, gdouble h,
+                                   gdouble offx, gdouble offy)
+{
+       FILE *f;
+       PipeError *pe;
+       gchar *lc_pointer;
+       gint sw, sh;
+       gint bps;
+       gint rowstride;
+       guchar *pix;
+       gint i, j;
+       gint c;
+       guchar *p;
+       gint ret;
+
+       if (!pixbuf) return TRUE;
+
+       f = print_job_ps_fd(pw);
+       if (!f) return FALSE;
+
+       sw = gdk_pixbuf_get_width(pixbuf);
+       sh = gdk_pixbuf_get_height(pixbuf);
+
+       if (pw->max_dpi >= PRINT_PS_DPI_MIN &&
+           sw / pw->max_dpi > w / 72.0)
+               {
+               pixbuf = gdk_pixbuf_scale_simple(pixbuf,
+                                               (gint)(w / 72.0 * pw->max_dpi),
+                                               (gint)(h / 72.0 * pw->max_dpi),
+                                               PRINT_PS_MAX_INTERP);
+               sw = gdk_pixbuf_get_width(pixbuf);
+               sh = gdk_pixbuf_get_height(pixbuf);
+               }
+       else
+               {
+               g_object_ref(G_OBJECT(pixbuf));
+               }
+
+       bps = (gdk_pixbuf_get_has_alpha(pixbuf)) ? 4 : 3;
+       rowstride = gdk_pixbuf_get_rowstride(pixbuf);
+       pix = gdk_pixbuf_get_pixels(pixbuf);
+
+       lc_pointer = g_strdup(setlocale(LC_NUMERIC, NULL));
+       setlocale(LC_NUMERIC, POSTSCRIPT_LOCALE);
+
+       pe = pipe_handler_new();
+
+       fprintf(f, "gsave\n");
+       fprintf(f, "[%f 0 0 %f %f %f] concat\n", w, h, x, pw->layout_height - h - y);
+       fprintf(f, "/buf %d string def\n", sw * 3);
+       fprintf(f, "%d %d %d\n", sw, sh, 8);
+       fprintf(f, "[%d 0 0 -%d 0 %d]\n", sw, sh, sh);
+       fprintf(f, "{ currentfile buf readhexstring pop }\n");
+       fprintf(f, "false %d colorimage\n", 3);
+
+       c = 0;
+       for (j = 0; j < sh; j++)
+               {
+               p = pix + j * rowstride;
+               for (i = 0; i < sw; i++)
+                       {
+                       print_job_ps_page_image_pixel(f, p);
+                       p+=bps;
+                       c++;
+                       if (c > 11)
+                               {
+                               fprintf(f, "\n");
+                               c = 0;
+                               }
+                       }
+               }
+       if (c > 0) fprintf(f, "\n");
+       fprintf(f, "grestore\n");
+
+       ret = !pipe_handler_check(pe);
+       pipe_handler_free(pe);
+
+       if (lc_pointer)
+               {
+               setlocale(LC_NUMERIC, lc_pointer);
+               g_free(lc_pointer);
+               }
+
+       g_object_unref(G_OBJECT(pixbuf));
+
+       if (!ret) print_job_throw_error(pw, _("SIGPIPE error writing to printer."));
+
+       return ret;
+}
+
+static const gchar *ps_text_to_hex_array(FILE *f, const gchar *text, gdouble x, gdouble y)
+{
+       static gchar hex_digits[] = "0123456789abcdef";
+       const gchar *p;
+
+       if (!text) return NULL;
+
+       fprintf(f, "%f %f moveto\n", x, y);
+       fprintf(f, "<");
+
+       /* fixme: convert utf8 to ascii or proper locale string.. */
+
+       p = text;
+       while (*p != '\0' && *p != '\n')
+               {
+               gchar text[3];
+
+               text[0] = hex_digits[*p >> 4];
+               text[1] = hex_digits[*p & 0xf];
+               text[2] = '\0';
+
+               fprintf(f, text);
+
+               p++;
+               }
+
+       fprintf(f, ">\n");
+       fprintf(f, "dup stringwidth pop 2 div neg 0 rmoveto show\n");
+
+       return p;
+}
+
+static void ps_text_parse(FILE *f, const gchar *text, gdouble x, gdouble y, gdouble point_size)
+{
+       const gchar *p;
+
+       if (!text) return;
+
+       fprintf(f, "newpath\n");
+
+       p = text;
+       while (p && *p != '\0')
+               {
+               p = ps_text_to_hex_array(f, p, x, y);
+               if (p && *p == '\n') p++;
+               y -= point_size;
+               }
+
+       fprintf(f, "closepath\n");
+}
+
+static gint print_job_ps_page_text(PrintWindow *pw, const gchar *text, gdouble point_size,
+                                  gdouble x, gdouble y, gdouble width,
+                                  guint8 r, guint8 g, guint8 b)
+{
+       FILE *f;
+       PipeError *pe;
+       gchar *lc_pointer;
+       gint ret;
+
+       if (!text) return TRUE;
+
+       f = print_job_ps_fd(pw);
+       if (!f) return FALSE;
+
+       lc_pointer = g_strdup(setlocale(LC_NUMERIC, NULL));
+       setlocale(LC_NUMERIC, POSTSCRIPT_LOCALE);
+
+       pe = pipe_handler_new();
+
+       fprintf(f, "/Sans findfont\n");
+       fprintf(f, "%f scalefont\n", point_size);
+       fprintf(f, "setfont\n");
+
+       fprintf(f, "%f %f %f setrgbcolor\n", (gdouble)r / 255.0, (gdouble)g / 255.0, (gdouble)b / 255.0);
+       ps_text_parse(f, text, x, pw->layout_height - y - point_size, point_size);
+
+       ret = !pipe_handler_check(pe);
+       pipe_handler_free(pe);
+
+       if (lc_pointer)
+               {
+               setlocale(LC_NUMERIC, lc_pointer);
+               g_free(lc_pointer);
+               }
+
+       if (!ret) print_job_throw_error(pw, _("SIGPIPE error writing to printer."));
+
+       return ret;
+}
+
+static gint print_job_ps_end(PrintWindow *pw)
+{
+       FILE *f;
+       PipeError *pe;
+       gchar *lc_pointer;
+       gint ret;
+
+       f = print_job_ps_fd(pw);
+       if (!f) return FALSE;
+
+       lc_pointer = g_strdup(setlocale(LC_NUMERIC, NULL));
+       setlocale(LC_NUMERIC, POSTSCRIPT_LOCALE);
+
+       pe = pipe_handler_new();
+
+       fprintf(f, "%%%%EOF\n");
+
+       ret = !pipe_handler_check(pe);
+       pipe_handler_free(pe);
+
+       if (lc_pointer)
+               {
+               setlocale(LC_NUMERIC, lc_pointer);
+               g_free(lc_pointer);
+               }
+
+       if (!ret) print_job_throw_error(pw, _("SIGPIPE error writing to printer."));
+
+       return ret;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * print rgb
+ *-----------------------------------------------------------------------------
+ */
+
+static gint print_job_rgb_page_new(PrintWindow *pw, gint page)
+{
+       gint total;
+
+       if (pw->job_pixbuf)
+               {
+               pixbuf_set_rect_fill(pw->job_pixbuf, 0, 0,
+                                    gdk_pixbuf_get_width(pw->job_pixbuf),
+                                    gdk_pixbuf_get_height(pw->job_pixbuf),
+                                    255, 255, 255, 255);
+               }
+
+       g_free(pw->job_path);
+       pw->job_path = NULL;
+
+       total = print_layout_page_count(pw);
+
+       if (!pw->output_path ||
+           page < 0 || page >= total) return FALSE;
+
+       if (total > 1)
+               {
+               const gchar *ext;
+               gchar *base;
+
+               ext = extension_from_path(pw->output_path);
+
+               if (ext)
+                       {
+                       base = g_strndup(pw->output_path, ext - pw->output_path);
+                       }
+               else
+                       {
+                       base = g_strdup(pw->output_path);
+                       ext = "";
+                       }
+               pw->job_path = g_strdup_printf("%s_%03d%s", base, page + 1, ext);
+               g_free(base);
+               }
+       else
+               {
+               pw->job_path = g_strdup(pw->output_path);
+               }
+
+       if (isfile(pw->job_path))
+               {
+               gchar *buf;
+
+               buf = g_strdup_printf(_("A file with name %s already exists."), pw->job_path);
+               print_job_throw_error(pw, buf);
+               g_free(buf);
+
+               g_free(pw->job_path);
+               pw->job_path = NULL;
+               }
+
+       return (pw->job_path != NULL);
+}
+
+static gint print_job_rgb_page_done(PrintWindow *pw)
+{
+       gchar *pathl;
+       gint ret = FALSE;
+
+       if (!pw->job_pixbuf) return FALSE;
+
+       pathl = path_from_utf8(pw->job_path);
+
+       if (pw->output_format == PRINT_FILE_PNG)
+               {
+               ret = pixbuf_to_file_as_png(pw->job_pixbuf, pathl);
+               }
+       else
+               {
+               gint quality = 0;
+
+               switch (pw->output_format)
+                       {
+                       case PRINT_FILE_JPG_LOW:
+                               quality = 65;
+                               break;
+                       case PRINT_FILE_JPG_NORMAL:
+                               quality = 80;
+                               break;
+                       case PRINT_FILE_JPG_HIGH:
+                               quality = 95;
+                               break;
+                       default:
+                               break;
+                       }
+
+               if (quality > 0)
+                       {
+                       ret = pixbuf_to_file_as_jpg(pw->job_pixbuf, pathl, quality);
+                       }
+               }
+
+       g_free(pathl);
+
+       if (!ret)
+               {
+               gchar *buf;
+
+               buf = g_strdup_printf(_("Failure writing to file %s"), pw->job_path);
+               print_job_throw_error(pw, buf);
+               g_free(buf);
+               }
+
+       return ret;
+}
+
+static gint print_job_rgb_page_image(PrintWindow *pw, GdkPixbuf *pixbuf,
+                                    gdouble x, gdouble y, gdouble w, gdouble h,
+                                    gdouble offx, gdouble offy)
+{
+       gdouble sw, sh;
+       gdouble dw, dh;
+       gdouble rx, ry, rw, rh;
+
+       if (!pw->job_pixbuf) return FALSE;
+       if (!pixbuf) return TRUE;
+
+       sw = (gdouble)gdk_pixbuf_get_width(pixbuf);
+       sh = (gdouble)gdk_pixbuf_get_height(pixbuf);
+
+       dw = (gdouble)gdk_pixbuf_get_width(pw->job_pixbuf);
+       dh = (gdouble)gdk_pixbuf_get_height(pw->job_pixbuf);
+
+        if (clip_region(x, y, w, h,
+                        0.0, 0.0, dw, dh,
+                        &rx, &ry, &rw, &rh))
+                {
+               gdk_pixbuf_composite(pixbuf, pw->job_pixbuf, rx, ry, rw, rh,
+                                    x + offx, y + offy,
+                                    w / sw, h / sh,
+                                    (w / sw < 0.01 || h / sh < 0.01) ? GDK_INTERP_NEAREST : GDK_INTERP_BILINEAR, 255);
+               }
+
+       return TRUE;
+}
+
+static gdouble convert_pango_dpi(gdouble points)
+{
+       static gdouble dpi = 0.0;
+
+       if (dpi == 0.0)
+               {
+               GtkSettings *settings;
+               GObjectClass *klass;
+
+               settings = gtk_settings_get_default();
+               klass = G_OBJECT_CLASS(GTK_SETTINGS_GET_CLASS(settings));
+               if (g_object_class_find_property(klass, "gtk-xft-dpi"))
+                       {
+                       int int_dpi;
+                       g_object_get(settings, "gtk-xft-dpi", &int_dpi, NULL);
+                       dpi = (gdouble)int_dpi / PANGO_SCALE;
+                       }
+
+               if (dpi < 25.0)
+                       {
+                       static gint warned = FALSE;
+                       gdouble fallback_dpi = 96.0;
+
+                       if (!warned)
+                               {
+                               if (dpi == 0.0)
+                                       {
+                                       printf("pango dpi unknown, assuming %.0f\n", fallback_dpi);
+                                       }
+                               else
+                                       {
+                                       printf("pango dpi reported as %.0f ignored, assuming %.0f\n", dpi, fallback_dpi);
+                                       }
+                               warned = TRUE;
+                               }
+
+                       dpi = fallback_dpi;
+                       }
+               }
+
+       if (dpi == 0) return points;
+       return points * 72.0 / dpi;
+}
+
+static gint print_job_rgb_page_text(PrintWindow *pw, const gchar *text, gdouble point_size,
+                                   gdouble x, gdouble y, gdouble width,
+                                   guint8 r, guint8 g, guint8 b)
+{
+       PangoLayout *layout;
+       PangoFontDescription *desc;
+       gint lw, lh;
+
+       if (!pw->job_pixbuf) return FALSE;
+
+       layout = gtk_widget_create_pango_layout(pw->dialog->dialog, NULL);
+
+       desc = pango_font_description_new();
+       pango_font_description_set_size(desc, convert_pango_dpi(point_size) * PANGO_SCALE);
+       pango_layout_set_font_description(layout, desc);
+       pango_font_description_free(desc);
+
+       pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER);
+       pango_layout_set_text(layout, text, -1);
+
+       pango_layout_get_pixel_size(layout, &lw, &lh);
+       x = x - (gdouble)lw / 2.0;
+
+       pixbuf_draw_layout(pw->job_pixbuf, layout, pw->dialog->dialog, x, y, r, g, b, 255);
+       g_object_unref(G_OBJECT(layout));
+
+       return TRUE;
+}
+
+static gint print_job_rgb_init(PrintWindow *pw)
+{
+       if (pw->job_pixbuf) g_object_unref(pw->job_pixbuf);
+       pw->job_pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8,
+                                       (gint)pw->layout_width, (gint)pw->layout_height);
+
+       return print_job_rgb_page_new(pw, pw->job_page);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * print preview
+ *-----------------------------------------------------------------------------
+ */
+
+static gint print_job_preview_page_new(PrintWindow *pw, gint page)
+{
+       GdkPixbuf *pixbuf;
+       gint w, h;
+       gint l, r, t, b;
+
+       pixbuf = pw->job_pixbuf;
+       if (!pixbuf) return FALSE;
+
+       w = print_preview_unit(pw->layout_width);
+       h = print_preview_unit(pw->layout_height);
+       l = print_preview_unit(pw->margin_left);
+       r = print_preview_unit(pw->margin_right);
+       t = print_preview_unit(pw->margin_top);
+       b = print_preview_unit(pw->margin_bottom);
+
+       /* fill background */
+       pixbuf_set_rect_fill(pixbuf, 0, 0, w, h,
+                            255, 255, 255, 255);
+
+       /* draw cm or inch grid */
+       if (TRUE)
+               {
+               gdouble i;
+               gdouble grid;
+               PaperUnits units;
+
+               units = (pw->paper_units == PAPER_UNIT_MM ||
+                        pw->paper_units == PAPER_UNIT_CM) ? PAPER_UNIT_CM : PAPER_UNIT_INCH;
+
+               grid = print_paper_size_convert_units(1.0, units, PAPER_UNIT_POINTS);
+               for (i = grid ; i < pw->layout_width; i += grid)
+                       {
+                       pixbuf_draw_rect_fill(pixbuf, print_preview_unit(i), 0, 1, h, 0, 0, 0, 16);
+                       }
+               for (i = grid; i < pw->layout_height; i += grid)
+                       {
+                       pixbuf_draw_rect_fill(pixbuf, 0, print_preview_unit(i), w, 1, 0, 0, 0, 16);
+                       }
+               }
+
+       /* proof sheet grid */
+       if (pw->layout == PRINT_LAYOUT_PROOF)
+               {
+               gdouble i, j;
+               gdouble proof_w, proof_h;
+               gint uw, uh;
+
+               print_proof_size(pw, &proof_w, &proof_h);
+               uw = print_preview_unit(proof_w + PRINT_PREVIEW_SCALE - 0.1);
+               uh = print_preview_unit(proof_h + PRINT_PREVIEW_SCALE - 0.1);
+
+               for (i = 0; i < pw->proof_columns; i++)
+                   for (j = 0; j < pw->proof_rows; j++)
+                       {
+                       gint x, y;
+
+                       x = pw->margin_left + (pw->layout_width - pw->margin_left - pw->margin_right - (pw->proof_columns * proof_w)) / 2 + i * proof_w;
+                       y = pw->margin_top + j * proof_h;
+
+                       pixbuf_draw_rect(pixbuf, print_preview_unit(x), print_preview_unit(y), uw, uh,
+                                        255, 0, 0, 64, 1, 1, 1, 1);
+                       }
+               }
+
+       /* non-printable region (margins) */
+       pixbuf_draw_rect(pixbuf, 0, 0, w, h,
+                        0, 0, 0, 16,
+                        l, r, t, b);
+
+       /* margin lines */
+       pixbuf_draw_rect(pixbuf, l, 0, w - l - r, h,
+                        0, 0, 255, 128,
+                        1, 1, 0, 0);
+       pixbuf_draw_rect(pixbuf, 0, t, w, h - t - b,
+                        0, 0, 255, 128,
+                        0, 0, 1, 1);
+
+       /* border */
+       pixbuf_draw_rect(pixbuf, 0, 0, w, h,
+                        0, 0, 0, 255,
+                        1, 1, 1, 1);
+
+       image_area_changed(pw->layout_image, 0, 0, w, h);
+
+       return TRUE;
+}
+
+static gint print_job_preview_page_done(PrintWindow *pw)
+{
+       return TRUE;
+}
+
+static gint print_job_preview_page_image(PrintWindow *pw, GdkPixbuf *pixbuf,
+                                        gdouble x, gdouble y, gdouble w, gdouble h,
+                                        gdouble offx, gdouble offy)
+{
+       gdouble sw, sh;
+       gdouble dw, dh;
+       gdouble rx, ry, rw, rh;
+
+       if (!pw->job_pixbuf) return FALSE;
+       if (!pixbuf) return TRUE;
+
+       sw = (gdouble)gdk_pixbuf_get_width(pixbuf);
+       sh = (gdouble)gdk_pixbuf_get_height(pixbuf);
+
+       dw = (gdouble)gdk_pixbuf_get_width(pw->job_pixbuf);
+       dh = (gdouble)gdk_pixbuf_get_height(pw->job_pixbuf);
+
+       x = print_preview_unit(x);
+       y = print_preview_unit(y);
+       w = print_preview_unit(w);
+       h = print_preview_unit(h);
+       offx = print_preview_unit(offx);
+       offy = print_preview_unit(offy);
+
+       if (clip_region(x, y, w, h,
+                       0.0, 0.0, dw, dh,
+                       &rx, &ry, &rw, &rh))
+               {
+               gdk_pixbuf_composite(pixbuf, pw->job_pixbuf, rx, ry, rw, rh,
+                                    x + offx, y + offy,
+                                    w / sw, h / sh,
+                                    (w / sw < 0.01 || h / sh < 0.01) ? GDK_INTERP_NEAREST : GDK_INTERP_BILINEAR, 255);
+
+               image_area_changed(pw->layout_image, rx, ry, rw, rh);
+               }
+
+       return TRUE;
+}
+
+static gint print_job_preview_page_text(PrintWindow *pw, const gchar *text, gdouble point_size,
+                                       gdouble x, gdouble y, gdouble width,
+                                       guint8 r, guint8 g, guint8 b)
+{
+       PangoLayout *layout;
+       PangoFontDescription *desc;
+       gint lw, lh;
+       GdkPixbuf *pixbuf;
+
+       if (!pw->job_pixbuf) return FALSE;
+
+       layout = gtk_widget_create_pango_layout(pw->dialog->dialog, NULL);
+
+       desc = pango_font_description_new();
+       pango_font_description_set_size(desc, convert_pango_dpi(point_size) * PANGO_SCALE);
+       pango_layout_set_font_description(layout, desc);
+       pango_font_description_free(desc);
+
+       pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER);
+       pango_layout_set_text(layout, text, -1);
+
+       pango_layout_get_pixel_size(layout, &lw, &lh);
+       x = x - (gdouble)lw / 2.0;
+
+       pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, lw, lh);
+       pixbuf_set_rect_fill(pixbuf, 0, 0, lw, lh, 0, 0, 0, 0);
+       pixbuf_draw_layout(pixbuf, layout, pw->dialog->dialog, 0, 0, r, g, b, 255);
+       g_object_unref(G_OBJECT(layout));
+
+       print_job_preview_page_image(pw, pixbuf, x, y, (gdouble)lw, (gdouble)lh, 0, 0);
+       g_object_unref(pixbuf);
+
+       return TRUE;
+}
+
+static gint print_job_preview_init(PrintWindow *pw)
+{
+       if (pw->job_pixbuf) g_object_unref(pw->job_pixbuf);
+       pw->job_pixbuf = pw->layout_image->pixbuf;
+       g_object_ref(pw->job_pixbuf);
+
+       return print_job_preview_page_new(pw, pw->job_page);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * wrappers
+ *-----------------------------------------------------------------------------
+ */
+
+static gint print_job_page_new(PrintWindow *pw)
+{
+       switch (pw->job_format)
+               {
+               case RENDER_FORMAT_RGB:
+                       return print_job_rgb_page_new(pw, pw->job_page);
+               case RENDER_FORMAT_PS:
+                       return print_job_ps_page_new(pw, pw->job_page);
+               case RENDER_FORMAT_PREVIEW:
+                       return print_job_preview_page_new(pw, pw->job_page);
+               }
+
+       return FALSE;
+}
+
+static gint print_job_page_done(PrintWindow *pw)
+{
+       switch (pw->job_format)
+               {
+               case RENDER_FORMAT_RGB:
+                       return print_job_rgb_page_done(pw);
+               case RENDER_FORMAT_PS:
+                       return print_job_ps_page_done(pw);
+               case RENDER_FORMAT_PREVIEW:
+                       return print_job_preview_page_done(pw);
+               }
+
+       return FALSE;
+}
+
+static gint print_job_page_image(PrintWindow *pw, GdkPixbuf *pixbuf,
+                                gdouble x, gdouble y, gdouble w, gdouble h,
+                                gdouble offx, gdouble offy)
+{
+       gint success = FALSE;
+
+       if (w <= 0.0 || h <= 0.0) return TRUE;
+
+       switch (pw->job_format)
+               {
+               case RENDER_FORMAT_RGB:
+                       success = print_job_rgb_page_image(pw, pixbuf, x, y, w, h, offx, offy);
+                       break;
+               case RENDER_FORMAT_PS:
+                       success = print_job_ps_page_image(pw, pixbuf, x, y, w, h, offx, offy);
+                       break;
+               case RENDER_FORMAT_PREVIEW:
+                       success = print_job_preview_page_image(pw, pixbuf, x, y, w, h, offx, offy);
+                       break;
+               }
+
+       return success;
+}
+
+static gint print_job_page_text(PrintWindow *pw, const gchar *text, gdouble point_size,
+                               gdouble x, gdouble y, gdouble width,
+                               guint8 r, guint8 g, guint8 b)
+{
+       gint success = TRUE;
+
+       if (!text) return TRUE;
+
+       switch (pw->job_format)
+               {
+               case RENDER_FORMAT_RGB:
+                       success = print_job_rgb_page_text(pw, text, point_size, x, y, width, r, g, b);
+                       break;
+               case RENDER_FORMAT_PS:
+                       success = print_job_ps_page_text(pw, text, point_size, x, y, width, r, g, b);
+                       break;
+               case RENDER_FORMAT_PREVIEW:
+                       success = print_job_preview_page_text(pw, text, point_size, x, y, width, r, g, b);
+                       break;
+               }
+
+       return success;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * print ?
+ *-----------------------------------------------------------------------------
+ */
+
+static gint print_job_render_image(PrintWindow *pw);
+static gint print_job_render_proof(PrintWindow *pw);
+
+
+static void print_job_status(PrintWindow *pw)
+{
+       gdouble value;
+       gint page;
+       gint total;
+       gchar *buf;
+
+       if (!pw->job_progress) return;
+
+       page = pw->job_page;
+       total = print_layout_page_count(pw);
+
+       if (pw->layout == PRINT_LAYOUT_PROOF && pw->proof_point)
+               {
+               GList *start;
+
+               start = g_list_first(pw->proof_point);
+               value = (gdouble)g_list_position(start, pw->proof_point) / g_list_length(start);
+               }
+       else
+               {
+               value = (total > 0) ? (gdouble)page / total : 0.0;
+               }
+
+       buf = g_strdup_printf(_("Page %d"), page + 1);
+       gtk_progress_bar_set_text(GTK_PROGRESS_BAR(pw->job_progress), buf);
+       g_free(buf);
+
+       if (pw->job_path && pw->job_progress_label)
+               {
+               gtk_label_set_text(GTK_LABEL(pw->job_progress_label), pw->job_path);
+               }
+
+       gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(pw->job_progress), value);
+}
+
+static void print_job_throw_error(PrintWindow *pw, const gchar *message)
+{
+       GenericDialog *gd;
+       GtkWidget *parent = NULL;
+       GtkWidget *group;
+       GtkWidget *label;
+       gchar *buf;
+
+       if (GTK_WIDGET_VISIBLE(pw->dialog->dialog)) parent = pw->dialog->dialog;
+
+       gd = generic_dialog_new(_("Printing error"), "GQview", "print_warning",
+                               parent, TRUE, NULL, NULL);
+       generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, NULL, TRUE);
+
+       buf = g_strdup_printf(_("An error occured printing to %s."), print_output_name(pw->output));
+       generic_dialog_add_message(gd, GTK_STOCK_DIALOG_ERROR, _("Printing error"), buf);
+       g_free(buf);
+
+       group = pref_group_new(gd->vbox, FALSE, _("Details"), GTK_ORIENTATION_VERTICAL);
+       label = pref_label_new(group, message);
+       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+
+       gtk_widget_show(gd->dialog);
+}
+
+static void print_job_done(PrintWindow *pw)
+{
+       print_job_close(pw, FALSE);
+}
+
+static gint print_job_text_image(PrintWindow *pw, const gchar *path,
+                                gdouble x, gdouble y, gdouble width,
+                                gint sw, gint sh, gint proof)
+{
+       GString *string;
+       gint space = FALSE;
+       gint newline = FALSE;
+       gint ret;
+
+       if (pw->text_fields == 0) return TRUE;
+
+       string = g_string_new("");
+       path = pw->job_loader->path;
+
+       if (pw->text_fields & TEXT_INFO_FILENAME)
+               {
+               g_string_append(string, filename_from_path(path));
+               newline = TRUE;
+               }
+       if (pw->text_fields & TEXT_INFO_DIMENSIONS)
+               {
+               if (newline) g_string_append(string, "\n");
+               g_string_append_printf(string, "%d x %d", (gint)sw, (gint)sh);
+               newline = proof;
+               space = !proof;
+               }
+       if (pw->text_fields & TEXT_INFO_FILEDATE)
+               {
+               if (newline)  g_string_append(string, "\n");
+               if (space) g_string_append(string, " - ");
+               g_string_append(string, text_from_time(filetime(pw->job_loader->path)));
+               newline = proof;
+               space = !proof;
+               }
+       if (pw->text_fields & TEXT_INFO_FILESIZE)
+               {
+               gchar *size;
+
+               if (newline)  g_string_append(string, "\n");
+               if (space) g_string_append(string, " - ");
+               size = text_from_size_abrev(filesize(pw->job_loader->path));
+               g_string_append(string, size);
+               g_free(size);
+               }
+
+       ret = print_job_page_text(pw, string->str, pw->text_points, x, y, width,
+                                 pw->text_r, pw->text_g, pw->text_b);
+
+       g_string_free(string, TRUE);
+
+       return ret;
+}
+
+static void print_job_render_image_loader_done(ImageLoader *il, gpointer data)
+{
+       PrintWindow *pw = data;
+       GdkPixbuf *pixbuf;
+       gint success = TRUE;
+
+       pixbuf = image_loader_get_pixbuf(il);
+       if (pixbuf)
+               {
+               gdouble sw, sh;
+               gdouble dw, dh;
+               gdouble x, y, w, h;
+               gdouble scale;
+               gdouble offx, offy;
+
+               sw = (gdouble)gdk_pixbuf_get_width(pixbuf);
+               sh = (gdouble)gdk_pixbuf_get_height(pixbuf);
+
+               dw = pw->layout_width - pw->margin_left - pw->margin_right;
+               dh = pw->layout_height - pw->margin_top - pw->margin_bottom;
+
+               if (dw / sw < dh / sh)
+                       {
+                       w = dw;
+                       h = dw / sw * sh;
+                       scale = w / sw;
+                       }
+               else
+                       {
+                       h = dh;
+                       w = dh / sh *sw;
+                       scale = h / sh;
+                       }
+
+               if (pw->image_scale >= 5)
+                       {
+                       w = w * (gdouble)pw->image_scale / 100.0;
+                       h = h * (gdouble)pw->image_scale / 100.0;
+                       }
+
+               x = pw->margin_left + (dw / 2) - (w / 2);
+               y = pw->margin_top + (dh / 2) - (h / 2);
+
+               offx = offy = 0;
+
+               if (x < 0)
+                       {
+                       w += x;
+                       offx = x;
+                       x = 0;
+                       }
+               if (x + w >= pw->layout_width) w = pw->layout_width - x;
+
+               if (y < 0)
+                       {
+                       h += y;
+                       offy = y;
+                       y = 0;
+                       }
+               if (y + h >= pw->layout_height) h = pw->layout_height - y;
+
+               success = (success &&
+                          print_job_page_image(pw, pixbuf, x, y, w, h, offx, offy));
+
+               x = x + w / 2;
+               y = y + h + PRINT_TEXT_PADDING;
+
+               success = (success &&
+                          print_job_text_image(pw, pw->job_loader->path, x, y, dw, sw, sh, FALSE));
+               }
+
+       image_loader_free(pw->job_loader);
+       pw->job_loader = NULL;
+
+       if (pw->job_format == RENDER_FORMAT_PREVIEW)
+               {
+               print_job_done(pw);
+               return;
+               }
+
+       success = (success && print_job_page_done(pw));
+       if (!success)
+               {
+               print_job_close(pw, TRUE);
+               return;
+               }
+
+       pw->job_page++;
+       print_job_status(pw);
+
+       if (print_job_render_image(pw))
+               {
+               if (!print_job_page_new(pw)) print_job_close(pw, TRUE);
+               }
+       else
+               {
+               print_job_done(pw);
+               }
+}
+
+static gint print_job_render_image(PrintWindow *pw)
+{
+       gchar *path = NULL;
+
+       switch (pw->source)
+               {
+               case PRINT_SOURCE_SELECTION:
+                       path = g_list_nth_data(pw->source_selection, pw->job_page);
+                       break;
+               case PRINT_SOURCE_ALL:
+                       path = g_list_nth_data(pw->source_list, pw->job_page);
+                       break;
+               case PRINT_SOURCE_IMAGE:
+               default:
+                       if (pw->job_page == 0) path = pw->source_path;
+                       break;
+               }
+
+       image_loader_free(pw->job_loader);
+       pw->job_loader = NULL;
+
+       if (!path) return FALSE;
+
+       pw->job_loader = image_loader_new(path);
+       if (!image_loader_start(pw->job_loader, print_job_render_image_loader_done, pw))
+               {
+               image_loader_free(pw->job_loader);
+               pw->job_loader= NULL;
+               }
+
+       return TRUE;
+}
+
+static void print_job_render_proof_loader_done(ImageLoader *il, gpointer data)
+{
+       PrintWindow *pw = data;
+       GdkPixbuf *pixbuf;
+       gdouble x, y;
+       gdouble w, h;
+       gdouble proof_w, proof_h;
+       gdouble icon_w, icon_h;
+       gdouble scale;
+       gint success = TRUE;
+
+       if (pw->proof_columns < 1 || pw->proof_rows < 1)
+               {
+               image_loader_free(pw->job_loader);
+               pw->job_loader = NULL;
+
+               print_job_done(pw);
+
+               return;
+               }
+
+       pixbuf = image_loader_get_pixbuf(il);
+
+       w = gdk_pixbuf_get_width(pixbuf);
+       h = gdk_pixbuf_get_height(pixbuf);
+
+       if (pw->proof_width / w < pw->proof_height / h)
+               {
+               icon_w = pw->proof_width;
+               icon_h = pw->proof_width / w * h;
+               scale = icon_w / w;
+               }
+       else
+               {
+               icon_h = pw->proof_height;
+               icon_w = pw->proof_height / h * w;
+               scale = icon_h / h;
+               }
+
+       y = pw->proof_position / pw->proof_columns;
+       x = pw->proof_position - (y * pw->proof_columns);
+
+       print_proof_size(pw, &proof_w, &proof_h);
+
+       x *= proof_w;
+       y *= proof_h;
+       x += pw->margin_left + (pw->layout_width - pw->margin_left - pw->margin_right - (pw->proof_columns * proof_w)) / 2 + (proof_w - icon_w) / 2;
+       y += pw->margin_top + PRINT_PROOF_MARGIN + (pw->proof_height - icon_h) / 2;
+
+       success = (success &&
+                  print_job_page_image(pw, pixbuf, x, y, icon_w, icon_h, 0, 0));
+
+       x = x + icon_w / 2;
+       y = y + icon_h + (pw->proof_height - icon_h) / 2 + PRINT_TEXT_PADDING;
+
+       success = (success && 
+                  print_job_text_image(pw, pw->job_loader->path, x, y, icon_w + PRINT_PROOF_MARGIN * 2, w, h, TRUE));
+
+       if (!success)
+               {
+               print_job_close(pw, TRUE);
+               return;
+               }
+
+       if (pw->proof_point) pw->proof_point = pw->proof_point->next;
+
+       pw->proof_position++;
+       if (pw->proof_position >= pw->proof_columns * pw->proof_rows)
+               {
+               if (pw->job_format == RENDER_FORMAT_PREVIEW)
+                       {
+                       print_job_done(pw);
+                       return;
+                       }
+
+               if (!print_job_page_done(pw))
+                       {
+                       print_job_close(pw, TRUE);
+                       return;
+                       }
+
+               pw->proof_position = 0;
+               pw->job_page++;
+               if (print_job_render_proof(pw))
+                       {
+                       if (!print_job_page_new(pw))
+                               {
+                               print_job_close(pw, TRUE);
+                               return;
+                               }
+                       print_job_status(pw);
+                       }
+               else
+                       {
+                       print_job_done(pw);
+                       }
+               }
+       else
+               {
+               if (print_job_render_proof(pw))
+                       {
+                       print_job_status(pw);
+                       }
+               else
+                       {
+                       if (print_job_page_done(pw))
+                               {
+                               print_job_done(pw);
+                               }
+                       else
+                               {
+                               print_job_close(pw, TRUE);
+                               }
+                       }
+               }
+}
+
+static gint print_job_render_proof(PrintWindow *pw)
+{
+       gchar *path = NULL;
+
+       if (pw->proof_columns < 1 || pw->proof_rows < 1) return FALSE;
+
+       if (!pw->proof_point && pw->proof_position == 0 && pw->source == PRINT_SOURCE_IMAGE)
+               {
+               path = pw->source_path;
+               }
+       else if (pw->proof_point &&
+                pw->proof_position < pw->proof_columns * pw->proof_rows)
+               {
+               path = pw->proof_point->data;
+               }
+
+       if (!path) return FALSE;
+
+       image_loader_free(pw->job_loader);
+       pw->job_loader = image_loader_new(path);
+       if (!image_loader_start(pw->job_loader, print_job_render_proof_loader_done, pw))
+               {
+               image_loader_free(pw->job_loader);
+               pw->job_loader = NULL;
+               }
+
+       return TRUE;
+}
+
+static void print_job_render(PrintWindow *pw)
+{
+       gdouble proof_w, proof_h;
+       gint finished;
+
+       pw->proof_position = 0;
+
+       switch (pw->source)
+               {
+               case PRINT_SOURCE_SELECTION:
+                       pw->proof_point = pw->source_selection;
+                       break;
+               case PRINT_SOURCE_ALL:
+                       pw->proof_point = pw->source_list;
+                       break;
+               case PRINT_SOURCE_IMAGE:
+               default:
+                       pw->proof_point = NULL;
+                       break;
+               }
+
+       print_proof_size(pw, &proof_w, &proof_h);
+       pw->proof_columns = (pw->layout_width - pw->margin_left - pw->margin_right) / proof_w;
+       pw->proof_rows = (pw->layout_height - pw->margin_top - pw->margin_bottom) / proof_h;
+
+       if (pw->job_format == RENDER_FORMAT_PREVIEW)
+               {
+               gint total;
+
+               total = print_layout_page_count(pw);
+               if (pw->job_page < 0 || pw->job_page >= total)
+                       {
+                       print_job_done(pw);
+                       return;
+                       }
+
+               if (pw->proof_point && pw->job_page > 0)
+                       {
+                       pw->proof_point = g_list_nth(pw->proof_point, pw->job_page * pw->proof_columns * pw->proof_rows);
+                       }
+               }
+
+       if (!print_job_page_new(pw))
+               {
+               print_job_close(pw, TRUE);
+               return;
+               }
+
+       if (pw->layout == PRINT_LAYOUT_IMAGE)
+               {
+               finished = !print_job_render_image(pw);
+               }
+       else
+               {
+               finished = !print_job_render_proof(pw);
+               }
+
+       if (finished) print_job_done(pw);
+}
+
+static gint print_job_init(PrintWindow *pw)
+{
+       gint success = FALSE;
+
+       pw->job_page = 0;
+
+       switch (pw->job_format)
+               {
+               case RENDER_FORMAT_RGB:
+                       success = print_job_rgb_init(pw);
+                       break;
+               case RENDER_FORMAT_PS:
+                       success = print_job_ps_init(pw);
+                       break;
+               case RENDER_FORMAT_PREVIEW:
+                       pw->job_page = pw->proof_page;
+                       success = print_job_preview_init(pw);
+                       break;
+               }
+
+       return success;
+}
+
+static gint print_job_finish(PrintWindow *pw)
+{
+       gint success = FALSE;
+
+       switch (pw->job_format)
+               {
+               case RENDER_FORMAT_RGB:
+                       success = TRUE;
+                       break;
+               case RENDER_FORMAT_PS:
+                       print_job_ps_end(pw);
+                       break;
+               case RENDER_FORMAT_PREVIEW:
+                       success = TRUE;
+                       break;
+               }
+
+       return success;
+}
+
+static void print_job_close_file(PrintWindow *pw)
+{
+       if (pw->job_file)
+               {
+               fclose(pw->job_file);
+               pw->job_file = NULL;
+               }
+
+       if (pw->job_pipe)
+               {
+               PipeError *pe;
+
+               pe = pipe_handler_new();
+               pclose(pw->job_pipe);
+               pipe_handler_free(pe);
+
+               pw->job_pipe = NULL;
+               }
+}
+
+static gboolean print_job_close_finish_cb(gpointer data)
+{
+       PrintWindow *pw = data;
+
+       print_window_close(pw);
+       return FALSE;
+}
+
+static void print_job_close(PrintWindow *pw, gint error)
+{
+       if (!error) print_job_finish(pw);
+
+       print_job_close_file(pw);
+       g_free(pw->job_path);
+       pw->job_path = NULL;
+
+       if (pw->job_dialog)
+               {
+               generic_dialog_close(pw->job_dialog);
+               pw->job_dialog = NULL;
+               pw->job_progress = NULL;
+               }
+
+       image_loader_free(pw->job_loader);
+       pw->job_loader = NULL;
+
+       if (pw->job_pixbuf)
+               {
+               g_object_unref(pw->job_pixbuf);
+               pw->job_pixbuf = NULL;
+               }
+
+       if (pw->dialog && !GTK_WIDGET_VISIBLE(pw->dialog->dialog))
+               {
+               g_idle_add_full(G_PRIORITY_HIGH_IDLE, print_job_close_finish_cb, pw, NULL);
+               }
+}
+
+static void print_job_cancel_cb(GenericDialog *gd, gpointer data)
+{
+       PrintWindow *pw = data;
+
+       print_job_close(pw, FALSE);
+}
+
+static void print_pref_store(PrintWindow *pw)
+{
+
+       pref_list_int_set(PRINT_PREF_GROUP, PRINT_PREF_SAVE, pw->save_settings);
+
+       if (!pw->save_settings) return;
+
+       /* only store values that are actually used in this print job, hence the if()s */
+
+       pref_list_int_set(PRINT_PREF_GROUP, PRINT_PREF_OUTPUT, pw->output);
+
+       if (pw->output == PRINT_OUTPUT_RGB_FILE)
+               {
+               pref_list_int_set(PRINT_PREF_GROUP, PRINT_PREF_FORMAT, pw->output_format);
+               }
+
+       if (pw->job_format == RENDER_FORMAT_PS)
+               {
+               pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_DPI, pw->max_dpi);
+               }
+
+       pref_list_int_set(PRINT_PREF_GROUP, PRINT_PREF_UNITS, pw->paper_units);
+       pref_list_int_set(PRINT_PREF_GROUP, PRINT_PREF_SIZE, pw->paper_size);
+       pref_list_int_set(PRINT_PREF_GROUP, PRINT_PREF_ORIENTATION, pw->paper_orientation);
+
+       if (pw->paper_size == 0)
+               {
+               pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_CUSTOM_WIDTH, pw->paper_width);
+               pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_CUSTOM_HEIGHT, pw->paper_height);
+               }
+
+       pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_MARGIN_LEFT, pw->margin_left);
+       pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_MARGIN_RIGHT, pw->margin_right);
+       pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_MARGIN_TOP, pw->margin_top);
+       pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_MARGIN_BOTTOM, pw->margin_bottom);
+
+       if (pw->layout == PRINT_LAYOUT_PROOF)
+               {
+               pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_PROOF_WIDTH, pw->proof_width);
+               pref_list_double_set(PRINT_PREF_GROUP, PRINT_PREF_PROOF_HEIGHT, pw->proof_height);
+               }
+
+       if (pw->output == PRINT_OUTPUT_PS_CUSTOM)
+               {
+               pref_list_string_set(PRINT_PREF_GROUP, PRINT_PREF_PRINTERC, pw->output_custom);
+               }
+
+       if (pw->output == PRINT_OUTPUT_RGB_FILE ||
+           pw->output == PRINT_OUTPUT_PS_FILE)
+               {
+               tab_completion_append_to_history(pw->path_entry, pw->output_path);
+               }
+}
+
+static gint print_job_start(PrintWindow *pw, RenderFormat format, PrintOutput output)
+{
+       GtkWidget *hbox;
+       GtkWidget *spinner;
+       gchar *msg;
+
+       if (pw->job_dialog) return FALSE;
+
+       pw->job_format = format;
+       pw->job_output = output;
+
+       if (!print_job_init(pw))
+               {
+               print_job_close(pw, TRUE);
+               return FALSE;
+               }
+
+       if (format == RENDER_FORMAT_PREVIEW)
+               {
+               print_job_render(pw);
+               return TRUE;
+               }
+
+       print_pref_store(pw);
+
+       gtk_widget_hide(pw->dialog->dialog);
+
+       pw->job_dialog = file_util_gen_dlg(_("Print - GQview"), "gqview", "print_job_dialog",
+                                          (GtkWidget *)gtk_window_get_transient_for(GTK_WINDOW(pw->dialog->dialog)), FALSE,
+                                          print_job_cancel_cb, pw);
+
+       msg = g_strdup_printf(_("Printing %d pages to %s."), print_layout_page_count(pw), print_output_name(pw->output));
+       generic_dialog_add_message(pw->job_dialog, NULL, msg, NULL);
+       g_free(msg);
+
+       if (pw->job_output == PRINT_OUTPUT_PS_FILE ||
+           pw->job_output == PRINT_OUTPUT_RGB_FILE)
+               {
+               hbox = pref_box_new(pw->job_dialog->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+               pref_label_new(hbox, _("Filename:"));
+
+               pw->job_progress_label = pref_label_new(hbox, "");
+               }
+       else
+               {
+               pw->job_progress_label = NULL;
+               }
+
+       pref_spacer(pw->job_dialog->vbox, PREF_PAD_SPACE);
+
+       hbox = pref_box_new(pw->job_dialog->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+
+       pw->job_progress = gtk_progress_bar_new();
+       gtk_box_pack_start(GTK_BOX(hbox), pw->job_progress, TRUE, TRUE, 0);
+       gtk_widget_show(pw->job_progress);
+
+       spinner = spinner_new(NULL, SPINNER_SPEED);
+       gtk_box_pack_start(GTK_BOX(hbox), spinner, FALSE, FALSE, 0);
+       gtk_widget_show(spinner);
+
+       gtk_widget_show(pw->job_dialog->dialog);
+
+       print_job_render(pw);
+       print_job_status(pw);
+
+       return TRUE;
+}
+
+static void print_window_print_start(PrintWindow *pw)
+{
+       RenderFormat format;
+
+       switch(pw->output)
+               {
+               case PRINT_OUTPUT_RGB_FILE:
+                       format = RENDER_FORMAT_RGB;
+                       break;
+               case PRINT_OUTPUT_PS_FILE:
+               case PRINT_OUTPUT_PS_CUSTOM:
+               case PRINT_OUTPUT_PS_LPR:
+               default:
+                       format = RENDER_FORMAT_PS;
+                       break;
+               }
+
+       print_job_start(pw, format, pw->output);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * combo box util
+ *-----------------------------------------------------------------------------
+ */
+
+static GtkWidget *print_combo_menu(const gchar *text[], gint count, gint preferred,
+                                  GCallback func, gpointer data)
+{
+       GtkWidget *combo;
+       gint i;
+
+       combo = gtk_combo_box_new_text();
+
+       for (i = 0 ; i < count; i++)
+               {
+               gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _(text[i]));
+               }
+
+       if (preferred >= 0 && preferred < count)
+               {
+               gtk_combo_box_set_active(GTK_COMBO_BOX(combo), preferred);
+               }
+
+       if (func) g_signal_connect(G_OBJECT(combo), "changed", func, data);
+
+       return combo;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * paper selection
+ *-----------------------------------------------------------------------------
+ */
+
+static GtkWidget *print_paper_menu(GtkWidget *table, gint column, gint row,
+                                  gint preferred, GCallback func, gpointer data)
+{
+       GtkWidget *combo;
+       gint i;
+
+       pref_table_label(table, column, row, (_("Format:")), 1.0);
+
+       combo = gtk_combo_box_new_text();
+
+       i = 0;
+       while (print_paper_sizes[i].description)
+               {
+               gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _(print_paper_sizes[i].description));
+               i++;
+               }
+
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), preferred);
+       if (func) g_signal_connect(G_OBJECT(combo), "changed", func, data);
+
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1,
+                        GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+       gtk_widget_show(combo);
+
+       return combo;
+}
+
+static void print_paper_select_cb(GtkWidget *combo, gpointer data)
+{
+       PrintWindow *pw = data;
+       PaperSize *ps;
+       gint n;
+
+       n = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
+       ps = print_paper_size_nth(n);
+
+       if (!ps) return;
+
+       pw->paper_size = n;
+
+       if (pw->paper_size == 0)
+               {
+               print_window_layout_sync_paper(pw);
+               return;
+               }
+
+       if (ps->orientation == PAPER_ORIENTATION_PORTRAIT)
+               {
+               print_window_layout_set_size(pw, ps->width, ps->height);
+               }
+       else
+               {
+               print_window_layout_set_size(pw, ps->height, ps->width);
+               }
+}
+
+static void print_paper_size_cb(GtkWidget *spin, gpointer data)
+{
+       PrintWindow *pw = data;
+       gdouble value;
+
+       value = print_paper_size_convert_units(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)),
+                                              pw->paper_units, PAPER_UNIT_POINTS);
+
+       if (spin == pw->paper_width_spin)
+               {
+               pw->paper_width = value;
+               }
+       else
+               {
+               pw->paper_height = value;
+               }
+
+       print_window_layout_set_size(pw, pw->paper_width, pw->paper_height);
+}
+
+static GtkWidget *print_paper_units_menu(GtkWidget *table, gint column, gint row,
+                                        PaperUnits units, GCallback func, gpointer data)
+{
+       GtkWidget *combo;
+
+       pref_table_label(table, column, row, (_("Units:")), 1.0);
+
+       combo = print_combo_menu(print_paper_units, PAPER_UNIT_COUNT, units, func, data);
+
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1,
+                        GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+       gtk_widget_show(combo);
+
+       return combo;
+}
+
+static void print_paper_units_set(PrintWindow *pw, PaperUnits units)
+{
+       PaperUnits old_units;
+
+       if (units < 0 || units >= PAPER_UNIT_COUNT) return;
+
+       old_units = pw->paper_units;
+       pw->paper_units = units;
+       print_window_layout_sync_paper(pw);
+
+       if ((units == PAPER_UNIT_MM || units == PAPER_UNIT_CM) !=
+           (old_units == PAPER_UNIT_MM || old_units == PAPER_UNIT_CM))
+               {
+               print_window_layout_render(pw);
+               }
+}
+
+static void print_paper_units_cb(GtkWidget *combo, gpointer data)
+{
+       PrintWindow *pw = data;
+       PaperUnits units;
+
+       units = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
+
+       print_paper_units_set(pw, units);
+}
+
+static GtkWidget *print_paper_orientation_menu(GtkWidget *table, gint column, gint row,
+                                              PaperOrientation preferred,
+                                              GCallback func, gpointer data)
+{
+       GtkWidget *combo;
+
+       pref_table_label(table, column, row, (_("Orientation:")), 1.0);
+
+       combo = print_combo_menu(print_paper_orientation, PAPER_ORIENTATION_COUNT, preferred, func, data);
+
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1,
+                        GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+       gtk_widget_show(combo);
+
+       return combo;
+}
+
+static void print_paper_orientation_cb(GtkWidget *combo, gpointer data)
+{
+       PrintWindow *pw = data;
+       PaperOrientation o;
+
+       o = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
+
+       print_window_layout_set_orientation(pw, o);
+}
+
+static void print_paper_margin_cb(GtkWidget *spin, gpointer data)
+{
+       PrintWindow *pw = data;
+       gdouble value;
+
+       value = print_paper_size_convert_units(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)),
+                                              pw->paper_units, PAPER_UNIT_POINTS);
+
+       if (spin == pw->margin_left_spin)
+               {
+               pw->margin_left = CLAMP(value, 0.0, pw->paper_width);
+               }
+       else if (spin == pw->margin_right_spin)
+               {
+               pw->margin_right = CLAMP(value, 0.0, pw->paper_width);
+               }
+       else if (spin == pw->margin_top_spin)
+               {
+               pw->margin_top = CLAMP(value, 0.0, pw->paper_height);
+               }
+       else if (spin == pw->margin_bottom_spin)
+               {
+               pw->margin_bottom = CLAMP(value, 0.0, pw->paper_height);
+               }
+
+       print_window_layout_set_size(pw, pw->paper_width, pw->paper_height);
+}
+
+static GtkWidget *print_misc_menu(GtkWidget *parent_box, gint preferred,
+                                 const gchar *title, const gchar *key,
+                                 gint count, const gchar **text,
+                                 GCallback func, gpointer data)
+{
+       GtkWidget *box;
+       GtkWidget *button = NULL;
+       gint i;
+
+       box = pref_group_new(parent_box, FALSE, title, GTK_ORIENTATION_VERTICAL);
+
+       for (i = 0; i < count; i++)
+               {
+               button = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(button), _(text[i]));
+               if (i == preferred)
+                       {
+                       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+                       }
+               g_object_set_data(G_OBJECT(button), key, GINT_TO_POINTER(i));
+               if (func) g_signal_connect(G_OBJECT(button), "clicked", func, data);
+               gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
+               gtk_widget_show(button);
+               }
+
+       return box;
+}
+
+static void print_source_select_cb(GtkWidget *widget, gpointer data)
+{
+       PrintWindow *pw = data;
+
+       if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) return;
+
+       pw->source = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "print_source"));
+       print_window_layout_size(pw);
+}
+
+static void print_layout_select_cb(GtkWidget *widget, gpointer data)
+{
+       PrintWindow *pw = data;
+
+       if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) return;
+
+       pw->layout = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "print_layout"));
+
+       print_window_layout_sync_layout(pw);
+       print_window_layout_size(pw);
+}
+
+static void print_image_scale_cb(GtkWidget *spin, gpointer data)
+{
+       PrintWindow *pw = data;
+
+       pw->image_scale = (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin));
+
+       print_window_layout_set_size(pw, pw->paper_width, pw->paper_height);
+}
+
+static void print_proof_size_cb(GtkWidget *spin, gpointer data)
+{
+       PrintWindow *pw = data;
+       gdouble value;
+
+       value = print_paper_size_convert_units(gtk_spin_button_get_value(GTK_SPIN_BUTTON(spin)),
+                                              pw->paper_units, PAPER_UNIT_POINTS);
+
+       if (spin == pw->proof_width_spin)
+               {
+               pw->proof_width = value;
+               }
+       else
+               {
+               pw->proof_height = value;
+               }
+
+       print_window_layout_render(pw);
+}
+
+static GtkWidget *print_output_menu(GtkWidget *table, gint column, gint row,
+                                   PrintOutput preferred, GCallback func, gpointer data)
+{
+       GtkWidget *combo;
+
+       pref_table_label(table, column, row, (_("Destination:")), 1.0);
+
+       combo = print_combo_menu(print_output_text, PRINT_OUTPUT_COUNT, preferred, func, data);
+
+       gtk_table_attach(GTK_TABLE(table), combo, column + 1, column + 2, row, row + 1,
+                        GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+       gtk_widget_show(combo);
+
+       return combo;
+}
+
+static void print_custom_entry_set(PrintWindow *pw, GtkWidget *combo)
+{
+       GtkListStore *store;
+       const gchar *text;
+       GList *list;
+       GList *work;
+
+       store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(combo)));
+       gtk_list_store_clear(store);
+
+       list = print_window_list_printers();
+       work = list;
+       while (work)
+               {
+               gchar *name;
+               gchar *buf;
+
+               name = work->data;
+               work = work->next;
+
+               buf = g_strdup_printf(PRINT_LPR_CUSTOM, name);
+               gtk_combo_box_append_text(GTK_COMBO_BOX(combo), buf);
+               g_free(buf);
+               }
+       path_list_free(list);
+
+       if (pref_list_string_get(PRINT_PREF_GROUP, PRINT_PREF_PRINTERC, &text))
+               {
+               gtk_entry_set_text(GTK_ENTRY(pw->custom_entry), text);
+               }
+       else
+               {
+               text = gtk_entry_get_text(GTK_ENTRY(pw->custom_entry));
+               if (!text || strlen(text) == 0)
+                       {
+                       gchar *buf;
+
+                       buf = g_strdup_printf(PRINT_LPR_CUSTOM, _("<printer name>"));
+                       gtk_entry_set_text(GTK_ENTRY(pw->custom_entry), buf);
+                       g_free(buf);
+                       }
+               }
+}
+
+static void print_output_set(PrintWindow *pw, PrintOutput output)
+{
+       gint use_file = FALSE;
+       gint use_custom = FALSE;
+       gint use_format = FALSE;
+
+       pw->output = output;
+
+       switch (pw->output)
+               {
+               case PRINT_OUTPUT_RGB_FILE:
+                       use_file = TRUE;
+                       use_format = TRUE;
+                       break;
+               case PRINT_OUTPUT_PS_FILE:
+                       use_file = TRUE;
+                       break;
+               case PRINT_OUTPUT_PS_CUSTOM:
+                       use_custom = TRUE;
+                       break;
+               case PRINT_OUTPUT_PS_LPR:
+               default:
+                       break;
+               }
+
+       gtk_widget_set_sensitive(gtk_widget_get_parent(pw->path_entry), use_file);
+       gtk_widget_set_sensitive(gtk_widget_get_parent(pw->custom_entry), use_custom);
+       gtk_widget_set_sensitive(pw->path_format_menu, use_format);
+       gtk_widget_set_sensitive(pw->max_dpi_menu, !use_format);
+}
+
+static void print_output_cb(GtkWidget *combo, gpointer data)
+{
+       PrintWindow *pw = data;
+       PrintOutput output;
+
+       output = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
+
+       print_output_set(pw, output);
+}
+
+static GtkWidget *print_output_format_menu(GtkWidget * table, gint column, gint row,
+                                          PrintFileFormat preferred, GCallback func, gpointer data)
+{
+       GtkWidget *combo;
+
+       combo = print_combo_menu(print_file_format_text, PRINT_FILE_COUNT, preferred, func, data);
+
+       gtk_table_attach(GTK_TABLE(table), combo, column, column + 1, row, row + 1,
+                        GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+       gtk_widget_show(combo);
+
+       return combo;
+}
+
+static void print_output_format_cb(GtkWidget *combo, gpointer data)
+{
+       PrintWindow *pw = data;
+
+       pw->output_format = gtk_combo_box_get_active(GTK_COMBO_BOX(combo));
+}
+
+static GtkWidget *print_output_dpi_menu(GtkWidget * table, gint column, gint row,
+                                       gdouble dpi, GCallback func, gpointer data)
+{
+       static gint dpilist[] = { 150, 300, 600, 1200, 0, -1};
+       GtkWidget *combo;
+       GtkListStore *store;
+       GtkCellRenderer *renderer;
+       gint current = 1;
+       gint i;
+
+       store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
+
+       i = 0;
+       while (dpilist[i] != -1)
+               {
+               GtkTreeIter iter;
+               gchar *text;
+
+               if (dpilist[i] == 0)
+                       {
+                       text = g_strdup(_("Unlimited"));
+                       }
+               else
+                       {
+                       text = g_strdup_printf("%d", dpilist[i]);
+                       }
+
+               gtk_list_store_append(store, &iter);
+               gtk_list_store_set(store, &iter, 0, text, 1, dpilist[i], -1);
+               g_free(text);
+
+               if (dpi == (gdouble)dpilist[i]) current = i;
+
+               i++;
+               }
+
+       combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), current);
+       if (func) g_signal_connect(G_OBJECT(combo), "changed", func, data);
+
+       renderer = gtk_cell_renderer_text_new();
+       gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, TRUE);
+       gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), renderer, "text", 0, NULL);
+
+       gtk_table_attach(GTK_TABLE(table), combo, column, column + 1, row, row + 1,
+                        GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+       gtk_widget_show(combo);
+
+       return combo;
+}
+
+static void print_output_dpi_cb(GtkWidget *combo, gpointer data)
+{
+       PrintWindow *pw = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gint n = -1;
+
+       store = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
+       if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter)) return;
+       gtk_tree_model_get(store, &iter, 1, &n, -1);
+
+       pw->max_dpi = (gdouble)n;
+}
+
+static void print_text_field_set(PrintWindow *pw, TextInfo field, gint active)
+{
+       if (active)
+               {
+               pw->text_fields |= field;
+               }
+       else
+               {
+               pw->text_fields &= ~field;
+               }
+
+       print_window_layout_render(pw);
+}
+
+static void print_text_cb_name(GtkWidget *widget, gpointer data)
+{
+       PrintWindow *pw = data;
+       gint active;
+
+       active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+       print_text_field_set(pw, TEXT_INFO_FILENAME, active);
+}
+
+static void print_text_cb_date(GtkWidget *widget, gpointer data)
+{
+       PrintWindow *pw = data;
+       gint active;
+
+       active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+       print_text_field_set(pw, TEXT_INFO_FILEDATE, active);
+}
+
+static void print_text_cb_size(GtkWidget *widget, gpointer data)
+{
+       PrintWindow *pw = data;
+       gint active;
+
+       active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+       print_text_field_set(pw, TEXT_INFO_FILESIZE, active);
+}
+
+static void print_text_cb_dims(GtkWidget *widget, gpointer data)
+{
+       PrintWindow *pw = data;
+       gint active;
+
+       active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+       print_text_field_set(pw, TEXT_INFO_DIMENSIONS, active);
+}
+
+static void print_text_cb_points(GtkWidget *widget, gpointer data)
+{
+       PrintWindow *pw = data;
+
+       pw->text_points = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
+       print_window_layout_render(pw);
+}
+
+static void print_text_menu(GtkWidget *box, PrintWindow *pw)
+{
+       GtkWidget *group;
+
+       group = pref_group_new(box, FALSE, _("Show"), GTK_ORIENTATION_VERTICAL);
+
+       pref_checkbox_new(group, _("Name"), (pw->text_fields & TEXT_INFO_FILENAME),
+                         G_CALLBACK(print_text_cb_name), pw);
+       pref_checkbox_new(group, _("Date"), (pw->text_fields & TEXT_INFO_FILEDATE),
+                         G_CALLBACK(print_text_cb_date), pw);
+       pref_checkbox_new(group, _("Size"), (pw->text_fields & TEXT_INFO_FILESIZE),
+                         G_CALLBACK(print_text_cb_size), pw);
+       pref_checkbox_new(group, _("Dimensions"), (pw->text_fields & TEXT_INFO_DIMENSIONS),
+                         G_CALLBACK(print_text_cb_dims), pw);
+
+       group = pref_group_new(box, FALSE, _("Font"), GTK_ORIENTATION_VERTICAL);
+
+       pref_spin_new(group, _("Size:"), _("points"),
+                     8.0, 100.0, 1.0, 0, pw->text_points,
+                     G_CALLBACK(print_text_cb_points), pw);
+
+#if 0
+       button = color_selection_new();
+       gtk_box_pack_start(GTK_BOX(group), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+#endif
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * print window
+ *-----------------------------------------------------------------------------
+ */
+
+static void print_window_close(PrintWindow *pw)
+{
+       print_window_layout_render_stop(pw);
+
+       generic_dialog_close(pw->dialog);
+       pw->dialog = NULL;
+
+       print_job_close(pw, FALSE);
+
+       g_free(pw->source_path);
+       path_list_free(pw->source_selection);
+       path_list_free(pw->source_list);
+
+       g_free(pw->output_path);
+       g_free(pw->output_custom);
+
+       g_free(pw);
+}
+
+static void print_window_print_cb(GenericDialog *gd, gpointer data)
+{
+       PrintWindow *pw = data;
+
+       switch (pw->output)
+               {
+               case PRINT_OUTPUT_RGB_FILE:
+               case PRINT_OUTPUT_PS_FILE:
+                       g_free(pw->output_path);
+                       pw->output_path = g_strdup(gtk_entry_get_text(GTK_ENTRY(pw->path_entry)));
+                       break;
+               case PRINT_OUTPUT_PS_CUSTOM:
+                       g_free(pw->output_custom);
+                       pw->output_custom = g_strdup(gtk_entry_get_text(GTK_ENTRY(pw->custom_entry)));
+                       break;
+               case PRINT_OUTPUT_PS_LPR:
+               default:
+                       break;
+               }
+
+       print_window_print_start(pw);
+}
+
+static void print_window_cancel_cb(GenericDialog *gd, gpointer data)
+{
+       PrintWindow *pw = data;
+
+       print_window_close(pw);
+}
+
+static gint print_pref_int(const gchar *key, gint fallback)
+{
+       gint value;
+
+       if (pref_list_int_get(PRINT_PREF_GROUP, key, &value)) return value;
+       return fallback;
+}
+
+static gdouble print_pref_double(const gchar *key, gdouble fallback)
+{
+       gdouble value;
+
+       if (pref_list_double_get(PRINT_PREF_GROUP, key, &value)) return value;
+       return fallback;
+}
+
+void print_window_new(const gchar *path, GList *selection, GList *list, GtkWidget *parent)
+{
+       PrintWindow *pw;
+       GdkGeometry geometry;
+       GtkWidget *main_box;
+       GtkWidget *vbox;
+       GtkWidget *label;
+       GtkWidget *combo;
+       GtkWidget *box;
+       GtkWidget *table;
+
+       pw = g_new0(PrintWindow, 1);
+
+       pw->source_path = g_strdup(path);
+       pw->source_selection = selection;
+       pw->source_list = list;
+
+       pw->source = PRINT_SOURCE_SELECTION;
+       pw->layout = PRINT_LAYOUT_IMAGE;
+
+       pw->output = print_pref_int(PRINT_PREF_OUTPUT, PRINT_OUTPUT_PS_LPR);
+       pw->output_format = print_pref_int(PRINT_PREF_FORMAT, PRINT_FILE_JPG_NORMAL);
+
+       pw->max_dpi = print_pref_double(PRINT_PREF_DPI, PRINT_PS_DPI_DEFAULT);
+
+       pw->paper_units = print_pref_int(PRINT_PREF_UNITS, paper_unit_default());
+       pw->paper_size = print_pref_int(PRINT_PREF_SIZE, 1);
+       if (pw->paper_size == 0 ||
+           !print_paper_size_lookup(pw->paper_size, &pw->paper_width, &pw->paper_height))
+               {
+               pw->paper_width = print_pref_double(PRINT_PREF_CUSTOM_WIDTH, 360.0);
+               pw->paper_height = print_pref_double(PRINT_PREF_CUSTOM_HEIGHT, 720.0);
+               }
+       pw->paper_orientation = print_pref_int(PRINT_PREF_ORIENTATION, PAPER_ORIENTATION_PORTRAIT);
+
+       pw->margin_left = print_pref_double(PRINT_PREF_MARGIN_LEFT, PRINT_MARGIN_DEFAULT);
+       pw->margin_right = print_pref_double(PRINT_PREF_MARGIN_RIGHT, PRINT_MARGIN_DEFAULT);
+       pw->margin_top = print_pref_double(PRINT_PREF_MARGIN_TOP, PRINT_MARGIN_DEFAULT);
+       pw->margin_bottom = print_pref_double(PRINT_PREF_MARGIN_BOTTOM, PRINT_MARGIN_DEFAULT);
+
+       pw->proof_width = print_pref_double(PRINT_PREF_PROOF_WIDTH, PRINT_PROOF_DEFAULT_SIZE);
+       pw->proof_height = print_pref_double(PRINT_PREF_PROOF_HEIGHT, PRINT_PROOF_DEFAULT_SIZE);
+
+       pw->text_fields = TEXT_INFO_FILENAME;
+       pw->text_points = 10;
+       pw->text_r = pw->text_g = pw->text_b = 0;
+
+       pw->save_settings = print_pref_int(PRINT_PREF_SAVE, TRUE);
+
+       pw->dialog = file_util_gen_dlg(_("Print - GQview"), "gqview", "print_dialog",
+                                      parent, FALSE,
+                                      print_window_cancel_cb, pw);
+
+       geometry.min_width = 32;
+       geometry.min_height = 32;
+       geometry.base_width = PRINT_DLG_WIDTH;
+       geometry.base_height = PRINT_DLG_HEIGHT;
+       gtk_window_set_geometry_hints(GTK_WINDOW(pw->dialog->dialog), NULL, &geometry,
+                                     GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE);
+
+       pw->print_button = generic_dialog_add_button(pw->dialog, GTK_STOCK_PRINT, NULL, print_window_print_cb, TRUE);
+
+       main_box = pref_box_new(pw->dialog->vbox, TRUE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+
+       pw->notebook = gtk_notebook_new();
+       gtk_notebook_set_tab_pos(GTK_NOTEBOOK(pw->notebook), GTK_POS_TOP);
+       gtk_box_pack_start(GTK_BOX(main_box), pw->notebook, FALSE, FALSE, 0);
+
+       /* layout tab */
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
+       gtk_widget_show(vbox);
+       label = gtk_label_new(_("Layout"));
+       gtk_notebook_append_page(GTK_NOTEBOOK(pw->notebook), vbox, label);
+
+       print_misc_menu(vbox, pw->source, _("Source"), "print_source",
+                       PRINT_SOURCE_COUNT, print_source_text,
+                       G_CALLBACK(print_source_select_cb), pw);
+
+       box = print_misc_menu(vbox, pw->layout, _("Layout"), "print_layout",
+                             PRINT_LAYOUT_COUNT, print_layout_text,
+                             G_CALLBACK(print_layout_select_cb), pw);
+
+       pref_spacer(box, PREF_PAD_GROUP);
+
+       table = pref_table_new(box, 2, 2, FALSE, FALSE);
+
+       pw->image_scale_spin = pref_table_spin(table, 0, 0, _("Image size:"), "%",
+                                              5.0, 100.0, 1.0, 0, 100.0,
+                                              G_CALLBACK(print_image_scale_cb), pw);
+
+       label = pref_table_label(table, 0, 1, _("Proof size:"), 1.0);
+       pw->proof_group = pref_table_box(table, 1, 1, GTK_ORIENTATION_HORIZONTAL, NULL);
+       pref_link_sensitivity(label, pw->proof_group);
+       
+       pw->proof_width_spin = pref_spin_new(pw->proof_group, NULL, NULL,
+                                            0.0, 50.0, 0.1, 3, 0.0,
+                                            G_CALLBACK(print_proof_size_cb), pw);
+       pw->proof_height_spin = pref_spin_new(pw->proof_group, "x", NULL,
+                                             0.0, 50.0, 0.1, 3, 0.0,
+                                             G_CALLBACK(print_proof_size_cb), pw);
+
+       /* text tab */
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
+       gtk_widget_show(vbox);
+       label = gtk_label_new(_("Text"));
+       gtk_notebook_append_page(GTK_NOTEBOOK(pw->notebook), vbox, label);
+
+       print_text_menu(vbox, pw);
+
+       /* paper tab */
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
+       gtk_widget_show(vbox);
+       label = gtk_label_new(_("Paper"));
+       gtk_notebook_append_page(GTK_NOTEBOOK(pw->notebook), vbox, label);
+
+       table = pref_table_new(vbox, 2, 4, FALSE, FALSE);
+
+       print_paper_menu(table, 0, 0, pw->paper_size, G_CALLBACK(print_paper_select_cb), pw);
+
+       label = pref_table_label(table, 0, 1, (_("Size:")), 1.0);
+       box = pref_table_box(table, 1, 1, GTK_ORIENTATION_HORIZONTAL, NULL);
+       pw->paper_width_spin = pref_spin_new(box, NULL, NULL,
+                                            1.0, 10000.0, 1.0, 2, 66,
+                                            G_CALLBACK(print_paper_size_cb), pw);
+       pw->paper_height_spin = pref_spin_new(box, "x", NULL,
+                                             1.0, 10000.0, 1.0, 2, 66,
+                                             G_CALLBACK(print_paper_size_cb), pw);
+       pref_link_sensitivity(label, pw->paper_width_spin);
+
+       pw->paper_units_menu = print_paper_units_menu(table, 0, 2, pw->paper_units,
+                                       G_CALLBACK(print_paper_units_cb), pw);
+
+       print_paper_orientation_menu(table, 0, 3, pw->paper_orientation,
+                                    G_CALLBACK(print_paper_orientation_cb), pw);
+
+       box = pref_group_new(vbox, FALSE, _("Margins"), GTK_ORIENTATION_VERTICAL);
+       table = pref_table_new(box, 4, 2, FALSE, FALSE);
+       pw->margin_left_spin = pref_table_spin(table, 0, 0, _("Left:"), NULL,
+                                       0.0, 50.0, 0.1, 3, 0.0,
+                                       G_CALLBACK(print_paper_margin_cb), pw);
+       pw->margin_right_spin = pref_table_spin(table, 2, 0, _("Right:"), NULL,
+                                       0.0, 50.0, 0.1, 3, 0.0,
+                                       G_CALLBACK(print_paper_margin_cb), pw);
+       pw->margin_top_spin = pref_table_spin(table, 0, 1, _("Top:"), NULL,
+                                       0.0, 50.0, 0.1, 3, 0.0,
+                                       G_CALLBACK(print_paper_margin_cb), pw);
+       pw->margin_bottom_spin = pref_table_spin(table, 2, 1, _("Bottom:"), NULL,
+                                       0.0, 50.0, 0.1, 3, 0.0,
+                                       G_CALLBACK(print_paper_margin_cb), pw);
+
+       /* printer tab */
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_BORDER);
+       gtk_widget_show(vbox);
+       label = gtk_label_new(_("Printer"));
+       gtk_notebook_append_page(GTK_NOTEBOOK(pw->notebook), vbox, label);
+
+       table = pref_table_new(vbox, 2, 5, FALSE, FALSE);
+       print_output_menu(table, 0, 0, pw->output, G_CALLBACK(print_output_cb), pw);
+
+       label = pref_table_label(table, 0, 1, _("Custom printer:"), 1.0);
+       combo = history_combo_new(&pw->custom_entry, NULL, "print_custom", -1);
+       print_custom_entry_set(pw, combo);
+       gtk_table_attach(GTK_TABLE(table), combo, 1, 2, 1, 2,
+                        GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+       gtk_widget_show(combo);
+
+       pref_link_sensitivity(label, combo);
+
+       label = pref_table_label(table, 0, 2, _("File:"), 1.0);
+       combo = tab_completion_new_with_history(&pw->path_entry, NULL, "print_path", -1, NULL, pw);
+       tab_completion_add_select_button(pw->path_entry, NULL, FALSE);
+       gtk_table_attach(GTK_TABLE(table), combo, 1, 2, 2, 3,
+                        GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+       gtk_widget_show(combo);
+
+       pref_link_sensitivity(label, combo);
+
+       label = pref_table_label(table, 0, 3, _("File format:"), 1.0);
+       pw->path_format_menu = print_output_format_menu(table, 1, 3, pw->output_format,
+                                                       G_CALLBACK(print_output_format_cb), pw);
+       pref_link_sensitivity(label, pw->path_format_menu);
+
+       label = pref_table_label(table, 0, 4, _("DPI:"), 1.0);
+       pw->max_dpi_menu = print_output_dpi_menu(table, 1, 4, pw->max_dpi,
+                                                G_CALLBACK(print_output_dpi_cb), pw);
+       pref_link_sensitivity(label, pw->max_dpi_menu);
+
+       print_output_set(pw, pw->output);
+
+       vbox = print_window_layout_setup(pw, main_box);
+       pref_checkbox_new_int(vbox, _("Remember print settings"), pw->save_settings, &pw->save_settings);
+
+       print_window_layout_sync_layout(pw);
+       print_window_layout_sync_paper(pw);
+
+       gtk_widget_show(pw->notebook);
+       gtk_widget_show(pw->dialog->dialog);
+}
+
diff --git a/src/print.h b/src/print.h
new file mode 100644 (file)
index 0000000..93f8880
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef PRINT_H
+#define PRINT_H
+
+
+/* do not free selection or list, the print window takes control of them */
+void print_window_new(const gchar *path, GList *selection, GList *list, GtkWidget *parent);
+
+
+#endif
+
index f5c20d1..59ad96c 100644 (file)
@@ -1,20 +1,22 @@
 /*
- * GQview image viewer
- * (C)2000 John Ellis
+ * GQview
+ * (C) 2004 John Ellis
  *
  * Author: John Ellis
  *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
  */
 
+
 #include "gqview.h"
+#include "rcfile.h"
+
+#include "filelist.h"
+#include "slideshow.h"
+#include "ui_fileops.h"
 
-static gchar *quoted_value(gchar *text);
-static void write_char_option(FILE *f, gchar *label, gchar *text);
-static gchar *read_char_option(FILE *f, gchar *option, gchar *label, gchar *value, gchar *text);
-static void write_int_option(FILE *f, gchar *label, gint n);
-static gint read_int_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n);
-static void write_bool_option(FILE *f, gchar *label, gint n);
-static gint read_bool_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n);
 
 /*
  *-----------------------------------------------------------------------------
@@ -22,9 +24,9 @@ static gint read_bool_option(FILE *f, gchar *option, gchar *label, gchar *value,
  *-----------------------------------------------------------------------------
  */ 
 
-static gchar *quoted_value(gchar *text)
+gchar *quoted_value(const gchar *text)
 {
-       gchar *ptr;
+       const gchar *ptr;
        gint c = 0;
        gint l = strlen(text);
 
@@ -33,15 +35,16 @@ static gchar *quoted_value(gchar *text)
        while (c < l && text[c] !='"') c++;
        if (text[c] == '"')
                {
+               gint e;
                c++;
                ptr = text + c;
-               while (c < l && text[c] !='"') c++;
-               if (text[c] == '"')
+               e = c;
+               while (e < l && text[e] !='"') e++;
+               if (text[e] == '"')
                        {
-                       text[c] = '\0';
-                       if (strlen(ptr) > 0)
+                       if (e - c > 0)
                                {
-                               return g_strdup(ptr);
+                               return g_strndup(ptr, e - c);
                                }
                        }
                }
@@ -53,8 +56,7 @@ static gchar *quoted_value(gchar *text)
                while (c < l && text[c] !=' ' && text[c] !=8 && text[c] != '\n') c++;
                if (c != 0)
                        {
-                       text[c] = '\0';
-                       return g_strdup(text);
+                       return g_strndup(text, c);
                        }
                }
 
@@ -71,7 +73,7 @@ static void write_char_option(FILE *f, gchar *label, gchar *text)
 
 static gchar *read_char_option(FILE *f, gchar *option, gchar *label, gchar *value, gchar *text)
 {
-       if (!strcasecmp(option, label))
+       if (strcasecmp(option, label) == 0)
                {
                g_free(text);
                text = quoted_value(value);
@@ -86,9 +88,55 @@ static void write_int_option(FILE *f, gchar *label, gint n)
 
 static gint read_int_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n)
 {
-       if (!strcasecmp(option, label))
+       if (strcasecmp(option, label) == 0)
                {
-               n = strtol(value,NULL,0);
+               n = strtol(value, NULL, 10);
+               }
+       return n;
+}
+
+static void write_int_unit_option(FILE *f, gchar *label, gint n, gint subunits)
+{
+       gint l, r;
+
+       if (subunits > 0)
+               {
+               l = n / subunits;
+               r = n % subunits;
+               }
+       else
+               {
+               l = n;
+               r = 0;
+               }
+
+       fprintf(f,"%s: %d.%d\n\n", label, l, r);
+}
+
+static gint read_int_unit_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n, gint subunits)
+{
+       if (strcasecmp(option, label) == 0)
+               {
+               gint l, r;
+               gchar *ptr;
+
+               ptr = value;
+               while (*ptr != '\0' && *ptr != '.') ptr++;
+               if (*ptr == '.')
+                       {
+                       *ptr = '\0';
+                       l = strtol(value, NULL, 10);
+                       *ptr = '.';
+                       ptr++;
+                       r = strtol(ptr, NULL, 10);
+                       }
+               else
+                       {
+                       l = strtol(value, NULL, 10);
+                       r = 0;
+                       }
+
+               n = l * subunits + r;
                }
        return n;
 }
@@ -102,9 +150,9 @@ static void write_bool_option(FILE *f, gchar *label, gint n)
 
 static gint read_bool_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n)
 {
-       if (!strcasecmp(option, label))
+       if (strcasecmp(option, label) == 0)
                {
-               if (!strcasecmp(value, "true"))
+               if (strcasecmp(value, "true") == 0)
                        n = TRUE;
                else
                        n = FALSE;
@@ -118,32 +166,50 @@ static gint read_bool_option(FILE *f, gchar *option, gchar *label, gchar *value,
  *-----------------------------------------------------------------------------
  */ 
 
-void save_options()
+void save_options(void)
 {
        FILE *f;
        gchar *rc_path;
+       gchar *rc_pathl;
        gint i;
 
-       rc_path = g_strconcat(homedir(), "/", RC_FILE_NAME, NULL);
+       rc_path = g_strconcat(homedir(), "/", GQVIEW_RC_DIR, "/", RC_FILE_NAME, NULL);
 
-       f = fopen(rc_path,"w");
+       rc_pathl = path_from_utf8(rc_path);
+       f = fopen(rc_pathl, "w");
+       g_free(rc_pathl);
        if (!f)
                {
-               printf(_("error saving config file: %s\n"), rc_path);
+               gchar *buf;
+
+               buf = g_strdup_printf(_("error saving config file: %s\n"), rc_path);
+               print_term(buf);
+               g_free(buf);
+
                g_free(rc_path);
                return;
                }
 
        fprintf(f,"######################################################################\n");
        fprintf(f,"#                         GQview config file         version %7s #\n", VERSION);
-       fprintf(f,"#                                                                    #\n");
-       fprintf(f,"#  Everything in this file can be changed in the option dialogs.     #\n");
-       fprintf(f,"#      (so there should be no need to edit this file by hand)        #\n");
-       fprintf(f,"#                                                                    #\n");
        fprintf(f,"######################################################################\n");
        fprintf(f,"\n");
        fprintf(f,"##### General Options #####\n\n");
 
+       write_int_option(f, "layout_style", layout_style);
+       write_char_option(f, "layout_order", layout_order);
+       fprintf(f,"\n");
+       write_bool_option(f, "layout_view_as_icons", layout_view_icons);
+       write_bool_option(f, "layout_view_as_tree", layout_view_tree);
+       write_bool_option(f, "show_icon_names", show_icon_names);
+       fprintf(f,"\n");
+
+       write_bool_option(f, "tree_descend_folders", tree_descend_subdirs);
+       write_bool_option(f, "lazy_image_sync", lazy_image_sync);
+       write_bool_option(f, "update_on_time_change", update_on_time_change);
+       write_bool_option(f, "exif_auto_rotate", exif_rotate_enable);
+       fprintf(f,"\n");
+
        write_bool_option(f, "enable_startup_path", startup_path_enable);
        write_char_option(f, "startup_path", startup_path);
        fprintf(f,"\n");
@@ -152,6 +218,10 @@ void save_options()
        if (zoom_mode == ZOOM_RESET_ORIGINAL) fprintf(f,"original\n");
        if (zoom_mode == ZOOM_RESET_FIT_WINDOW) fprintf(f,"fit\n");
        if (zoom_mode == ZOOM_RESET_NONE) fprintf(f,"dont_change\n");
+
+       write_bool_option(f, "two_pass_scaling", two_pass_zoom);
+
+       write_bool_option(f, "zoom_to_fit_allow_expand", zoom_to_fit_expands);
        fprintf(f,"\n");
 
        write_bool_option(f, "fit_window_to_image", fit_window);
@@ -160,26 +230,67 @@ void save_options()
        fprintf(f,"\n");
 
        write_bool_option(f, "progressive_keyboard_scrolling", progressive_key_scrolling);
+       write_int_option(f, "scroll_reset_method", scroll_reset_method);
        fprintf(f,"\n");
 
        write_bool_option(f, "enable_thumbnails", thumbnails_enabled);
        write_int_option(f, "thumbnail_width", thumb_max_width);
        write_int_option(f, "thumbnail_height", thumb_max_height);
        write_bool_option(f, "cache_thumbnails", enable_thumb_caching);
+       write_bool_option(f, "cache_thumbnails_into_dirs", enable_thumb_dirs);
        write_bool_option(f, "use_xvpics_thumbnails", use_xvpics_thumbnails);
+       write_bool_option(f, "thumbnail_spec_standard", thumbnail_spec_standard);
+       fprintf(f,"\n");
+
+       write_bool_option(f, "local_metadata", enable_metadata_dirs);
+       fprintf(f,"\n");
+
+       write_int_option(f, "sort_method", (gint)file_sort_method);
+       write_bool_option(f, "sort_ascending", file_sort_ascending);
+       write_bool_option(f, "sort_case_sensitive", file_sort_case_sensitive);
        fprintf(f,"\n");
 
        write_bool_option(f, "confirm_delete", confirm_delete);
+       write_bool_option(f, "enable_delete_key", enable_delete_key);
+       write_bool_option(f, "safe_delete", safe_delete_enable);
+       write_char_option(f, "safe_delete_path", safe_delete_path);
+       write_int_option(f, "safe_delete_size", safe_delete_size);
        fprintf(f,"\n");
        write_bool_option(f, "tools_float", tools_float);
        write_bool_option(f, "tools_hidden", tools_hidden);
        write_bool_option(f, "restore_tool_state", restore_tool);
 
+       write_bool_option(f, "toolbar_hidden", toolbar_hidden);
+
        write_bool_option(f, "mouse_wheel_scrolls", mousewheel_scrolls);
+       write_bool_option(f, "in_place_rename", enable_in_place_rename);
+
+       write_int_option(f, "open_recent_max", recent_list_max);
+
+       write_int_option(f, "image_cache_size_max", tile_cache_max);
+
+       write_int_option(f, "thumbnail_quality", thumbnail_quality);
+       write_int_option(f, "zoom_quality", zoom_quality);
+       write_int_option(f, "dither_quality", dither_quality);
+
+       write_int_option(f, "zoom_increment", zoom_increment);
+
+       write_bool_option(f, "enable_read_ahead", enable_read_ahead);
+
+       write_bool_option(f, "display_dialogs_under_mouse", place_dialogs_under_mouse);
+
+       write_bool_option(f, "black_window_background", black_window_background);
+
+       write_int_option(f, "fullscreen_screen", fullscreen_screen);
+       write_bool_option(f, "fullscreen_clean_flip", fullscreen_clean_flip);
+       write_bool_option(f, "fullscreen_disable_saver", fullscreen_disable_saver);
+       write_bool_option(f, "fullscreen_above", fullscreen_above);
+
+       write_int_option(f, "custom_similarity_threshold", dupe_custom_threshold);
 
        fprintf(f,"\n##### Slideshow Options #####\n\n");
 
-       write_int_option(f, "slideshow_delay", slideshow_delay);
+       write_int_unit_option(f, "slideshow_delay", slideshow_delay, SLIDESHOW_SUBSECOND_PRECISION);
 
        write_bool_option(f, "slideshow_random", slideshow_random);
        write_bool_option(f, "slideshow_repeat", slideshow_repeat);
@@ -188,32 +299,25 @@ void save_options()
 
        write_bool_option(f, "show_dotfiles", show_dot_files);
        write_bool_option(f, "disable_filtering", file_filter_disable);
-       fprintf(f,"\n");
-       write_bool_option(f, "filter_ppm", filter_include_ppm);
-       write_bool_option(f, "filter_png", filter_include_png);
-       write_bool_option(f, "filter_jpg", filter_include_jpg);
-       write_bool_option(f, "filter_tif", filter_include_tif);
-       write_bool_option(f, "filter_pgm", filter_include_pgm);
-       write_bool_option(f, "filter_xpm", filter_include_xpm);
-       write_bool_option(f, "filter_gif", filter_include_gif);
-       write_bool_option(f, "filter_pcx", filter_include_pcx);
-       write_bool_option(f, "filter_bmp", filter_include_bmp);
-       fprintf(f,"\n");
-       write_char_option(f, "custom_filter", custom_filter);
+       filter_write_list(f);
 
        fprintf(f,"\n##### External Programs #####\n");
        fprintf(f,"# Maximum of 8 programs (external_1 through external 8)\n");
        fprintf(f,"# format: external_n: \"menu name\" \"command line\"\n\n");
 
-       for (i=0; i<8; i++)
+       for (i = 0; i < GQVIEW_EDITOR_SLOTS; i++)
                {
                fprintf(f,"external_%d: \"", i+1);
-               if (editor_name[i]) fprintf(f, editor_name[i]);
+               if (editor_name[i]) fprintf(f, "%s", editor_name[i]);
                fprintf(f, "\" \"");
-               if (editor_command[i]) fprintf(f, editor_command[i]);
+               if (editor_command[i]) fprintf(f, "%s", editor_command[i]);
                fprintf(f, "\"\n");
                }
 
+       fprintf(f,"\n##### Collection Options #####\n\n");
+
+       write_bool_option(f, "rectangular_selections", collection_rectangular_selection);
+
        fprintf(f,"\n##### Window Positions #####\n\n");
 
        write_bool_option(f, "restore_window_positions", save_window_positions);
@@ -222,10 +326,14 @@ void save_options()
        write_int_option(f, "main_window_y", main_window_y);
        write_int_option(f, "main_window_width", main_window_w);
        write_int_option(f, "main_window_height", main_window_h);
+       write_bool_option(f, "main_window_maximized", main_window_maximized);
        write_int_option(f, "float_window_x", float_window_x);
        write_int_option(f, "float_window_y", float_window_y);
        write_int_option(f, "float_window_width", float_window_w);
        write_int_option(f, "float_window_height", float_window_h);
+       write_int_option(f, "float_window_divider", float_window_divider);
+       write_int_option(f, "divider_position_h", window_hdivider_pos);
+       write_int_option(f, "divider_position_v", window_vdivider_pos);
 
        fprintf(f,"######################################################################\n");
        fprintf(f,"#                      end of GQview config file                     #\n");
@@ -242,19 +350,23 @@ void save_options()
  *-----------------------------------------------------------------------------
  */ 
 
-void load_options()
+void load_options(void)
 {
        FILE *f;
        gchar *rc_path;
+       gchar *rc_pathl;
        gchar s_buf[1024];
        gchar *s_buf_ptr;
        gchar option[1024];
        gchar value[1024];
        gchar value_all[1024];
        gint c,l,i;
-       rc_path = g_strconcat(homedir(), "/", RC_FILE_NAME, NULL);
 
-       f = fopen(rc_path,"r");
+       rc_path = g_strconcat(homedir(), "/", GQVIEW_RC_DIR, "/", RC_FILE_NAME, NULL);
+
+       rc_pathl = path_from_utf8(rc_path);
+       f = fopen(rc_pathl,"r");
+       g_free(rc_pathl);
        if (!f)
                {
                g_free(rc_path);
@@ -271,29 +383,51 @@ void load_options()
                if (c >= l) continue;
                s_buf[c] = '\0';
                c++;
-               while (s_buf[c] == ' ' && c < l) c++;
-               while (s_buf[c] == 8 && c < l) c++;
-               while (s_buf[c] == ' ' && c < l) c++;
+               while ((s_buf[c] == ' ' || s_buf[c] == 8) && c < l) c++;
                s_buf_ptr = s_buf + c;
-               strcpy(value_all,s_buf_ptr);
+               strncpy(value_all, s_buf_ptr, sizeof(value_all));
                while (s_buf[c] != 8 && s_buf[c] != ' ' && s_buf[c] != '\n' && c < l) c++;
                s_buf[c] = '\0';
-               strcpy(option,s_buf);
-               strcpy(value,s_buf_ptr);
+               strncpy(option, s_buf, sizeof(option));
+               strncpy(value, s_buf_ptr, sizeof(value));
 
                /* general options */
 
+               layout_style = read_int_option(f, option,
+                       "layout_style", value, layout_style);
+               layout_order = read_char_option(f, option,
+                       "layout_order", value, layout_order);
+               layout_view_icons = read_bool_option(f, option,
+                       "layout_view_as_icons", value, layout_view_icons);
+               layout_view_tree = read_bool_option(f, option,
+                       "layout_view_as_tree", value, layout_view_tree);
+               show_icon_names = read_bool_option(f, option,
+                       "show_icon_names", value, show_icon_names);
+
+               tree_descend_subdirs = read_bool_option(f, option,
+                       "tree_descend_folders", value, tree_descend_subdirs);
+               lazy_image_sync = read_bool_option(f, option,
+                       "lazy_image_sync", value, lazy_image_sync);
+               update_on_time_change = read_bool_option(f, option,
+                       "update_on_time_change", value, update_on_time_change);
+               exif_rotate_enable = read_bool_option(f, option,
+                       "exif_auto_rotate", value, exif_rotate_enable);
+
                startup_path_enable = read_bool_option(f, option,
                        "enable_startup_path", value, startup_path_enable);
                startup_path = read_char_option(f, option,
                        "startup_path", value_all, startup_path);
 
-               if (!strcasecmp(option,"zoom_mode"))
+               if (strcasecmp(option,"zoom_mode") == 0)
                         {
-                        if (!strcasecmp(value,"original")) zoom_mode = ZOOM_RESET_ORIGINAL;
-                        if (!strcasecmp(value,"fit")) zoom_mode = ZOOM_RESET_FIT_WINDOW;
-                        if (!strcasecmp(value,"dont_change")) zoom_mode = ZOOM_RESET_NONE;
+                        if (strcasecmp(value, "original") == 0) zoom_mode = ZOOM_RESET_ORIGINAL;
+                        if (strcasecmp(value, "fit") == 0) zoom_mode = ZOOM_RESET_FIT_WINDOW;
+                        if (strcasecmp(value, "dont_change") == 0) zoom_mode = ZOOM_RESET_NONE;
                         }
+               two_pass_zoom = read_bool_option(f, option,
+                       "two_pass_scaling", value, two_pass_zoom);
+               zoom_to_fit_expands = read_bool_option(f, option,
+                       "zoom_to_fit_allow_expand", value, zoom_to_fit_expands);
 
                fit_window = read_bool_option(f, option,
                        "fit_window_to_image", value, fit_window);
@@ -303,6 +437,8 @@ void load_options()
                        "max_window_size", value, max_window_size);
                progressive_key_scrolling = read_bool_option(f, option,
                        "progressive_keyboard_scrolling", value, progressive_key_scrolling);
+               scroll_reset_method = read_int_option(f, option,
+                       "scroll_reset_method", value, scroll_reset_method);
 
                thumbnails_enabled = read_bool_option(f, option,
                        "enable_thumbnails", value, thumbnails_enabled);
@@ -312,11 +448,33 @@ void load_options()
                        "thumbnail_height", value, thumb_max_height);
                enable_thumb_caching = read_bool_option(f, option,
                        "cache_thumbnails", value, enable_thumb_caching);
+               enable_thumb_dirs = read_bool_option(f, option,
+                       "cache_thumbnails_into_dirs", value, enable_thumb_dirs);
                use_xvpics_thumbnails = read_bool_option(f, option,
                        "use_xvpics_thumbnails", value, use_xvpics_thumbnails);
+               thumbnail_spec_standard = read_bool_option(f, option,
+                       "thumbnail_spec_standard", value, thumbnail_spec_standard);
+
+               enable_metadata_dirs = read_bool_option(f, option,
+                       "local_metadata", value, enable_metadata_dirs);
+
+               file_sort_method = (SortType)read_int_option(f, option,
+                       "sort_method", value, (gint)file_sort_method);
+               file_sort_ascending = read_bool_option(f, option,
+                       "sort_ascending", value, file_sort_ascending);
+               file_sort_case_sensitive = read_bool_option(f, option,
+                       "sort_case_sensitive", value, file_sort_case_sensitive);
 
                confirm_delete = read_bool_option(f, option,
                        "confirm_delete", value, confirm_delete);
+               enable_delete_key = read_bool_option(f, option,
+                       "enable_delete_key", value, enable_delete_key);
+               safe_delete_enable = read_bool_option(f, option,
+                       "safe_delete",  value, safe_delete_enable);
+               safe_delete_path = read_char_option(f, option,
+                       "safe_delete_path", value, safe_delete_path);
+               safe_delete_size = read_int_option(f, option,
+                       "safe_delete_size", value, safe_delete_size);
 
                tools_float = read_bool_option(f, option,
                        "tools_float", value, tools_float);
@@ -325,14 +483,55 @@ void load_options()
                restore_tool = read_bool_option(f, option,
                        "restore_tool_state", value, restore_tool);
 
+               toolbar_hidden = read_bool_option(f, option,
+                       "toolbar_hidden", value, toolbar_hidden);
+
                mousewheel_scrolls = read_bool_option(f, option,
                        "mouse_wheel_scrolls", value, mousewheel_scrolls);
+               enable_in_place_rename = read_bool_option(f, option,
+                       "in_place_rename", value, enable_in_place_rename);
+
+               recent_list_max = read_int_option(f, option,
+                       "open_recent_max", value, recent_list_max);
+
+               tile_cache_max = read_int_option(f, option,
+                       "image_cache_size_max", value, tile_cache_max);
+
+               thumbnail_quality = CLAMP(read_int_option(f, option,
+                       "thumbnail_quality", value, thumbnail_quality), GDK_INTERP_NEAREST, GDK_INTERP_HYPER);
+               zoom_quality = CLAMP(read_int_option(f, option,
+                       "zoom_quality", value, zoom_quality), GDK_INTERP_NEAREST, GDK_INTERP_HYPER);
+               dither_quality = CLAMP(read_int_option(f, option,
+                       "dither_quality", value, dither_quality), GDK_RGB_DITHER_NONE, GDK_RGB_DITHER_MAX);
+
+               zoom_increment = read_int_option(f, option,
+                       "zoom_increment", value, zoom_increment);
+
+               enable_read_ahead = read_bool_option(f, option,
+                       "enable_read_ahead", value, enable_read_ahead);
 
+               place_dialogs_under_mouse = read_bool_option(f, option,
+                       "display_dialogs_under_mouse", value, place_dialogs_under_mouse);
 
-               /* slideshow opitons */
+               black_window_background = read_bool_option(f, option,
+                       "black_window_background", value, black_window_background);
 
-               slideshow_delay = read_int_option(f, option,
-                       "slideshow_delay", value, slideshow_delay);
+               fullscreen_screen = read_int_option(f, option,
+                       "fullscreen_screen", value, fullscreen_screen);
+               fullscreen_clean_flip = read_bool_option(f, option,
+                       "fullscreen_clean_flip", value, fullscreen_clean_flip);
+               fullscreen_disable_saver = read_bool_option(f, option,
+                       "fullscreen_disable_saver", value, fullscreen_disable_saver);
+               fullscreen_above = read_bool_option(f, option,
+                       "fullscreen_above", value, fullscreen_above);
+
+               dupe_custom_threshold = read_int_option(f, option,
+                       "custom_similarity_threshold", value, dupe_custom_threshold);
+
+               /* slideshow options */
+
+               slideshow_delay = read_int_unit_option(f, option,
+                       "slideshow_delay", value, slideshow_delay, SLIDESHOW_SUBSECOND_PRECISION);
                slideshow_random = read_bool_option(f, option,
                        "slideshow_random", value, slideshow_random);
                slideshow_repeat = read_bool_option(f, option,
@@ -345,34 +544,17 @@ void load_options()
                file_filter_disable = read_bool_option(f, option,
                        "disable_filtering", value, file_filter_disable);
 
-               filter_include_ppm = read_bool_option(f, option,
-                       "filter_ppm", value, filter_include_ppm);
-               filter_include_png = read_bool_option(f, option,
-                       "filter_png", value, filter_include_png);
-               filter_include_jpg = read_bool_option(f, option,
-                       "filter_jpg", value, filter_include_jpg);
-               filter_include_tif = read_bool_option(f, option,
-                       "filter_tif", value, filter_include_tif);
-               filter_include_pgm = read_bool_option(f, option,
-                       "filter_pgm", value, filter_include_pgm);
-               filter_include_xpm = read_bool_option(f, option,
-                       "filter_xpm", value, filter_include_xpm);
-               filter_include_gif = read_bool_option(f, option,
-                       "filter_gif", value, filter_include_gif);
-               filter_include_pcx = read_bool_option(f, option,
-                       "filter_pcx", value, filter_include_pcx);
-               filter_include_bmp = read_bool_option(f, option,
-                       "filter_bmp", value, filter_include_bmp);
-
-               custom_filter = read_char_option(f, option,
-                       "custom_filter", value_all, custom_filter);
+               if (strcasecmp(option, "filter_ext") == 0)
+                       {
+                       filter_parse(value_all);
+                       }
 
                /* External Programs */
 
-               if (!strncasecmp(option,"external_",9))
+               if (strncasecmp(option, "external_", 9) == 0)
                        {
                        i = strtol(option + 9, NULL, 0);
-                       if (i>0 && i<9)
+                       if (i > 0 && i <= GQVIEW_EDITOR_SLOTS)
                                {
                                gchar *ptr1, *ptr2;
                                i--;
@@ -402,8 +584,9 @@ void load_options()
                                                        {
                                                        c++;
                                                        ptr2 = ptr1 + c;
-                                                       while (c<l && value_all[c] !='"') c++;
-                                                       if (ptr1[c] == '"' && ptr1 + c - 1 != ptr2)
+                                                       while (value_all[c] != '\0') c++;
+                                                       while (c > 0 && value_all[c] != '"') c--;
+                                                       if (ptr1[c] == '"' && ptr1 + c > ptr2)
                                                                {
                                                                ptr1[c] = '\0';
                                                                editor_command[i] = g_strdup(ptr2);
@@ -414,6 +597,11 @@ void load_options()
                                }
                        }
 
+               /* colection options */
+
+               collection_rectangular_selection = read_bool_option(f, option,
+                       "rectangular_selections", value, collection_rectangular_selection);
+
                /* window positions */
 
                save_window_positions = read_bool_option(f, option,
@@ -427,6 +615,8 @@ void load_options()
                        "main_window_width", value, main_window_w);
                main_window_h = read_int_option(f, option,
                        "main_window_height", value, main_window_h);
+               main_window_maximized = read_bool_option(f, option,
+                       "main_window_maximized", value, main_window_maximized);
                float_window_x = read_int_option(f, option,
                        "float_window_x", value, float_window_x);
                float_window_y = read_int_option(f, option,
@@ -435,6 +625,13 @@ void load_options()
                        "float_window_width", value, float_window_w);
                float_window_h = read_int_option(f, option,
                        "float_window_height", value, float_window_h);
+               float_window_divider = read_int_option(f, option,
+                       "float_window_divider", value, float_window_divider);
+               window_hdivider_pos = read_int_option(f, option,
+                       "divider_position_h", value, window_hdivider_pos);
+               window_vdivider_pos = read_int_option(f, option,
+                       "divider_position_v", value, window_vdivider_pos);
+
                }
 
        fclose(f);
diff --git a/src/rcfile.h b/src/rcfile.h
new file mode 100644 (file)
index 0000000..292fee1
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef RCFILE_H
+#define RCFILE_H
+
+
+gchar *quoted_value(const gchar *text);
+
+void save_options(void);
+void load_options(void);
+
+
+#endif
+
diff --git a/src/remote.c b/src/remote.c
new file mode 100644 (file)
index 0000000..2f438d7
--- /dev/null
@@ -0,0 +1,337 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "remote.h"
+
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <signal.h>
+#include <errno.h>
+
+
+#define SERVER_MAX_CLIENTS 8
+
+#define REMOTE_SERVER_BACKLOG 4
+
+
+#ifndef UNIX_PATH_MAX
+#define UNIX_PATH_MAX 108
+#endif
+
+
+typedef struct _RemoteClient RemoteClient;
+struct _RemoteClient {
+       gint fd;
+       gint channel_id;
+       RemoteConnection *rc;
+};
+
+
+static gboolean remote_server_client_cb(GIOChannel *source, GIOCondition condition, gpointer data)
+{
+       RemoteClient *client = data;
+       RemoteConnection *rc;
+
+       rc = client->rc;
+
+       if (condition & G_IO_IN)
+               {
+               GList *queue = NULL;
+               GList *work;
+               gchar *buffer = NULL;
+               GError *error = NULL;
+               gint termpos;
+
+               while (g_io_channel_read_line(source, &buffer, NULL, &termpos, &error) == G_IO_STATUS_NORMAL)
+                       {
+                       if (buffer)
+                               {
+                               buffer[termpos] = '\0';
+
+                               if (strlen(buffer) > 0)
+                                       {
+                                       queue = g_list_append(queue, buffer);
+                                       }
+                               else
+                                       {
+                                       g_free(buffer);
+                                       }
+
+                               buffer = NULL;
+                               }
+                       }
+
+               if (error)
+                       {
+                       printf("error reading socket: %s\n", error->message);
+                       g_error_free(error);
+                       }
+
+               work = queue;
+               while (work)
+                       {
+                       gchar *command = work->data;
+                       work = work->next;
+
+                       if (rc->read_func) rc->read_func(rc, command, rc->read_data);
+                       g_free(command);
+                       }
+
+               g_list_free(queue);
+               }
+
+       if (condition & G_IO_HUP)
+               {
+               rc->clients = g_list_remove(rc->clients, client);
+
+               if (debug)
+                       {
+                       printf("HUP detected, closing client.\n");
+                       printf("client count %d\n", g_list_length(rc->clients));
+                       }
+
+               g_source_remove(client->channel_id);
+               close(client->fd);
+               g_free(client);
+               }
+
+       return TRUE;
+}
+
+static void remote_server_client_add(RemoteConnection *rc, int fd)
+{
+       RemoteClient *client;
+       GIOChannel *channel;
+
+       if (g_list_length(rc->clients) > SERVER_MAX_CLIENTS)
+               {
+               printf("maximum remote clients of %d exceeded, closing connection\n", SERVER_MAX_CLIENTS);
+               close(fd);
+               return;
+               }
+
+       client = g_new0(RemoteClient, 1);
+       client->rc = rc;
+       client->fd = fd;
+
+       channel = g_io_channel_unix_new(fd);
+       client->channel_id = g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, G_IO_IN | G_IO_HUP,
+                                                remote_server_client_cb, client, NULL);
+       g_io_channel_unref(channel);
+
+       rc->clients = g_list_append(rc->clients, client);
+       if (debug) printf("client count %d\n", g_list_length(rc->clients));
+}
+
+static void remote_server_clients_close(RemoteConnection *rc)
+{
+       while (rc->clients)
+               {
+               RemoteClient *client = rc->clients->data;
+
+               rc->clients = g_list_remove(rc->clients, client);
+
+               g_source_remove(client->channel_id);
+               close(client->fd);
+               g_free(client);
+               }
+}
+
+static gboolean remote_server_read_cb(GIOChannel *source, GIOCondition condition, gpointer data)
+{
+       RemoteConnection *rc = data;
+       int fd;
+       int alen;
+
+       fd = accept(rc->fd, NULL, &alen);
+       if (fd == -1)
+               {
+               printf("error accepting socket: %s\n", strerror(errno));
+               return TRUE;
+               }
+
+       remote_server_client_add(rc, fd);
+
+       return TRUE;
+}
+
+static gint remote_server_exists(const gchar *path)
+{
+       RemoteConnection *rc;
+
+       /* verify server up */
+       rc = remote_client_open(path);
+       remote_close(rc);
+
+       if (rc) return TRUE;
+
+       /* unable to connect, remove socket file to free up address */
+       unlink(path);
+       return FALSE;
+}
+
+RemoteConnection *remote_server_open(const gchar *path)
+{
+       RemoteConnection *rc;
+       struct sockaddr_un addr;
+       gint sun_path_len;
+       int fd;
+       GIOChannel *channel;
+
+       if (remote_server_exists(path))
+               {
+               printf("Address already in use: %s\n", path);
+               return NULL;
+               }
+
+       fd = socket(PF_UNIX, SOCK_STREAM, 0);
+       if (fd == -1) return NULL;
+
+       addr.sun_family = AF_UNIX;
+       sun_path_len = MIN(strlen(path) + 1, UNIX_PATH_MAX);
+       strncpy(addr.sun_path, path, sun_path_len);
+       if (bind(fd, &addr, sizeof(addr)) == -1 ||
+           listen(fd, REMOTE_SERVER_BACKLOG) == -1)
+               {
+               printf("error subscribing to socket: %s\n", strerror(errno));
+               close(fd);
+               return NULL;
+               }
+
+       rc = g_new0(RemoteConnection, 1);
+       rc->server = TRUE;
+       rc->fd = fd;
+       rc->path = g_strdup(path);
+
+       rc->read_func = NULL;
+       rc->read_data = NULL;
+
+       rc->clients = NULL;
+
+       channel = g_io_channel_unix_new(rc->fd);
+       rc->channel_id = g_io_add_watch_full(channel, G_PRIORITY_DEFAULT, G_IO_IN,
+                                            remote_server_read_cb, rc, NULL);
+       g_io_channel_unref(channel);
+
+       return rc;
+}
+
+void remote_server_subscribe(RemoteConnection *rc, RemoteReadFunc *func, gpointer data)
+{
+       if (!rc || !rc->server) return;
+
+       rc->read_func = func;
+       rc->read_data = data;
+}
+
+
+RemoteConnection *remote_client_open(const gchar *path)
+{
+       RemoteConnection *rc;
+       struct stat st;
+       struct sockaddr_un addr;
+       gint sun_path_len;
+       int fd;
+
+       if (stat(path, &st) != 0 || !S_ISSOCK(st.st_mode)) return NULL;
+
+       fd = socket(PF_UNIX, SOCK_STREAM, 0);
+       if (fd == -1) return NULL;
+
+       addr.sun_family = AF_UNIX;
+       sun_path_len = MIN(strlen(path) + 1, UNIX_PATH_MAX);
+       strncpy(addr.sun_path, path, sun_path_len);
+       if (connect(fd, &addr, sizeof(addr)) == -1)
+               {
+               if (debug) printf("error connecting to socket: %s\n", strerror(errno));
+               close(fd);
+               return NULL;
+               }
+
+       rc = g_new0(RemoteConnection, 1);
+       rc->server = FALSE;
+       rc->fd = fd;
+       rc->path = g_strdup(path);
+
+       return rc;
+}
+
+static sig_atomic_t sigpipe_occured = FALSE;
+
+static void sighandler_sigpipe(int sig)
+{
+       sigpipe_occured = TRUE;
+}
+
+gint remote_client_send(RemoteConnection *rc, const gchar *text)
+{
+       struct sigaction new_action, old_action;
+       gint ret = FALSE;
+
+       if (!rc || rc->server) return FALSE;
+       if (!text) return TRUE;
+
+       sigpipe_occured = FALSE;
+
+       new_action.sa_handler = sighandler_sigpipe;
+       sigemptyset (&new_action.sa_mask);
+       new_action.sa_flags = 0;
+
+       /* setup our signal handler */
+       sigaction (SIGPIPE, &new_action, &old_action);
+
+       if (write(rc->fd, text, strlen(text)) == -1 ||
+           write(rc->fd, "\n", 1) == -1)
+               {
+               if (sigpipe_occured)
+                       {
+                       printf("SIGPIPE writing to socket: %s\n", rc->path);
+                       }
+               else
+                       {
+                       printf("error writing to socket: %s\n", strerror(errno));
+                       }
+               ret = FALSE;;
+               }
+       else
+               {
+               ret = TRUE;
+               }
+
+       /* restore the original signal handler */
+       sigaction (SIGPIPE, &old_action, NULL);
+
+       return ret;
+}
+
+void remote_close(RemoteConnection *rc)
+{
+       if (!rc) return;
+
+       if (rc->server)
+               {
+               remote_server_clients_close(rc);
+
+               g_source_remove(rc->channel_id);
+               unlink(rc->path);
+               }
+
+       close(rc->fd);
+
+       g_free(rc->path);
+       g_free(rc);
+}
+
+
diff --git a/src/remote.h b/src/remote.h
new file mode 100644 (file)
index 0000000..00966ab
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef REMOTE_H
+#define REMOTE_H
+
+
+typedef struct _RemoteConnection RemoteConnection;
+
+typedef void RemoteReadFunc(RemoteConnection *rc, const char *text, gpointer data);
+
+struct _RemoteConnection {
+       gint server;
+       int fd;
+       gchar *path;
+
+       gint channel_id;
+       RemoteReadFunc *read_func;
+       gpointer read_data;
+
+       GList *clients;
+};
+                                                                                                                        
+                                                                                                                        
+RemoteConnection *remote_server_open(const gchar *path);
+void remote_server_subscribe(RemoteConnection *rc, RemoteReadFunc *func, gpointer data);
+
+RemoteConnection *remote_client_open(const gchar *path);
+gint remote_client_send(RemoteConnection *rc, const gchar *text);
+
+void remote_close(RemoteConnection *rc);
+
+
+#endif
+
diff --git a/src/search.c b/src/search.c
new file mode 100644 (file)
index 0000000..3a7a45f
--- /dev/null
@@ -0,0 +1,2868 @@
+/*
+ * GQview
+ * (C) 2005 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "search.h"
+
+#include "bar_info.h"
+#include "cache.h"
+#include "collect.h"
+#include "collect-table.h"
+#include "dnd.h"
+#include "dupe.h"
+#include "image-load.h"
+#include "info.h"
+#include "editors.h"
+#include "img-view.h"
+#include "filelist.h"
+#include "layout_image.h"
+#include "menu.h"
+#include "print.h"
+#include "thumb.h"
+#include "utilops.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_misc.h"
+#include "ui_spinner.h"
+#include "ui_tabcomp.h"
+#include "ui_tree_edit.h"
+
+#include <gdk/gdkkeysyms.h> /* for keyboard values */
+
+
+#define DEF_SEARCH_WIDTH  700
+#define DEF_SEARCH_HEIGHT 450
+
+#define SEARCH_BUFFER_MATCH_LOAD 20
+#define SEARCH_BUFFER_MATCH_HIT  5
+#define SEARCH_BUFFER_MATCH_MISS 1
+#define SEARCH_BUFFER_FLUSH_SIZE 99
+
+
+typedef enum {
+       SEARCH_MATCH_NONE,
+       SEARCH_MATCH_EQUAL,
+       SEARCH_MATCH_CONTAINS,
+       SEARCH_MATCH_UNDER,
+       SEARCH_MATCH_OVER,
+       SEARCH_MATCH_BETWEEN,
+       SEARCH_MATCH_ALL,
+       SEARCH_MATCH_ANY
+} MatchType;
+
+enum {
+       SEARCH_COLUMN_POINTER = 0,
+       SEARCH_COLUMN_RANK,
+       SEARCH_COLUMN_THUMB,
+       SEARCH_COLUMN_NAME,
+       SEARCH_COLUMN_SIZE,
+       SEARCH_COLUMN_DATE,
+       SEARCH_COLUMN_DIMENSIONS,
+       SEARCH_COLUMN_PATH,
+       SEARCH_COLUMN_COUNT     /* total columns */
+};
+
+typedef struct _SearchData SearchData;
+struct _SearchData
+{
+       GtkWidget *window;
+
+       GtkWidget *button_thumbs;
+       GtkWidget *label_status;
+       GtkWidget *label_progress;
+       GtkWidget *button_start;
+       GtkWidget *button_stop;
+       GtkWidget *spinner;
+
+       GtkWidget *box_search;
+
+       GtkWidget *menu_path;
+       GtkWidget *path_entry;
+       GtkWidget *check_recurse;
+
+       GtkWidget *result_view;
+
+       GtkWidget *check_name;
+       GtkWidget *menu_name;
+       GtkWidget *entry_name;
+       GtkWidget *check_name_match_case;
+
+       GtkWidget *check_size;
+       GtkWidget *menu_size;
+       GtkWidget *spin_size;
+       GtkWidget *spin_size_end;
+
+       GtkWidget *check_date;
+       GtkWidget *menu_date;
+       GtkWidget *date_sel;
+       GtkWidget *date_sel_end;
+
+       GtkWidget *check_dimensions;
+       GtkWidget *menu_dimensions;
+       GtkWidget *spin_width;
+       GtkWidget *spin_height;
+       GtkWidget *spin_width_end;
+       GtkWidget *spin_height_end;
+
+       GtkWidget *check_similarity;
+       GtkWidget *spin_similarity;
+       GtkWidget *entry_similarity;
+
+       GtkWidget *check_keywords;
+       GtkWidget *menu_keywords;
+       GtkWidget *entry_keywords;
+
+       gchar *search_path;
+       gint   search_path_recurse;
+       gchar *search_name;
+       gint   search_name_match_case;
+       gint64 search_size;
+       gint64 search_size_end;
+       gint   search_date_y;
+       gint   search_date_m;
+       gint   search_date_d;
+       gint   search_date_end_y;
+       gint   search_date_end_m;
+       gint   search_date_end_d;
+       gint   search_width;
+       gint   search_height;
+       gint   search_width_end;
+       gint   search_height_end;
+       gint   search_similarity;
+       gchar *search_similarity_path;
+       CacheData *search_similarity_cd;
+       GList *search_keyword_list;
+
+       MatchType search_type;
+
+       MatchType match_name;
+       MatchType match_size;
+       MatchType match_date;
+       MatchType match_dimensions;
+       MatchType match_keywords;
+
+       gboolean match_name_enable;
+       gboolean match_size_enable;
+       gboolean match_date_enable;
+       gboolean match_dimensions_enable;
+       gboolean match_similarity_enable;
+       gboolean match_keywords_enable;
+
+       GList *search_folder_list;
+       GList *search_done_list;
+       GList *search_file_list;
+       GList *search_buffer_list;
+
+       gint search_count;
+       gint search_total;
+       gint search_buffer_count;
+
+       gint search_idle_id;
+       gint update_idle_id;
+
+       ImageLoader *img_loader;
+       CacheData   *img_cd;
+
+       FileData *click_fd;
+
+       ThumbLoader *thumb_loader;
+       gint thumb_enable;
+       FileData *thumb_fd;
+};
+
+typedef struct _MatchFileData MatchFileData;
+struct _MatchFileData
+{
+       FileData fd;
+       gint width;
+       gint height;
+       gint rank;
+};
+
+typedef struct _MatchList MatchList;
+struct _MatchList
+{
+       const gchar *text;
+       const MatchType type;
+};
+
+static const MatchList text_search_menu_path[] = {
+       { N_("folder"),         SEARCH_MATCH_NONE },
+       { N_("comments"),       SEARCH_MATCH_ALL },
+       { N_("results"),        SEARCH_MATCH_CONTAINS }
+};
+
+static const MatchList text_search_menu_name[] = {
+       { N_("contains"),       SEARCH_MATCH_CONTAINS },
+       { N_("is"),             SEARCH_MATCH_EQUAL }
+};
+
+static const MatchList text_search_menu_size[] = {
+       { N_("equal to"),       SEARCH_MATCH_EQUAL },
+       { N_("less than"),      SEARCH_MATCH_UNDER },
+       { N_("greater than"),   SEARCH_MATCH_OVER },
+       { N_("between"),        SEARCH_MATCH_BETWEEN }
+};
+
+static const MatchList text_search_menu_date[] = {
+       { N_("equal to"),       SEARCH_MATCH_EQUAL },
+       { N_("before"),         SEARCH_MATCH_UNDER },
+       { N_("after"),          SEARCH_MATCH_OVER },
+       { N_("between"),        SEARCH_MATCH_BETWEEN }
+};
+
+static const MatchList text_search_menu_keyword[] = {
+       { N_("match all"),      SEARCH_MATCH_ALL },
+       { N_("match any"),      SEARCH_MATCH_ANY },
+       { N_("exclude"),        SEARCH_MATCH_NONE }
+};
+
+static GList *search_window_list = NULL;
+
+
+static gint search_result_selection_count(SearchData *sd, gint64 *bytes);
+static gint search_result_count(SearchData *sd, gint64 *bytes);
+
+static void search_window_close(SearchData *sd);
+
+
+/*
+ *-------------------------------------------------------------------
+ * utils
+ *-------------------------------------------------------------------
+ */
+
+static time_t convert_dmy_to_time(gint day, gint month, gint year)
+{
+       struct tm lt;
+
+       lt.tm_sec = 0;
+       lt.tm_min = 0;
+       lt.tm_hour = 0;
+       lt.tm_mday = day;
+       lt.tm_mon = month - 1;
+       lt.tm_year = year - 1900;
+       lt.tm_isdst = 0;
+
+       return mktime(&lt);
+}
+
+static void search_status_update(SearchData *sd)
+{
+       gchar *buf;
+       gint t;
+       gint s;
+       gint64 t_bytes;
+       gint64 s_bytes;
+       gchar *tt;
+       gchar *ts;
+
+       t = search_result_count(sd, &t_bytes);
+       s = search_result_selection_count(sd, &s_bytes);
+
+       if (s > 0)
+               {
+               tt = text_from_size_abrev(t_bytes);
+               ts = text_from_size_abrev(s_bytes);
+               buf = g_strdup_printf(_("%s, %d files (%s, %d)"), tt, t, ts, s);
+               g_free(tt);
+               g_free(ts);
+               }
+       else
+               {
+               tt = text_from_size_abrev(t_bytes);
+               buf = g_strdup_printf(_("%s, %d files"), tt, t);
+               g_free(tt);
+               }
+
+       gtk_label_set_text(GTK_LABEL(sd->label_status), buf);
+       g_free(buf);
+}
+
+static void search_progress_update(SearchData *sd, gint search, gdouble thumbs)
+{
+
+       if (search || thumbs >= 0.0)
+               {
+               gchar *buf;
+               const gchar *message;
+
+               if (search && (sd->search_folder_list || sd->search_file_list))
+                       message = _("Searching...");
+               else if (thumbs >= 0.0)
+                       message = _("Loading thumbs...");
+               else
+                       message = "";
+
+               buf = g_strdup_printf("%s(%d / %d)", message, sd->search_count, sd->search_total);
+               gtk_progress_bar_set_text(GTK_PROGRESS_BAR(sd->label_progress), buf);
+               gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(sd->label_progress),
+                                             (thumbs >= 0.0) ? thumbs : 0.0);
+               g_free(buf);
+               }
+       else
+               {
+               gtk_progress_bar_set_text(GTK_PROGRESS_BAR(sd->label_progress), "");
+               gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(sd->label_progress), 0.0);
+               }
+}
+
+/*
+ *-------------------------------------------------------------------
+ * result list
+ *-------------------------------------------------------------------
+ */
+
+static gint search_result_find_row(SearchData *sd, FileData *fd, GtkTreeIter *iter)
+{
+       GtkTreeModel *store;
+       gint valid;
+       gint n = 0;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(sd->result_view));
+       valid = gtk_tree_model_get_iter_first(store, iter);
+       while (valid)
+               {
+               FileData *fd_n;
+               n++;
+
+               gtk_tree_model_get(store, iter, SEARCH_COLUMN_POINTER, &fd_n, -1);
+               if (fd_n == fd) return n;
+               valid = gtk_tree_model_iter_next(store, iter);
+               }
+
+       return -1;
+}
+
+static gint search_result_row_selected(SearchData *sd, FileData *fd)
+{
+       GtkTreeModel *store;
+       GtkTreeSelection *selection;
+       GList *slist;
+       GList *work;
+       gint found = FALSE;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(sd->result_view));
+       slist = gtk_tree_selection_get_selected_rows(selection, &store);
+       work = slist;
+       while (!found && work)
+               {
+               GtkTreePath *tpath = work->data;
+               FileData *fd_n;
+               GtkTreeIter iter;
+
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, SEARCH_COLUMN_POINTER, &fd_n, -1);
+               if (fd_n == fd) found = TRUE;
+               work = work->next;
+               }
+       g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+       g_list_free(slist);
+
+       return found;
+}
+
+static gint search_result_selection_util(SearchData *sd, gint64 *bytes, GList **list)
+{
+       GtkTreeModel *store;
+       GtkTreeSelection *selection;
+       GList *slist;
+       GList *work;
+       gint n = 0;
+       gint64 total = 0;
+       GList *plist = NULL;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(sd->result_view));
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(sd->result_view));
+       slist = gtk_tree_selection_get_selected_rows(selection, &store);
+       work = slist;
+       while (work)
+               {
+               n++;
+
+               if (bytes || list)
+                       {
+                       GtkTreePath *tpath = work->data;
+                       FileData *fd;
+                       GtkTreeIter iter;
+
+                       gtk_tree_model_get_iter(store, &iter, tpath);
+                       gtk_tree_model_get(store, &iter, SEARCH_COLUMN_POINTER, &fd, -1);
+                       total += fd->size;
+
+                       if (list) plist = g_list_prepend(plist, g_strdup(fd->path));
+                       }
+                       
+               work = work->next;
+               }
+       g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+       g_list_free(slist);
+
+       if (bytes) *bytes = total;
+       if (list) *list = g_list_reverse(plist);
+
+       return n;
+}
+
+static GList *search_result_selection_list(SearchData *sd)
+{
+       GList *list;
+
+       search_result_selection_util(sd, NULL, &list);
+       return list;
+}
+
+static gint search_result_selection_count(SearchData *sd, gint64 *bytes)
+{
+       return search_result_selection_util(sd, bytes, NULL);
+}
+
+static gint search_result_util(SearchData *sd, gint64 *bytes, GList **list)
+{
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gint valid;
+       gint n = 0;
+       gint64 total = 0;
+       GList *plist = NULL;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(sd->result_view));
+
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+       while (valid)
+               {
+               n++;
+               if (bytes || list)
+                       {
+                       FileData *fd;
+
+                       gtk_tree_model_get(store, &iter, SEARCH_COLUMN_POINTER, &fd, -1);
+                       total += fd->size;
+
+                       if (list) plist = g_list_prepend(plist, g_strdup(fd->path));
+                       }
+               valid = gtk_tree_model_iter_next(store, &iter);
+               }
+
+       if (bytes) *bytes = total;
+       if (list) *list = g_list_reverse(plist);
+
+       return n;
+}
+
+static GList *search_result_get_path_list(SearchData *sd)
+{
+       GList *list = NULL;
+
+       search_result_util(sd, NULL, &list);
+       return list;
+}
+
+static gint search_result_count(SearchData *sd, gint64 *bytes)
+{
+       return search_result_util(sd, bytes, NULL);
+}
+
+static void search_result_append(SearchData *sd, MatchFileData *mfd)
+{
+       FileData *fd;
+       GtkListStore *store;
+       GtkTreeIter iter;
+       gchar *text_size;
+       gchar *text_dim = NULL;
+
+       fd = (FileData *)mfd;
+
+       if (!fd) return;
+
+       text_size = text_from_size(fd->size);
+       if (mfd->width > 0 && mfd->height > 0) text_dim = g_strdup_printf("%d x %d", mfd->width, mfd->height);
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(sd->result_view)));
+       gtk_list_store_append(store, &iter);
+       gtk_list_store_set(store, &iter,
+                               SEARCH_COLUMN_POINTER, fd,
+                               SEARCH_COLUMN_RANK, mfd->rank,
+                               SEARCH_COLUMN_THUMB, fd->pixbuf,
+                               SEARCH_COLUMN_NAME, fd->name,
+                               SEARCH_COLUMN_SIZE, text_size,
+                               SEARCH_COLUMN_DATE, text_from_time(fd->date),
+                               SEARCH_COLUMN_DIMENSIONS, text_dim,
+                               SEARCH_COLUMN_PATH, fd->path,
+                               -1);
+
+       g_free(text_size);
+       g_free(text_dim);
+}
+
+static GList *search_result_refine_list(SearchData *sd)
+{
+       GList *list = NULL;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gint valid;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(sd->result_view));
+
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+       while (valid)
+               {
+               FileData *fd;
+
+               gtk_tree_model_get(store, &iter, SEARCH_COLUMN_POINTER, &fd, -1);
+               list = g_list_prepend(list, fd);
+
+               valid = gtk_tree_model_iter_next(store, &iter);
+               }
+
+       /* clear it here, so that the FileData in list is not freed */
+       gtk_list_store_clear(GTK_LIST_STORE(store));
+
+       return g_list_reverse(list);
+}
+
+static gboolean search_result_free_node(GtkTreeModel *store, GtkTreePath *tpath,
+                                       GtkTreeIter *iter, gpointer data)
+{
+       FileData *fd;
+
+       gtk_tree_model_get(store, iter, SEARCH_COLUMN_POINTER, &fd, -1);
+       file_data_free(fd);
+
+       return FALSE;
+}
+
+static void search_result_clear(SearchData *sd)
+{
+       GtkListStore *store;
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(sd->result_view)));
+
+       gtk_tree_model_foreach(GTK_TREE_MODEL(store), search_result_free_node, sd);
+       gtk_list_store_clear(store);
+
+       sd->click_fd = NULL;
+
+       thumb_loader_free(sd->thumb_loader);
+       sd->thumb_loader = NULL;
+       sd->thumb_fd = NULL;
+
+       search_status_update(sd);
+}
+
+static void search_result_remove_item(SearchData *sd, FileData *fd, GtkTreeIter *iter)
+{
+       GtkTreeModel *store;
+
+       if (!fd || !iter) return;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(sd->result_view));
+
+       tree_view_move_cursor_away(GTK_TREE_VIEW(sd->result_view), iter, TRUE);
+
+       gtk_list_store_remove(GTK_LIST_STORE(store), iter);
+       if (sd->click_fd == fd) sd->click_fd = NULL;
+       if (sd->thumb_fd == fd) sd->thumb_fd = NULL;
+       file_data_free(fd);
+}
+
+static void search_result_remove(SearchData *sd, FileData *fd)
+{
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gint valid;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(sd->result_view));
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+       while (valid)
+               {
+               FileData *fd_n;
+
+               gtk_tree_model_get(store, &iter, SEARCH_COLUMN_POINTER, &fd_n, -1);
+               if (fd_n == fd)
+                       {
+                       search_result_remove_item(sd, fd_n, &iter);
+                       return;
+                       }
+
+               valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
+               }
+}
+
+static void search_result_remove_selection(SearchData *sd)
+{
+       GtkTreeSelection *selection;
+       GtkTreeModel *store;
+       GList *slist;
+       GList *flist = NULL;
+       GList *work;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(sd->result_view));
+       slist = gtk_tree_selection_get_selected_rows(selection, &store);
+       work = slist;
+       while (work)
+               {
+               GtkTreePath *tpath = work->data;
+               GtkTreeIter iter;
+               FileData *fd;
+
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, SEARCH_COLUMN_POINTER, &fd, -1);
+               flist = g_list_prepend(flist, fd);
+               work = work->next;
+               }
+       g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+       g_list_free(slist);
+
+       work = flist;
+       while (work)
+               {
+               FileData *fd = work->data;
+               work = work->next;
+
+               search_result_remove(sd, fd);
+               }
+       g_list_free(flist);
+
+       search_status_update(sd);
+}
+
+static void search_result_edit_selected(SearchData *sd, gint n)
+{
+       GList *list;
+
+       list = search_result_selection_list(sd);
+       start_editor_from_path_list(n, list);
+       path_list_free(list);
+}
+
+static void search_result_collection_from_selection(SearchData *sd)
+{
+       CollectWindow *w;
+       GList *list;
+
+       list = search_result_selection_list(sd);
+       w = collection_window_new(NULL);
+       collection_table_add_path_list(w->table, list);
+       path_list_free(list);
+}
+
+static gint search_result_update_idle_cb(gpointer data)
+{
+       SearchData *sd = data;
+
+       search_status_update(sd);
+
+       sd->update_idle_id = -1;
+       return FALSE;
+}
+
+static void search_result_update_idle_cancel(SearchData *sd)
+{
+       if (sd->update_idle_id != -1) g_source_remove(sd->update_idle_id);
+       sd->update_idle_id = -1;
+}
+
+static gboolean search_result_select_cb(GtkTreeSelection *selection, GtkTreeModel *store,
+                                       GtkTreePath *tpath, gboolean selected, gpointer data)
+{
+       SearchData *sd = data;
+
+       if (sd->update_idle_id == -1)
+               {
+               sd->update_idle_id = g_idle_add(search_result_update_idle_cb, sd);
+               }
+
+       return TRUE;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * result list thumbs
+ *-------------------------------------------------------------------
+ */
+
+static void search_result_thumb_step(SearchData *sd);
+
+
+static void search_result_thumb_set(SearchData *sd, FileData *fd, GtkTreeIter *iter)
+{
+       GtkListStore *store;
+       GtkTreeIter iter_n;
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(sd->result_view)));
+       if (!iter)
+               {
+               if (search_result_find_row(sd, fd, &iter_n) >= 0) iter = &iter_n;
+               }
+
+       if (iter) gtk_list_store_set(store, iter, SEARCH_COLUMN_THUMB, fd->pixbuf, -1);
+}
+
+static void search_result_thumb_do(SearchData *sd)
+{
+       FileData *fd;
+
+       if (!sd->thumb_loader || !sd->thumb_fd) return;
+       fd = sd->thumb_fd;
+
+       if (fd->pixbuf) g_object_unref(fd->pixbuf);
+       fd->pixbuf = thumb_loader_get_pixbuf(sd->thumb_loader, TRUE);
+
+       search_result_thumb_set(sd, fd, NULL);
+}
+
+static void search_result_thumb_done_cb(ThumbLoader *tl, gpointer data)
+{
+       SearchData *sd = data;
+
+       search_result_thumb_do(sd);
+       search_result_thumb_step(sd);
+}
+
+static void search_result_thumb_step(SearchData *sd)
+{
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       FileData *fd = NULL;
+       gint valid;
+       gint row = 0;
+       gint length = 0;
+
+       if (!sd->thumb_enable) return;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(sd->result_view));
+
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+       while (!fd && valid)
+               {
+               GdkPixbuf *pixbuf;
+
+               length++;
+               gtk_tree_model_get(store, &iter, SEARCH_COLUMN_POINTER, &fd, SEARCH_COLUMN_THUMB, &pixbuf, -1);
+               if (pixbuf || fd->pixbuf)
+                       {
+                       if (!pixbuf) gtk_list_store_set(GTK_LIST_STORE(store), &iter, SEARCH_COLUMN_THUMB, fd->pixbuf, -1);
+                       row++;
+                       fd = NULL;
+                       }
+               valid = gtk_tree_model_iter_next(store, &iter);
+               }
+       if (valid)
+               {
+               while (gtk_tree_model_iter_next(store, &iter)) length++;
+               }
+
+       if (!fd)
+               {
+               sd->thumb_fd = NULL;
+               thumb_loader_free(sd->thumb_loader);
+               sd->thumb_loader = NULL;
+
+               search_progress_update(sd, TRUE, -1.0);
+               return;
+               }
+
+       search_progress_update(sd, FALSE, (gdouble)row/length);
+
+       sd->thumb_fd = fd;
+       thumb_loader_free(sd->thumb_loader);
+       sd->thumb_loader = thumb_loader_new(thumb_max_width, thumb_max_height);
+
+       thumb_loader_set_callbacks(sd->thumb_loader,
+                                  search_result_thumb_done_cb,
+                                  search_result_thumb_done_cb,
+                                  NULL,
+                                  sd);
+       if (!thumb_loader_start(sd->thumb_loader, fd->path))
+               {
+               search_result_thumb_do(sd);
+               search_result_thumb_step(sd);
+               }
+}
+
+static void search_result_thumb_height(SearchData *sd)
+{
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *cell;
+       GList *list;
+
+       column = gtk_tree_view_get_column(GTK_TREE_VIEW(sd->result_view), SEARCH_COLUMN_THUMB - 1);
+       if (!column) return;
+
+       gtk_tree_view_column_set_fixed_width(column, (sd->thumb_enable) ? thumb_max_width : 4);
+
+       list = gtk_tree_view_column_get_cell_renderers(column);
+       if (!list) return;
+       cell = list->data;
+       g_list_free(list);
+
+       g_object_set(G_OBJECT(cell), "height", (sd->thumb_enable) ? thumb_max_height : -1, NULL);
+       gtk_tree_view_columns_autosize(GTK_TREE_VIEW(sd->result_view));
+}
+
+static void search_result_thumb_enable(SearchData *sd, gint enable)
+{
+       if (sd->thumb_enable == enable) return;
+
+       if (sd->thumb_enable)
+               {
+               GtkTreeModel *store;
+               GtkTreeIter iter;
+               gint valid;
+
+               thumb_loader_free(sd->thumb_loader);
+               sd->thumb_loader = NULL;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(sd->result_view));
+               valid = gtk_tree_model_get_iter_first(store, &iter);
+               while (valid)
+                       {
+                       gtk_list_store_set(GTK_LIST_STORE(store), &iter, SEARCH_COLUMN_THUMB, NULL, -1);
+                       valid = gtk_tree_model_iter_next(store, &iter);
+                       }
+               search_progress_update(sd, TRUE, -1.0);
+               }
+
+       sd->thumb_enable = enable;
+
+       search_result_thumb_height(sd);
+       if (!sd->search_folder_list && !sd->search_file_list) search_result_thumb_step(sd);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * result list menu
+ *-------------------------------------------------------------------
+ */
+
+static void sr_menu_view_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+
+       if (sd->click_fd) layout_image_set_path(NULL, sd->click_fd->path);
+}
+
+static void sr_menu_viewnew_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+       GList *list;
+
+       list = search_result_selection_list(sd);
+       view_window_new_from_list(list);
+       path_list_free(list);
+}
+
+static void sr_menu_select_all_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+       GtkTreeSelection *selection;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(sd->result_view));
+       gtk_tree_selection_select_all(selection);
+}
+
+static void sr_menu_select_none_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+       GtkTreeSelection *selection;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(sd->result_view));
+       gtk_tree_selection_unselect_all(selection);
+}
+
+static void sr_menu_edit_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd;
+       gint n;
+
+       sd = submenu_item_get_data(widget);
+       n = GPOINTER_TO_INT(data);
+       if (!sd) return;
+
+       search_result_edit_selected(sd, n);
+}
+
+static void sr_menu_info_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+
+       info_window_new(NULL, search_result_selection_list(sd));
+}
+
+static void sr_menu_collection_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+
+       search_result_collection_from_selection(sd);
+}
+
+static void sr_menu_print_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+       const gchar *path;
+
+       path = (sd->click_fd) ? sd->click_fd->path : NULL;
+
+       print_window_new(path, search_result_selection_list(sd),
+                        search_result_get_path_list(sd), sd->window);
+}
+
+static void sr_menu_copy_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+
+       file_util_copy(NULL, search_result_selection_list(sd), NULL, sd->window);
+}
+
+static void sr_menu_move_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+
+       file_util_move(NULL, search_result_selection_list(sd), NULL, sd->window);
+}
+
+static void sr_menu_rename_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+
+       file_util_rename(NULL, search_result_selection_list(sd), sd->window);
+}
+
+static void sr_menu_delete_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+
+       file_util_delete(NULL, search_result_selection_list(sd), sd->window);
+}
+
+static void sr_menu_remove_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+
+       search_result_remove_selection(sd);
+}
+
+static void sr_menu_clear_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+
+       search_result_clear(sd);
+}
+
+static GtkWidget *search_result_menu(SearchData *sd, gint on_row, gint empty)
+{
+       GtkWidget *menu;
+       GtkWidget *item;
+
+       menu = popup_menu_short_lived();
+       menu_item_add_sensitive(menu, _("_View"), on_row,
+                               G_CALLBACK(sr_menu_view_cb), sd);
+       menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, on_row,
+                                     G_CALLBACK(sr_menu_viewnew_cb), sd);
+       menu_item_add_divider(menu);
+       menu_item_add_sensitive(menu, _("Select all"), !empty,
+                               G_CALLBACK(sr_menu_select_all_cb), sd);
+       menu_item_add_sensitive(menu, _("Select none"), !empty,
+                               G_CALLBACK(sr_menu_select_none_cb), sd);
+       menu_item_add_divider(menu);
+       submenu_add_edit(menu, &item, G_CALLBACK(sr_menu_edit_cb), sd);
+       if (!on_row) gtk_widget_set_sensitive(item, FALSE);
+       menu_item_add_stock_sensitive(menu, _("_Properties"), GTK_STOCK_PROPERTIES, on_row,
+                                     G_CALLBACK(sr_menu_info_cb), sd);
+       menu_item_add_stock_sensitive(menu, _("Add to new collection"), GTK_STOCK_INDEX, on_row,
+                                     G_CALLBACK(sr_menu_collection_cb), sd);
+       menu_item_add_stock_sensitive(menu, _("Print..."), GTK_STOCK_PRINT, on_row,
+                                     G_CALLBACK(sr_menu_print_cb), sd);
+       menu_item_add_divider(menu);
+       menu_item_add_stock_sensitive(menu, _("_Copy..."), GTK_STOCK_COPY, on_row,
+                                     G_CALLBACK(sr_menu_copy_cb), sd);
+       menu_item_add_sensitive(menu, _("_Move..."), on_row,
+                               G_CALLBACK(sr_menu_move_cb), sd);
+       menu_item_add_sensitive(menu, _("_Rename..."), on_row,
+                               G_CALLBACK(sr_menu_rename_cb), sd);
+       menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, on_row,
+                                     G_CALLBACK(sr_menu_delete_cb), sd);
+       menu_item_add_divider(menu);
+       menu_item_add_stock_sensitive(menu, _("Rem_ove"), GTK_STOCK_REMOVE, on_row,
+                                     G_CALLBACK(sr_menu_remove_cb), sd);
+       menu_item_add_stock_sensitive(menu, _("C_lear"), GTK_STOCK_CLEAR, !empty,
+                                     G_CALLBACK(sr_menu_clear_cb), sd);
+
+       return menu;
+}
+
+static void search_result_menu_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
+{
+       SearchData *sd = data;
+       GtkTreePath *tpath;
+       gint cx, cy, cw, ch;
+
+       gtk_tree_view_get_cursor(GTK_TREE_VIEW(sd->result_view), &tpath, NULL);
+       if (!tpath) return;
+
+       tree_view_get_cell_clamped(GTK_TREE_VIEW(sd->result_view), tpath,
+                                  SEARCH_COLUMN_NAME - 1, TRUE, &cx, &cy, &cw, &ch);
+       gtk_tree_path_free(tpath);
+       cy += ch;
+       popup_menu_position_clamp(menu, &cx, &cy, 0);
+       *x = cx;
+       *y = cy;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * result list input
+ *-------------------------------------------------------------------
+ */
+
+static gint search_result_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       SearchData *sd = data;
+       GtkTreeModel *store;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+       FileData *fd = NULL;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+
+       if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
+                                         &tpath, NULL, NULL, NULL))
+               {
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, SEARCH_COLUMN_POINTER, &fd, -1);
+               gtk_tree_path_free(tpath);
+               }
+
+       sd->click_fd = fd;
+
+       if (bevent->button == 3)
+               {
+               GtkWidget *menu;
+
+               menu = search_result_menu(sd, (fd != NULL), (search_result_count(sd, NULL) == 0));
+               gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, bevent->button, bevent->time);
+               }
+
+       if (!fd) return FALSE;
+
+       if (bevent->button == 1 && bevent->type == GDK_2BUTTON_PRESS)
+               {
+               layout_image_set_path(NULL, fd->path);
+               }
+
+       if (bevent->button == 2) return TRUE;
+
+       if (bevent->button == 3)
+               {
+               if (!search_result_row_selected(sd, fd))
+                       {
+                       GtkTreeSelection *selection;
+
+                       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+                       gtk_tree_selection_unselect_all(selection);
+                       gtk_tree_selection_select_iter(selection, &iter);
+
+                       tpath = gtk_tree_model_get_path(store, &iter);
+                       gtk_tree_view_set_cursor(GTK_TREE_VIEW(widget), tpath, NULL, FALSE);
+                       gtk_tree_path_free(tpath);
+                       }
+               return TRUE;
+               }
+
+       if (bevent->button == 1 && bevent->type == GDK_BUTTON_PRESS &&
+           !(bevent->state & GDK_SHIFT_MASK ) &&
+           !(bevent->state & GDK_CONTROL_MASK ) &&
+           search_result_row_selected(sd, fd))
+               {
+               /* this selection handled on release_cb */
+               gtk_widget_grab_focus(widget);
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+static gint search_result_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       SearchData *sd = data;
+       GtkTreeModel *store;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+
+       FileData *fd = NULL;
+
+       if (bevent->button != 1 && bevent->button != 2) return TRUE;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+
+       if ((bevent->x != 0 || bevent->y != 0) &&
+           gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
+                                         &tpath, NULL, NULL, NULL))
+               {
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, SEARCH_COLUMN_POINTER, &fd, -1);
+               gtk_tree_path_free(tpath);
+               }
+
+       if (bevent->button == 2)
+               {
+               if (fd && sd->click_fd == fd)
+                       {
+                       GtkTreeSelection *selection;
+
+                       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+                       if (search_result_row_selected(sd, fd))
+                               {
+                               gtk_tree_selection_unselect_iter(selection, &iter);
+                               }
+                       else
+                               {
+                               gtk_tree_selection_select_iter(selection, &iter);
+                               }
+                       }
+               return TRUE;
+               }
+
+       if (fd && sd->click_fd == fd &&
+           !(bevent->state & GDK_SHIFT_MASK ) &&
+           !(bevent->state & GDK_CONTROL_MASK ) &&
+           search_result_row_selected(sd, fd))
+               {
+               GtkTreeSelection *selection;
+
+               selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+               gtk_tree_selection_unselect_all(selection);
+               gtk_tree_selection_select_iter(selection, &iter);
+
+               tpath = gtk_tree_model_get_path(store, &iter);
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(widget), tpath, NULL, FALSE);
+               gtk_tree_path_free(tpath);
+
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+static gint search_result_keypress_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       SearchData *sd = data;
+       gint stop_signal = FALSE;
+       GtkTreeModel *store;
+       GtkTreeSelection *selection;
+       GList *slist;
+       FileData *fd = NULL;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(sd->result_view));
+       slist = gtk_tree_selection_get_selected_rows(selection, &store);
+       if (slist)
+               {
+               GtkTreePath *tpath;
+               GtkTreeIter iter;
+               GList *last;
+
+               last = g_list_last(slist);
+               tpath = last->data;
+
+               /* last is newest selected file */
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, SEARCH_COLUMN_POINTER, &fd, -1);
+               }
+       g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+       g_list_free(slist);
+
+       if (event->state & GDK_CONTROL_MASK)
+               {
+               gint edit_val = -1;
+
+               switch (event->keyval)
+                       {
+                       case '1':
+                               edit_val = 0;
+                               break;
+                       case '2':
+                               edit_val = 1;
+                               break;
+                       case '3':
+                               edit_val = 2;
+                               break;
+                       case '4':
+                               edit_val = 3;
+                               break;
+                       case '5':
+                               edit_val = 4;
+                               break;
+                       case '6':
+                               edit_val = 5;
+                               break;
+                       case '7':
+                               edit_val = 6;
+                               break;
+                       case '8':
+                               edit_val = 7;
+                               break;
+                       case '9':
+                               edit_val = 8;
+                               break;
+                       case '0':
+                               edit_val = 9;
+                               break;
+                       case 'C': case 'c':
+                               stop_signal = TRUE;
+                               file_util_copy(NULL, search_result_selection_list(sd), NULL, widget);
+                               break;
+                       case 'M': case 'm':
+                               stop_signal = TRUE;
+                               file_util_move(NULL, search_result_selection_list(sd), NULL, widget);
+                               break;
+                       case 'R': case 'r':
+                               stop_signal = TRUE;
+                               file_util_rename(NULL, search_result_selection_list(sd), widget);
+                               break;
+                       case 'D': case 'd':
+                               stop_signal = TRUE;
+                               file_util_delete(NULL, search_result_selection_list(sd), widget);
+                               break;
+                       case 'P': case 'p':
+                               stop_signal = TRUE;
+                               info_window_new(NULL,  search_result_selection_list(sd));
+                               break;
+                       case 'A': case 'a':
+                               if (event->state & GDK_SHIFT_MASK)
+                                       {
+                                       gtk_tree_selection_unselect_all(selection);
+                                       }
+                               else
+                                       {
+                                       gtk_tree_selection_select_all(selection);
+                                       }
+                               stop_signal = TRUE;
+                               break;
+                       case GDK_Delete: case GDK_KP_Delete:
+                               search_result_clear(sd);
+                               stop_signal = TRUE;
+                               break;
+                       default:
+                               break;
+                       }
+
+               if (edit_val >= 0)
+                       {
+                       search_result_edit_selected(sd, edit_val);
+                       stop_signal = TRUE;
+                       }
+               }
+       else
+               {
+               switch (event->keyval)
+                       {
+                       case GDK_Return: case GDK_KP_Enter:
+                               if (fd) layout_image_set_path(NULL, fd->path);
+                               stop_signal = TRUE;
+                               break;
+                       case 'V': case 'v':
+                               {
+                               GList *list;
+
+                               list = search_result_selection_list(sd);
+                               view_window_new_from_list(list);
+                               path_list_free(list);
+                               stop_signal = TRUE;
+                               }
+                               break;
+                       case GDK_Delete: case GDK_KP_Delete:
+                               search_result_remove_selection(sd);
+                               stop_signal = TRUE;
+                               break;
+                       case 'C': case 'c':
+                               search_result_collection_from_selection(sd);
+                               stop_signal = TRUE;
+                               break;
+                       case GDK_Menu:
+                       case GDK_F10:
+                               {
+                               GtkWidget *menu;
+
+                               sd->click_fd = fd;
+                               menu = search_result_menu(sd, (fd != NULL), (search_result_count(sd, NULL) > 0));
+                               gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
+                                              search_result_menu_pos_cb, sd, 0, GDK_CURRENT_TIME);
+                               stop_signal = TRUE;
+                               }
+                               break;
+                       default:
+                               break;
+                       }
+               }
+               
+       return stop_signal;
+}
+
+static gint search_window_keypress_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       SearchData *sd = data;
+       gint stop_signal = FALSE;
+
+       if (event->state & GDK_CONTROL_MASK)
+               {
+               switch (event->keyval)
+                       {
+                       case 'T': case 't':
+                               gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(sd->button_thumbs),
+                                       !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(sd->button_thumbs)));
+                               stop_signal = TRUE;
+                               break;
+                       case 'W': case 'w':
+                               search_window_close(sd);
+                               stop_signal = TRUE;
+                               break;
+                       default:
+                               break;
+                       }
+               }
+
+       return stop_signal;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * dnd
+ *-------------------------------------------------------------------
+ */
+
+static GtkTargetEntry result_drag_types[] = {
+       { "text/uri-list", 0, TARGET_URI_LIST },
+       { "text/plain", 0, TARGET_TEXT_PLAIN }
+};
+static gint n_result_drag_types = 2;
+
+static void search_dnd_data_set(GtkWidget *widget, GdkDragContext *context,
+                               GtkSelectionData *selection_data, guint info,
+                               guint time, gpointer data)
+{
+       SearchData *sd = data;
+       gchar *uri_text;
+       gint length;
+       GList *list;
+
+       switch (info)
+               {
+               case TARGET_URI_LIST:
+               case TARGET_TEXT_PLAIN:
+                       list = search_result_selection_list(sd);
+                       if (!list) return;
+                       uri_text = uri_text_from_list(list, &length, (info == TARGET_TEXT_PLAIN));
+                       path_list_free(list);
+                       break;
+               default:
+                       uri_text = NULL;
+                       break;
+               }
+
+       if (uri_text) gtk_selection_data_set(selection_data, selection_data->target,
+                                            8, uri_text, length);
+       g_free(uri_text);
+}
+
+static void search_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       SearchData *sd = data;
+
+       if (sd->click_fd && !search_result_row_selected(sd, sd->click_fd))
+               {
+               GtkListStore *store;
+               GtkTreeIter iter;
+
+               store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(widget)));
+               if (search_result_find_row(sd, sd->click_fd, &iter) >= 0)
+                       {
+                       GtkTreeSelection *selection;
+                       GtkTreePath *tpath;
+
+                       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+                       gtk_tree_selection_unselect_all(selection);
+                       gtk_tree_selection_select_iter(selection, &iter);
+
+                       tpath = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
+                       gtk_tree_view_set_cursor(GTK_TREE_VIEW(widget), tpath, NULL, FALSE);
+                       gtk_tree_path_free(tpath);
+                       }
+               }
+
+       if (sd->thumb_enable &&
+           sd->click_fd && sd->click_fd->pixbuf)
+               {
+               dnd_set_drag_icon(widget, context, sd->click_fd->pixbuf, search_result_selection_count(sd, NULL));
+               }
+}
+
+static void search_dnd_init(SearchData *sd)
+{
+       gtk_drag_source_set(sd->result_view, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+                           result_drag_types, n_result_drag_types,
+                           GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+       g_signal_connect(G_OBJECT(sd->result_view), "drag_data_get",
+                        G_CALLBACK(search_dnd_data_set), sd);
+       g_signal_connect(G_OBJECT(sd->result_view), "drag_begin",
+                        G_CALLBACK(search_dnd_begin), sd);
+#if 0
+       g_signal_connect(G_OBJECT(sd->result_view), "drag_end",
+                        G_CALLBACK(search_dnd_end), sd);
+#endif
+                       
+}
+
+/*
+ *-------------------------------------------------------------------
+ * search core
+ *-------------------------------------------------------------------
+ */
+
+#define MATCH_IS_BETWEEN(val, a, b)  (b > a ? (val >= a && val <= b) : (val >= b && val <= a))
+
+static gint search_step_cb(gpointer data);
+
+
+static void search_buffer_flush(SearchData *sd)
+{
+       GList *work;
+
+       work = g_list_last(sd->search_buffer_list);
+       while (work)
+               {
+               MatchFileData *mfd = work->data;
+               work = work->prev;
+
+               search_result_append(sd, mfd);
+               }
+
+       g_list_free(sd->search_buffer_list);
+       sd->search_buffer_list = NULL;
+       sd->search_buffer_count = 0;
+}
+
+static void search_stop(SearchData *sd)
+{
+       if (sd->search_idle_id != -1)
+               {
+               g_source_remove(sd->search_idle_id);
+               sd->search_idle_id = -1;
+               }
+
+       image_loader_free(sd->img_loader);
+       sd->img_loader = NULL;
+       cache_sim_data_free(sd->img_cd);
+       sd->img_cd = NULL;
+
+       cache_sim_data_free(sd->search_similarity_cd);
+       sd->search_similarity_cd = NULL;
+
+       search_buffer_flush(sd);
+
+       filelist_free(sd->search_folder_list);
+       sd->search_folder_list = NULL;
+
+       g_list_free(sd->search_done_list);
+       sd->search_done_list = NULL;
+
+       filelist_free(sd->search_file_list);
+       sd->search_file_list = NULL;
+
+       gtk_widget_set_sensitive(sd->box_search, TRUE);
+       spinner_set_interval(sd->spinner, -1);
+       gtk_widget_set_sensitive(sd->button_start, TRUE);
+       gtk_widget_set_sensitive(sd->button_stop, FALSE);
+       search_progress_update(sd, TRUE, -1.0);
+       search_status_update(sd);
+}
+
+static void search_file_load_process(SearchData *sd, CacheData *cd)
+{
+       GdkPixbuf *pixbuf;
+
+       pixbuf = image_loader_get_pixbuf(sd->img_loader);
+
+       if (cd && pixbuf)
+               {
+               if (!cd->dimensions)
+                       {
+                       cache_sim_data_set_dimensions(cd, gdk_pixbuf_get_width(pixbuf),
+                                                         gdk_pixbuf_get_height(pixbuf));
+                       }
+
+               if (sd->match_similarity_enable && !cd->similarity)
+                       {
+                       ImageSimilarityData *sim;
+
+                       sim = image_sim_new_from_pixbuf(pixbuf);
+                       cache_sim_data_set_similarity(cd, sim);
+                       image_sim_free(sim);
+                       }
+
+               if (enable_thumb_caching &&
+                   sd->img_loader && sd->img_loader->path)
+                       {
+                       gchar *base;
+                       const gchar *path;
+                       mode_t mode = 0755;
+
+                       path = sd->img_loader->path;
+                       base = cache_get_location(CACHE_TYPE_SIM, path, FALSE, &mode);
+                       if (cache_ensure_dir_exists(base, mode))
+                               {
+                               g_free(cd->path);
+                               cd->path = cache_get_location(CACHE_TYPE_SIM, path, TRUE, NULL);
+                               if (cache_sim_data_save(cd))
+                                       {
+                                       filetime_set(cd->path, filetime(sd->img_loader->path));
+                                       }
+                               }
+                       g_free(base);
+                       }
+               }
+
+       image_loader_free(sd->img_loader);
+       sd->img_loader = NULL;
+
+       sd->search_idle_id = g_idle_add(search_step_cb, sd);
+}
+
+static void search_file_load_done_cb(ImageLoader *il, gpointer data)
+{
+        SearchData *sd = data;
+       search_file_load_process(sd, sd->img_cd);
+}
+
+static gint search_file_do_extra(SearchData *sd, FileData *fd, gint *match,
+                                gint *width, gint *height, gint *simval)
+{
+       gint new_data = FALSE;
+       gint tmatch = TRUE;
+       gint tested = FALSE;
+
+       if (!sd->img_cd)
+               {
+               gchar *cd_path;
+
+               new_data = TRUE;
+
+               cd_path = cache_find_location(CACHE_TYPE_SIM, fd->path);
+               if (cd_path && filetime(fd->path) == filetime(cd_path))
+                       {
+                       sd->img_cd = cache_sim_data_load(cd_path);
+                       }
+               g_free(cd_path);
+               }
+
+       if (!sd->img_cd)
+               {
+               sd->img_cd = cache_sim_data_new();
+               }
+
+       if (new_data)
+               {
+               if ((sd->match_dimensions_enable && !sd->img_cd->dimensions) ||
+                   (sd->match_similarity_enable && !sd->img_cd->similarity))
+                       {
+                       sd->img_loader = image_loader_new(fd->path);
+                       image_loader_set_error_func(sd->img_loader, search_file_load_done_cb, sd);
+                       if (image_loader_start(sd->img_loader, search_file_load_done_cb, sd))
+                               {
+                               return TRUE;
+                               }
+                       else
+                               {
+                               image_loader_free(sd->img_loader);
+                               sd->img_loader = NULL;
+                               }
+                       }
+               }
+
+       if (tmatch && sd->match_dimensions_enable && sd->img_cd->dimensions)
+               {
+               CacheData *cd = sd->img_cd;
+
+               tmatch = FALSE;
+               tested = TRUE;
+
+               if (sd->match_dimensions == SEARCH_MATCH_EQUAL)
+                       {
+                       tmatch = (cd->width == sd->search_width && cd->height == sd->search_height);
+                       }
+               else if (sd->match_dimensions == SEARCH_MATCH_UNDER)
+                       {
+                       tmatch = (cd->width < sd->search_width && cd->height < sd->search_height);
+                       }
+               else if (sd->match_dimensions == SEARCH_MATCH_OVER)
+                       {
+                       tmatch = (cd->width > sd->search_width && cd->height > sd->search_height);
+                       }
+               else if (sd->match_dimensions == SEARCH_MATCH_BETWEEN)
+                       {
+                       tmatch = (MATCH_IS_BETWEEN(cd->width, sd->search_width, sd->search_width_end) &&
+                                 MATCH_IS_BETWEEN(cd->height, sd->search_height, sd->search_height_end));
+                       }
+               }
+
+       if (tmatch && sd->match_similarity_enable && sd->img_cd->similarity)
+               {
+               gdouble value = 0.0;
+
+               tmatch = FALSE;
+               tested = TRUE;
+
+               /* fixme: implement similarity checking */
+               if (sd->search_similarity_cd && sd->search_similarity_cd->similarity)
+                       {
+                       gdouble result;
+
+                       result = image_sim_compare_fast(sd->search_similarity_cd->sim, sd->img_cd->sim,
+                                                       (gdouble)sd->search_similarity / 100.0);
+                       result *= 100.0;
+                       if (result >= (gdouble)sd->search_similarity)
+                               {
+                               tmatch = TRUE;
+                               value = (gint)result;
+                               }
+                       }
+                   
+               if (simval) *simval = value;
+               }
+
+       if (sd->img_cd->dimensions)
+               {
+               if (width) *width = sd->img_cd->width;
+               if (height) *height = sd->img_cd->height;
+               }
+
+       cache_sim_data_free(sd->img_cd);
+       sd->img_cd = NULL;
+
+       *match = (tmatch && tested);
+
+       return FALSE;
+}
+
+static gint search_file_next(SearchData *sd)
+{
+       FileData *fd;
+       gint match = TRUE;
+       gint tested = FALSE;
+       gint extra_only = FALSE;
+       gint width = 0;
+       gint height = 0;
+       gint sim = 0;
+
+       if (!sd->search_file_list) return FALSE;
+
+       if (sd->img_cd)
+               {
+               /* on end of a CacheData load, skip recomparing non-extra match types */
+               extra_only = TRUE;
+               match = FALSE;
+               }
+       else
+               {
+               sd->search_total++;
+               }
+
+       fd = sd->search_file_list->data;
+
+       if (match && sd->match_name_enable && sd->search_name)
+               {
+               tested = TRUE;
+               match = FALSE;
+
+               if (sd->match_name == SEARCH_MATCH_EQUAL)
+                       {
+                       if (sd->search_name_match_case)
+                               {
+                               match = (strcmp(fd->name, sd->search_name) == 0);
+                               }
+                       else
+                               {
+                               match = (strcasecmp(fd->name, sd->search_name) == 0);
+                               }
+                       }
+               else if (sd->match_name == SEARCH_MATCH_CONTAINS)
+                       {
+                       if (sd->search_name_match_case)
+                               {
+                               match = (strstr(fd->name, sd->search_name) != NULL);
+                               }
+                       else
+                               {
+                               /* sd->search_name is converted in search_start() */
+                               gchar *haystack = g_utf8_strdown(fd->name, -1);
+                               match = (strstr(haystack, sd->search_name) != NULL);
+                               g_free(haystack);
+                               }
+                       }
+               }
+
+       if (match && sd->match_size_enable)
+               {
+               tested = TRUE;
+               match = FALSE;
+
+               if (sd->match_size == SEARCH_MATCH_EQUAL)
+                       {
+                       match = (fd->size == sd->search_size);
+                       }
+               else if (sd->match_size == SEARCH_MATCH_UNDER)
+                       {
+                       match = (fd->size < sd->search_size);
+                       }
+               else if (sd->match_size == SEARCH_MATCH_OVER)
+                       {
+                       match = (fd->size > sd->search_size);
+                       }
+               else if (sd->match_size == SEARCH_MATCH_BETWEEN)
+                       {
+                       match = MATCH_IS_BETWEEN(fd->size, sd->search_size, sd->search_size_end);
+                       }
+               }
+
+       if (match && sd->match_date_enable)
+               {
+               tested = TRUE;
+               match = FALSE;
+
+               if (sd->match_date == SEARCH_MATCH_EQUAL)
+                       {
+                       struct tm *lt;
+
+                       lt = localtime(&fd->date);
+                       match = (lt &&
+                                lt->tm_year == sd->search_date_y - 1900 &&
+                                lt->tm_mon == sd->search_date_m - 1 &&
+                                lt->tm_mday == sd->search_date_d);
+                       }
+               else if (sd->match_date == SEARCH_MATCH_UNDER)
+                       {
+                       match = (fd->date < convert_dmy_to_time(sd->search_date_d, sd->search_date_m, sd->search_date_y));
+                       }
+               else if (sd->match_date == SEARCH_MATCH_OVER)
+                       {
+                       match = (fd->date > convert_dmy_to_time(sd->search_date_d, sd->search_date_m, sd->search_date_y) + 60 * 60 * 24 - 1);
+                       }
+               else if (sd->match_date == SEARCH_MATCH_BETWEEN)
+                       {
+                       time_t a = convert_dmy_to_time(sd->search_date_d, sd->search_date_m, sd->search_date_y);
+                       time_t b = convert_dmy_to_time(sd->search_date_end_d, sd->search_date_end_m, sd->search_date_end_y);
+
+                       if (b >= a)
+                               {
+                               b += 60 * 60 * 24 - 1;
+                               }
+                       else
+                               {
+                               a += 60 * 60 * 24 - 1;
+                               }
+                       match = MATCH_IS_BETWEEN(fd->date, a, b);
+                       }
+               }
+
+       if (match && sd->match_keywords_enable && sd->search_keyword_list)
+               {
+               GList *list;
+
+               tested = TRUE;
+               match = FALSE;
+
+               if (comment_cache_read(fd->path, &list, NULL))
+                       {
+                       GList *needle;
+                       GList *haystack;
+
+                       if (sd->match_keywords == SEARCH_MATCH_ALL)
+                               {
+                               gint found = TRUE;
+
+                               needle = sd->search_keyword_list;
+                               while (needle && found)
+                                       {
+                                       found = FALSE;
+                                       haystack = list;
+                                       while (haystack && !found)
+                                               {
+                                               found = (strcasecmp((gchar *)needle->data,
+                                                                   (gchar *)haystack->data) == 0);
+                                               haystack = haystack->next;
+                                               }
+                                       needle = needle->next;
+                                       }
+
+                               match = found;
+                               }
+                       else if (sd->match_keywords == SEARCH_MATCH_ANY)
+                               {
+                               gint found = FALSE;
+
+                               needle = sd->search_keyword_list;
+                               while (needle && !found)
+                                       {
+                                       haystack = list;
+                                       while (haystack && !found)
+                                               {
+                                               found = (strcasecmp((gchar *)needle->data,
+                                                                   (gchar *)haystack->data) == 0);
+                                               haystack = haystack->next;
+                                               }
+                                       needle = needle->next;
+                                       }
+
+                               match = found;
+                               }
+                       else if (sd->match_keywords == SEARCH_MATCH_NONE)
+                               {
+                               gint found = FALSE;
+
+                               needle = sd->search_keyword_list;
+                               while (needle && !found)
+                                       {
+                                       haystack = list;
+                                       while (haystack && !found)
+                                               {
+                                               found = (strcasecmp((gchar *)needle->data,
+                                                                   (gchar *)haystack->data) == 0);
+                                               haystack = haystack->next;
+                                               }
+                                       needle = needle->next;
+                                       }
+
+                               match = !found;
+                               }
+                       path_list_free(list);
+                       }
+               else
+                       {
+                       match = (sd->match_keywords == SEARCH_MATCH_NONE);
+                       }
+               }
+
+       if ((match || extra_only) &&
+           (sd->match_dimensions_enable || sd->match_similarity_enable))
+               {
+               tested = TRUE;
+
+               if (search_file_do_extra(sd, fd, &match, &width, &height, &sim))
+                       {
+                       sd->search_buffer_count += SEARCH_BUFFER_MATCH_LOAD;
+                       return TRUE;
+                       }
+               }
+
+       sd->search_file_list = g_list_remove(sd->search_file_list, fd);
+
+       if (tested && match)
+               {
+               MatchFileData *mfd;
+
+               mfd = g_new(MatchFileData, 1);
+               memcpy(mfd, fd, sizeof(FileData));
+               g_free(fd);
+
+               mfd->width = width;
+               mfd->height = height;
+               mfd->rank = sim;
+
+               sd->search_buffer_list = g_list_prepend(sd->search_buffer_list, mfd);
+               sd->search_buffer_count += SEARCH_BUFFER_MATCH_HIT;
+               sd->search_count++;
+               search_progress_update(sd, TRUE, -1.0);
+               }
+       else
+               {
+               file_data_free(fd);
+               sd->search_buffer_count += SEARCH_BUFFER_MATCH_MISS;
+               }
+
+       return FALSE;
+}
+
+static gint search_step_cb(gpointer data)
+{
+       SearchData *sd = data;
+       FileData *fd;
+
+       if (sd->search_buffer_count > SEARCH_BUFFER_FLUSH_SIZE)
+               {
+               search_buffer_flush(sd);
+               search_progress_update(sd, TRUE, -1.0);
+               }
+
+       if (sd->search_file_list)
+               {
+               if (search_file_next(sd))
+                       {
+                       sd->search_idle_id = -1;
+                       return FALSE;
+                       }
+               return TRUE;
+               }
+
+       if (!sd->search_file_list && !sd->search_folder_list)
+               {
+               sd->search_idle_id = -1;
+
+               search_stop(sd);
+               search_result_thumb_step(sd);
+
+               return FALSE;
+               }
+
+       fd = sd->search_folder_list->data;
+
+       if (g_list_find(sd->search_done_list, fd) == NULL)
+               {
+               GList *list = NULL;
+               GList *dlist = NULL;
+               gint success = FALSE;
+
+               sd->search_done_list = g_list_prepend(sd->search_done_list, fd);
+
+               if (sd->search_type == SEARCH_MATCH_NONE)
+                       {
+                       success = filelist_read(fd->path, &list, &dlist);
+                       }
+               else if (sd->search_type == SEARCH_MATCH_ALL &&
+                        sd->search_path &&
+                        strlen(fd->path) >= strlen(sd->search_path))
+                       {
+                       const gchar *path;
+
+                       path = fd->path + strlen(sd->search_path);
+                       if (path != fd->path) success = filelist_read(path, &list, NULL);
+                       success |= filelist_read(fd->path, NULL, &dlist);
+                       if (success)
+                               {
+                               GList *work;
+
+                               work = list;
+                               while (work)
+                                       {
+                                       FileData *fdp;
+                                       GList *link;
+                                       gchar *meta_path;
+
+                                       fdp = work->data;
+                                       link = work;
+                                       work = work->next;
+
+                                       meta_path = cache_find_location(CACHE_TYPE_METADATA, fdp->path);
+                                       if (!meta_path)
+                                               {
+                                               list = g_list_delete_link(list, link);
+                                               file_data_free(fdp);
+                                               }
+                                       g_free(meta_path);
+                                       }
+                               }
+                       }
+
+               if (success)
+                       {
+                       list = filelist_sort(list, SORT_NAME, TRUE);
+                       sd->search_file_list = list;
+
+                       if (sd->search_path_recurse)
+                               {
+                               dlist = filelist_sort(dlist, SORT_NAME, TRUE);
+                               sd->search_folder_list = g_list_concat(dlist, sd->search_folder_list);
+                               }
+                       else
+                               {
+                               filelist_free(dlist);
+                               }
+                       }
+               }
+       else
+               {
+               sd->search_folder_list = g_list_remove(sd->search_folder_list, fd);
+               sd->search_done_list = g_list_remove(sd->search_done_list, fd);
+               file_data_free(fd);
+               }
+
+       return TRUE;
+}
+
+static void search_similarity_load_done_cb(ImageLoader *il, gpointer data)
+{
+       SearchData *sd = data;
+       search_file_load_process(sd, sd->search_similarity_cd);
+}
+
+static void search_start(SearchData *sd)
+{
+       search_stop(sd);
+       search_result_clear(sd);
+
+       if (sd->search_path)
+               {
+               sd->search_folder_list = g_list_prepend(sd->search_folder_list,
+                                                       file_data_new_simple(sd->search_path));
+               }
+
+       if (!sd->search_name_match_case)
+               {
+               /* convert to lowercase here, so that this is only done once per search */
+               gchar *tmp = g_utf8_strdown(sd->search_name, -1);
+               g_free(sd->search_name);
+               sd->search_name = tmp;
+               }
+
+       sd->search_count = 0;
+       sd->search_total = 0;
+
+       gtk_widget_set_sensitive(sd->box_search, FALSE);
+       spinner_set_interval(sd->spinner, SPINNER_SPEED);
+       gtk_widget_set_sensitive(sd->button_start, FALSE);
+       gtk_widget_set_sensitive(sd->button_stop, TRUE);
+       search_progress_update(sd, TRUE, -1.0);
+
+       if (sd->match_similarity_enable &&
+           !sd->search_similarity_cd &&
+           isfile(sd->search_similarity_path))
+               {
+               gchar *cd_path;
+
+               cd_path = cache_find_location(CACHE_TYPE_SIM, sd->search_similarity_path);
+               if (cd_path && filetime(sd->search_similarity_path) == filetime(cd_path))
+                       {
+                       sd->search_similarity_cd = cache_sim_data_load(cd_path);
+                       }
+               g_free(cd_path);
+
+               if (!sd->search_similarity_cd || !sd->search_similarity_cd->similarity)
+                       {
+                       if (!sd->search_similarity_cd)
+                               {
+                               sd->search_similarity_cd = cache_sim_data_new();
+                               }
+
+                       sd->img_loader = image_loader_new(sd->search_similarity_path);
+                       image_loader_set_error_func(sd->img_loader, search_similarity_load_done_cb, sd);
+                       if (image_loader_start(sd->img_loader, search_similarity_load_done_cb, sd))
+                               {
+                               return;
+                               }
+                       image_loader_free(sd->img_loader);
+                       sd->img_loader = NULL;
+                       }
+                       
+               }
+
+       sd->search_idle_id = g_idle_add(search_step_cb, sd);
+}
+
+static void search_start_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+       GtkTreeViewColumn *column;
+       gchar *path;
+
+       if (sd->search_folder_list)
+               {
+               search_stop(sd);
+               search_result_thumb_step(sd);
+               return;
+               }
+
+       if (sd->match_name_enable) history_combo_append_history(sd->entry_name, NULL);
+       g_free(sd->search_name);
+       sd->search_name = g_strdup(gtk_entry_get_text(GTK_ENTRY(sd->entry_name)));
+
+       g_free(sd->search_similarity_path);
+       sd->search_similarity_path = g_strdup(gtk_entry_get_text(GTK_ENTRY(sd->entry_similarity)));
+       if (sd->match_similarity_enable)
+               {
+               if (!isfile(sd->search_similarity_path))
+                       {
+                       file_util_warning_dialog(_("File not found"),
+                                                _("Please enter an existing file for image content."),
+                                                GTK_STOCK_DIALOG_WARNING, sd->window);
+                       return;
+                       }
+               tab_completion_append_to_history(sd->entry_similarity, sd->search_similarity_path);
+               }
+
+       path_list_free(sd->search_keyword_list);
+       sd->search_keyword_list = keyword_list_pull(sd->entry_keywords);
+
+       date_selection_get(sd->date_sel, &sd->search_date_d, &sd->search_date_m, &sd->search_date_y);
+       date_selection_get(sd->date_sel_end, &sd->search_date_end_d, &sd->search_date_end_m, &sd->search_date_end_y);
+
+       column = gtk_tree_view_get_column(GTK_TREE_VIEW(sd->result_view), SEARCH_COLUMN_RANK - 1);
+       gtk_tree_view_column_set_visible(column, sd->match_similarity_enable);
+       if (!sd->match_similarity_enable)
+               {
+               GtkTreeSortable *sortable;
+               gint id;
+               GtkSortType order;
+
+               sortable = GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(sd->result_view)));
+               if (gtk_tree_sortable_get_sort_column_id(sortable, &id, &order) &&
+                   id == SEARCH_COLUMN_RANK)
+                       {
+                       gtk_tree_sortable_set_sort_column_id(sortable, SEARCH_COLUMN_PATH, GTK_SORT_ASCENDING);
+                       }
+               }
+
+       if (sd->search_type == SEARCH_MATCH_NONE)
+               {
+               /* search path */
+
+               path = remove_trailing_slash(gtk_entry_get_text(GTK_ENTRY(sd->path_entry)));
+               if (isdir(path))
+                       {
+                       g_free(sd->search_path);
+                       sd->search_path = path;
+                       path = NULL;
+
+                       tab_completion_append_to_history(sd->path_entry, sd->search_path);
+
+                       search_start(sd);
+                       }
+               else
+                       {
+                       file_util_warning_dialog(_("Folder not found"),
+                                                _("Please enter an existing folder to search."),
+                                                GTK_STOCK_DIALOG_WARNING, sd->window);
+                       }
+
+               g_free(path);
+               }
+       else if (sd->search_type == SEARCH_MATCH_ALL)
+               {
+               /* search metadata */
+
+               g_free(sd->search_path);
+               sd->search_path = g_strconcat(homedir(), "/", GQVIEW_CACHE_RC_METADATA, NULL);
+
+               search_start(sd);
+               }
+       else if (sd->search_type == SEARCH_MATCH_CONTAINS)
+               {
+               /* search current result list */
+               GList *list;
+
+               list = search_result_refine_list(sd);
+
+               g_free(sd->search_path);
+               sd->search_path = NULL;
+
+               search_start(sd);
+
+               sd->search_file_list = g_list_concat(sd->search_file_list, list);
+               }
+}
+
+/*
+ *-------------------------------------------------------------------
+ * window construct
+ *-------------------------------------------------------------------
+ */
+
+enum {
+       MENU_CHOICE_COLUMN_NAME = 0,
+       MENU_CHOICE_COLUMN_VALUE
+};
+
+static void search_thumb_toggle_cb(GtkWidget *button, gpointer data)
+{
+       SearchData *sd = data;
+
+       search_result_thumb_enable(sd, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)));
+}
+
+static gint sort_matchdata_dimensions(MatchFileData *a, MatchFileData *b)
+{
+       gint sa;
+       gint sb;
+
+       sa = a->width * a->height;
+       sb = b->width * b->height;
+
+       if (sa > sb) return 1;
+       if (sa < sb) return -1;
+       return 0;
+}
+
+static gint search_result_sort_cb(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer data)
+{
+       gint n = GPOINTER_TO_INT(data);
+       FileData *fda;
+       FileData *fdb;
+
+       gtk_tree_model_get(model, a, SEARCH_COLUMN_POINTER, &fda, -1);
+       gtk_tree_model_get(model, b, SEARCH_COLUMN_POINTER, &fdb, -1);
+
+       if (!fda || !fdb) return 0;
+
+       switch (n)
+               {
+               case SEARCH_COLUMN_RANK:
+                       if (((MatchFileData *)fda)->rank > ((MatchFileData *)fdb)->rank) return 1;
+                       if (((MatchFileData *)fda)->rank < ((MatchFileData *)fdb)->rank) return -1;
+                       return 0;
+                       break;
+               case SEARCH_COLUMN_NAME:
+                       return CASE_SORT(fda->name, fdb->name);
+                       break;
+               case SEARCH_COLUMN_SIZE:
+                       if (fda->size > fdb->size) return 1;
+                       if (fda->size < fdb->size) return -1;
+                       return 0;
+                       break;
+               case SEARCH_COLUMN_DATE:
+                       if (fda->date > fdb->date) return 1;
+                       if (fda->date < fdb->date) return -1;
+                       return 0;
+                       break;
+               case SEARCH_COLUMN_DIMENSIONS:
+                       return sort_matchdata_dimensions((MatchFileData *)fda, (MatchFileData *)fdb);
+                       break;
+               case SEARCH_COLUMN_PATH:
+                       return CASE_SORT(fda->path, fdb->path);
+                       break;
+               default:
+                       break;
+               }
+
+       return 0;
+}
+
+static void search_result_add_column(SearchData * sd, gint n, const gchar *title, gint image, gint right_justify)
+{
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_title(column, title);
+       gtk_tree_view_column_set_min_width(column, 4);
+
+       if (n != SEARCH_COLUMN_THUMB) gtk_tree_view_column_set_resizable(column, TRUE);
+
+       if (!image)
+               {
+               gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
+               renderer = gtk_cell_renderer_text_new();
+               if (right_justify) g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
+               gtk_tree_view_column_pack_start(column, renderer, TRUE);
+               gtk_tree_view_column_add_attribute(column, renderer, "text", n);
+
+               gtk_tree_view_column_set_sort_column_id(column, n);
+               }
+       else
+               {
+               gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+               renderer = gtk_cell_renderer_pixbuf_new();
+               cell_renderer_height_override(renderer);
+               gtk_tree_view_column_pack_start(column, renderer, TRUE);
+               gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", n);
+               }
+
+       gtk_tree_view_append_column(GTK_TREE_VIEW(sd->result_view), column);
+}
+
+static void menu_choice_set_visible(GtkWidget *widget, gint visible)
+{
+       if (visible)
+               {
+               if (!GTK_WIDGET_VISIBLE(widget)) gtk_widget_show(widget);
+               }
+       else
+               {
+               if (GTK_WIDGET_VISIBLE(widget)) gtk_widget_hide(widget);
+               }
+}
+
+static void menu_choice_path_cb(GtkWidget *combo, gpointer data)
+{
+       SearchData *sd = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+
+       store = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
+       if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter)) return;
+       gtk_tree_model_get(store, &iter, MENU_CHOICE_COLUMN_VALUE, &sd->search_type, -1);
+
+       menu_choice_set_visible(gtk_widget_get_parent(sd->check_recurse),
+                               (sd->search_type == SEARCH_MATCH_NONE));
+}
+
+static void menu_choice_name_cb(GtkWidget *combo, gpointer data)
+{
+       SearchData *sd = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+
+       store = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
+       if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter)) return;
+       gtk_tree_model_get(store, &iter, MENU_CHOICE_COLUMN_VALUE, &sd->match_name, -1);
+}
+
+static void menu_choice_size_cb(GtkWidget *combo, gpointer data)
+{
+       SearchData *sd = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+
+       store = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
+       if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter)) return;
+       gtk_tree_model_get(store, &iter, MENU_CHOICE_COLUMN_VALUE, &sd->match_size, -1);
+
+       menu_choice_set_visible(gtk_widget_get_parent(sd->spin_size_end),
+                               (sd->match_size == SEARCH_MATCH_BETWEEN));
+}
+
+static void menu_choice_date_cb(GtkWidget *combo, gpointer data)
+{
+       SearchData *sd = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+
+       store = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
+       if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter)) return;
+       gtk_tree_model_get(store, &iter, MENU_CHOICE_COLUMN_VALUE, &sd->match_date, -1);
+
+       menu_choice_set_visible(gtk_widget_get_parent(sd->date_sel_end),
+                               (sd->match_date == SEARCH_MATCH_BETWEEN));
+}
+
+static void menu_choice_dimensions_cb(GtkWidget *combo, gpointer data)
+{
+       SearchData *sd = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+
+       store = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
+       if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter)) return;
+       gtk_tree_model_get(store, &iter, MENU_CHOICE_COLUMN_VALUE, &sd->match_dimensions, -1);
+
+       menu_choice_set_visible(gtk_widget_get_parent(sd->spin_width_end),
+                               (sd->match_dimensions == SEARCH_MATCH_BETWEEN));
+}
+
+static void menu_choice_keyword_cb(GtkWidget *combo, gpointer data)
+{
+       SearchData *sd = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+
+       store = gtk_combo_box_get_model(GTK_COMBO_BOX(combo));
+       if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo), &iter)) return;
+       gtk_tree_model_get(store, &iter, MENU_CHOICE_COLUMN_VALUE, &sd->match_keywords, -1);
+}
+
+static void menu_choice_spin_cb(GtkAdjustment *adjustment, gpointer data)
+{
+       gint *value = data;
+
+       *value = (gint)gtk_adjustment_get_value(adjustment);
+}
+
+static GtkWidget *menu_spin(GtkWidget *box, gdouble min, gdouble max, gint value,
+                           GCallback func, gpointer data)
+{
+       GtkWidget *spin;
+       GtkAdjustment *adj;
+
+       spin = gtk_spin_button_new_with_range(min, max, 1);
+       gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), (gdouble)value);
+       adj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(spin));
+       if (func) g_signal_connect(G_OBJECT(adj), "value_changed",
+                                  G_CALLBACK(func), data);
+       gtk_box_pack_start(GTK_BOX(box), spin, FALSE, FALSE, 0);
+       gtk_widget_show(spin);
+
+       return spin;
+}
+
+static void menu_choice_check_cb(GtkWidget *button, gpointer data)
+{
+       GtkWidget *widget = data;
+       gboolean active;
+       gboolean *value;
+
+       active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
+       gtk_widget_set_sensitive(widget, active);
+
+       value = g_object_get_data(G_OBJECT(button), "check_var");
+       if (value) *value = active;
+}
+
+static GtkWidget *menu_choice_menu(const MatchList *items, gint item_count,
+                                  GCallback func, gpointer data)
+{
+       GtkWidget *combo;
+       GtkCellRenderer *renderer;
+       GtkListStore *store;
+       gint i;
+
+       store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
+       combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       renderer = gtk_cell_renderer_text_new();
+       gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, TRUE);
+       gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), renderer,
+                                      "text", MENU_CHOICE_COLUMN_NAME, NULL);
+
+       for (i = 0; i < item_count; i++)
+               {
+               GtkTreeIter iter;
+
+               gtk_list_store_append(store, &iter);
+               gtk_list_store_set(store, &iter, MENU_CHOICE_COLUMN_NAME, _(items[i].text),
+                                                MENU_CHOICE_COLUMN_VALUE, items[i].type, -1);
+               }
+
+       gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
+
+       if (func) g_signal_connect(G_OBJECT(combo), "changed",
+                                  G_CALLBACK(func), data);
+
+       return combo;
+}
+
+static GtkWidget *menu_choice(GtkWidget *box, GtkWidget **check, GtkWidget **menu,
+                             const gchar *text, gboolean *value,
+                             const MatchList *items, gint item_count,
+                             GCallback func, gpointer data)
+{
+       GtkWidget *base_box;
+       GtkWidget *hbox;
+       GtkWidget *button;
+       GtkWidget *option;
+
+       base_box = gtk_hbox_new(FALSE, PREF_PAD_GAP);
+       gtk_box_pack_start(GTK_BOX(box), base_box, FALSE, FALSE, 0);
+       gtk_widget_show(base_box);
+
+       button = gtk_check_button_new();
+       if (value) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), *value);
+       gtk_box_pack_start(GTK_BOX(base_box), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+       if (check) *check = button;
+       if (value) g_object_set_data(G_OBJECT(button), "check_var", value);
+
+       hbox = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
+       gtk_box_pack_start(GTK_BOX(base_box), hbox, TRUE, TRUE, 0);
+       gtk_widget_show(hbox);
+
+       g_signal_connect(G_OBJECT(button), "toggled",
+                        G_CALLBACK(menu_choice_check_cb), hbox);
+       gtk_widget_set_sensitive(hbox, (value) ? *value : FALSE);
+
+       pref_label_new(hbox, text);
+
+       if (!items && !menu) return hbox;
+
+       option = menu_choice_menu(items, item_count, func, data);
+       gtk_box_pack_start(GTK_BOX(hbox), option, FALSE, FALSE, 0);
+       gtk_widget_show(option);
+       if (menu) *menu = option;
+
+       return hbox;
+}
+
+static void search_window_close(SearchData *sd)
+{
+       gtk_widget_destroy(sd->window);
+}
+
+static gint search_window_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
+{
+       SearchData *sd = data;
+
+       search_window_close(sd);
+       return TRUE;
+}
+
+static void search_window_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       SearchData *sd = data;
+
+       search_window_list = g_list_remove(search_window_list, sd);
+
+       search_result_update_idle_cancel(sd);
+
+       filelist_free(sd->search_buffer_list);
+       sd->search_buffer_list = NULL;
+
+       search_stop(sd);
+       search_result_clear(sd);
+
+       g_free(sd->search_path);
+       g_free(sd->search_name);
+       g_free(sd->search_similarity_path);
+       path_list_free(sd->search_keyword_list);
+
+       g_free(sd);
+}
+
+void search_new(const gchar *path, const gchar *example_file)
+{
+       SearchData *sd;
+       GtkWidget *vbox;
+       GtkWidget *hbox;
+       GtkWidget *hbox2;
+       GtkWidget *pad_box;
+       GtkWidget *frame;
+       GtkWidget *scrolled;
+       GtkListStore *store;
+       GtkTreeSortable *sortable;
+       GtkTreeSelection *selection;
+       GtkWidget *combo;
+       GdkGeometry geometry;
+
+       sd = g_new0(SearchData, 1);
+
+       sd->search_path = g_strdup(path);
+       sd->search_path_recurse = TRUE;
+       sd->search_size = 0;
+       sd->search_width = 640;
+       sd->search_height = 480;
+       sd->search_width_end = 1024;
+       sd->search_height_end = 768;
+       sd->search_name = NULL;
+       sd->search_name_match_case = FALSE;
+
+       sd->search_type = SEARCH_MATCH_NONE;
+
+       sd->match_name = SEARCH_MATCH_CONTAINS;
+       sd->match_size = SEARCH_MATCH_EQUAL;
+       sd->match_date = SEARCH_MATCH_EQUAL;
+       sd->match_dimensions = SEARCH_MATCH_EQUAL;
+       sd->match_keywords = SEARCH_MATCH_ALL;
+
+       sd->match_name_enable = TRUE;
+       sd->match_size_enable = FALSE;
+       sd->match_date_enable = FALSE;
+       sd->match_dimensions_enable = FALSE;
+       sd->match_similarity_enable = FALSE;
+       sd->match_keywords_enable = FALSE;
+
+       sd->search_similarity = 95;
+       sd->search_similarity_path = g_strdup(example_file);
+       sd->search_similarity_cd = NULL;
+
+       sd->search_idle_id = -1;
+       sd->update_idle_id = -1;
+
+       sd->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+       window_set_icon(sd->window, NULL, NULL);
+
+       gtk_window_set_resizable(GTK_WINDOW(sd->window), TRUE);
+       gtk_window_set_title(GTK_WINDOW(sd->window), _("Image search - GQview"));
+       gtk_window_set_wmclass(GTK_WINDOW(sd->window), "search", "GQview");
+
+       geometry.min_width = 32;
+       geometry.min_height = 32;
+       geometry.base_width = DEF_SEARCH_WIDTH;
+       geometry.base_height = DEF_SEARCH_HEIGHT;
+       gtk_window_set_geometry_hints(GTK_WINDOW(sd->window), NULL, &geometry,
+                                     GDK_HINT_MIN_SIZE | GDK_HINT_BASE_SIZE);
+
+       gtk_window_set_default_size(GTK_WINDOW(sd->window), DEF_SEARCH_WIDTH, DEF_SEARCH_HEIGHT);
+
+       g_signal_connect(G_OBJECT(sd->window), "delete_event",
+                        G_CALLBACK(search_window_delete_cb), sd);
+       g_signal_connect(G_OBJECT(sd->window), "destroy",
+                        G_CALLBACK(search_window_destroy_cb), sd);
+
+       g_signal_connect(G_OBJECT(sd->window), "key_press_event",
+                        G_CALLBACK(search_window_keypress_cb), sd);
+
+       vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+       gtk_container_set_border_width(GTK_CONTAINER(vbox), PREF_PAD_GAP);
+       gtk_container_add(GTK_CONTAINER(sd->window), vbox);
+       gtk_widget_show(vbox);
+
+       sd->box_search = pref_box_new(vbox, FALSE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
+
+       hbox = pref_box_new(sd->box_search, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+
+       pref_label_new(hbox, _("Search:"));
+
+       sd->menu_path = menu_choice_menu(text_search_menu_path, sizeof(text_search_menu_path) / sizeof(MatchList),
+                                        G_CALLBACK(menu_choice_path_cb), sd);
+       gtk_box_pack_start(GTK_BOX(hbox), sd->menu_path, FALSE, FALSE, 0);
+       gtk_widget_show(sd->menu_path);
+
+       hbox2 = pref_box_new(hbox, TRUE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+       combo = tab_completion_new_with_history(&sd->path_entry, sd->search_path,
+                                               "search_path", -1,
+                                               NULL, NULL);
+       tab_completion_add_select_button(sd->path_entry, NULL, TRUE);
+       gtk_box_pack_start(GTK_BOX(hbox2), combo, TRUE, TRUE, 0);
+       gtk_widget_show(combo);
+       sd->check_recurse = pref_checkbox_new_int(hbox2, _("Recurse"),
+                                                 sd->search_path_recurse, &sd->search_path_recurse);
+
+       hbox = menu_choice(sd->box_search, &sd->check_name, &sd->menu_name,
+                          _("File name"), &sd->match_name_enable,
+                          text_search_menu_name, sizeof(text_search_menu_name) / sizeof(MatchList),
+                          G_CALLBACK(menu_choice_name_cb), sd);
+       combo = history_combo_new(&sd->entry_name, "", "search_name", -1);
+       gtk_box_pack_start(GTK_BOX(hbox), combo, TRUE, TRUE, 0);
+       gtk_widget_show(combo);
+       pref_checkbox_new_int(hbox, _("Match case"),
+                             sd->search_name_match_case, &sd->search_name_match_case);
+
+       hbox = menu_choice(sd->box_search, &sd->check_size, &sd->menu_size,
+                          _("File size is"), &sd->match_size_enable,
+                          text_search_menu_size, sizeof(text_search_menu_size) / sizeof(MatchList),
+                          G_CALLBACK(menu_choice_size_cb), sd);
+       sd->spin_size = menu_spin(hbox, 0, 1024*1024*1024, sd->search_size,
+                                 G_CALLBACK(menu_choice_spin_cb), &sd->search_size);
+       hbox2 = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
+       gtk_box_pack_start(GTK_BOX(hbox), hbox2, FALSE, FALSE, 0);
+       pref_label_new(hbox2, _("and"));
+       sd->spin_size_end = menu_spin(hbox2, 0, 1024*1024*1024, sd->search_size_end,
+                                     G_CALLBACK(menu_choice_spin_cb), &sd->search_size_end);
+
+       hbox = menu_choice(sd->box_search, &sd->check_date, &sd->menu_date,
+                          _("File date is"), &sd->match_date_enable,
+                          text_search_menu_date, sizeof(text_search_menu_date) / sizeof(MatchList),
+                          G_CALLBACK(menu_choice_date_cb), sd);
+       sd->date_sel = date_selection_new();
+       date_selection_time_set(sd->date_sel, time(NULL));
+       gtk_box_pack_start(GTK_BOX(hbox), sd->date_sel, FALSE, FALSE, 0);
+       gtk_widget_show(sd->date_sel);
+
+       hbox2 = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
+       gtk_box_pack_start(GTK_BOX(hbox), hbox2, FALSE, FALSE, 0);
+       pref_label_new(hbox2, _("and"));
+       sd->date_sel_end = date_selection_new();
+       date_selection_time_set(sd->date_sel_end, time(NULL));
+       gtk_box_pack_start(GTK_BOX(hbox2), sd->date_sel_end, FALSE, FALSE, 0);
+       gtk_widget_show(sd->date_sel_end);
+
+       hbox = menu_choice(sd->box_search, &sd->check_dimensions, &sd->menu_dimensions,
+                          _("Image dimensions are"), &sd->match_dimensions_enable,
+                          text_search_menu_size, sizeof(text_search_menu_size) / sizeof(MatchList),
+                          G_CALLBACK(menu_choice_dimensions_cb), sd);
+       pad_box = pref_box_new(hbox, FALSE, GTK_ORIENTATION_HORIZONTAL, 2);
+       sd->spin_width = menu_spin(pad_box, 0, 1000000, sd->search_width,
+                                  G_CALLBACK(menu_choice_spin_cb), &sd->search_width);
+       pref_label_new(pad_box, "x");
+       sd->spin_height = menu_spin(pad_box, 0, 1000000, sd->search_height,
+                                   G_CALLBACK(menu_choice_spin_cb), &sd->search_height);
+       hbox2 = gtk_hbox_new(FALSE, 2);
+       gtk_box_pack_start(GTK_BOX(hbox), hbox2, FALSE, FALSE, 0);
+       pref_label_new(hbox2, _("and"));
+       pref_spacer(hbox2, PREF_PAD_SPACE - 2*2);
+       sd->spin_width_end = menu_spin(hbox2, 0, 1000000, sd->search_width_end,
+                                      G_CALLBACK(menu_choice_spin_cb), &sd->search_width_end);
+       pref_label_new(hbox2, "x");
+       sd->spin_height_end = menu_spin(hbox2, 0, 1000000, sd->search_height_end,
+                                       G_CALLBACK(menu_choice_spin_cb), &sd->search_height_end);
+
+       hbox = menu_choice(sd->box_search, &sd->check_similarity, NULL,
+                          _("Image content is"), &sd->match_similarity_enable,
+                          NULL, 0, NULL, sd);
+       sd->spin_similarity = menu_spin(hbox, 80, 100, sd->search_similarity,
+                                       G_CALLBACK(menu_choice_spin_cb), &sd->search_similarity);
+
+       /* xgettext:no-c-format */
+       pref_label_new(hbox, _("% similar to"));
+
+       combo = tab_completion_new_with_history(&sd->entry_similarity,
+                                               (sd->search_similarity_path) ? sd->search_similarity_path : "",
+                                               "search_similarity_path", -1, NULL, NULL);
+       tab_completion_add_select_button(sd->entry_similarity, NULL, FALSE);
+       gtk_box_pack_start(GTK_BOX(hbox), combo, TRUE, TRUE, 0);
+       gtk_widget_show(combo);
+
+       hbox = menu_choice(sd->box_search, &sd->check_keywords, &sd->menu_keywords,
+                          _("Keywords"), &sd->match_keywords_enable,
+                          text_search_menu_keyword, sizeof(text_search_menu_keyword) / sizeof(MatchList),
+                          G_CALLBACK(menu_choice_keyword_cb), sd);
+       sd->entry_keywords = gtk_entry_new();
+       gtk_box_pack_start(GTK_BOX(hbox), sd->entry_keywords, TRUE, TRUE, 0);
+       gtk_widget_set_sensitive(sd->entry_keywords, sd->match_keywords_enable);
+       g_signal_connect(G_OBJECT(sd->check_keywords), "toggled",
+                        G_CALLBACK(menu_choice_check_cb), sd->entry_keywords);
+       gtk_widget_show(sd->entry_keywords);
+
+       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+       gtk_box_pack_start(GTK_BOX(vbox), scrolled, TRUE, TRUE, 0);
+       gtk_widget_show(scrolled);
+
+       store = gtk_list_store_new(8, G_TYPE_POINTER, G_TYPE_INT, GDK_TYPE_PIXBUF,
+                                  G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+                                  G_TYPE_STRING, G_TYPE_STRING);
+
+       /* set up sorting */
+       sortable = GTK_TREE_SORTABLE(store);
+       gtk_tree_sortable_set_sort_func(sortable, SEARCH_COLUMN_RANK, search_result_sort_cb,
+                                 GINT_TO_POINTER(SEARCH_COLUMN_RANK), NULL);
+       gtk_tree_sortable_set_sort_func(sortable, SEARCH_COLUMN_NAME, search_result_sort_cb,
+                                 GINT_TO_POINTER(SEARCH_COLUMN_NAME), NULL);
+       gtk_tree_sortable_set_sort_func(sortable, SEARCH_COLUMN_SIZE, search_result_sort_cb,
+                                 GINT_TO_POINTER(SEARCH_COLUMN_SIZE), NULL);
+       gtk_tree_sortable_set_sort_func(sortable, SEARCH_COLUMN_DATE, search_result_sort_cb,
+                                 GINT_TO_POINTER(SEARCH_COLUMN_DATE), NULL);
+       gtk_tree_sortable_set_sort_func(sortable, SEARCH_COLUMN_DIMENSIONS, search_result_sort_cb,
+                                 GINT_TO_POINTER(SEARCH_COLUMN_DIMENSIONS), NULL);
+       gtk_tree_sortable_set_sort_func(sortable, SEARCH_COLUMN_PATH, search_result_sort_cb,
+                                 GINT_TO_POINTER(SEARCH_COLUMN_PATH), NULL);
+
+#if 0
+       /* by default, search results are unsorted until user selects a sort column - for speed,
+        * using sort slows search speed by an order of magnitude with 1000's of results :-/
+        */
+       gtk_tree_sortable_set_sort_column_id(sortable, SEARCH_COLUMN_PATH, GTK_SORT_ASCENDING);
+#endif
+
+       sd->result_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+       gtk_container_add(GTK_CONTAINER(scrolled), sd->result_view);
+       gtk_widget_show(sd->result_view);
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(sd->result_view));
+       gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_MULTIPLE);
+       gtk_tree_selection_set_select_function(selection, search_result_select_cb, sd, NULL);
+
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(sd->result_view), TRUE);
+       gtk_tree_view_set_enable_search(GTK_TREE_VIEW(sd->result_view), FALSE);
+
+#if 0
+       gtk_tree_view_set_search_column(GTK_TREE_VIEW(sd->result_view), SEARCH_COLUMN_NAME);
+#endif
+
+       search_result_add_column(sd, SEARCH_COLUMN_RANK, _("Rank"), FALSE, FALSE);
+       search_result_add_column(sd, SEARCH_COLUMN_THUMB, "", TRUE, FALSE);
+       search_result_add_column(sd, SEARCH_COLUMN_NAME, _("Name"), FALSE, FALSE);
+       search_result_add_column(sd, SEARCH_COLUMN_SIZE, _("Size"), FALSE, TRUE);
+       search_result_add_column(sd, SEARCH_COLUMN_DATE, _("Date"), FALSE, TRUE);
+       search_result_add_column(sd, SEARCH_COLUMN_DIMENSIONS, _("Dimensions"), FALSE, FALSE);
+       search_result_add_column(sd, SEARCH_COLUMN_PATH, _("Path"), FALSE, FALSE);
+
+       search_dnd_init(sd);
+
+       g_signal_connect(G_OBJECT(sd->result_view), "button_press_event",
+                        G_CALLBACK(search_result_press_cb), sd);
+       g_signal_connect(G_OBJECT(sd->result_view), "button_release_event",
+                        G_CALLBACK(search_result_release_cb), sd);
+       g_signal_connect(G_OBJECT(sd->result_view), "key_press_event",
+                        G_CALLBACK(search_result_keypress_cb), sd);
+
+       hbox = pref_box_new(vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, 0);
+
+       sd->button_thumbs = pref_checkbox_new(hbox, _("Thumbnails"), FALSE,
+                                             G_CALLBACK(search_thumb_toggle_cb), sd);
+
+       frame = gtk_frame_new(NULL);
+       gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_IN);
+       gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, PREF_PAD_SPACE);
+       gtk_widget_show(frame);
+
+       sd->label_status = gtk_label_new("");
+       gtk_widget_set_size_request(sd->label_status, 50, -1);
+       gtk_container_add(GTK_CONTAINER(frame), sd->label_status);
+       gtk_widget_show(sd->label_status);
+
+       sd->label_progress = gtk_progress_bar_new();
+       gtk_widget_set_size_request(sd->label_progress, 50, -1);
+       gtk_box_pack_start(GTK_BOX(hbox), sd->label_progress, TRUE, TRUE, 0);
+       gtk_widget_show(sd->label_progress);
+
+       sd->spinner = spinner_new(NULL, -1);
+       gtk_box_pack_start(GTK_BOX(hbox), sd->spinner, FALSE, FALSE, 0);
+       gtk_widget_show(sd->spinner);
+
+       sd->button_start = pref_button_new(hbox, GTK_STOCK_FIND, NULL, FALSE,
+                                          G_CALLBACK(search_start_cb), sd);
+       pref_spacer(hbox, PREF_PAD_BUTTON_GAP);
+       sd->button_stop = pref_button_new(hbox, GTK_STOCK_STOP, NULL, FALSE,
+                                         G_CALLBACK(search_start_cb), sd);
+       gtk_widget_set_sensitive(sd->button_stop, FALSE);
+
+       search_status_update(sd);
+       search_progress_update(sd, FALSE, -1.0);
+
+       search_window_list = g_list_append(search_window_list, sd);
+
+       gtk_widget_show(sd->window);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * maintenance (move, delete, etc.)
+ *-------------------------------------------------------------------
+ */
+
+static void search_result_change_path(SearchData *sd, const gchar *path, const gchar *newpath)
+{
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gint valid;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(sd->result_view));
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+       while (valid)
+               {
+               GtkTreeIter current;
+               FileData *fd;
+
+               current = iter;
+               valid = gtk_tree_model_iter_next(store, &iter);
+
+               gtk_tree_model_get(store, &current, SEARCH_COLUMN_POINTER, &fd, -1);
+               if (strcmp(fd->path, path) == 0)
+                       {
+                       if (newpath)
+                               {
+                               g_free(fd->path);
+                               fd->path = g_strdup(newpath);
+                               fd->name = filename_from_path(fd->path);
+
+                               gtk_list_store_set(GTK_LIST_STORE(store), &current,
+                                                  SEARCH_COLUMN_NAME, fd->name,
+                                                  SEARCH_COLUMN_PATH, fd->path, -1);
+                               }
+                       else
+                               {
+                               search_result_remove_item(sd, fd, &current);
+                               }
+                       }
+               }
+}
+
+void search_maint_renamed(const gchar *source, const gchar *dest)
+{
+       GList *work;
+
+       work = search_window_list;
+       while (work)
+               {
+               SearchData *sd = work->data;
+               work = work->next;
+
+               search_result_change_path(sd, source, dest);
+               }
+}
+
+void search_maint_removed(const gchar *path)
+{
+       search_maint_renamed(path, NULL);
+}
+
diff --git a/src/search.h b/src/search.h
new file mode 100644 (file)
index 0000000..2db7bf4
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * GQview
+ * (C) 2005 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef SEARCH_H
+#define SEARCH_H
+
+
+void search_new(const gchar *path, const gchar *example_file);
+
+
+void search_maint_renamed(const gchar *source, const gchar *dest);
+void search_maint_removed(const gchar *path);
+
+
+#endif
+
+
diff --git a/src/similar.c b/src/similar.c
new file mode 100644 (file)
index 0000000..691b220
--- /dev/null
@@ -0,0 +1,391 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "similar.h"
+
+/*
+ * These functions are intended to find images with similar color content. For
+ * example when an image was saved at different compression levels or dimensions
+ * (scaled down/up) the contents are similar, but these files do not match by file
+ * size, dimensions, or checksum.
+ *
+ * These functions create a 32 x 32 array for each color channel (red, green, blue).
+ * The array represents the average color of each corresponding part of the
+ * image. (imagine the image cut into 1024 rectangles, or a 32 x 32 grid.
+ * Each grid is then processed for the average color value, this is what
+ * is stored in the array)
+ *
+ * To compare two images, generate a ImageSimilarityData for each image, then
+ * pass them to the compare function. The return value is the percent match
+ * of the two images. (for this, simple comparisons are used, basically the return
+ * is an average of the corresponding array differences)
+ *
+ * for image_sim_compare(), the return is 0.0 to 1.0:
+ *  1.0 for exact matches (an image is compared to itself)
+ *  0.0 for exact opposite images (compare an all black to an all white image)
+ * generally only a match of > 0.85 are significant at all, and >.95 is useful to
+ * find images that have been re-saved to other formats, dimensions, or compression.
+ */
+
+
+/*
+ * The experimental (alternate) algorithm is only for testing of new techniques to
+ * improve the result, and hopes to reduce false positives.
+ */
+
+static gint alternate_enabled = FALSE;
+
+void image_sim_alternate_set(gint enable)
+{
+       alternate_enabled = enable;
+}
+
+gint image_sim_alternate_enabled(void)
+{
+       return alternate_enabled;
+}
+
+ImageSimilarityData *image_sim_new(void)
+{
+       ImageSimilarityData *sd = g_new0(ImageSimilarityData, 1);
+
+       return sd;
+}
+
+void image_sim_free(ImageSimilarityData *sd)
+{
+       g_free(sd);
+}
+
+#if 0
+static void image_sim_channel_expand(guint8 *pix, gint len)
+{
+       guint8 l, h;
+       gint i;
+       gdouble scale;
+
+       /* set the start values */
+       l = h = pix[0];
+
+       /* find min/max */
+       for (i = 0; i < len; i++)
+               {
+               if (pix[i] < l) l = pix[i];
+               if (pix[i] > h) h = pix[i];
+               }
+
+       /* calc scale from range */
+       if (l != h)
+               {
+               scale = 255.0 / (gdouble)(h - l);
+               }
+       else
+               {
+               scale = 1.0;
+               }
+
+       for (i = 0; i < len; i++)
+               {
+               pix[i] = (guint8)((gdouble)pix[i] - l * scale);
+               }
+}
+#endif
+
+static int image_sim_channel_eq_sort_cb(const void *a, const void *b)
+{
+       gint *pa = (void *)a;
+       gint *pb = (void *)b;
+       if (pa[1] < pb[1]) return -1;
+       if (pa[1] > pb[1]) return 1;
+       return 0;
+}
+
+static void image_sim_channel_equal(guint8 *pix, gint len)
+{
+       gint *buf;
+       gint i;
+       gint p;
+
+       buf = g_new0(gint, len * 2);
+
+       p = 0;
+       for (i = 0; i < len; i++)
+               {
+               buf[p] = i;
+               p++;
+               buf[p] = (gint)pix[i];
+               p++;
+               }
+
+       qsort (buf, len, sizeof(gint) * 2, image_sim_channel_eq_sort_cb);
+
+       p = 0;
+       for (i = 0; i < len; i++)
+               {
+               gint n;
+
+               n = buf[p];
+               p+= 2;
+               pix[n] = (guint8)(255 * i / len);
+               }
+
+       g_free(buf);
+}
+
+static void image_sim_channel_norm(guint8 *pix, gint len)
+{
+       guint8 l, h;
+       gint i;
+       gdouble scale;
+
+       l = h = pix[0];
+
+       for (i = 0; i < len; i++)
+               {
+               if (pix[i] < l) l = pix[i];
+               if (pix[i] > h) h = pix[i];
+               }
+
+       scale = (h-l !=0) ? 255.0 / (gdouble)(h - l) : 1.0;
+
+       for (i = 0; i < len; i++)
+               {
+               pix[i] = (guint8)((gdouble)(pix[i] - l) * scale);
+               }
+}
+
+/*
+ * define these to enable various components of the experimental compare functions
+ *
+ * Convert the thumbprint to greyscale (ignore all color information when comparing)
+ *  #define ALTERNATE_USES_GREYSCALE 1
+ *
+ * Take into account the difference in change from one pixel to the next
+ *  #define ALTERNATE_INCLUDE_COMPARE_CHANGE 1
+ */
+
+void image_sim_alternate_processing(ImageSimilarityData *sd)
+{
+#ifdef ALTERNATE_USES_GREYSCALE
+       gint i;
+#endif
+
+       if (!alternate_enabled) return;
+       
+       image_sim_channel_norm(sd->avg_r, sizeof(sd->avg_r));
+       image_sim_channel_norm(sd->avg_g, sizeof(sd->avg_g));
+       image_sim_channel_norm(sd->avg_b, sizeof(sd->avg_b));
+
+       image_sim_channel_equal(sd->avg_r, sizeof(sd->avg_r));
+       image_sim_channel_equal(sd->avg_g, sizeof(sd->avg_g));
+       image_sim_channel_equal(sd->avg_b, sizeof(sd->avg_b));
+
+#ifdef ALTERNATE_USES_GREYSCALE
+       for (i = 0; i < sizeof(sd->avg_r); i++)
+               {
+               guint8 n;
+               
+               n = (guint8)((gint)(sd->avg_r[i] + sd->avg_g[i] + sd->avg_b[i]) / 3);
+               sd->avg_r[i] = sd->avg_g[i] = sd->avg_b[i] = n;
+               }
+#endif
+}
+
+void image_sim_fill_data(ImageSimilarityData *sd, GdkPixbuf *pixbuf)
+{
+       gint w, h;
+       gint rs;
+       guchar *pix;
+       gint has_alpha;
+       gint p_step;
+
+       guchar *p;
+       gint i;
+       gint j;
+       gint x_inc, y_inc;
+       gint xs, ys;
+
+       gint x_small = FALSE;   /* if less than 32 w or h, set TRUE */
+       gint y_small = FALSE;
+
+       if (!sd || !pixbuf) return;
+
+       w = gdk_pixbuf_get_width(pixbuf);
+       h = gdk_pixbuf_get_height(pixbuf);
+       rs = gdk_pixbuf_get_rowstride(pixbuf);
+       pix = gdk_pixbuf_get_pixels(pixbuf);
+       has_alpha = gdk_pixbuf_get_has_alpha(pixbuf);
+
+       p_step = has_alpha ? 4 : 3;
+       x_inc = w / 32;
+       y_inc = h / 32;
+
+       if (x_inc < 1)
+               {
+               x_inc = 1;
+               x_small = TRUE;
+               }
+       if (y_inc < 1)
+               {
+               y_inc = 1;
+               y_small = TRUE;
+               }
+
+       j = 0;
+
+       for (ys = 0; ys < 32; ys++)
+               {
+               if (y_small) j = (gdouble)h / 32 * ys;
+
+               i = 0;
+
+               for (xs = 0; xs < 32; xs++)
+                       {
+                       gint x, y;
+                       gint r, g, b;
+                       gint t;
+
+                       if (x_small) i = (gdouble)w / 32 * xs;
+
+                       r = g = b = 0;
+
+                       for (y = j; y < j + y_inc; y++)
+                               {
+                               p = pix + (y * rs) + (i * p_step);
+                               for (x = i; x < i + x_inc; x++)
+                                       {
+                                       r += *p; p++;
+                                       g += *p; p++;
+                                       b += *p; p++;
+                                       if (has_alpha) p++;
+                                       }
+                               }
+
+                       t = x_inc * y_inc;
+                       r /= t;
+                       g /= t;
+                       b /= t;
+
+                       t = ys * 32 + xs;
+                       sd->avg_r[t] = r;
+                       sd->avg_g[t] = g;
+                       sd->avg_b[t] = b;
+
+                       i += x_inc;
+                       }
+
+               j += y_inc;
+               }
+
+       sd->filled = TRUE;
+}
+
+ImageSimilarityData *image_sim_new_from_pixbuf(GdkPixbuf *pixbuf)
+{
+       ImageSimilarityData *sd;
+
+       sd = image_sim_new();
+       image_sim_fill_data(sd, pixbuf);
+
+       return sd;
+}
+
+#ifdef ALTERNATE_INCLUDE_COMPARE_CHANGE
+static gdouble alternate_image_sim_compare_fast(ImageSimilarityData *a, ImageSimilarityData *b, gdouble min)
+{
+       gint sim;
+       gint i;
+       gint j;
+       gint ld;
+
+       if (!a || !b || !a->filled || !b->filled) return 0.0;
+
+
+       min = 1.0 - min;
+       sim = 0.0;
+       ld = 0;
+
+       for (j = 0; j < 1024; j+= 32)
+               {
+               for (i = j; i < j + 32; i++)
+                       {
+                       gint cr, cg, cb;
+                       gint cd;
+
+                       cr = abs(a->avg_r[i] - b->avg_r[i]);
+                       cg = abs(a->avg_g[i] - b->avg_g[i]);
+                       cb = abs(a->avg_b[i] - b->avg_b[i]);
+
+                       cd = cr + cg + cb;
+                       sim += cd + abs(cd - ld);
+                       ld = cd / 3;
+                       }
+               /* check for abort, if so return 0.0 */
+               if ((gdouble)sim / (255.0 * 1024.0 * 4.0) > min) return 0.0;
+               }
+
+       return (1.0 - ((gdouble)sim / (255.0 * 1024.0 * 4.0)) );
+}
+#endif
+
+gdouble image_sim_compare(ImageSimilarityData *a, ImageSimilarityData *b)
+{
+       gint sim;
+       gint i;
+
+       if (!a || !b || !a->filled || !b->filled) return 0.0;
+
+       sim = 0.0;
+
+       for (i = 0; i < 1024; i++)
+               {
+               sim += abs(a->avg_r[i] - b->avg_r[i]);
+               sim += abs(a->avg_g[i] - b->avg_g[i]);
+               sim += abs(a->avg_b[i] - b->avg_b[i]);
+               }
+
+       return 1.0 - ((gdouble)sim / (255.0 * 1024.0 * 3.0));
+}
+
+/* this uses a cutoff point so that it can abort early when it gets to
+ * a point that can simply no longer make the cut-off point.
+ */
+gdouble image_sim_compare_fast(ImageSimilarityData *a, ImageSimilarityData *b, gdouble min)
+{
+       gint sim;
+       gint i;
+       gint j;
+
+#ifdef ALTERNATE_INCLUDE_COMPARE_CHANGE
+       if (alternate_enabled) return alternate_image_sim_compare_fast(a, b, min);
+#endif
+
+       if (!a || !b || !a->filled || !b->filled) return 0.0;
+
+       min = 1.0 - min;
+       sim = 0.0;
+
+       for (j = 0; j < 1024; j+= 32)
+               {
+               for (i = j; i < j + 32; i++)
+                       {
+                       sim += abs(a->avg_r[i] - b->avg_r[i]);
+                       sim += abs(a->avg_g[i] - b->avg_g[i]);
+                       sim += abs(a->avg_b[i] - b->avg_b[i]);
+                       }
+               /* check for abort, if so return 0.0 */
+               if ((gdouble)sim / (255.0 * 1024.0 * 3.0) > min) return 0.0;
+               }
+
+       return (1.0 - ((gdouble)sim / (255.0 * 1024.0 * 3.0)) );
+}
diff --git a/src/similar.h b/src/similar.h
new file mode 100644 (file)
index 0000000..7e0936e
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef SIMILAR_H
+#define SIMILAR_H
+
+
+typedef struct _ImageSimilarityData ImageSimilarityData;
+struct _ImageSimilarityData
+{
+        guint8 avg_r[1024];
+        guint8 avg_g[1024];
+        guint8 avg_b[1024];
+
+        gint filled;
+};
+
+
+ImageSimilarityData *image_sim_new(void);
+void image_sim_free(ImageSimilarityData *sd);
+
+void image_sim_fill_data(ImageSimilarityData *sd, GdkPixbuf *pixbuf);
+ImageSimilarityData *image_sim_new_from_pixbuf(GdkPixbuf *pixbuf);
+
+gdouble image_sim_compare(ImageSimilarityData *a, ImageSimilarityData *b);
+gdouble image_sim_compare_fast(ImageSimilarityData *a, ImageSimilarityData *b, gdouble min);
+
+
+void image_sim_alternate_set(gint enable);
+gint image_sim_alternate_enabled(void);
+void image_sim_alternate_processing(ImageSimilarityData *sd);
+
+
+#endif
+
index 299015f..6b608a2 100644 (file)
@@ -1,82 +1,78 @@
 /*
- * GQview image viewer
- * (C)2000 John Ellis
+ * GQview
+ * (C) 2004 John Ellis
  *
  * Author: John Ellis
  *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
  */
 
+
 #include "gqview.h"
+#include "collect.h"
+#include "image.h"
+#include "slideshow.h"
+
+#include "layout.h"
+#include "layout_image.h"
+#include "ui_fileops.h"
+
 
-static GList *slide_list = NULL;
-static GList *past_slide_list = NULL;
-static gchar *slide_img = NULL;
-static gchar *slide_path = NULL;
-static gint slide_count = 0;
-static gint slide_active = FALSE;
-static gint slide_sel_list = FALSE;
-static gint slide_timeout_id = -1;
+static void slideshow_timer_reset(SlideShowData *ss, gint reset);
 
-static void slideshow_free_all()
+
+void slideshow_free(SlideShowData *ss)
 {
-       slide_active = FALSE;
+       slideshow_timer_reset(ss, FALSE);
 
-       g_list_free(slide_list);
-       slide_list = NULL;
+       if (ss->stop_func) ss->stop_func(ss, ss->stop_data);
 
-       g_list_free(past_slide_list);
-       past_slide_list = NULL;
+       if (ss->path_list) path_list_free(ss->path_list);
+       if (ss->cd) collection_unref(ss->cd);
+       g_free(ss->layout_path);
 
-       g_free(slide_path);
-       slide_path = NULL;
+       g_list_free(ss->list);
+       g_list_free(ss->list_done);
 
-       g_free(slide_img);
-       slide_img = NULL;
+       g_free(ss->slide_path);
 
-       slide_count = 0;
-       slide_sel_list = FALSE;
+       g_free(ss);
 }
 
-static GList *generate_list()
+static GList *generate_list(SlideShowData *ss)
 {
        GList *list = NULL;
 
-       if (file_selection_count() < 2)
+       if (ss->from_selection)
                {
-               gint i;
-               gint c = file_count();
-               for(i = 0; i < c; i++)
-                       {
-                       list = g_list_prepend(list, GINT_TO_POINTER(i));
-                       }
-               slide_sel_list = FALSE;
+               list = layout_selection_list_by_index(ss->layout);
                }
        else
                {
-               GList *work = GTK_CLIST(file_clist)->selection;
-               while(work)
+               gint i;
+               for(i = 0; i < ss->slide_count; i++)
                        {
-                       list = g_list_prepend(list, work->data);
-                       work = work->next;
+                       list = g_list_prepend(list, GINT_TO_POINTER(i));
                        }
-               slide_sel_list = TRUE;
+               list = g_list_reverse(list);
                }
-       list = g_list_reverse(list);
 
        return list;
 }
 
-static GList *generate_random_list()
+static GList *generate_random_list(SlideShowData *ss)
 {
        GList *src_list = NULL;
        GList *list = NULL;
        GList *work;
 
-       src_list = generate_list();
+       src_list = generate_list(ss);
 
        while(src_list)
                {
-               gint p = (float)rand() / RAND_MAX * g_list_length(src_list);
+               gint p = (double)rand() / ((double)RAND_MAX + 1.0) * g_list_length(src_list);
                work = g_list_nth(src_list, p);
                list = g_list_prepend(list, work->data);
                src_list = g_list_remove(src_list, work->data);
@@ -85,261 +81,345 @@ static GList *generate_random_list()
        return list;
 }
 
-static void slideshow_init_list()
+static void slideshow_list_init(SlideShowData *ss, gint start_index)
 {
-       if (slide_list)
+       if (ss->list_done)
                {
-               g_list_free(slide_list);
+               g_list_free(ss->list_done);
+               ss->list_done = NULL;
                }
 
-       if (past_slide_list)
-               {
-               g_list_free(past_slide_list);
-               past_slide_list = NULL;
-               }
+       if (ss->list) g_list_free(ss->list);
 
        if (slideshow_random)
                {
-               slide_list = generate_random_list();
+               ss->list = generate_random_list(ss);
                }
        else
                {
-               slide_list = generate_list();
+               ss->list = generate_list(ss);
+               if (start_index >= 0)
+                       {
+                       /* start with specified image by skipping to it */
+                       gint i = 0;
+
+                       while(ss->list && i < start_index)
+                               {
+                               ss->list_done = g_list_prepend (ss->list_done, ss->list->data);
+                               ss->list = g_list_remove(ss->list, ss->list->data);
+                               i++;
+                               }
+                       }
                }
 }
 
-static void slideshow_move_list(gint forward)
+gint slideshow_should_continue(SlideShowData *ss)
 {
-       if (forward)
+       const gchar *imd_path;
+       const gchar *path;
+
+       imd_path = image_get_path(ss->imd);
+
+       if ( ((imd_path == NULL) != (ss->slide_path == NULL)) ||
+           (imd_path && ss->slide_path && strcmp(imd_path, ss->slide_path) != 0) ) return FALSE;
+
+       if (ss->path_list) return TRUE;
+
+       if (ss->cd)
                {
-               if (slide_list)
-                       {
-                       past_slide_list = g_list_prepend (past_slide_list, slide_list->data);
-                       slide_list = g_list_remove(slide_list, slide_list->data);
-                       }
+               if (g_list_length(ss->cd->list) == ss->slide_count)
+                       return TRUE;
+               else
+                       return FALSE;
                }
-       else
+
+       if (!ss->layout) return FALSE;
+       path = layout_get_path(ss->layout);
+
+       if (path && ss->layout_path &&
+           strcmp(path, ss->layout_path) == 0)
                {
-               if (past_slide_list)
-                       {
-                       slide_list = g_list_prepend(slide_list, past_slide_list->data);
-                       past_slide_list = g_list_remove(past_slide_list, past_slide_list->data);
-                       }
+               if (ss->from_selection && ss->slide_count == layout_selection_count(ss->layout, NULL)) return TRUE;
+               if (!ss->from_selection && ss->slide_count == layout_list_count(ss->layout, NULL)) return TRUE;
                }
+
+       return FALSE;
 }
 
-static gint slideshow_should_continue()
+static gint slideshow_step(SlideShowData *ss, gint forward)
 {
-       if (!slide_active || !slide_list || !slide_path ||
-           slide_count != file_count() ||
-           (slide_img && image_get_path() && strcmp(image_get_path(), slide_img) != 0) ||
-           current_path == NULL ||
-           strcmp(current_path, slide_path) != 0)
+       gint row;
+
+       if (!slideshow_should_continue(ss))
                {
                return FALSE;
                }
 
-       return TRUE;
-}
+       if (forward)
+               {
+               if (!ss->list) return TRUE;
 
-static gint real_slideshow_prev()
-{
-       gint row;
-       gchar *buf;
+               row = GPOINTER_TO_INT(ss->list->data);
+               ss->list_done = g_list_prepend (ss->list_done, ss->list->data);
+               ss->list = g_list_remove(ss->list, ss->list->data);
+               }
+       else
+               {
+               if (!ss->list_done || !ss->list_done->next) return TRUE;
+
+               ss->list = g_list_prepend(ss->list, ss->list_done->data);
+               ss->list_done = g_list_remove(ss->list_done, ss->list_done->data);
+               row = GPOINTER_TO_INT(ss->list_done->data);
+               }
 
-       if (!slide_active) return FALSE;
-       if (!past_slide_list || !past_slide_list->next) return TRUE;
+       g_free(ss->slide_path);
+       ss->slide_path = NULL;
 
-       if (!slideshow_should_continue())
+       if (ss->path_list)
                {
-               slideshow_free_all();
-               slide_timeout_id = -1;
-               return FALSE;
+               ss->slide_path = g_strdup(g_list_nth_data(ss->path_list, row));
+               image_change_path(ss->imd, ss->slide_path, image_zoom_get_default(ss->imd, zoom_mode));
                }
+       else if (ss->cd)
+               {
+               CollectInfo *info;
 
-       slideshow_move_list(FALSE);
+               info = g_list_nth_data(ss->cd->list, row);
+               ss->slide_path = g_strdup(info->path);
 
-       row = GPOINTER_TO_INT(past_slide_list->data);
+               image_change_from_collection(ss->imd, ss->cd, info, image_zoom_get_default(ss->imd, zoom_mode));
+               }
+       else
+               {
+               ss->slide_path = g_strdup(layout_list_get_path(ss->layout, row));
 
-       g_free(slide_img);
-       slide_img = NULL;
-       buf = file_get_path(row);
+               if (ss->from_selection)
+                       {
+                       image_change_path(ss->imd, ss->slide_path, image_zoom_get_default(ss->imd, zoom_mode));
+                       layout_status_update_info(ss->layout, NULL);
+                       }
+               else
+                       {
+                       layout_image_set_index(ss->layout, row);
+                       }
+               }
 
-       if (slide_sel_list)
+       if (!ss->list && slideshow_repeat)
                {
-               image_change_to(buf);
-               update_status_label(NULL);
+               slideshow_list_init(ss, -1);
                }
-       else
+
+       if (!ss->list)
                {
-               file_image_change_to(row);
+               return FALSE;
                }
 
-       slide_img = buf;
+       /* read ahead */
+
+       if (enable_read_ahead)
+               {
+               gint r;
+               if (forward)
+                       {
+                       if (!ss->list) return TRUE;
+                       r = GPOINTER_TO_INT(ss->list->data);
+                       }
+               else
+                       {
+                       if (!ss->list_done || !ss->list_done->next) return TRUE;
+                       r = GPOINTER_TO_INT(ss->list_done->next->data);
+                       }
+
+               if (ss->path_list)
+                       {
+                       image_prebuffer_set(ss->imd, g_list_nth_data(ss->path_list, r));
+                       }
+               else if (ss->cd)
+                       {
+                       CollectInfo *info;
+                       info = g_list_nth_data(ss->cd->list, r);
+                       if (info) image_prebuffer_set(ss->imd, info->path);
+                       }
+               else if (ss->from_selection)
+                       {
+                       image_prebuffer_set(ss->imd, layout_list_get_path(ss->layout, r));
+                       }
+               }
 
        return TRUE;
 }
 
-/* the return is TRUE if slideshow should continue */
-static gint real_slideshow_next()
+static gint slideshow_loop_cb(gpointer data)
 {
-       gint row;
-       gchar *buf;
+       SlideShowData *ss = data;
 
-       if (!slide_active) return FALSE;
+       if (ss->paused) return TRUE;
 
-       if (!slideshow_should_continue())
+       if (!slideshow_step(ss, TRUE))
                {
-               slideshow_free_all();
-               slide_timeout_id = -1;
+               ss->timeout_id = -1;
+               slideshow_free(ss);
                return FALSE;
                }
 
-       row = GPOINTER_TO_INT(slide_list->data);
-
-       g_free(slide_img);
-       slide_img = NULL;
-       buf = file_get_path(row);
-       slideshow_move_list(TRUE);
+       return TRUE;
+}
 
-       if (!slide_list && slideshow_repeat)
+static void slideshow_timer_reset(SlideShowData *ss, gint reset)
+{
+       if (reset)
                {
-               slideshow_init_list();
-               }
+               if (slideshow_delay < 1) slideshow_delay = 1;
 
-       if (slide_sel_list)
-               {
-               image_change_to(buf);
-               update_status_label(NULL);
+               if (ss->timeout_id != -1) g_source_remove(ss->timeout_id);
+               ss->timeout_id = g_timeout_add(slideshow_delay * 1000 / SLIDESHOW_SUBSECOND_PRECISION,
+                                              slideshow_loop_cb, ss);
                }
-       else
+       else if (ss->timeout_id != -1)
                {
-               file_image_change_to(row);
+               g_source_remove(ss->timeout_id);
+               ss->timeout_id = -1;
                }
+}
 
-       slide_img = buf;
-
-       if (!slide_list)
+void slideshow_next(SlideShowData *ss)
+{
+       if (!slideshow_step(ss, TRUE))
                {
-               slideshow_free_all();
-               slide_timeout_id = -1;
-               return FALSE;
+               slideshow_free(ss);
+               return;
                }
 
-       return TRUE;
+       slideshow_timer_reset(ss, TRUE);
 }
 
-static gint slideshow_loop_cb(gpointer data)
+void slideshow_prev(SlideShowData *ss)
 {
-       return real_slideshow_next();
+       if (!slideshow_step(ss, FALSE))
+               {
+               slideshow_free(ss);
+               return;
+               }
+
+       slideshow_timer_reset(ss, TRUE);
 }
 
-void slideshow_start()
+static SlideShowData *real_slideshow_start(ImageWindow *imd, LayoutWindow *lw,
+                                          GList *path_list, gint start_point,
+                                          CollectionData *cd, CollectInfo *start_info,
+                                          void (*stop_func)(SlideShowData *, gpointer), gpointer stop_data)
 {
-       gint row;
-       gchar *buf;
+       SlideShowData *ss;
+       gint start_index = -1;
 
-       if (slide_active) return;
+       if (!path_list && !cd && layout_list_count(lw, NULL) < 1) return NULL;
 
-       if (file_count() < 2) return;
+       ss = g_new0(SlideShowData, 1);
 
-       slideshow_init_list();
-       if (!slide_list) return;
+       ss->imd = imd;
 
-       row = GPOINTER_TO_INT(slide_list->data);
+       ss->path_list = path_list;
+       ss->cd = cd;
+       ss->layout = lw;
+       ss->layout_path = NULL;
 
-       slide_active = TRUE;
-       slide_path = g_strdup(current_path);
-       slide_count = file_count();
-       g_free(slide_img);
-       slide_img = NULL;
-       buf = file_get_path(row);
-       slideshow_move_list(TRUE);
+       ss->list = NULL;
+       ss->list_done = NULL;
 
-       if (slide_sel_list)
-               {
-               image_change_to(buf);
-               update_status_label(NULL);
-               }
-       else
-               {
-               file_image_change_to(row);
-               }
+       ss->from_selection = FALSE;
 
-       slide_img = buf;
+       ss->stop_func = stop_func;
+       ss->stop_data = stop_data;
 
-       slide_timeout_id = gtk_timeout_add(slideshow_delay * 1000, slideshow_loop_cb, NULL);
-}
+       ss->timeout_id = -1;
 
-void slideshow_stop()
-{
-       if (!slide_active) return;
+       ss->paused = FALSE;
 
-       slideshow_free_all();
-       if (slide_timeout_id != -1)
+       if (ss->path_list)
                {
-               gtk_timeout_remove(slide_timeout_id);
-               slide_timeout_id = -1;
+               ss->slide_count = g_list_length(ss->path_list);
                }
-       update_status_label(NULL);
-}
-
-static void slideshow_reset_timeout(gint reset)
-{
-       if (reset)
+       else if (ss->cd)
                {
-               if (slide_timeout_id != -1) gtk_timeout_remove(slide_timeout_id);
-               slide_timeout_id = gtk_timeout_add(slideshow_delay * 1000, slideshow_loop_cb, NULL);
+               collection_ref(ss->cd);
+               ss->slide_count = g_list_length(ss->cd->list);
+               if (!slideshow_random && start_info)
+                       {
+                       start_index = g_list_index(ss->cd->list, start_info);
+                       }
                }
        else
                {
-               if (slide_timeout_id != -1)
+               /* layout method */
+
+               ss->slide_count = layout_selection_count(ss->layout, NULL);
+               ss->layout_path = g_strdup(layout_get_path(ss->layout));
+               if (ss->slide_count < 2)
                        {
-                       gtk_timeout_remove(slide_timeout_id);
-                       slide_timeout_id = -1;
+                       ss->slide_count = layout_list_count(ss->layout, NULL);
+                       if (!slideshow_random && start_point >= 0 && start_point < ss->slide_count)
+                               {
+                               start_index = start_point;
+                               }
                        }
+               else
+                       {
+                       ss->from_selection = TRUE;
+                       }
+               }
+
+       slideshow_list_init(ss, start_index);
+
+       ss->slide_path = g_strdup(image_get_path(ss->imd));
+       if (slideshow_step(ss, TRUE))
+               {
+               slideshow_timer_reset(ss, TRUE);
+               }
+       else
+               {
+               ss = NULL;
                }
+
+       return ss;
 }
 
-void slideshow_next()
+SlideShowData *slideshow_start_from_path_list(ImageWindow *imd, GList *list,
+                                             void (*stop_func)(SlideShowData *, gpointer), gpointer stop_data)
 {
-       if (!slide_active) return;
-       slideshow_reset_timeout(real_slideshow_next());
+       return real_slideshow_start(imd, NULL, list, -1, NULL, NULL, stop_func, stop_data);
 }
 
-void slideshow_prev()
+SlideShowData *slideshow_start_from_collection(ImageWindow *imd, CollectionData *cd,
+                                              void (*stop_func)(SlideShowData *, gpointer), gpointer stop_data,
+                                              CollectInfo *start_info)
 {
-       if (!slide_active) return;
-       slideshow_reset_timeout(real_slideshow_prev());
+       return real_slideshow_start(imd, NULL, NULL, -1, cd, start_info, stop_func, stop_data);
 }
 
-void slideshow_toggle()
+SlideShowData *slideshow_start(ImageWindow *imd, LayoutWindow *lw, gint start_point,
+                              void (*stop_func)(SlideShowData *, gpointer), gpointer stop_data)
 {
-       if (!slide_active)
-               {
-               slideshow_start();
-               }
-       else
-               {
-               slideshow_stop();
-               }
+       return real_slideshow_start(imd, lw, NULL, start_point, NULL, NULL, stop_func, stop_data);
 }
 
-gint slideshow_is_running()
+gint slideshow_paused(SlideShowData *ss)
 {
-       if (!slide_active) return FALSE;
+       if (!ss) return FALSE;
 
-       if (!slideshow_should_continue())
-               {
-               slideshow_free_all();
-               if (slide_timeout_id != -1)
-                       {
-                       gtk_timeout_remove(slide_timeout_id);
-                       slide_timeout_id = -1;
-                       }
-               return FALSE;
-               }
+       return ss->paused;
+}
 
-       return TRUE;
+void slideshow_pause_set(SlideShowData *ss, gint paused)
+{
+       if (!ss) return;
+
+       ss->paused = paused;
 }
 
+gint slideshow_pause_toggle(SlideShowData *ss)
+{
+       slideshow_pause_set(ss, !slideshow_paused(ss));
+       return slideshow_paused(ss);
+}
+
+
diff --git a/src/slideshow.h b/src/slideshow.h
new file mode 100644 (file)
index 0000000..de4dbcc
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef SLIDESHOW_H
+#define SLIDESHOW_H
+
+
+#define SLIDESHOW_SUBSECOND_PRECISION 10
+#define SLIDESHOW_MIN_SECONDS    0.1
+#define SLIDESHOW_MAX_SECONDS 3600.0
+
+/*
+ * It works like this, it uses path_list, if that does not exist, it uses
+ * CollectionData, then finally falls back to the layout listing.
+ */
+
+void slideshow_free(SlideShowData *ss);
+
+gint slideshow_should_continue(SlideShowData *ss);
+
+void slideshow_next(SlideShowData *ss);
+void slideshow_prev(SlideShowData *ss);
+
+SlideShowData *slideshow_start_from_path_list(ImageWindow *imd, GList *list,
+                                             void (*stop_func)(SlideShowData *, gpointer), gpointer stop_data);
+SlideShowData *slideshow_start_from_collection(ImageWindow *imd, CollectionData *cd,
+                                              void (*stop_func)(SlideShowData *, gpointer), gpointer stop_data,
+                                              CollectInfo *start_info);
+SlideShowData *slideshow_start(ImageWindow *imd, LayoutWindow *lw, gint start_point,
+                              void (*stop_func)(SlideShowData *, gpointer), gpointer stop_data);
+
+gint slideshow_paused(SlideShowData *ss);
+void slideshow_pause_set(SlideShowData *ss, gint paused);
+gint slideshow_pause_toggle(SlideShowData *ss);
+
+
+#endif
+
diff --git a/src/tabcomp.c b/src/tabcomp.c
deleted file mode 100644 (file)
index 94618e7..0000000
+++ /dev/null
@@ -1,629 +0,0 @@
-/*
- * GQview image viewer
- * (C)2000 John Ellis
- *
- * Author: John Ellis
- *
- */
-
-#include "gqview.h"
-#include <gdk/gdkkeysyms.h> /* for key values */
-
-#include "tabcomp.xpm"
-
-/* ----------------------------------------------------------------
-   Tab completion routines, can be connected to any gtkentry widget
-   using the tab_completion_add_to_entry() function.
-   Use remove_trailing_slash() to strip the trailing '/'.
-   ----------------------------------------------------------------*/
-
-typedef struct _TabCompData TabCompData;
-struct _TabCompData
-{
-       GtkWidget *entry;
-       gchar *dir_path;
-       GList *file_list;
-       void (*enter_func)(gchar *, gpointer);
-       void (*tab_func)(gchar *, gpointer);
-       gpointer enter_data;
-       gpointer tab_data;
-
-       GtkWidget *combo;
-       gint has_history;
-       gchar *history_key;
-       gint history_levels;
-};
-
-typedef struct _HistoryData HistoryData;
-struct _HistoryData
-{
-       gchar *key;
-       GList *list;
-};
-
-static GList *history_list = NULL;
-
-static void tab_completion_free_list(TabCompData *td);
-static void tab_completion_read_dir(TabCompData *td, gchar *path);
-static void tab_completion_destroy(GtkWidget *widget, gpointer data);
-static void tab_completion_emit_enter_signal(TabCompData *td);
-static void tab_completion_emit_tab_signal(TabCompData *td);
-static gint tab_completion_do(TabCompData *td);
-static gint tab_completion_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data);
-static void tab_completion_button_pressed(GtkWidget *widget, gpointer data);
-static GtkWidget *tab_completion_create_complete_button(GtkWidget *window, GtkWidget *entry);
-
-static void history_list_free(HistoryData *hd);
-static HistoryData *history_list_find_by_key(const gchar* key);
-static gchar *history_list_find_last_path_by_key(const gchar* key);
-static void history_list_free_key(const gchar *key);
-static void history_list_add_to_key(const gchar *key, const gchar *path, gint max);
-
-static void history_list_free(HistoryData *hd)
-{
-       GList *work;
-
-       if (!hd) return;
-
-       work = hd->list;
-       while(work)
-               {
-               g_free(work->data);
-               work = work->next;
-               }
-
-       g_free(hd->key);
-       g_free(hd);
-}
-
-static HistoryData *history_list_find_by_key(const gchar* key)
-{
-       GList *work = history_list;
-       while(work)
-               {
-               HistoryData *hd = work->data;
-               if (strcmp(hd->key, key) == 0) return hd;
-               work = work->next;
-               }
-       return NULL;
-}
-
-static gchar *history_list_find_last_path_by_key(const gchar* key)
-{
-       HistoryData *hd;
-       hd = history_list_find_by_key(key);
-       if (!hd || !hd->list) return NULL;
-
-       return hd->list->data;
-}
-
-static void history_list_free_key(const gchar *key)
-{
-       HistoryData *hd;
-       hd = history_list_find_by_key(key);
-       if (!hd) return;
-
-       history_list = g_list_remove(history_list, hd);
-       history_list_free(hd);
-}
-
-static void history_list_add_to_key(const gchar *key, const gchar *path, gint max)
-{
-       HistoryData *hd;
-       GList *work;
-
-       hd = history_list_find_by_key(key);
-       if (!hd)
-               {
-               hd = g_new(HistoryData, 1);
-               hd->key = g_strdup(key);
-               hd->list = NULL;
-               history_list = g_list_prepend(history_list, hd);
-               }
-
-       /* if already in the list, simply move it to the top */
-       work = hd->list;
-       while(work)
-               {
-               gchar *buf = work->data;
-               work = work->next;
-               if (strcmp(buf, path) == 0)
-                       {
-                       hd->list = g_list_remove(hd->list, buf);
-                       hd->list = g_list_prepend(hd->list, buf);
-                       return;
-                       }
-               }
-
-       hd->list = g_list_prepend(hd->list, g_strdup(path));
-
-       if (max > 0)
-               {
-               while(hd->list && g_list_length(hd->list) > max)
-                       {
-                       GList *work = g_list_last(hd->list);
-                       gchar *buf = work->data;
-                       hd->list = g_list_remove(hd->list, buf);
-                       g_free(buf);
-                       }
-               }
-}
-
-static void tab_completion_free_list(TabCompData *td)
-{
-       GList *list;
-
-       g_free(td->dir_path);
-       td->dir_path = NULL;
-
-       list = td->file_list;
-
-       while(list)
-               {
-               g_free(list->data);
-               list = list->next;
-               }
-
-       g_list_free(td->file_list);
-       td->file_list = NULL;
-}
-
-static void tab_completion_read_dir(TabCompData *td, gchar *path)
-{
-        DIR *dp;
-        struct dirent *dir;
-        GList *list = NULL;
-
-       tab_completion_free_list(td);
-
-        if((dp = opendir(path))==NULL)
-                {
-                /* dir not found */
-                return;
-                }
-        while ((dir = readdir(dp)) != NULL)
-                {
-                /* skips removed files */
-                if (dir->d_ino > 0)
-                        {
-                       gchar *name = dir->d_name;
-                       if (strcmp(name, ".") != 0 && strcmp(name, "..") != 0)
-                               {
-                               list = g_list_prepend(list, g_strdup(name));
-                               }
-                        }
-               }
-        closedir(dp);
-
-       td->dir_path = g_strdup(path);
-       td->file_list = list;
-}
-
-static void tab_completion_destroy(GtkWidget *widget, gpointer data)
-{
-       TabCompData *td = data;
-       tab_completion_free_list(td);
-       g_free(td->history_key);
-       g_free(td);
-}
-
-static void tab_completion_emit_enter_signal(TabCompData *td)
-{
-       gchar *text;
-       if (!td->enter_func) return;
-
-       text = g_strdup(gtk_entry_get_text(GTK_ENTRY(td->entry)));
-
-       if (text[0] == '~')
-               {
-               gchar *t = text;
-               text = g_strconcat(homedir(), t + 1, NULL);
-               g_free(t);
-               }
-
-       td->enter_func(text, td->enter_data);
-       g_free(text);
-}
-
-static void tab_completion_emit_tab_signal(TabCompData *td)
-{
-       gchar *text;
-       if (!td->tab_func) return;
-
-       text = g_strdup(gtk_entry_get_text(GTK_ENTRY(td->entry)));
-
-       if (text[0] == '~')
-               {
-               gchar *t = text;
-               text = g_strconcat(homedir(), t + 1, NULL);
-               g_free(t);
-               }
-
-       td->tab_func(text, td->tab_data);
-       g_free(text);
-}
-
-static gint tab_completion_do(TabCompData *td)
-{
-       gchar *entry_text = gtk_entry_get_text(GTK_ENTRY(td->entry));
-       gchar *entry_file;
-       gchar *entry_dir;
-       gchar *ptr;
-       gint home_exp = FALSE;
-
-       /* home dir expansion */
-       if (entry_text[0] == '~')
-               {
-               entry_dir = g_strconcat(homedir(), entry_text + 1, NULL);
-               home_exp = TRUE;
-               }
-       else
-               {
-               entry_dir = g_strdup(entry_text);
-               }
-
-       entry_file = filename_from_path(entry_text);
-
-       if (isfile(entry_dir))
-               {
-               if (home_exp)
-                       {
-                       gtk_entry_set_text(GTK_ENTRY(td->entry), entry_dir);
-                       gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(entry_dir));
-                       }
-               g_free(entry_dir);
-               return home_exp;
-               }
-       if (isdir(entry_dir) && strcmp(entry_file, ".") != 0 && strcmp(entry_file, "..") != 0)
-               {
-               ptr = entry_dir + strlen(entry_dir) - 1;
-               if (ptr[0] == '/')
-                       {
-                       if (home_exp)
-                               {
-                               gtk_entry_set_text(GTK_ENTRY(td->entry), entry_dir);
-                               gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(entry_dir));
-                               }
-                       g_free(entry_dir);
-                       return home_exp;
-                       }
-               else
-                       {
-                       gchar *buf = g_strconcat(entry_dir, "/", NULL);
-                       gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
-                       gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(buf));
-                       g_free(buf);
-                       g_free(entry_dir);
-                       return TRUE;
-                       }
-               }
-
-       ptr = filename_from_path(entry_dir);
-       if (ptr > entry_dir) ptr--;
-       ptr[0] = '\0';
-
-       if (strlen(entry_dir) == 0)
-               {
-               g_free(entry_dir);
-               entry_dir = g_strdup("/");
-               }
-
-       if (isdir(entry_dir))
-               {
-               GList *list;
-               GList *poss = NULL;
-               gint l = strlen(entry_file);
-
-               if (!td->dir_path || !td->file_list || strcmp(td->dir_path, entry_dir) != 0)
-                       {
-                       tab_completion_read_dir(td, entry_dir);
-                       }
-
-               if (strcmp(entry_dir, "/") == 0) entry_dir[0] = '\0';
-
-               list = td->file_list;
-               while(list)
-                       {
-                       gchar *file = list->data;
-                       if (strncmp(entry_file, file, l) == 0)
-                               {
-                               poss = g_list_prepend(poss, file);
-                               }
-                       list = list->next;
-                       }
-
-               if (poss)
-                       {
-                       if (!poss->next)
-                               {
-                               gchar *file = poss->data;
-                               gchar *buf;
-
-                               buf = g_strconcat(entry_dir, "/", file, NULL);
-
-                               if (isdir(buf))
-                                       {
-                                       g_free(buf);
-                                       buf = g_strconcat(entry_dir, "/", file, "/", NULL);
-                                       }
-                               gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
-                               gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(buf));
-                               g_free(buf);
-                               g_list_free(poss);
-                               g_free(entry_dir);
-                               return TRUE;
-                               }
-                       else
-                               {
-                               gint c = strlen(entry_file);
-                               gint done = FALSE;
-                               gchar *test_file = poss->data;
-
-                               while (!done)
-                                       {
-                                       list = poss;
-                                       if (!list) done = TRUE;
-                                       while(list && !done)
-                                               {
-                                               gchar *file = list->data;
-                                               if (strlen(file) < c || strncmp(test_file, file, c) != 0)
-                                                       {
-                                                       done = TRUE;
-                                                       }
-                                               list = list->next;
-                                               }
-                                       c++;
-                                       }
-                               c -= 2;
-                               if (c > 0)
-                                       {
-                                       gchar *file;
-                                       gchar *buf;
-                                       file = g_strdup(test_file);
-                                       file[c] = '\0';
-                                       buf = g_strconcat(entry_dir, "/", file, NULL);
-                                       gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
-                                       gtk_entry_set_position(GTK_ENTRY(td->entry), strlen(buf));
-                                       g_free(file);
-                                       g_free(buf);
-                                       g_list_free(poss);
-                                       g_free(entry_dir);
-                                       return TRUE;
-                                       }
-                               }
-                       g_list_free(poss);
-                       }
-               }
-
-       g_free(entry_dir);
-
-       return FALSE;
-}
-
-static gint tab_completion_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
-{
-       TabCompData *td = data;
-       gint stop_signal = FALSE;
-
-       switch (event->keyval)
-               {
-                case GDK_Tab:
-                       if (tab_completion_do(td))
-                               {
-                               tab_completion_emit_tab_signal(td);
-                               }
-                       stop_signal = TRUE;
-                       break;
-               case GDK_Return:
-                       tab_completion_emit_enter_signal(td);
-                       stop_signal = TRUE;
-                       break;
-               default:
-                       break;
-               }
-
-       if (stop_signal)
-               {
-               if (stop_signal) gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event");
-               return TRUE;
-               }
-
-       return FALSE;
-}
-
-static void tab_completion_button_pressed(GtkWidget *widget, gpointer data)
-{
-       TabCompData *td;
-       GtkWidget *entry = data;
-
-       td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data");
-
-       if (!td) return;
-
-       if (!GTK_WIDGET_HAS_FOCUS(entry))
-               {
-               gtk_widget_grab_focus(entry);
-               }
-
-       if (tab_completion_do(td))
-               {
-               tab_completion_emit_tab_signal(td);
-               }
-}
-
-static GtkWidget *tab_completion_create_complete_button(GtkWidget *window, GtkWidget *entry)
-{
-       GtkWidget *button;
-       GtkWidget *icon;
-       GdkPixmap *pixmap = NULL;
-       GdkBitmap *mask = NULL;
-       GtkStyle *style;
-
-       style = gtk_widget_get_style(window);
-       pixmap = gdk_pixmap_create_from_xpm_d(window->window, &mask,
-               &style->bg[GTK_STATE_NORMAL], (gchar **)tabcomp_xpm);
-
-       button = gtk_button_new();
-       GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS);
-       gtk_signal_connect(GTK_OBJECT(button), "clicked", (GtkSignalFunc) tab_completion_button_pressed, entry);
-       
-       icon = gtk_pixmap_new(pixmap, mask);
-       gtk_container_add(GTK_CONTAINER(button), icon);
-       gtk_widget_show(icon);
-
-       return button;
-}
-
-/*
- *----------------------------------------------------------------------------
- * public interface
- *----------------------------------------------------------------------------
- */
-
-GtkWidget *tab_completion_new_with_history(GtkWidget **entry, GtkWidget *window, gchar *text,
-                                          const gchar *history_key, gint max_levels,
-                                          void (*enter_func)(gchar *, gpointer), gpointer data)
-{
-       GtkWidget *combo;
-       GtkWidget *button;
-       HistoryData *hd;
-       TabCompData *td;
-
-       combo = gtk_combo_new();
-       gtk_combo_set_use_arrows(GTK_COMBO(combo), FALSE);
-
-       button = tab_completion_create_complete_button(window, GTK_COMBO(combo)->entry);
-       gtk_box_pack_start(GTK_BOX(combo), button, FALSE, FALSE, 0);
-       gtk_box_reorder_child(GTK_BOX(combo), button, 1);
-       gtk_widget_show(button);
-       
-       tab_completion_add_to_entry(GTK_COMBO(combo)->entry, enter_func, data);
-
-       td = gtk_object_get_data(GTK_OBJECT(GTK_COMBO(combo)->entry), "tab_completion_data");
-       if (!td) return; /* this should never happen! */
-
-       td->combo = combo;
-       td->has_history = TRUE;
-       td->history_key = g_strdup(history_key);
-       td->history_levels = max_levels;
-
-       hd = history_list_find_by_key(td->history_key);
-       if (hd && hd->list)
-               {
-               gtk_combo_set_popdown_strings(GTK_COMBO(combo), hd->list);
-               }
-
-       if (text) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), text);
-
-       if (entry) *entry = GTK_COMBO(combo)->entry;
-       return combo;
-}
-
-gchar *tab_completion_set_to_last_history(GtkWidget *entry)
-{
-       TabCompData *td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data");
-       gchar *buf;
-
-       if (!td || !td->has_history) return NULL;
-
-       buf = history_list_find_last_path_by_key(td->history_key);
-       if (buf)
-               {
-               gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
-               }
-
-       return buf;
-}
-
-void tab_completion_append_to_history(GtkWidget *entry, gchar *path)
-{
-       TabCompData *td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data");
-       HistoryData *hd;
-
-       if (!td || !td->has_history) return;
-
-       history_list_add_to_key(td->history_key, path, td->history_levels);
-       hd = history_list_find_by_key(td->history_key);
-       if (hd && hd->list)
-               {
-               gtk_combo_set_popdown_strings(GTK_COMBO(td->combo), hd->list);
-               }
-}
-
-GtkWidget *tab_completion_new(GtkWidget **entry, GtkWidget *window, gchar *text,
-                             void (*enter_func)(gchar *, gpointer), gpointer data)
-{
-       GtkWidget *hbox;
-       GtkWidget *button;
-       GtkWidget *newentry;
-
-       hbox = gtk_hbox_new(FALSE, 0);
-
-       newentry = gtk_entry_new();
-       if (text) gtk_entry_set_text(GTK_ENTRY(newentry), text);
-       gtk_box_pack_start(GTK_BOX(hbox), newentry, TRUE, TRUE, 0);
-       gtk_widget_show(newentry);
-
-       button = tab_completion_create_complete_button(window, newentry);
-       gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
-       gtk_widget_show(button);
-
-       tab_completion_add_to_entry(newentry, enter_func, data);
-
-       if (entry) *entry = newentry;
-       return hbox;
-}
-
-void tab_completion_add_to_entry(GtkWidget *entry, void (*enter_func)(gchar *, gpointer), gpointer data)
-{
-       TabCompData *td;
-       if (!entry)
-               {
-               printf("Tab completion error: entry != NULL\n");
-               return;
-               }
-
-       td = g_new0(TabCompData, 1);
-       td->entry = entry;
-       td->dir_path = NULL;
-       td->file_list = NULL;
-       td->enter_func = enter_func;
-       td->enter_data = data;
-       td->tab_func = NULL;
-       td->tab_data = NULL;
-
-       td->has_history = FALSE;
-       td->history_key = NULL;
-       td->history_levels = 0;
-
-       gtk_object_set_data(GTK_OBJECT(td->entry), "tab_completion_data", td);
-
-       gtk_signal_connect(GTK_OBJECT(entry), "key_press_event",
-                       (GtkSignalFunc) tab_completion_key_pressed, td);
-       gtk_signal_connect(GTK_OBJECT(entry), "destroy",
-                       (GtkSignalFunc) tab_completion_destroy, td);
-}
-
-void tab_completion_add_tab_func(GtkWidget *entry, void (*tab_func)(gchar *, gpointer), gpointer data)
-{
-       TabCompData *td = gtk_object_get_data(GTK_OBJECT(entry), "tab_completion_data");
-
-       if (!td) return;
-
-       td->tab_func = tab_func;
-       td->tab_data = data;
-}
-
-gchar *remove_trailing_slash(gchar *path)
-{
-       gchar *ret;
-       gint l;
-       if (!path) return NULL;
-
-       ret = g_strdup(path);
-       l = strlen(ret);
-       if (l > 1 && ret[l - 1] == '/') ret[l - 1] = '\0';
-
-       return ret;
-}
-
diff --git a/src/tabcomp.xpm b/src/tabcomp.xpm
deleted file mode 100644 (file)
index e73bf90..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-/* XPM */
-static char * tabcomp_xpm[] = {
-"10 10 2 1",
-"      c None",
-".     c #000000",
-"         .",
-"    .    .",
-"    ..   .",
-"    ...  .",
-"........ .",
-"........ .",
-"    ...  .",
-"    ..   .",
-"    .    .",
-"         ."};
index f4e7e09..489ff2c 100644 (file)
@@ -1,19 +1,33 @@
 /*
- * GQview image viewer
- * (C)2000 John Ellis
+ * GQview
+ * (C) 2004 John Ellis
  *
  * Author: John Ellis
  *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
  */
 
+
 #include "gqview.h"
-#include "icons/img_unknown.xpm" /* fixme! duplicate, included in image.c too */
+#include "thumb.h"
+
+#include "cache.h"
+#include "image-load.h"
+#include "pixbuf_util.h"
+#include "thumb_standard.h"
+#include "ui_fileops.h"
+
+#include <utime.h>
+
 
-#define THUMBNAIL_CACHE_DIR "/.gqview_thmb"
+static void thumb_loader_error_cb(ImageLoader *il, gpointer data);
+static void thumb_loader_setup(ThumbLoader *tl, gchar *path);
+
+static gint normalize_thumb(gint *width, gint *height, gint max_w, gint max_h);
+static GdkPixbuf *get_xv_thumbnail(gchar *thumb_filename, gint max_w, gint max_h);
 
-static guchar *load_xv_thumbnail(gchar *filename, gint *widthp, gint *heightp);
-static void normalize_thumb(gint *width, gint *height);
-static gint get_xv_thumbnail(gchar *thumb_filename, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask);
 
 /*
  *-----------------------------------------------------------------------------
@@ -21,244 +35,497 @@ static gint get_xv_thumbnail(gchar *thumb_filename, GdkPixmap **thumb_pixmap, Gd
  *-----------------------------------------------------------------------------
  */
 
-gint create_thumbnail(gchar *path, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask)
+static gint thumb_loader_save_to_cache(ThumbLoader *tl)
 {
-       gint width, height;
-       gint space;
-       GdkImlibImage *thumb = NULL;
-       GdkImlibImage *image = NULL;
-       gint cached = FALSE;
+       gchar *cache_dir;
+       gint success = FALSE;
+       mode_t mode = 0755;
+
+       if (!tl || !tl->pixbuf) return FALSE;
 
-       if (debug) printf("Gen thumbnail:%s\n",path);
+       cache_dir = cache_get_location(CACHE_TYPE_THUMB, tl->path, FALSE, &mode);
 
-       /* if xvpics enabled, check for that first */
-       if (use_xvpics_thumbnails)
+       if (cache_ensure_dir_exists(cache_dir, mode))
                {
-               space = get_xv_thumbnail(path, thumb_pixmap, thumb_mask);
-               if (space != -1)
+               gchar *cache_path;
+               gchar *pathl;
+
+               cache_path = g_strconcat(cache_dir, "/", filename_from_path(tl->path),
+                                        GQVIEW_CACHE_EXT_THUMB, NULL);
+
+               if (debug) printf("Saving thumb: %s\n", cache_path);
+
+               pathl = path_from_utf8(cache_path);
+               success = pixbuf_to_file_as_png(tl->pixbuf, pathl);
+               if (success)
                        {
-                       if (debug) printf("XV thumbnail found, loaded\n");
-                       return space;
+                       struct utimbuf ut;
+                       /* set thumb time to that of source file */
+
+                       ut.actime = ut.modtime = filetime(tl->path);
+                       if (ut.modtime > 0)
+                               {
+                               utime(pathl, &ut);
+                               }
                        }
+               else
+                       {
+                       if (debug) printf("Saving failed: %s\n", pathl);
+                       }
+
+               g_free(pathl);
+               g_free(cache_path);
                }
 
-       /* start load from cache */
+       g_free(cache_dir);
 
-       if (enable_thumb_caching)
+       return success;
+}
+
+static gint thumb_loader_mark_failure(ThumbLoader *tl)
+{
+       gchar *cache_dir;
+       gint success = FALSE;
+       mode_t mode = 0755;
+       
+       if (!tl) return FALSE;
+
+       cache_dir = cache_get_location(CACHE_TYPE_THUMB, tl->path, FALSE, &mode);
+
+       if (cache_ensure_dir_exists(cache_dir, mode))
                {
                gchar *cache_path;
-               cache_path = g_strconcat(homedir(), THUMBNAIL_CACHE_DIR, path, ".png", NULL);
+               gchar *pathl;
+               FILE *f;
 
-               if (isfile(cache_path) && filetime(cache_path) >= filetime(path))
+               cache_path = g_strconcat(cache_dir, "/", filename_from_path(tl->path),
+                                        GQVIEW_CACHE_EXT_THUMB, NULL);
+
+               if (debug) printf("marking thumb failure: %s\n", cache_path);
+
+               pathl = path_from_utf8(cache_path);
+               f = fopen(pathl, "w");
+               if (f)
                        {
-                       if (debug) printf("Found in cache:%s\n", path);
-                       image = gdk_imlib_load_image(cache_path);
-                       if (image && image->rgb_width != thumb_max_width && image->rgb_height != thumb_max_height)
-                               {
-                               if (debug) printf("Thumbnail size may have changed, reloading:%s\n", path);
-                               unlink(cache_path);
-                               gdk_imlib_destroy_image(image);
-                               image = gdk_imlib_load_image(path);
-                               }
-                       else
+                       struct utimbuf ut;
+
+                       fclose (f);
+
+                       ut.actime = ut.modtime = filetime(tl->path);
+                       if (ut.modtime > 0)
                                {
-                               cached = TRUE;
+                               utime(pathl, &ut);
                                }
+
+                       success = TRUE;
                        }
-               else
-                       image = gdk_imlib_load_image(path);
-               
+
+               g_free(pathl);
+               g_free(cache_path);
                }
-       else
-               image = gdk_imlib_load_image(path);
 
-       if (!image)
+       g_free(cache_dir);
+       return success;
+}
+
+static void thumb_loader_percent_cb(ImageLoader *il, gdouble percent, gpointer data)
+{
+       ThumbLoader *tl = data;
+
+       tl->percent_done = percent;
+
+       if (tl->func_progress) tl->func_progress(tl, tl->data);
+}
+
+static void thumb_loader_done_cb(ImageLoader *il, gpointer data)
+{
+       ThumbLoader *tl = data;
+       GdkPixbuf *pixbuf;
+       gint pw, ph;
+       gint save;
+
+       if (debug) printf("thumb done: %s\n", tl->path);
+
+       pixbuf = image_loader_get_pixbuf(tl->il);
+       if (!pixbuf)
                {
-               image = gdk_imlib_create_image_from_xpm_data((gchar **)img_unknown_xpm);
-               cached = TRUE; /* no need to save a thumbnail of the unknown pixmap */
+               if (debug) printf("...but no pixbuf: %s\n", tl->path);
+               thumb_loader_error_cb(tl->il, tl);
+               return;
                }
 
-       if (image)
+       pw = gdk_pixbuf_get_width(pixbuf);
+       ph = gdk_pixbuf_get_height(pixbuf);
+
+       if (tl->cache_hit && pw != tl->max_w && ph != tl->max_h)
                {
-               if (image->rgb_width > thumb_max_width || image->rgb_height > thumb_max_height)
+               /* requested thumbnail size may have changed, load original */
+               if (debug) printf("thumbnail size mismatch, regenerating: %s\n", tl->path);
+               tl->cache_hit = FALSE;
+
+               thumb_loader_setup(tl, tl->path);
+
+               if (!image_loader_start(tl->il, thumb_loader_done_cb, tl))
                        {
-                       if (((float)thumb_max_width / image->rgb_width) < ((float)thumb_max_height / image->rgb_height))
-                               {
-                               width = thumb_max_width;
-                               height = (float)width / image->rgb_width * image->rgb_height;
-                               if (height < 1) height = 1;
-                               }
-                       else
-                               {
-                               height = thumb_max_height;
-                               width = (float)height / image->rgb_height * image->rgb_width;
-                               if (width < 1) width = 1;
-                               }
+                       image_loader_free(tl->il);
+                       tl->il = NULL;
+
+                       if (debug) printf("regeneration failure: %s\n", tl->path);
+                       thumb_loader_error_cb(tl->il, tl);
+                       }
+               return;
+               }
+
+       /* scale ?? */
+
+       if (pw > tl->max_w || ph > tl->max_h)
+               {
+               gint w, h;
+
+               if (((float)tl->max_w / pw) < ((float)tl->max_h / ph))
+                       {
+                       w = tl->max_w;
+                       h = (float)w / pw * ph;
+                       if (h < 1) h = 1;
                        }
                else
                        {
-                       width = image->rgb_width;
-                       height = image->rgb_height;
-                       cached = TRUE; /* don't cache images smaller than thumbnail size */
+                       h = tl->max_h;
+                       w = (float)h / ph * pw;
+                       if (w < 1) w = 1;
                        }
-               if (*thumb_pixmap) gdk_imlib_free_pixmap(*thumb_pixmap);
-               *thumb_pixmap = NULL;
-               *thumb_mask = NULL;
 
-       /* start save cache */
+               tl->pixbuf = gdk_pixbuf_scale_simple(pixbuf, w, h, (GdkInterpType)thumbnail_quality);
+               save = TRUE;
+               }
+       else
+               {
+               tl->pixbuf = pixbuf;
+               gdk_pixbuf_ref(tl->pixbuf);
+               save = FALSE;
+               }
+
+       /* save it ? */
+       if (tl->cache_enable && save)
+               {
+               thumb_loader_save_to_cache(tl);
+               }
+
+       if (tl->func_done) tl->func_done(tl, tl->data);
+}
+
+static void thumb_loader_error_cb(ImageLoader *il, gpointer data)
+{
+       ThumbLoader *tl = data;
+
+       /* if at least some of the image is available, go to done_cb */
+       if (image_loader_get_pixbuf(tl->il) != NULL)
+               {
+               thumb_loader_done_cb(il, data);
+               return;
+               }
+
+       if (debug) printf("thumb error: %s\n", tl->path);
+
+       image_loader_free(tl->il);
+       tl->il = NULL;
+
+       if (tl->func_error) tl->func_error(tl, tl->data);
+}
+
+static gint thumb_loader_done_delay_cb(gpointer data)
+{
+       ThumbLoader *tl = data;
+
+       tl->idle_done_id = -1;
+
+       if (tl->func_done) tl->func_done(tl, tl->data);
+
+       return FALSE;
+}
+
+static void thumb_loader_delay_done(ThumbLoader *tl)
+{
+       if (tl->idle_done_id == -1) tl->idle_done_id = g_idle_add(thumb_loader_done_delay_cb, tl);
+}
+
+static void thumb_loader_setup(ThumbLoader *tl, gchar *path)
+{
+       image_loader_free(tl->il);
+       tl->il = image_loader_new(path);
+
+#if 0
+       /* this will speed up jpegs by up to 3x in some cases */
+       image_loader_set_requested_size(tl->max_w, tl->max_h);
+#endif
+
+       image_loader_set_error_func(tl->il, thumb_loader_error_cb, tl);
+       if (tl->func_progress) image_loader_set_percent_func(tl->il, thumb_loader_percent_cb, tl);
+}
+
+void thumb_loader_set_callbacks(ThumbLoader *tl,
+                               ThumbLoaderFunc func_done,
+                               ThumbLoaderFunc func_error,
+                               ThumbLoaderFunc func_progress,
+                               gpointer data)
+{
+       if (!tl) return;
+
+       if (tl->standard_loader)
+               {
+               thumb_loader_std_set_callbacks((ThumbLoaderStd *)tl,
+                                              (ThumbLoaderStdFunc) func_done,
+                                              (ThumbLoaderStdFunc) func_error,
+                                              (ThumbLoaderStdFunc) func_progress,
+                                              data);
+               return;
+               }
+
+       tl->func_done = func_done;
+       tl->func_error = func_error;
+       tl->func_progress = func_progress;
+
+       tl->data = data;
+}
+
+void thumb_loader_set_cache(ThumbLoader *tl, gint enable_cache, gint local, gint retry_failed)
+{
+        if (!tl) return;
+
+       if (tl->standard_loader)
+               {
+               thumb_loader_std_set_cache((ThumbLoaderStd *)tl, enable_cache, local, retry_failed);
+               return;
+               }
+
+       tl->cache_enable = enable_cache;
+#if 0
+       tl->cache_local = local;
+       tl->cache_retry = retry_failed;
+#endif
+}
+
+
+gint thumb_loader_start(ThumbLoader *tl, const gchar *path)
+{
+       gchar *cache_path = NULL;
 
-               if (enable_thumb_caching && !cached)
+       if (!tl) return FALSE;
+
+       if (tl->standard_loader)
+               {
+               return thumb_loader_std_start((ThumbLoaderStd *)tl, path);
+               }
+
+       if (!tl->path && !path) return FALSE;
+
+       if (!tl->path) tl->path = g_strdup(path);
+
+       if (tl->cache_enable)
+               {
+               cache_path = cache_find_location(CACHE_TYPE_THUMB, tl->path);
+
+               if (cache_path)
                        {
-                       gchar *thumb_path;
-                       gchar *base_dir;
-                       gchar *thumb_dir;
-                       gchar *image_dir;
-
-                       /* attempt at speed-up? move this here */
-                       thumb = gdk_imlib_clone_scaled_image(image, width, height);
-                       gdk_imlib_destroy_image(image);
-                       image = NULL;
-
-                       base_dir = g_strconcat(homedir(), THUMBNAIL_CACHE_DIR, NULL);
-                       if (!isdir(base_dir))
+                       if (cache_time_valid(cache_path, tl->path))
                                {
-                               if (debug) printf("creating thumbnail dir:%s\n", base_dir);
-                               if (mkdir(base_dir, 0755) < 0)
-                                       printf(_("create dir failed: %s\n"), base_dir);
-                               }
+                               if (debug) printf("Found in cache:%s\n", tl->path);
 
-                       image_dir = remove_level_from_path(path);
-                       thumb_dir = g_strconcat(base_dir, image_dir, NULL);
-                       g_free(image_dir);
-                       if (!isdir(thumb_dir))
-                               {
-                               gchar *p = thumb_dir;
-                               while (p[0] != '\0')
+                               if (filesize(cache_path) == 0)
                                        {
-                                       p++;
-                                       if (p[0] == '/' || p[0] == '\0')
-                                               {
-                                               gint end = TRUE;
-                                               if (p[0] != '\0')
-                                                       {
-                                                       p[0] = '\0';
-                                                       end = FALSE;
-                                                       }
-                                               if (!isdir(thumb_dir))
-                                                       {
-                                                       if (debug) printf("creating sub dir:%s\n",thumb_dir);
-                                                       if (mkdir(thumb_dir, 0755) < 0)
-                                                               printf(_("create dir failed: %s\n"), thumb_dir);
-                                                       }
-                                               if (!end) p[0] = '/';
-                                               }
+                                       if (debug) printf("Broken image mark found:%s\n", cache_path);
+                                       g_free(cache_path);
+                                       return FALSE;
                                        }
+
+                               if (debug) printf("Cache location:%s\n", cache_path);
+                               }
+                       else
+                               {
+                               g_free(cache_path);
+                               cache_path = NULL;
                                }
-                       g_free(thumb_dir);
+                       }
+               }
 
-                       thumb_path = g_strconcat(base_dir, path, ".png", NULL);
-                       if (debug) printf("Saving thumb: %s\n",thumb_path);
+       if (!cache_path && use_xvpics_thumbnails)
+               {
+               tl->pixbuf = get_xv_thumbnail(tl->path, tl->max_w, tl->max_h);
+               if (tl->pixbuf)
+                       {
+                       thumb_loader_delay_done(tl);
+                       return TRUE;
+                       }
+               }
 
-                       gdk_imlib_save_image(thumb, thumb_path, NULL);
+       if (cache_path)
+               {
+               thumb_loader_setup(tl, cache_path);
+               g_free(cache_path);
+               tl->cache_hit = TRUE;
+               }
+       else
+               {
+               thumb_loader_setup(tl, tl->path);
+               }
 
-                       g_free(base_dir);
-                       g_free(thumb_path);
+       if (!image_loader_start(tl->il, thumb_loader_done_cb, tl))
+               {
+               /* try from original if cache attempt */
+               if (tl->cache_hit)
+                       {
+                       tl->cache_hit = FALSE;
+                       print_term(_("Thumbnail image in cache failed to load, trying to recreate.\n"));
+
+                       thumb_loader_setup(tl, tl->path);
+                       if (image_loader_start(tl->il, thumb_loader_done_cb, tl)) return TRUE;
                        }
-               else
+               /* mark failed thumbnail in cache with 0 byte file */
+               if (tl->cache_enable)
                        {
-                       thumb = image;
+                       thumb_loader_mark_failure(tl);
                        }
+               
+               image_loader_free(tl->il);
+               tl->il = NULL;
+               return FALSE;
+               }
+
+       return TRUE;
+}
 
-       /* end save cache */
+#if 0
+gint thumb_loader_to_pixmap(ThumbLoader *tl, GdkPixmap **pixmap, GdkBitmap **mask)
+{
+       if (!tl || !tl->pixbuf) return -1;
+
+       gdk_pixbuf_render_pixmap_and_mask(tl->pixbuf, pixmap, mask, 128);
+
+       return thumb_loader_get_space(tl);
+}
+#endif
 
-               gdk_imlib_render(thumb, width, height);
-               *thumb_pixmap = gdk_imlib_move_image(thumb);
-               *thumb_mask = gdk_imlib_move_mask(thumb);
-               if (*thumb_pixmap)
-                       space = thumb_max_width - width;
-               gdk_imlib_destroy_image(thumb);
-               thumb = NULL;
+GdkPixbuf *thumb_loader_get_pixbuf(ThumbLoader *tl, gint with_fallback)
+{
+       GdkPixbuf *pixbuf;
+
+       if (tl && tl->standard_loader)
+               {
+               return thumb_loader_std_get_pixbuf((ThumbLoaderStd *)tl, with_fallback);
+               }
+
+       if (tl && tl->pixbuf)
+               {
+               pixbuf = tl->pixbuf;
+               g_object_ref(pixbuf);
+               }
+       else if (with_fallback)
+               {
+               gint w, h;
+
+               pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN);
+               w = gdk_pixbuf_get_width(pixbuf);
+               h = gdk_pixbuf_get_height(pixbuf);
+               if ((w > tl->max_w || h > tl->max_h) &&
+                   normalize_thumb(&w, &h, tl->max_w, tl->max_h))
+                       {
+                       GdkPixbuf *tmp;
+
+                       tmp = pixbuf;
+                       pixbuf = gdk_pixbuf_scale_simple(tmp, w, h, GDK_INTERP_NEAREST);
+                       gdk_pixbuf_unref(tmp);
+                       }
                }
        else
                {
-               space = -1;
+               pixbuf = NULL;
                }
-       return space;
+
+       return pixbuf;
 }
 
-gint maintain_thumbnail_dir(gchar *dir, gint recursive)
+#if 0
+gint thumb_loader_get_space(ThumbLoader *tl)
 {
-       gchar *thumb_dir;
-       gint base_length;
-       gint still_have_a_file = FALSE;
+       if (!tl) return 0;
 
-       if (debug) printf("maintainance check: %s\n", dir);
+       if (tl->pixbuf) return (tl->max_w - gdk_pixbuf_get_width(tl->pixbuf));
 
-       base_length = strlen(homedir()) + strlen(THUMBNAIL_CACHE_DIR);
-       thumb_dir = g_strconcat(homedir(), THUMBNAIL_CACHE_DIR, dir, NULL);
+       return tl->max_w;
+}
+#endif
+
+ThumbLoader *thumb_loader_new(gint width, gint height)
+{
+       ThumbLoader *tl;
 
-       if (isdir(thumb_dir))
+       if (thumbnail_spec_standard)
                {
-               DIR             *dp;
-               struct dirent   *dirent;
-               struct stat ent_sbuf;
+               return (ThumbLoader *)thumb_loader_std_new(width, height);
+               }
 
-               if((dp = opendir(thumb_dir))==NULL)
-                       {
-                               /* dir not found */
-                               g_free(thumb_dir);
-                               return FALSE;
-                       }
+       tl = g_new0(ThumbLoader, 1);
+       tl->standard_loader = FALSE;
+       tl->path = NULL;
+       tl->cache_enable = enable_thumb_caching;
+       tl->cache_hit = FALSE;
+       tl->percent_done = 0.0;
+       tl->max_w = width;
+       tl->max_h = height;
 
-               while ((dirent = readdir(dp)) != NULL)
-                       {
-                       /* skips removed files */
-                       if (dirent->d_ino > 0)
-                               {
-                               int l = 0;
-                               gchar *path_buf;
-                               if (strcmp(dirent->d_name, ".") == 0 || strcmp(dirent->d_name, "..") == 0)
-                                       continue;
-                               path_buf = g_strconcat(thumb_dir, "/", dirent->d_name, NULL);
-                               if (strlen(path_buf) > 4) l = strlen(path_buf) - 4;
-
-                               if (stat(path_buf,&ent_sbuf) >= 0 && S_ISDIR(ent_sbuf.st_mode))
-                                       {
-                                       /* recurse dir then delete it */
-                                       gchar *rdir = g_strconcat(dir, "/", dirent->d_name, NULL);
-                                       if (recursive && !maintain_thumbnail_dir(rdir, TRUE))
-                                               {
-                                               if (debug) printf("Deleting thumb dir: %s\n",path_buf);
-                                               if ( (rmdir (path_buf) < 0) )
-                                                       printf(_("Unable to delete dir: %s\n"), path_buf);
-                                               }
-                                       else
-                                               still_have_a_file = TRUE;
-                                       g_free(rdir);
-                                       }
-                               else
-                                       {
-                                       gchar *fp = path_buf + l;
-                                       fp[0] = '\0';
-                                       if (strlen(path_buf) > base_length &&
-                                                       !isfile(path_buf + base_length))
-                                               {
-                                               fp[0] = '.';
-                                               if (debug) printf("Deleting thumb: %s\n",path_buf);
-                                               if ( (unlink (path_buf) < 0) )
-                                                       printf(_("failed to delete:%s\n"),path_buf);
-                                               }
-                                       else
-                                                still_have_a_file = TRUE;
-                                       }
-                               g_free(path_buf);
-                               }
-                       }
-               closedir(dp);
+       tl->il = NULL;
+
+       tl->idle_done_id = -1;
+
+       return tl;
+}
+
+void thumb_loader_free(ThumbLoader *tl)
+{
+       if (!tl) return;
+
+       if (tl->standard_loader)
+               {
+               thumb_loader_std_free((ThumbLoaderStd *)tl);
+               return;
+               }
+
+       if (tl->pixbuf) gdk_pixbuf_unref(tl->pixbuf);
+       image_loader_free(tl->il);
+       g_free(tl->path);
+
+       if (tl->idle_done_id != -1) g_source_remove(tl->idle_done_id);
+
+       g_free(tl);
+}
+
+#if 0
+gint thumb_from_xpm_d(const char **data, gint max_w, gint max_h, GdkPixmap **pixmap, GdkBitmap **mask)
+{
+       GdkPixbuf *pixbuf;
+       gint w, h;
+
+       pixbuf = gdk_pixbuf_new_from_xpm_data(data);
+       w = gdk_pixbuf_get_width(pixbuf);
+       h = gdk_pixbuf_get_height(pixbuf);
+
+       if ((w > max_w || h > max_h) &&
+           normalize_thumb(&w, &h, max_w, max_h))
+               {
+               /* scale */
+               GdkPixbuf *tmp;
+
+               tmp = pixbuf;
+               pixbuf = gdk_pixbuf_scale_simple(tmp, w, h, GDK_INTERP_NEAREST);
+               gdk_pixbuf_unref(tmp);
                }
-       g_free(thumb_dir);
-       return still_have_a_file;
+
+       gdk_pixbuf_render_pixmap_and_mask(pixbuf, pixmap, mask, 128);
+       gdk_pixbuf_unref(pixbuf);
+
+       return w;
 }
+#endif
 
 /*
  *-----------------------------------------------------------------------------
@@ -272,6 +539,7 @@ gint maintain_thumbnail_dir(gchar *dir, gint recursive)
  *
  * Note: Code has been modified to fit the style of the other code, and to use
  *       a few more glib-isms.
+ * 08-28-2000: Updated to return a gdk_pixbuf, Imlib is dieing a death here.
  */
 
 #define XV_BUFFER 2048
@@ -310,17 +578,31 @@ static guchar *load_xv_thumbnail(gchar *filename, gint *widthp, gint *heightp)
 }
 #undef XV_BUFFER
 
-static void normalize_thumb(gint *width, gint *height)
+static gint normalize_thumb(gint *width, gint *height, gint max_w, gint max_h)
 {
-       if(*width > thumb_max_width || *height > thumb_max_height)
+       gdouble scale;
+       gint new_w, new_h;
+
+       scale = MIN((gdouble) max_w / *width, (gdouble) max_h / *height);
+       new_w = *width * scale;
+       new_h = *height * scale;
+
+       if (new_w != *width || new_h != *height)
                {
-               gfloat factor = MAX((gfloat) *width / thumb_max_width, (gfloat) *height / thumb_max_height);
-               *width = (gfloat) *width / factor;
-               *height = (gfloat) *height / factor;
+               *width = new_w;
+               *height = new_h;
+               return TRUE;
                }
+
+       return FALSE;
+}
+
+static void free_rgb_buffer(guchar *pixels, gpointer data)
+{
+       g_free(pixels);
 }
 
-static gint get_xv_thumbnail(gchar *thumb_filename, GdkPixmap **thumb_pixmap, GdkBitmap **thumb_mask)
+static GdkPixbuf *get_xv_thumbnail(gchar *thumb_filename, gint max_w, gint max_h)
 {
        gint width, height;
        gchar *thumb_name;
@@ -328,9 +610,9 @@ static gint get_xv_thumbnail(gchar *thumb_filename, GdkPixmap **thumb_pixmap, Gd
        gchar *last_slash;
        guchar *packed_data;
 
-       tmp_string = g_strdup(thumb_filename);  
+       tmp_string = path_from_utf8(thumb_filename);
        last_slash = strrchr(tmp_string, '/');
-       if(!last_slash) return -1;
+       if(!last_slash) return NULL;
        *last_slash++ = '\0';
 
        thumb_name = g_strconcat(tmp_string, "/.xvpics/", last_slash, NULL);
@@ -341,7 +623,7 @@ static gint get_xv_thumbnail(gchar *thumb_filename, GdkPixmap **thumb_pixmap, Gd
        if(packed_data)
                {
                guchar *rgb_data;
-               GdkImlibImage *image;
+               GdkPixbuf *pixbuf;
                gint i;
 
                rgb_data = g_new(guchar, width * height * 3);
@@ -351,21 +633,26 @@ static gint get_xv_thumbnail(gchar *thumb_filename, GdkPixmap **thumb_pixmap, Gd
                        rgb_data[i * 3 + 1] = ((packed_data[i] & 28) >> 2) * 36;
                        rgb_data[i * 3 + 2] = (packed_data[i] & 3) * 85;
                        }
-
                g_free(packed_data);
-               image = gdk_imlib_create_image_from_data(rgb_data, NULL, width, height);
-               g_free(rgb_data);
-               normalize_thumb(&width, &height);
-               gdk_imlib_render(image, width, height);
-       
-               if(*thumb_pixmap) gdk_imlib_free_pixmap(*thumb_pixmap);
 
-               *thumb_pixmap = gdk_imlib_move_image(image);
-               *thumb_mask = gdk_imlib_move_mask(image);
-               gdk_imlib_destroy_image(image);
-               return thumb_max_width - width;
+               pixbuf = gdk_pixbuf_new_from_data(rgb_data, GDK_COLORSPACE_RGB, FALSE, 8,
+                                                 width, height, 3 * width, free_rgb_buffer, NULL);
+
+               if (normalize_thumb(&width, &height, max_w, max_h))
+                       {
+                       /* scale */
+                       GdkPixbuf *tmp;
+
+                       tmp = pixbuf;
+                       pixbuf = gdk_pixbuf_scale_simple(tmp, width, height, GDK_INTERP_NEAREST);
+                       gdk_pixbuf_unref(tmp);
+                       }
+       
+               return pixbuf;
                }
 
-       return -1;
+       return NULL;
 }
 
+
+
diff --git a/src/thumb.h b/src/thumb.h
new file mode 100644 (file)
index 0000000..fed9b7f
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef THUMB_H
+#define THUMB_H
+
+
+ThumbLoader *thumb_loader_new(gint width, gint height);
+void thumb_loader_set_callbacks(ThumbLoader *tl,
+                               ThumbLoaderFunc func_done,
+                               ThumbLoaderFunc func_error,
+                               ThumbLoaderFunc func_progress,
+                               gpointer data);
+void thumb_loader_set_cache(ThumbLoader *tl, gint enable_cache, gint local, gint retry_failed);
+
+gint thumb_loader_start(ThumbLoader *tl, const gchar *path);
+void thumb_loader_free(ThumbLoader *tl);
+
+GdkPixbuf *thumb_loader_get_pixbuf(ThumbLoader *tl, gint with_fallback);
+
+
+#endif
diff --git a/src/thumb_standard.c b/src/thumb_standard.c
new file mode 100644 (file)
index 0000000..edf021e
--- /dev/null
@@ -0,0 +1,1124 @@
+/*
+ * GQview
+ * (C) 2005 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "gqview.h"
+#include "thumb_standard.h"
+
+#include "cache.h"     /* for cache_ensure_dir_exists */
+#include "image-load.h"
+#include "md5-util.h"
+#include "pixbuf_util.h"
+#include "ui_fileops.h"
+
+
+/*
+ * This thumbnail caching implementation attempts to conform
+ * to the Thumbnail Managing Standard proposed on freedesktop.org
+ * The standard is documented here:
+ *   http://triq.net/~jens/thumbnail-spec/index.html
+ *  (why isn't it actually hosted on freedesktop.org?)
+ *
+ * This code attempts to conform to version 0.7.0 of the standard.
+ *
+ * Notes:
+ *   > Validation of the thumb's embedded uri is a simple strcmp between our
+ *     version of the escaped uri and the thumb's escaped uri. But not all uri
+ *     escape functions escape the same set of chars, comparing the unescaped
+ *     versions may be more accurate.
+ *   > Only Thumb::URI and Thumb::MTime are stored in a thumb at this time.
+ *     Storing the Size, Width, Height should probably be implemented.
+ */
+
+
+#define THUMB_SIZE_NORMAL 128
+#define THUMB_SIZE_LARGE  256
+
+#define THUMB_MARKER_URI    "tEXt::Thumb::URI"
+#define THUMB_MARKER_MTIME  "tEXt::Thumb::MTime"
+#define THUMB_MARKER_SIZE   "tEXt::Thumb::Size"
+#define THUMB_MARKER_WIDTH  "tEXt::Thumb::Image::Width"
+#define THUMB_MARKER_HEIGHT "tEXt::Thumb::Image::Height"
+#define THUMB_MARKER_APP    "tEXt::Software"
+
+#define THUMB_PERMS_FOLDER 0700
+#define THUMB_PERMS_THUMB  0600
+
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * thumbnail loader
+ *-----------------------------------------------------------------------------
+ */
+
+
+static void thumb_loader_std_error_cb(ImageLoader *il, gpointer data);
+static gint thumb_loader_std_setup(ThumbLoaderStd *tl, const gchar *path);
+
+
+ThumbLoaderStd *thumb_loader_std_new(gint width, gint height)
+{
+       ThumbLoaderStd *tl;
+
+       tl = g_new0(ThumbLoaderStd, 1);
+
+       tl->standard_loader = TRUE;
+
+       tl->requested_width = width;
+       tl->requested_height = height;
+
+       tl->pixbuf = NULL;
+       tl->il = NULL;
+       tl->source_path = NULL;
+
+       tl->cache_enable = enable_thumb_caching;
+       tl->cache_local = FALSE;
+       tl->cache_retry = FALSE;
+
+       return tl;
+}
+
+void thumb_loader_std_set_callbacks(ThumbLoaderStd *tl,
+                                   ThumbLoaderStdFunc func_done,
+                                   ThumbLoaderStdFunc func_error,
+                                   ThumbLoaderStdFunc func_progress,
+                                   gpointer data)
+{
+       if (!tl) return;
+
+       tl->func_done = func_done;
+       tl->func_error = func_error;
+       tl->func_progress = func_progress;
+       tl->data = data;
+}
+
+static void thumb_loader_std_reset(ThumbLoaderStd *tl)
+{
+       if (tl->pixbuf) g_object_unref(tl->pixbuf);
+       tl->pixbuf = NULL;
+
+       image_loader_free(tl->il);
+       tl->il = NULL;
+
+       g_free(tl->source_path);
+       tl->source_path = NULL;
+
+       g_free(tl->thumb_path);
+       tl->thumb_path = NULL;
+
+       g_free(tl->thumb_uri);
+       tl->thumb_uri = NULL;
+       tl->local_uri = NULL;
+
+       tl->thumb_path_local = FALSE;
+
+       tl->cache_hit = FALSE;
+
+       tl->source_mtime = 0;
+       tl->source_size = 0;
+       tl->source_mode = 0;
+
+       tl->progress = 0.0;
+}
+
+static gchar *thumb_std_cache_path(const gchar *path, const gchar *uri, gint local,
+                                  const gchar *cache_subfolder)
+{
+       gchar *result = NULL;
+       gchar *cache_base;
+       gchar *md5_text;
+       guchar digest[16];
+
+       if (!path || !uri || !cache_subfolder) return NULL;
+
+       if (local)
+               {
+               gchar *base;
+
+               base = remove_level_from_path(path);
+               cache_base = g_strconcat(base, "/", THUMB_FOLDER, "/", cache_subfolder, NULL);
+               g_free(base);
+               }
+       else
+               {
+               cache_base = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", cache_subfolder, NULL);
+               }
+
+       md5_get_digest(uri, strlen(uri), digest);
+       md5_text = md5_digest_to_text(digest);
+
+       if (cache_base && md5_text)
+               {
+               result = g_strconcat(cache_base, "/", md5_text, THUMB_NAME_EXTENSION, NULL);
+               }
+
+       g_free(cache_base);
+       g_free(md5_text);
+
+       return result;
+}
+
+static gchar *thumb_loader_std_cache_path(ThumbLoaderStd *tl, gint local, GdkPixbuf *pixbuf, gint fail)
+{
+#if 0
+       gchar *result = NULL;
+       gchar *cache_base;
+#endif
+       const gchar *folder_size;
+#if 0
+       const gchar *uri;
+       gchar *md5_text;
+       guchar digest[16];
+#endif
+       gint w, h;
+
+       if (!tl->source_path || !tl->thumb_uri) return NULL;
+
+       if (pixbuf)
+               {
+               w = gdk_pixbuf_get_width(pixbuf);
+               h = gdk_pixbuf_get_height(pixbuf);
+               }
+       else
+               {
+               w = tl->requested_width;
+               h = tl->requested_height;
+               }
+
+       if (fail)
+               {
+               folder_size = THUMB_FOLDER_FAIL;
+               }
+       else if (w > THUMB_SIZE_NORMAL || h > THUMB_SIZE_NORMAL)
+               {
+               folder_size = THUMB_FOLDER_LARGE;
+               }
+       else
+               {
+               folder_size = THUMB_FOLDER_NORMAL;
+               }
+
+       return thumb_std_cache_path(tl->source_path,
+                                   (local) ?  tl->local_uri : tl->thumb_uri,
+                                   local, folder_size);
+
+#if 0
+       if (local)
+               {
+               gchar *base;
+
+               base = remove_level_from_path(tl->source_path);
+               cache_base = g_strconcat(base, "/", THUMB_FOLDER, "/", folder_size, NULL);
+               g_free(base);
+               }
+       else
+               {
+               cache_base = g_strconcat(homedir(), "/", THUMB_FOLDER, "/", folder_size, NULL);
+               }
+
+       uri = (local) ? tl->local_uri : tl->thumb_uri;
+       md5_get_digest(uri, strlen(uri), digest);
+       md5_text = md5_digest_to_text(digest);
+
+       if (cache_base && md5_text)
+               {
+               result = g_strconcat(cache_base, "/", md5_text, THUMB_NAME_EXTENSION, NULL);
+               }
+
+       g_free(cache_base);
+       g_free(md5_text);
+
+       return result;
+#endif
+}
+
+static gint thumb_loader_std_fail_check(ThumbLoaderStd *tl)
+{
+       gchar *fail_path;
+       gint result = FALSE;
+
+       fail_path = thumb_loader_std_cache_path(tl, FALSE, NULL, TRUE);
+       if (isfile(fail_path))
+               {
+               GdkPixbuf *pixbuf;
+
+               if (tl->cache_retry)
+                       {
+                       pixbuf = NULL;
+                       }
+               else
+                       {
+                       gchar *pathl;
+
+                       pathl = path_from_utf8(fail_path);
+                       pixbuf = gdk_pixbuf_new_from_file(pathl, NULL);
+                       g_free(pathl);
+                       }
+
+               if (pixbuf)
+                       {
+                       const gchar *mtime_str;
+
+                       mtime_str = gdk_pixbuf_get_option(pixbuf, THUMB_MARKER_MTIME);
+                       if (mtime_str && strtol(mtime_str, NULL, 10) == tl->source_mtime)
+                               {
+                               result = TRUE;
+                               if (debug)
+                                       {
+                                       printf("thumb fail valid: %s\n", tl->source_path);
+                                       printf("           thumb: %s\n", fail_path);
+                                       }
+                               }
+
+                       g_object_unref(G_OBJECT(pixbuf));
+                       }
+
+               if (!result) unlink_file(fail_path);
+               }
+       g_free(fail_path);
+
+       return result;
+}
+
+static gint thumb_loader_std_validate(ThumbLoaderStd *tl, GdkPixbuf *pixbuf)
+{
+       const gchar *valid_uri;
+       const gchar *uri;
+       const gchar *mtime_str;
+       time_t mtime;
+       gint w, h;
+
+       if (!pixbuf) return FALSE;
+
+       w = gdk_pixbuf_get_width(pixbuf);
+       h = gdk_pixbuf_get_height(pixbuf);
+
+       if (w != THUMB_SIZE_NORMAL && w != THUMB_SIZE_LARGE &&
+           h != THUMB_SIZE_NORMAL && h != THUMB_SIZE_LARGE) return FALSE;
+
+       valid_uri = (tl->thumb_path_local) ? tl->local_uri : tl->thumb_uri;
+
+       uri = gdk_pixbuf_get_option(pixbuf, THUMB_MARKER_URI);
+       mtime_str = gdk_pixbuf_get_option(pixbuf, THUMB_MARKER_MTIME);
+
+       if (!mtime_str || !uri || !valid_uri) return FALSE;
+       if (strcmp(uri, valid_uri) != 0) return FALSE;
+
+       mtime = strtol(mtime_str, NULL, 10);
+       if (tl->source_mtime != mtime) return FALSE;
+
+       return TRUE;
+}
+
+static void thumb_loader_std_save(ThumbLoaderStd *tl, GdkPixbuf *pixbuf)
+{
+       gchar *base_path;
+       gchar *tmp_path;
+       gint fail;
+
+       if (!tl->cache_enable || tl->cache_hit) return;
+       if (tl->thumb_path) return;
+
+       if (!pixbuf)
+               {
+               /* local failures are not stored */
+               if (tl->cache_local) return;
+
+               pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 1, 1);
+               fail = TRUE;
+               }
+       else
+               {
+               g_object_ref(G_OBJECT(pixbuf));
+               fail = FALSE;
+               }
+
+       tl->thumb_path = thumb_loader_std_cache_path(tl, tl->cache_local, pixbuf, fail);
+       if (!tl->thumb_path)
+               {
+               g_object_unref(G_OBJECT(pixbuf));
+               return;
+               }
+       tl->thumb_path_local = tl->cache_local;
+
+       /* create thumbnail dir if needed */
+       base_path = remove_level_from_path(tl->thumb_path);
+       if (tl->cache_local)
+               {
+               if (!isdir(base_path))
+                       {
+                       struct stat st;
+                       gchar *source_base;
+
+                       source_base = remove_level_from_path(tl->source_path);
+                       if (stat_utf8(source_base, &st))
+                               {
+                               cache_ensure_dir_exists(base_path, st.st_mode);
+                               }
+                       g_free(source_base);
+                       }
+               }
+       else
+               {
+               cache_ensure_dir_exists(base_path, THUMB_PERMS_FOLDER);
+               }
+       g_free(base_path);
+
+       if (debug)
+               {
+               printf("thumb saving: %s\n", tl->source_path);
+               printf("       saved: %s\n", tl->thumb_path);
+               }
+
+       /* save thumb, using a temp file then renaming into place */
+       tmp_path = unique_filename(tl->thumb_path, ".tmp", "_", 2);
+       if (tmp_path)
+               {
+               const gchar *mark_uri;
+               gchar *mark_app;
+               gchar *mark_mtime;
+               gchar *pathl;
+               gint success;
+
+               mark_uri = (tl->cache_local) ? tl->local_uri :tl->thumb_uri;
+
+               mark_app = g_strdup_printf("GQview %s", VERSION);
+               mark_mtime = g_strdup_printf("%lu", tl->source_mtime);
+
+               pathl = path_from_utf8(tmp_path);
+               success = gdk_pixbuf_save(pixbuf, pathl, "png", NULL,
+                                         THUMB_MARKER_URI, mark_uri,
+                                         THUMB_MARKER_MTIME, mark_mtime,
+                                         THUMB_MARKER_APP, mark_app,
+                                         NULL);
+               if (success)
+                       {
+                       chmod(pathl, (tl->cache_local) ? tl->source_mode : THUMB_PERMS_THUMB);
+                       success = rename_file(tmp_path, tl->thumb_path);
+                       }
+
+               g_free(pathl);
+
+               g_free(mark_mtime);
+               g_free(mark_app);
+
+               g_free(tmp_path);
+               if (!success && debug)
+                       {
+                       printf("thumb save failed: %s\n", tl->source_path);
+                       printf("            thumb: %s\n", tl->thumb_path);
+                       }
+
+               }
+
+       g_object_unref(G_OBJECT(pixbuf));
+}
+
+static gint thumb_loader_std_scale_aspect(gint req_w, gint req_h, gint old_w, gint old_h,
+                                         gint *new_w, gint *new_h)
+{
+       if (((gdouble)req_w / old_w) < ((gdouble)req_h / old_h))
+               {
+               *new_w = req_w;
+               *new_h = (gdouble)*new_w / old_w * old_h;
+               if (*new_h < 1) *new_h = 1;
+               }
+       else
+               {
+               *new_h = req_h;
+               *new_w = (gdouble)*new_h / old_h * old_w;
+               if (*new_w < 1) *new_w = 1;
+               }
+
+       return (*new_w != old_w || *new_h != old_h);
+}
+
+static GdkPixbuf *thumb_loader_std_finish(ThumbLoaderStd *tl, GdkPixbuf *pixbuf)
+{
+       GdkPixbuf *pixbuf_thumb = NULL;
+       GdkPixbuf *result;
+       gint sw, sh;
+
+       sw = gdk_pixbuf_get_width(pixbuf);
+       sh = gdk_pixbuf_get_height(pixbuf);
+
+       if (tl->cache_enable && !tl->cache_hit &&
+           (sw >= THUMB_SIZE_NORMAL || sh >= THUMB_SIZE_NORMAL))
+               {
+               gint cache_w, cache_h;
+               gint thumb_w, thumb_h;
+
+               if (tl->requested_width > THUMB_SIZE_NORMAL || tl->requested_height > THUMB_SIZE_NORMAL)
+                       {
+                       cache_w = cache_h = THUMB_SIZE_LARGE;
+                       }
+               else
+                       {
+                       cache_w = cache_h = THUMB_SIZE_NORMAL;
+                       }
+
+               if (thumb_loader_std_scale_aspect(cache_w, cache_h, sw, sh,
+                                                 &thumb_w, &thumb_h))
+                       {
+                       pixbuf_thumb = gdk_pixbuf_scale_simple(pixbuf, thumb_w, thumb_h,
+                                                              (GdkInterpType)thumbnail_quality);
+                       }
+               else
+                       {
+                       pixbuf_thumb = pixbuf;
+                       g_object_ref(G_OBJECT(pixbuf_thumb));
+                       }
+               
+               thumb_loader_std_save(tl, pixbuf_thumb);
+               }
+       else if (tl->cache_enable && tl->cache_local &&
+                tl->cache_hit && !tl->thumb_path_local)
+               {
+               /* A local cache save was requested, but a valid thumb is in $HOME,
+                * so specifically save as a local thumbnail.
+                */
+               g_free(tl->thumb_path);
+               tl->thumb_path = NULL;
+
+               tl->cache_hit = FALSE;
+
+               if (debug) printf("thumb copied: %s\n", tl->source_path);
+
+               thumb_loader_std_save(tl, pixbuf);
+               }
+
+       if (sw <= tl->requested_width && sh <= tl->requested_height)
+               {
+               result = pixbuf;
+               g_object_ref(result);
+               }
+       else
+               {
+               gint thumb_w, thumb_h;
+
+               if (pixbuf_thumb)
+                       {
+                       pixbuf = pixbuf_thumb;
+                       sw = gdk_pixbuf_get_width(pixbuf);
+                       sh = gdk_pixbuf_get_height(pixbuf);
+                       }
+
+               if (thumb_loader_std_scale_aspect(tl->requested_width, tl->requested_height, sw, sh,
+                                                 &thumb_w, &thumb_h))
+                       {
+                       result = gdk_pixbuf_scale_simple(pixbuf, thumb_w, thumb_h,
+                                                        (GdkInterpType)thumbnail_quality);
+                       }
+               else
+                       {
+                       result = pixbuf;
+                       g_object_ref(result);
+                       }
+               }
+
+       if (pixbuf_thumb) g_object_unref(pixbuf_thumb);
+
+       return result;
+}
+
+static gint thumb_loader_std_next_source(ThumbLoaderStd *tl, gint remove_broken)
+{
+       image_loader_free(tl->il);
+       tl->il = NULL;
+
+       if (tl->thumb_path)
+               {
+               if (!tl->thumb_path_local && remove_broken)
+                       {
+                       if (debug) printf("thumb broken, unlinking: %s\n", tl->thumb_path);
+                       unlink_file(tl->thumb_path);
+                       }
+
+               g_free(tl->thumb_path);
+               tl->thumb_path = NULL;
+
+               if (!tl->thumb_path_local)
+                       {
+                       tl->thumb_path = thumb_loader_std_cache_path(tl, TRUE, NULL, FALSE);
+                       if (isfile(tl->thumb_path) && thumb_loader_std_setup(tl, tl->thumb_path))
+                               {
+                               tl->thumb_path_local = TRUE;
+                               return TRUE;
+                               }
+
+                       g_free(tl->thumb_path);
+                       tl->thumb_path = NULL;
+                       }
+
+               if (thumb_loader_std_setup(tl, tl->source_path)) return TRUE;
+               }
+
+       thumb_loader_std_save(tl, NULL);
+       return FALSE;
+}
+
+static void thumb_loader_std_done_cb(ImageLoader *il, gpointer data)
+{
+       ThumbLoaderStd *tl = data;
+       GdkPixbuf *pixbuf;
+
+       if (debug)
+               {
+               printf("thumb image done: %s\n", tl->source_path);
+               printf("            from: %s\n", tl->il->path);
+               }
+
+       pixbuf = image_loader_get_pixbuf(tl->il);
+       if (!pixbuf)
+               {
+               if (debug) printf("...but no pixbuf\n");
+               thumb_loader_std_error_cb(il, data);
+               return;
+               }
+
+       if (tl->thumb_path && !thumb_loader_std_validate(tl, pixbuf))
+               {
+               if (thumb_loader_std_next_source(tl, TRUE)) return;
+
+               if (tl->func_error) tl->func_error(tl, tl->data);
+               return;
+               }
+
+       tl->cache_hit = (tl->thumb_path != NULL);
+
+       tl->pixbuf = thumb_loader_std_finish(tl, pixbuf);
+
+       if (tl->func_done) tl->func_done(tl, tl->data);
+}
+
+static void thumb_loader_std_error_cb(ImageLoader *il, gpointer data)
+{
+       ThumbLoaderStd *tl = data;
+
+       /* if at least some of the image is available, go to done */
+       if (image_loader_get_pixbuf(tl->il) != NULL)
+               {
+               thumb_loader_std_done_cb(il, data);
+               return;
+               }
+
+       if (debug)
+               {
+               printf("thumb image error: %s\n", tl->source_path);
+               printf("             from: %s\n", tl->il->path);
+               }
+
+       if (thumb_loader_std_next_source(tl, TRUE)) return;
+
+       if (tl->func_error) tl->func_error(tl, tl->data);
+}
+
+static void thumb_loader_std_progress_cb(ImageLoader *il, gdouble percent, gpointer data)
+{
+       ThumbLoaderStd *tl = data;
+
+       tl->progress = (gdouble)percent;
+
+       if (tl->func_progress) tl->func_progress(tl, tl->data);
+}
+
+static gint thumb_loader_std_setup(ThumbLoaderStd *tl, const gchar *path)
+{
+       tl->il = image_loader_new(path);
+
+#if 0
+       /* this will speed up jpegs by up to 3x in some cases */
+       if (tl->requested_width <= THUMB_SIZE_NORMAL &&
+           tl->requested_height <= THUMB_SIZE_NORMAL)
+               {
+               image_loader_set_requested_size(tl->il, THUMB_SIZE_NORMAL, THUMB_SIZE_NORMAL);
+               }
+       else
+               {
+               image_loader_set_requested_size(tl->il, THUMB_SIZE_LARGE, THUMB_SIZE_LARGE);
+               }
+#endif
+
+       image_loader_set_error_func(tl->il, thumb_loader_std_error_cb, tl);
+       if (tl->func_progress)
+               {
+               image_loader_set_percent_func(tl->il, thumb_loader_std_progress_cb, tl);
+               }
+
+       if (image_loader_start(tl->il, thumb_loader_std_done_cb, tl))
+               {
+               return TRUE;
+               }
+
+       image_loader_free(tl->il);
+       tl->il = NULL;
+       return FALSE;
+}
+
+/*
+ * Note: Currently local_cache only specifies where to save a _new_ thumb, if
+ *       a valid existing thumb is found anywhere the local thumb will not be created.
+ */
+void thumb_loader_std_set_cache(ThumbLoaderStd *tl, gint enable_cache, gint local, gint retry_failed)
+{
+       if (!tl) return;
+
+       tl->cache_enable = enable_cache;
+       tl->cache_local = local;
+       tl->cache_retry = retry_failed;
+}
+
+gint thumb_loader_std_start(ThumbLoaderStd *tl, const gchar *path)
+{
+       static gchar *thumb_cache = NULL;
+       struct stat st;
+
+       if (!tl || !path) return FALSE;
+
+       thumb_loader_std_reset(tl);
+
+       if (!stat_utf8(path, &st)) return FALSE;
+
+       tl->source_path = g_strdup(path);
+       tl->source_mtime = st.st_mtime;
+       tl->source_size = st.st_size;
+       tl->source_mode = st.st_mode;
+
+       if (!thumb_cache) thumb_cache = g_strconcat(homedir(), "/", THUMB_FOLDER, NULL);
+       if (strncmp(tl->source_path, thumb_cache, strlen(thumb_cache)) != 0)
+               {
+               gchar *pathl;
+
+               pathl = path_from_utf8(path);
+               tl->thumb_uri = g_filename_to_uri(pathl, NULL, NULL);
+               tl->local_uri = filename_from_path(tl->thumb_uri);
+               g_free(pathl);
+               }
+
+       if (tl->cache_enable)
+               {
+               gint found;
+
+               if (thumb_loader_std_fail_check(tl)) return FALSE;
+
+               tl->thumb_path = thumb_loader_std_cache_path(tl, FALSE, NULL, FALSE);
+               tl->thumb_path_local = FALSE;
+
+               found = isfile(tl->thumb_path);
+               if (found && thumb_loader_std_setup(tl, tl->thumb_path)) return TRUE;
+
+               return thumb_loader_std_next_source(tl, found);
+               }
+
+       if (!thumb_loader_std_setup(tl, tl->source_path))
+               {
+               thumb_loader_std_save(tl, NULL);
+               return FALSE;
+               }
+
+       return TRUE;
+}
+
+void thumb_loader_std_free(ThumbLoaderStd *tl)
+{
+       if (!tl) return;
+
+       thumb_loader_std_reset(tl);
+       g_free(tl);
+}
+
+GdkPixbuf *thumb_loader_std_get_pixbuf(ThumbLoaderStd *tl, gint with_fallback)
+{
+       GdkPixbuf *pixbuf;
+
+       if (tl && tl->pixbuf)
+               {
+               pixbuf = tl->pixbuf;
+               g_object_ref(pixbuf);
+               }
+       else if (with_fallback)
+               {
+               gint w, h;
+
+               pixbuf = pixbuf_inline(PIXBUF_INLINE_BROKEN);
+               w = gdk_pixbuf_get_width(pixbuf);
+               h = gdk_pixbuf_get_height(pixbuf);
+
+               if (w > tl->requested_width || h > tl->requested_height)
+                       {
+                       gint nw, nh;
+
+                       if (thumb_loader_std_scale_aspect(tl->requested_width, tl->requested_height,
+                                                         w, h, &nw, &nh))
+                               {
+                               GdkPixbuf *tmp;
+
+                               tmp = pixbuf;
+                               pixbuf = gdk_pixbuf_scale_simple(tmp, nw, nh, GDK_INTERP_TILES);
+                               g_object_unref(G_OBJECT(tmp));
+                               }
+                       }
+               }
+       else
+               {
+               pixbuf = NULL;
+               }
+
+       return pixbuf;
+}
+
+
+typedef struct _ThumbValidate ThumbValidate;
+struct _ThumbValidate
+{
+       ThumbLoaderStd *tl;
+       gchar *path;
+       gint days;
+
+       void (*func_valid)(const gchar *path, gint valid, gpointer data);
+       gpointer data;
+
+       gint idle_id;
+};
+
+static void thumb_loader_std_thumb_file_validate_free(ThumbValidate *tv)
+{
+       thumb_loader_std_free(tv->tl);
+       g_free(tv->path);
+       g_free(tv);
+}
+
+void thumb_loader_std_thumb_file_validate_cancel(ThumbLoaderStd *tl)
+{
+       ThumbValidate *tv;
+
+       if (!tl) return;
+
+       tv = tl->data;
+
+       if (tv->idle_id != -1) g_source_remove(tv->idle_id);
+       tv->idle_id = -1;
+
+       thumb_loader_std_thumb_file_validate_free(tv);
+}
+
+static void thumb_loader_std_thumb_file_validate_finish(ThumbValidate *tv, gint valid)
+{
+       if (tv->func_valid) tv->func_valid(tv->path, valid, tv->data);
+
+       thumb_loader_std_thumb_file_validate_free(tv);
+}
+
+static void thumb_loader_std_thumb_file_validate_done_cb(ThumbLoaderStd *tl, gpointer data)
+{
+       ThumbValidate *tv = data;
+       GdkPixbuf *pixbuf;
+       gint valid = FALSE;
+
+       pixbuf = thumb_loader_std_get_pixbuf(tv->tl, FALSE);
+       if (pixbuf)
+               {
+               const gchar *uri;
+               const gchar *mtime_str;
+
+               uri = gdk_pixbuf_get_option(pixbuf, THUMB_MARKER_URI);
+               mtime_str = gdk_pixbuf_get_option(pixbuf, THUMB_MARKER_MTIME);
+               if (uri && mtime_str)
+                       {
+                       if (strncmp(uri, "file:", strlen("file:")) == 0)
+                               {
+                               struct stat st;
+                               gchar *target;
+
+                               target = g_filename_from_uri(uri, NULL, NULL);
+                               if (stat(target, &st) == 0 &&
+                                   st.st_mtime == strtol(mtime_str, NULL, 10))
+                                       {
+                                       valid = TRUE;
+                                       }
+                               g_free(target);
+                               }
+                       else
+                               {
+                               struct stat st;
+
+                               if (debug) printf("thumb uri foreign, doing day check: %s\n", uri);
+
+                               if (stat_utf8(tv->path, &st))
+                                       {
+                                       time_t now;
+
+                                       now = time(NULL);
+                                       if (st.st_atime >= now - (time_t)tv->days * 24 * 60 * 60)
+                                               {
+                                               valid = TRUE;
+                                               }
+                                       }
+                               }
+                       }
+
+               g_object_unref(pixbuf);
+               }
+
+       thumb_loader_std_thumb_file_validate_finish(tv, valid);
+}
+
+static void thumb_loader_std_thumb_file_validate_error_cb(ThumbLoaderStd *tl, gpointer data)
+{
+       ThumbValidate *tv = data;
+
+       thumb_loader_std_thumb_file_validate_finish(tv, FALSE);
+}
+
+static gint thumb_loader_std_thumb_file_validate_idle_cb(gpointer data)
+{
+       ThumbValidate *tv = data;
+
+       tv->idle_id = -1;
+       thumb_loader_std_thumb_file_validate_finish(tv, FALSE);
+
+       return FALSE;
+}
+
+ThumbLoaderStd *thumb_loader_std_thumb_file_validate(const gchar *thumb_path, gint allowed_days,
+                                                    void (*func_valid)(const gchar *path, gint valid, gpointer data),
+                                                    gpointer data)
+{
+       ThumbValidate *tv;
+
+       tv = g_new0(ThumbValidate, 1);
+
+       tv->tl = thumb_loader_std_new(THUMB_SIZE_LARGE, THUMB_SIZE_LARGE);
+       thumb_loader_std_set_callbacks(tv->tl,
+                                      thumb_loader_std_thumb_file_validate_done_cb,
+                                      thumb_loader_std_thumb_file_validate_error_cb,
+                                      NULL,
+                                      tv);
+       thumb_loader_std_reset(tv->tl);
+
+       tv->path = g_strdup(thumb_path);
+       tv->days = allowed_days;
+       tv->func_valid = func_valid;
+       tv->data = data;
+
+       if (!thumb_loader_std_setup(tv->tl, thumb_path))
+               {
+               tv->idle_id = g_idle_add(thumb_loader_std_thumb_file_validate_idle_cb, tv);
+               }
+       else
+               {
+               tv->idle_id = -1;
+               }
+
+       return tv->tl;
+}
+
+static void thumb_std_maint_remove_one(const gchar *source, const gchar *uri, gint local,
+                                      const gchar *subfolder)
+{
+       gchar *thumb_path;
+
+       thumb_path = thumb_std_cache_path(source,
+                                         (local) ? filename_from_path(uri) : uri,
+                                         local, subfolder);
+       if (isfile(thumb_path))
+               {
+               if (debug) printf("thumb removing: %s\n", thumb_path);
+               unlink_file(thumb_path);
+               }
+       g_free(thumb_path);
+}
+
+/* this also removes local thumbnails (the source is gone so it makes sense) */
+void thumb_std_maint_removed(const gchar *source)
+{
+       gchar *uri;
+       gchar *sourcel;
+
+       sourcel = path_from_utf8(source);
+       uri = g_filename_to_uri(sourcel, NULL, NULL);
+       g_free(sourcel);
+
+       /* all this to remove a thumbnail? */
+
+       thumb_std_maint_remove_one(source, uri, FALSE, THUMB_FOLDER_NORMAL);
+       thumb_std_maint_remove_one(source, uri, FALSE, THUMB_FOLDER_LARGE);
+       thumb_std_maint_remove_one(source, uri, FALSE, THUMB_FOLDER_FAIL);
+       thumb_std_maint_remove_one(source, uri, TRUE, THUMB_FOLDER_NORMAL);
+       thumb_std_maint_remove_one(source, uri, TRUE, THUMB_FOLDER_LARGE);
+
+       g_free(uri);
+}
+
+typedef struct _TMaintMove TMaintMove;
+struct _TMaintMove
+{
+       gchar *source;
+       gchar *dest;
+
+       ThumbLoaderStd *tl;
+       gchar *source_uri;
+       gchar *thumb_path;
+
+       gint pass;
+};
+
+static GList *thumb_std_maint_move_list = NULL;
+static GList *thumb_std_maint_move_tail = NULL;
+
+
+static void thumb_std_maint_move_step(TMaintMove *tm);
+static gint thumb_std_maint_move_idle(gpointer data);
+
+
+static void thumb_std_maint_move_validate_cb(const gchar *path, gint valid, gpointer data)
+{
+       TMaintMove *tm = data;
+       GdkPixbuf *pixbuf;
+
+       pixbuf = thumb_loader_std_get_pixbuf(tm->tl, FALSE);
+       if (pixbuf)
+               {
+               const gchar *uri;
+               const gchar *mtime_str;
+
+               uri = gdk_pixbuf_get_option(pixbuf, THUMB_MARKER_URI);
+               mtime_str = gdk_pixbuf_get_option(pixbuf, THUMB_MARKER_MTIME);
+
+               if (uri && mtime_str && strcmp(uri, tm->source_uri) == 0)
+                       {
+                       gchar *pathl;
+
+                       /* The validation utility abuses ThumbLoader, and we
+                        * abuse the utility just to load the thumbnail,
+                        * but the loader needs to look sane for the save to complete.
+                        */
+
+                       tm->tl->cache_enable = TRUE;
+                       tm->tl->cache_hit = FALSE;
+                       tm->tl->cache_local = FALSE;
+
+                       g_free(tm->tl->source_path);
+                       tm->tl->source_path = g_strdup(tm->dest);
+                       tm->tl->source_mtime = strtol(mtime_str, NULL, 10);
+
+                       pathl = path_from_utf8(tm->tl->source_path);
+                       g_free(tm->tl->thumb_uri);
+                       tm->tl->thumb_uri = g_filename_to_uri(pathl, NULL, NULL);
+                       tm->tl->local_uri = filename_from_path(tm->tl->thumb_uri);
+                       g_free(pathl);
+
+                       g_free(tm->tl->thumb_path);
+                       tm->tl->thumb_path = NULL;
+                       tm->tl->thumb_path_local = FALSE;
+
+                       if (debug) printf("thumb move attempting save:\n");
+
+                       thumb_loader_std_save(tm->tl, pixbuf);
+                       }
+
+               if (debug) printf("thumb move unlink: %s\n", tm->thumb_path);
+               unlink_file(tm->thumb_path);
+               }
+
+       thumb_std_maint_move_step(tm);
+}
+
+static void thumb_std_maint_move_step(TMaintMove *tm)
+{
+       const gchar *folder;
+
+       tm->pass++;
+       if (tm->pass > 2)
+               {
+               g_free(tm->source);
+               g_free(tm->dest);
+               g_free(tm->source_uri);
+               g_free(tm->thumb_path);
+               g_free(tm);
+
+               if (thumb_std_maint_move_list)
+                       {
+                       g_idle_add_full(G_PRIORITY_LOW, thumb_std_maint_move_idle, NULL, NULL);
+                       }
+
+               return;
+               }
+
+       folder = (tm->pass == 1) ? THUMB_FOLDER_NORMAL : THUMB_FOLDER_LARGE;
+       
+       g_free(tm->thumb_path);
+       tm->thumb_path = thumb_std_cache_path(tm->source, tm->source_uri, FALSE, folder);
+       tm->tl = thumb_loader_std_thumb_file_validate(tm->thumb_path, 0,
+                                                     thumb_std_maint_move_validate_cb, tm);
+}
+
+static gint thumb_std_maint_move_idle(gpointer data)
+{
+       TMaintMove *tm;
+       gchar *pathl;
+
+       if (!thumb_std_maint_move_list) return FALSE;
+
+       tm = thumb_std_maint_move_list->data;
+
+       thumb_std_maint_move_list = g_list_remove(thumb_std_maint_move_list, tm);
+       if (!thumb_std_maint_move_list) thumb_std_maint_move_tail = NULL;
+
+       pathl = path_from_utf8(tm->source);
+       tm->source_uri = g_filename_to_uri(pathl, NULL, NULL);
+       g_free(pathl);
+
+       tm->pass = 0;
+
+       thumb_std_maint_move_step(tm);
+
+       return FALSE;
+}
+
+/* This will schedule a move of the thumbnail for source image to dest when idle.
+ * We do this so that file renaming or moving speed is not sacrificed by
+ * moving the thumbnails at the same time because:
+ *
+ * This cache design requires the tedious task of loading the png thumbnails and saving them.
+ *
+ * The thumbnails are processed when the app is idle. If the app
+ * exits early well too bad - they can simply be regenerated from scratch.
+ *
+ * This does not manage local thumbnails (fixme ?)
+ */
+void thumb_std_maint_moved(const gchar *source, const gchar *dest)
+{
+       TMaintMove *tm;
+
+       tm = g_new0(TMaintMove, 1);
+       tm->source = g_strdup(source);
+       tm->dest = g_strdup(dest);
+
+       if (!thumb_std_maint_move_list)
+               {
+               g_idle_add_full(G_PRIORITY_LOW, thumb_std_maint_move_idle, NULL, NULL);
+               }
+
+       if (thumb_std_maint_move_tail)
+               {
+               g_list_append(thumb_std_maint_move_tail, tm);
+               thumb_std_maint_move_tail = thumb_std_maint_move_tail->next;
+               }
+       else
+               {
+               thumb_std_maint_move_list = g_list_append(thumb_std_maint_move_list, tm);
+               thumb_std_maint_move_tail = thumb_std_maint_move_list;
+               }
+}
+
+
diff --git a/src/thumb_standard.h b/src/thumb_standard.h
new file mode 100644 (file)
index 0000000..840e341
--- /dev/null
@@ -0,0 +1,91 @@
+/*
+ * GQview
+ * (C) 2005 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef THUMB_STANDARD_H
+#define THUMB_STANDARD_H
+
+
+#define THUMB_FOLDER        ".thumbnails"
+#define THUMB_FOLDER_NORMAL "normal"
+#define THUMB_FOLDER_LARGE  "large"
+#define THUMB_FOLDER_FAIL   "fail/gqview-1.0"
+#define THUMB_NAME_EXTENSION ".png"
+
+
+typedef struct _ThumbLoaderStd ThumbLoaderStd;
+typedef void (* ThumbLoaderStdFunc)(ThumbLoaderStd *tl, gpointer data);
+
+struct _ThumbLoaderStd
+{
+       gint standard_loader;
+
+       GdkPixbuf *pixbuf;
+       ImageLoader *il;
+
+       gchar *source_path;
+
+       time_t source_mtime;
+       off_t source_size;
+       mode_t source_mode;
+
+       gchar *thumb_path;
+       gchar *thumb_uri;
+       const gchar *local_uri;
+
+       gint thumb_path_local;
+
+       gint requested_width;
+       gint requested_height;
+
+       gint cache_enable;
+       gint cache_local;
+       gint cache_hit;
+       gint cache_retry;
+
+       gdouble progress;
+
+       ThumbLoaderStdFunc func_done;
+       ThumbLoaderStdFunc func_error;
+       ThumbLoaderStdFunc func_progress;
+
+       gpointer data;
+};
+
+
+ThumbLoaderStd *thumb_loader_std_new(gint width, gint height);
+void thumb_loader_std_set_callbacks(ThumbLoaderStd *tl,
+                                   ThumbLoaderStdFunc func_done,
+                                   ThumbLoaderStdFunc func_error,
+                                   ThumbLoaderStdFunc func_progress,
+                                   gpointer data);
+void thumb_loader_std_set_cache(ThumbLoaderStd *tl, gint enable_cache, gint local, gint retry_failed);
+gint thumb_loader_std_start(ThumbLoaderStd *tl, const gchar *path);
+void thumb_loader_std_free(ThumbLoaderStd *tl);
+
+GdkPixbuf *thumb_loader_std_get_pixbuf(ThumbLoaderStd *tl, gint with_fallback);
+
+
+/* validates a non local thumbnail file,
+ * calling func_valid with the information when app is idle
+ * for thumbnail's without a file: uri, validates against allowed_age in days
+ */
+ThumbLoaderStd *thumb_loader_std_thumb_file_validate(const gchar *thumb_path, gint allowed_age,
+                                                    void (*func_valid)(const gchar *path, gint valid, gpointer data),
+                                                    gpointer data);
+void thumb_loader_std_thumb_file_validate_cancel(ThumbLoaderStd *tl);
+
+
+void thumb_std_maint_removed(const gchar *source);
+void thumb_std_maint_moved(const gchar *source, const gchar *dest);
+
+
+#endif
diff --git a/src/typedefs.h b/src/typedefs.h
new file mode 100644 (file)
index 0000000..9e7e26f
--- /dev/null
@@ -0,0 +1,641 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef TYPEDEFS_H
+#define TYPEDEFS_H
+
+
+typedef enum {
+       SORT_NONE,
+       SORT_NAME,
+       SORT_SIZE,
+       SORT_TIME,
+       SORT_PATH,
+       SORT_NUMBER
+} SortType;
+
+typedef enum {
+       ALTER_NONE,             /* do nothing */
+       ALTER_ROTATE_90,
+       ALTER_ROTATE_90_CC,     /* counterclockwise */
+       ALTER_ROTATE_180,
+       ALTER_MIRROR,
+       ALTER_FLIP
+} AlterType;
+
+typedef enum {
+       LAYOUT_HIDE   = 0,
+       LAYOUT_LEFT   = 1 << 0,
+       LAYOUT_RIGHT  = 1 << 1,
+       LAYOUT_TOP    = 1 << 2,
+       LAYOUT_BOTTOM = 1 << 3
+} LayoutLocation;
+
+
+typedef struct _ImageLoader ImageLoader;
+typedef struct _ThumbLoader ThumbLoader;
+
+typedef struct _CollectInfo CollectInfo;
+typedef struct _CollectionData CollectionData;
+typedef struct _CollectTable CollectTable;
+typedef struct _CollectWindow CollectWindow;
+
+typedef struct _ImageWindow ImageWindow;
+
+typedef struct _FileData FileData;
+
+typedef struct _LayoutWindow LayoutWindow;
+typedef struct _ViewDirList ViewDirList;
+typedef struct _ViewDirTree ViewDirTree;
+typedef struct _ViewFileList ViewFileList;
+typedef struct _ViewFileIcon ViewFileIcon;
+
+typedef struct _SlideShowData SlideShowData;
+typedef struct _FullScreenData FullScreenData;
+
+typedef struct _PixmapFolders PixmapFolders;
+
+
+struct _ImageLoader
+{
+       GdkPixbuf *pixbuf;
+       gchar *path;
+
+       gint bytes_read;
+       gint bytes_total;
+
+       guint buffer_size;
+
+       gint requested_width;
+       gint requested_height;
+
+       gint done;
+       gint idle_id;
+       gint idle_priority;
+
+       GdkPixbufLoader *loader;
+       gint load_fd;
+
+       void (*func_area_ready)(ImageLoader *, guint x, guint y, guint w, guint h, gpointer);
+       void (*func_error)(ImageLoader *, gpointer);
+       void (*func_done)(ImageLoader *, gpointer);
+       void (*func_percent)(ImageLoader *, gdouble, gpointer);
+
+       gpointer data_area_ready;
+       gpointer data_error;
+       gpointer data_done;
+       gpointer data_percent;
+
+       gint idle_done_id;
+};
+
+typedef void (* ThumbLoaderFunc)(ThumbLoader *tl, gpointer data);
+
+struct _ThumbLoader
+{
+       gint standard_loader;
+
+       GdkPixbuf *pixbuf;      /* contains final (scaled) image when done */
+       ImageLoader *il;
+       gchar *path;
+
+       gint cache_enable;
+       gint cache_hit;
+       gdouble percent_done;
+
+       gint max_w;
+       gint max_h;
+
+       ThumbLoaderFunc func_done;
+       ThumbLoaderFunc func_error;
+       ThumbLoaderFunc func_progress;
+
+       gpointer data;
+
+       gint idle_done_id;
+};
+
+struct _CollectInfo
+{
+       gchar *path;
+       gint64 size;
+       time_t date;
+
+       GdkPixbuf *pixbuf;
+       gint flag_mask;
+};
+
+struct _CollectionData
+{
+       gchar *path;
+       gchar *name;
+       GList *list;
+       SortType sort_method;
+
+       ThumbLoader *thumb_loader;
+       CollectInfo *thumb_info;
+
+       void (*info_updated_func)(CollectionData *, CollectInfo *, gpointer);
+       gpointer info_updated_data;
+
+       gint ref;
+
+       /* geometry */
+       gint window_read;
+       gint window_x;
+       gint window_y;
+       gint window_w;
+       gint window_h;
+
+       /* contents changed since save flag */
+       gint changed;
+};
+
+struct _CollectTable
+{
+       GtkWidget *scrolled;
+       GtkWidget *listview;
+       gint columns;
+       gint rows;
+
+       CollectionData *cd;
+
+       GList *selection;
+       CollectInfo *prev_selection;
+
+       CollectInfo *click_info;
+
+       GtkWidget *tip_window;
+       gint tip_delay_id;
+       CollectInfo *tip_info;
+
+       GdkWindow *marker_window;
+       CollectInfo *marker_info;
+
+       GtkWidget *status_label;
+       GtkWidget *extra_label;
+
+       gint focus_row;
+       gint focus_column;
+       CollectInfo *focus_info;
+
+       GtkWidget *popup;
+       CollectInfo *drop_info;
+       GList *drop_list;
+
+       gint sync_idle_id;
+       gint drop_idle_id;
+
+       gint show_text;
+};
+
+struct _CollectWindow
+{
+       GtkWidget *window;
+       CollectTable *table;
+       GtkWidget *status_box;
+       GList *list;
+
+       GtkWidget *close_dialog;
+
+       CollectionData *cd;
+};
+
+struct _ImageWindow
+{
+       GtkWidget *widget;      /* use this to add it and show it */
+       GtkWidget *image;
+
+       gchar *image_path;
+       const gchar *image_name;
+
+       gint image_width;       /* image actual dimensions (pixels) */
+       gint image_height;
+       GdkPixbuf *pixbuf;
+       gint64 size;            /* file size (bytes) */
+       time_t mtime;           /* file modified time stamp */
+       gint unknown;           /* failed to load image */
+
+       gint window_width;      /* allocated size of window (drawing area) */
+       gint window_height;
+
+       gint x_offset;          /* offset of image start (non-zero when image < window) */
+       gint y_offset;
+
+       gint vis_width;         /* dimensions of visible part of image */
+       gint vis_height;
+
+       gint width;             /* size of scaled image (result) */
+       gint height;
+
+       gint x_scroll;          /* scroll offset of image (into width, height to start drawing) */
+       gint y_scroll;
+
+       gdouble zoom;           /* zoom we want (0 is auto) */
+       gdouble scale;          /* zoom we got (should never be 0) */
+
+       gint tile_width;
+       gint tile_height;
+       gint tile_cols;         /* count of tile columns */
+       GList *tiles;           /* list of buffer tiles */
+       GList *tile_cache;      /* list of pixmap/pixbuf tile allocations */
+       gint tile_cache_size;   /* allocated size of pixmaps/pixbufs */
+       GList *draw_queue;      /* list of areas to redraw */
+
+       GList *draw_queue_2pass;/* list when 2 pass is enabled */
+
+       ImageLoader *il;
+
+       gint draw_idle_id;
+       gint draw_idle_high;    /* current idle_id has high priority */
+
+       gint in_drag;
+       gint drag_last_x;
+       gint drag_last_y;
+       gint drag_moved;
+
+       gint has_frame;
+       gint top_window_sync;   /* resize top_window when image dimensions change */
+
+       /* top level (not necessarily parent) window */
+       GtkWidget *top_window;  /* window that gets title, and window to resize when 'fitting' */
+       gchar *title;           /* window title to display left of file name */
+       gchar *title_right;     /* window title to display right of file name */
+       gint title_show_zoom;   /* option to include zoom in window title */
+
+       gint completed;
+
+       void (*func_update)(ImageWindow *, gpointer);
+       void (*func_complete)(ImageWindow *, gint preload, gpointer);
+       void (*func_new)(ImageWindow *, gpointer);
+
+       gpointer data_update;
+       gpointer data_complete;
+       gpointer data_new;
+
+       /* button, scroll functions */
+       void (*func_button)(ImageWindow *, gint button,
+                           guint32 time, gdouble x, gdouble y, guint state, gpointer);
+       void (*func_scroll)(ImageWindow *, GdkScrollDirection direction,
+                           guint32 time, gdouble x, gdouble y, guint state, gpointer);
+
+       gpointer data_button;
+       gpointer data_scroll;
+
+       /* collection info */
+       CollectionData *collection;
+       CollectInfo *collection_info;
+
+       AlterType delay_alter_type;
+
+       ImageLoader *read_ahead_il;
+       GdkPixbuf *read_ahead_pixbuf;
+       gchar *read_ahead_path;
+
+       GdkPixbuf *prev_pixbuf;
+       gchar *prev_path;
+
+       gint auto_refresh_id;
+       gint auto_refresh_interval;
+
+       gint delay_flip;
+
+       gint scroller_id;
+       gint scroller_overlay;
+       gint scroller_x;
+       gint scroller_y;
+       gint scroller_xpos;
+       gint scroller_ypos;
+       gint scroller_xinc;
+       gint scroller_yinc;
+
+       GList *overlay_list;
+};
+
+struct _FileData {
+       gchar *path;
+       const gchar *name;
+       gint64 size;
+       time_t date;
+
+       GdkPixbuf *pixbuf;
+};
+
+struct _LayoutWindow
+{
+       gchar *path;
+
+       /* base */
+
+       GtkWidget *window;
+
+       GtkWidget *main_box;
+
+       GtkWidget *group_box;
+       GtkWidget *h_pane;
+       GtkWidget *v_pane;
+
+       GtkTooltips *tooltips;
+
+       /* menus, path selector */
+
+       GtkActionGroup *action_group;
+       GtkUIManager *ui_manager;
+
+       GtkWidget *path_entry;
+
+       /* image */
+
+       LayoutLocation image_location;
+
+       ImageWindow *image;
+
+       /* tools window (float) */
+
+       GtkWidget *tools;
+       GtkWidget *tools_pane;
+
+       gint tools_float;
+       gint tools_hidden;
+
+       /* toolbar */
+
+       GtkWidget *toolbar;
+       gint toolbar_hidden;
+
+       GtkWidget *thumb_button;
+       gint thumbs_enabled;
+
+       /* dir view */
+
+       LayoutLocation dir_location;
+
+       ViewDirList *vdl;
+       ViewDirTree *vdt;
+       GtkWidget *dir_view;
+
+       gint tree_view;
+
+       /* file view */
+
+       LayoutLocation file_location;
+
+       ViewFileList *vfl;
+       ViewFileIcon *vfi;
+       GtkWidget *file_view;
+
+       gint icon_view;
+       SortType sort_method;
+       gint sort_ascend;
+
+       /* status bar */
+
+       GtkWidget *info_box;
+       GtkWidget *info_progress_bar;
+       GtkWidget *info_sort;
+       GtkWidget *info_status;
+       GtkWidget *info_details;
+       GtkWidget *info_zoom;
+
+       /* slide show */
+
+       SlideShowData *slideshow;
+
+       /* full screen */
+
+       FullScreenData *full_screen;
+       gint full_screen_overlay_id;
+       gint full_screen_overlay_on;
+
+       /* dividers */
+
+       gint div_h;
+       gint div_v;
+       gint div_float;
+
+       /* directory update check */
+
+       gint last_time_id;
+       time_t last_time;
+
+       /* misc */
+
+       GtkWidget *utility_box;
+       GtkWidget *bar_sort;
+       GtkWidget *bar_exif;
+       GtkWidget *bar_info;
+
+       gint bar_sort_enabled;
+       gint bar_exif_enabled;
+       gint bar_info_enabled;
+
+       gint bar_exif_size;
+       gint bar_exif_advanced;
+};
+
+struct _ViewDirList
+{
+       GtkWidget *widget;
+       GtkWidget *listview;
+
+       gchar *path;
+       GList *list;
+
+       FileData *click_fd;
+
+       FileData *drop_fd;
+       GList *drop_list;
+
+       gint drop_scroll_id;
+
+       /* func list */
+       void (*select_func)(ViewDirList *vdl, const gchar *path, gpointer data);
+       gpointer select_data;
+
+       LayoutWindow *layout;
+
+       GtkWidget *popup;
+
+       PixmapFolders *pf;
+};
+
+struct _ViewDirTree
+{
+       GtkWidget *widget;
+       GtkWidget *treeview;
+
+       gchar *path;
+
+       FileData *click_fd;
+
+       FileData *drop_fd;
+       GList *drop_list;
+
+       gint drop_scroll_id;
+       gint drop_expand_id;
+
+       /* func list */
+       void (*select_func)(ViewDirTree *vdt, const gchar *path, gpointer data);
+       gpointer select_data;
+
+       LayoutWindow *layout;
+
+       GtkWidget *popup;
+
+       PixmapFolders *pf;
+
+       gint busy_ref;
+};
+
+struct _ViewFileList
+{
+       GtkWidget *widget;
+       GtkWidget *listview;
+
+       gchar *path;
+       GList *list;
+
+       SortType sort_method;
+       gint sort_ascend;
+
+       FileData *click_fd;
+       FileData *select_fd;
+
+       gint thumbs_enabled;
+
+       /* thumb updates */
+       gint thumbs_running;
+       gint thumbs_count;
+       ThumbLoader *thumbs_loader;
+       FileData *thumbs_filedata;
+
+       /* func list */
+       void (*func_thumb_status)(ViewFileList *vfl, gdouble val, const gchar *text, gpointer data);
+       gpointer data_thumb_status;
+
+       void (*func_status)(ViewFileList *vfl, gpointer data);
+       gpointer data_status;
+
+       gint select_idle_id;
+       LayoutWindow *layout;
+
+       GtkWidget *popup;
+};
+
+struct _ViewFileIcon
+{
+       GtkWidget *widget;
+       GtkWidget *listview;
+
+       gchar *path;
+       GList *list;
+
+       /* table stuff */
+
+       gint columns;
+       gint rows;
+
+       GList *selection;
+       FileData *prev_selection;
+
+       GtkWidget *tip_window;
+       gint tip_delay_id;
+       FileData *tip_fd;
+
+       FileData *click_fd;
+
+       FileData *focus_fd;
+       gint focus_row;
+       gint focus_column;
+
+       SortType sort_method;
+       gint sort_ascend;
+
+       gint show_text;
+
+       gint sync_idle_id;
+
+       /* thumbs */
+       
+       gint thumbs_running;
+       GList *thumbs_list;
+       gint thumbs_count;
+       ThumbLoader *thumbs_loader;
+       FileData *thumbs_fd;
+
+       /* func list */
+       void (*func_thumb_status)(ViewFileIcon *vfi, gdouble val, const gchar *text, gpointer data);
+       gpointer data_thumb_status;
+
+       void (*func_status)(ViewFileIcon *vfi, gpointer data);
+       gpointer data_status;
+
+       LayoutWindow *layout;
+
+       GtkWidget *popup;
+};
+
+struct _SlideShowData
+{
+       ImageWindow *imd;
+
+       GList *path_list;
+       CollectionData *cd;
+       gchar *layout_path;
+       LayoutWindow *layout;
+
+       GList *list;
+       GList *list_done;
+
+       gchar *slide_path;
+
+       gint slide_count;
+       gint timeout_id;
+
+       gint from_selection;
+
+       void (*stop_func)(SlideShowData *, gpointer);
+       gpointer stop_data;
+
+       gint paused;
+};
+
+struct _FullScreenData
+{
+       GtkWidget *window;
+       ImageWindow *imd;
+
+       GtkWidget *normal_window;
+       ImageWindow *normal_imd;
+
+       gint hide_mouse_id;
+       gint busy_mouse_id;
+       gint cursor_state;
+
+       gint saver_block_id;
+
+       void (*stop_func)(FullScreenData *, gpointer);
+       gpointer stop_data;
+};
+
+struct _PixmapFolders
+{
+       GdkPixbuf *close;
+       GdkPixbuf *open;
+       GdkPixbuf *deny;
+       GdkPixbuf *parent;
+};
+
+
+#endif
+
+
diff --git a/src/ui_bookmark.c b/src/ui_bookmark.c
new file mode 100644 (file)
index 0000000..367efda
--- /dev/null
@@ -0,0 +1,1494 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+#include "intl.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include <gdk/gdkkeysyms.h> /* for key values */
+
+#include "ui_bookmark.h"
+
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_misc.h"
+#include "ui_utildlg.h"
+#include "ui_tabcomp.h"
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * history lists
+ *-----------------------------------------------------------------------------
+ */
+
+#define HISTORY_DEFAULT_KEY_COUNT 16
+
+
+typedef struct _HistoryData HistoryData;
+struct _HistoryData
+{
+       gchar *key;
+       GList *list;
+};
+
+static GList *history_list = NULL;
+
+
+static gchar *quoted_from_text(const gchar *text)
+{
+       const gchar *ptr;
+       gint c = 0;
+       gint l = strlen(text);
+
+       if (l == 0) return NULL;
+
+       while (c < l && text[c] !='"') c++;
+       if (text[c] == '"')
+               {
+               gint e;
+               c++;
+               ptr = text + c;
+               e = c;
+               while (e < l && text[e] !='"') e++;
+               if (text[e] == '"')
+                       {
+                       if (e - c > 0)
+                               {
+                               return g_strndup(ptr, e - c);
+                               }
+                       }
+               }
+       return NULL;
+}
+
+gint history_list_load(const gchar *path)
+{
+       FILE *f;
+       gchar *key = NULL;
+       gchar s_buf[1024];
+       gchar *pathl;
+
+       pathl = path_from_utf8(path);
+       f = fopen(pathl, "r");
+       g_free(pathl);
+       if (!f) return FALSE;
+
+       /* first line must start with History comment */
+       if (!fgets(s_buf,1024,f) ||
+           strncmp(s_buf, "#History", 8) != 0)
+               {
+               fclose(f);
+               return FALSE;
+               }
+
+       while (fgets(s_buf,1024,f))
+               {
+               if (s_buf[0]=='#') continue;
+               if (s_buf[0]=='[')
+                       {
+                       gint c;
+                       gchar *ptr;
+
+                       ptr = s_buf + 1;
+                       c = 0;
+                       while(ptr[c] != ']' && ptr[c] != '\n' && ptr[c] != '\0') c++;
+
+                       g_free(key);
+                       key = g_strndup(ptr, c);
+                       }
+               else
+                       {
+                       gchar *value;
+
+                       value = quoted_from_text(s_buf);
+                       if (value && key)
+                               {
+                               history_list_add_to_key(key, value, 0);
+                               }
+                       g_free(value);
+                       }
+               }
+
+       fclose(f);
+
+       g_free(key);
+
+       return TRUE;
+}
+
+gint history_list_save(const gchar *path)
+{
+       FILE *f;
+       GList *list;
+       gchar *pathl;
+
+       pathl = path_from_utf8(path);
+       f = fopen(pathl, "w");
+       g_free(pathl);
+       if (!f)
+               {
+               gchar *buf;
+
+               buf = g_strdup_printf(_("Unable to write history lists to: %s\n"), path);
+               print_term(buf);
+               g_free(buf);
+
+               return FALSE;
+               }
+
+       fprintf(f, "#History lists\n");
+       fprintf(f, "\n");
+
+       list = g_list_last(history_list);
+       while(list)
+               {
+               HistoryData *hd;
+               GList *work;
+
+               hd = list->data;
+               list = list->prev;
+
+               fprintf(f, "[%s]\n", hd->key);
+
+               /* save them inverted (oldest to newest)
+                * so that when reading they are added correctly
+                */
+               work = g_list_last(hd->list);
+               while(work)
+                       {
+                       fprintf(f, "\"%s\"\n", (gchar *)work->data);
+                       work = work->prev;
+                       }
+               fprintf(f, "\n");
+               }
+
+       fprintf(f, "#end\n");
+
+       fclose(f);
+
+       return TRUE;
+}
+
+static void history_list_free(HistoryData *hd)
+{
+       GList *work;
+
+       if (!hd) return;
+
+       work = hd->list;
+       while(work)
+               {
+               g_free(work->data);
+               work = work->next;
+               }
+
+       g_free(hd->key);
+       g_free(hd);
+}
+
+static HistoryData *history_list_find_by_key(const gchar* key)
+{
+       GList *work = history_list;
+
+       if (!key) return NULL;
+
+       while (work)
+               {
+               HistoryData *hd = work->data;
+               if (strcmp(hd->key, key) == 0) return hd;
+               work = work->next;
+               }
+       return NULL;
+}
+
+const gchar *history_list_find_last_path_by_key(const gchar* key)
+{
+       HistoryData *hd;
+
+       hd = history_list_find_by_key(key);
+       if (!hd || !hd->list) return NULL;
+
+       return hd->list->data;
+}
+
+void history_list_free_key(const gchar *key)
+{
+       HistoryData *hd;
+       hd = history_list_find_by_key(key);
+       if (!hd) return;
+
+       history_list = g_list_remove(history_list, hd);
+       history_list_free(hd);
+}
+
+void history_list_add_to_key(const gchar *key, const gchar *path, gint max)
+{
+       HistoryData *hd;
+       GList *work;
+
+       if (!key || !path) return;
+
+       hd = history_list_find_by_key(key);
+       if (!hd)
+               {
+               hd = g_new(HistoryData, 1);
+               hd->key = g_strdup(key);
+               hd->list = NULL;
+               history_list = g_list_prepend(history_list, hd);
+               }
+
+       /* if already in the list, simply move it to the top */
+       work = hd->list;
+       while(work)
+               {
+               gchar *buf = work->data;
+               work = work->next;
+               if (strcmp(buf, path) == 0)
+                       {
+                       hd->list = g_list_remove(hd->list, buf);
+                       hd->list = g_list_prepend(hd->list, buf);
+                       return;
+                       }
+               }
+
+       hd->list = g_list_prepend(hd->list, g_strdup(path));
+
+       if (max == -1) max = HISTORY_DEFAULT_KEY_COUNT;
+       if (max > 0)
+               {
+               while(hd->list && g_list_length(hd->list) > max)
+                       {
+                       GList *work = g_list_last(hd->list);
+                       gchar *buf = work->data;
+                       hd->list = g_list_remove(hd->list, buf);
+                       g_free(buf);
+                       }
+               }
+}
+
+void history_list_item_change(const gchar *key, const gchar *oldpath, const gchar *newpath)
+{
+       HistoryData *hd;
+       GList *work;
+
+       if (!oldpath) return;
+       hd = history_list_find_by_key(key);
+       if (!hd) return;
+
+       work = hd->list;
+       while(work)
+               {
+               gchar *buf = work->data;
+               if (strcmp(buf, oldpath) == 0)
+                       {
+                       if (newpath)
+                               {
+                               work->data = g_strdup(newpath);
+                               }
+                       else
+                               {
+                               hd->list = g_list_remove(hd->list, buf);
+                               }
+                       g_free(buf);
+                       return;
+                       }
+               work = work->next;
+               }
+}
+
+void history_list_item_move(const gchar *key, const gchar *path, gint direction)
+{
+       HistoryData *hd;
+       GList *work;
+       gint p = 0;
+
+       if (!path) return;
+       hd = history_list_find_by_key(key);
+       if (!hd) return;
+
+       work = hd->list;
+       while (work)
+               {
+               gchar *buf = work->data;
+               if (strcmp(buf, path) == 0)
+                       {
+                       p += direction;
+                       if (p < 0) return;
+                       hd->list = g_list_remove(hd->list, buf);
+                       hd->list = g_list_insert(hd->list, buf, p);
+                       return;
+                       }
+               work = work->next;
+               p++;
+               }
+}
+
+void history_list_item_remove(const gchar *key, const gchar *path)
+{
+       history_list_item_change(key, path, NULL);
+}
+
+GList *history_list_get_by_key(const gchar *key)
+{
+       HistoryData *hd;
+
+       hd = history_list_find_by_key(key);
+       if (!hd) return NULL;
+
+       return hd->list;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * bookmarks
+ *-----------------------------------------------------------------------------
+ */
+
+#define BOOKMARK_DATA_KEY "bookmarkdata"
+#define MARKER_PATH "[path]"
+#define MARKER_ICON "[icon]"
+
+typedef struct _BookMarkData BookMarkData;
+typedef struct _BookButtonData BookButtonData;
+typedef struct _BookPropData BookPropData;
+
+struct _BookMarkData
+{
+       GtkWidget *widget;
+       GtkWidget *box;
+       gchar *key;
+
+       void (*select_func)(const gchar *path, gpointer data);
+       gpointer select_data;
+
+       gint no_defaults;
+       gint editable;
+
+       BookButtonData *active_button;
+};
+
+struct _BookButtonData
+{
+       GtkWidget *button;
+       GtkWidget *image;
+       GtkWidget *label;
+
+       gchar *key;
+       gchar *name;
+       gchar *path;
+       gchar *icon;
+       gchar *parent;
+};
+
+struct _BookPropData
+{
+       GtkWidget *name_entry;
+       GtkWidget *path_entry;
+       GtkWidget *icon_entry;
+
+       BookButtonData *bb;
+};
+
+enum {
+       TARGET_URI_LIST,
+       TARGET_X_URL,
+       TARGET_TEXT_PLAIN
+};
+
+static GtkTargetEntry bookmark_drop_types[] = {
+       { "text/uri-list", 0, TARGET_URI_LIST },
+       { "x-url/http",    0, TARGET_X_URL },
+       { "_NETSCAPE_URL", 0, TARGET_X_URL }
+};
+#define bookmark_drop_types_n 3
+
+static GtkTargetEntry bookmark_drag_types[] = {
+       { "text/uri-list", 0, TARGET_URI_LIST },
+       { "text/plain",    0, TARGET_TEXT_PLAIN }
+};
+#define bookmark_drag_types_n 2
+
+
+static GList *bookmark_widget_list = NULL;
+static GList *bookmark_default_list = NULL;
+
+
+static void bookmark_populate_all(const gchar *key);
+
+
+static BookButtonData *bookmark_from_string(const gchar *text)
+{
+       BookButtonData *b;
+       const gchar *path_ptr;
+       const gchar *icon_ptr;
+
+       b = g_new0(BookButtonData, 1);
+
+       if (!text)
+               {
+               b->name = g_strdup(_("New Bookmark"));
+               b->path = g_strdup(homedir());
+               b->key = NULL;
+               return b;
+               }
+
+       b->key = g_strdup(text);
+
+       path_ptr = strstr(text, MARKER_PATH);
+       icon_ptr = strstr(text, MARKER_ICON);
+
+       if (path_ptr && icon_ptr && icon_ptr < path_ptr)
+               {
+               printf("warning, bookmark icon must be after path\n");
+               return NULL;
+               }
+
+       if (path_ptr)
+               {
+               gint l;
+
+               l = path_ptr - text;
+               b->name = g_strndup(text, l);
+               path_ptr += strlen(MARKER_PATH);
+               if (icon_ptr)
+                       {
+                       l = icon_ptr - path_ptr;
+                       b->path = g_strndup(path_ptr, l);
+                       }
+               else
+                       {
+                       b->path = g_strdup(path_ptr);
+                       }
+               }
+       else
+               {
+               b->name = g_strdup(text);
+               b->path = g_strdup("");
+               }
+
+       if (icon_ptr)
+               {
+               icon_ptr += strlen(MARKER_ICON);
+               b->icon = g_strdup(icon_ptr);
+               }
+
+       return b;
+}
+
+static void bookmark_free(BookButtonData *b)
+{
+       if (!b) return;
+
+       g_free(b->name);
+       g_free(b->path);
+       g_free(b->icon);
+       g_free(b->key);
+       g_free(b->parent);
+       g_free(b);
+}
+
+static gchar *bookmark_string(const gchar *name, const gchar *path, const gchar *icon)
+{
+       if (!name) name = _("New Bookmark");
+       if (icon && strncmp(icon, "/", 1) != 0) icon = NULL;
+
+       if (icon)
+               {
+               return g_strdup_printf("%s"MARKER_PATH"%s"MARKER_ICON"%s", name, path, icon);
+               }
+       
+       return g_strdup_printf("%s"MARKER_PATH"%s", name, path);
+}
+
+static void bookmark_select_cb(GtkWidget *button, gpointer data)
+{
+       BookMarkData *bm = data;
+       BookButtonData *b;
+
+       b = g_object_get_data(G_OBJECT(button), "bookbuttondata");
+       if (!b) return;
+
+       if (bm->select_func) bm->select_func(b->path, bm->select_data);
+}
+
+static void bookmark_edit_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       BookPropData *p = data;
+
+       bookmark_free(p->bb);
+       g_free(p);
+}
+
+static void bookmark_edit_cancel_cb(GenericDialog *gd, gpointer data)
+{
+}
+
+static void bookmark_edit_ok_cb(GenericDialog *gd, gpointer data)
+{
+       BookPropData *p = data;
+       const gchar *name;
+       gchar *path;
+       const gchar *icon;
+       gchar *new;
+
+       name = gtk_entry_get_text(GTK_ENTRY(p->name_entry));
+       path = remove_trailing_slash(gtk_entry_get_text(GTK_ENTRY(p->path_entry)));
+       icon = gtk_entry_get_text(GTK_ENTRY(p->icon_entry));
+
+       new = bookmark_string(name, path, icon);
+
+       if (p->bb->key)
+               {
+               history_list_item_change(p->bb->parent, p->bb->key, new);
+               }
+       else
+               {
+               history_list_add_to_key(p->bb->parent, new, 0);
+               }
+
+       if (path && strlen(path) > 0) tab_completion_append_to_history(p->path_entry, path);
+       if (icon && strlen(icon) > 0) tab_completion_append_to_history(p->icon_entry, icon);
+
+       g_free(path);
+       g_free(new);
+
+       bookmark_populate_all(p->bb->parent);
+}
+
+/* simply pass NULL for text to turn this into a 'new bookmark' dialog */
+
+static void bookmark_edit(const gchar *key, const gchar *text, GtkWidget *parent)
+{
+       BookPropData *p;
+       GenericDialog *gd;
+       GtkWidget *table;
+       GtkWidget *label;
+       const gchar *icon;
+       
+       if (!key) key = "bookmarks";
+
+       p = g_new0(BookPropData, 1);
+
+       p->bb = bookmark_from_string(text);
+       p->bb->parent = g_strdup(key);
+
+       gd = generic_dialog_new(_("Edit Bookmark"), PACKAGE, "bookmark_edit",
+                               parent, TRUE,
+                               bookmark_edit_cancel_cb, p);
+       g_signal_connect(G_OBJECT(gd->dialog), "destroy",
+                        G_CALLBACK(bookmark_edit_destroy_cb), p);
+
+       generic_dialog_add_message(gd, NULL, _("Edit Bookmark"), NULL);
+
+       generic_dialog_add_button(gd, GTK_STOCK_OK, NULL,
+                                 bookmark_edit_ok_cb, TRUE);
+
+       table = pref_table_new(gd->vbox, 3, 2, FALSE, TRUE);
+       pref_table_label(table, 0, 0, _("Name:"), 1.0);
+
+       p->name_entry = gtk_entry_new();
+       gtk_widget_set_size_request(p->name_entry, 300, -1);
+       if (p->bb->name) gtk_entry_set_text(GTK_ENTRY(p->name_entry), p->bb->name);
+       gtk_table_attach_defaults(GTK_TABLE(table), p->name_entry, 1, 2, 0, 1);
+       generic_dialog_attach_default(gd, p->name_entry);
+       gtk_widget_show(p->name_entry);
+
+       pref_table_label(table, 0, 1, _("Path:"), 1.0);
+
+       label = tab_completion_new_with_history(&p->path_entry, p->bb->path,
+                                               "bookmark_path", -1, NULL, NULL);
+       tab_completion_add_select_button(p->path_entry, NULL, TRUE);
+       gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 1, 2);
+       generic_dialog_attach_default(gd, p->path_entry);
+       gtk_widget_show(label);
+
+       pref_table_label(table, 0, 2, _("Icon:"), 1.0);
+
+       icon = p->bb->icon;
+       if (!icon) icon = "";
+       label = tab_completion_new_with_history(&p->icon_entry, icon,
+                                               "bookmark_icons", -1, NULL, NULL);
+       tab_completion_add_select_button(p->icon_entry, _("Select icon"), FALSE);
+       gtk_table_attach_defaults(GTK_TABLE(table), label, 1, 2, 2, 3);
+       generic_dialog_attach_default(gd, p->icon_entry);
+       gtk_widget_show(label);
+
+       gtk_widget_show(gd->dialog);
+}
+
+static void bookmark_move(BookMarkData *bm, GtkWidget *button, gint direction)
+{
+       BookButtonData *b;
+       gint p;
+       GList *list;
+       gchar *key_holder;
+
+       if (!bm->editable) return;
+
+       b = g_object_get_data(G_OBJECT(button), "bookbuttondata");
+       if (!b) return;
+
+       list = gtk_container_get_children(GTK_CONTAINER(bm->box));
+       p = g_list_index(list, button);
+       g_list_free(list);
+
+       if (p < 0 || p + direction < 0) return;
+
+       key_holder = bm->key;
+       bm->key = "_TEMPHOLDER";
+       history_list_item_move(key_holder, b->key, -direction);
+       bookmark_populate_all(key_holder);
+       bm->key = key_holder;
+
+       gtk_box_reorder_child(GTK_BOX(bm->box), button, p + direction);
+}
+
+static void bookmark_menu_prop_cb(GtkWidget *widget, gpointer data)
+{
+       BookMarkData *bm = data;
+
+       if (!bm->active_button) return;
+
+       bookmark_edit(bm->key, bm->active_button->key, widget);
+}
+
+static void bookmark_menu_move(BookMarkData *bm, gint direction)
+{
+       if (!bm->active_button) return;
+
+       bookmark_move(bm, bm->active_button->button, direction);
+}
+
+static void bookmark_menu_up_cb(GtkWidget *widget, gpointer data)
+{
+       bookmark_menu_move(data, -1);
+}
+
+static void bookmark_menu_down_cb(GtkWidget *widget, gpointer data)
+{
+       bookmark_menu_move(data, 1);
+}
+
+static void bookmark_menu_remove_cb(GtkWidget *widget, gpointer data)
+{
+       BookMarkData *bm = data;
+       
+       if (!bm->active_button) return;
+
+       history_list_item_remove(bm->key, bm->active_button->key);
+       bookmark_populate_all(bm->key);
+}
+
+static void bookmark_menu_position_cb(GtkMenu *menu, gint *x, gint *y, gint *pushed_in, gpointer data)
+{
+       GtkWidget *button = data;
+
+       gdk_window_get_origin(button->window, x, y);
+       *y += button->allocation.y + button->allocation.height;
+}
+
+static void bookmark_menu_popup(BookMarkData *bm, GtkWidget *button,
+                               gint button_n, guint32 time, gint local)
+{
+       GtkWidget *menu;
+       BookButtonData *b;
+
+       b = g_object_get_data(G_OBJECT(button), "bookbuttondata");
+       if (!b) return;
+
+       bm->active_button = b;
+
+       menu = popup_menu_short_lived();
+       menu_item_add_stock_sensitive(menu, _("_Properties..."), GTK_STOCK_PROPERTIES, bm->editable,
+                     G_CALLBACK(bookmark_menu_prop_cb), bm);
+       menu_item_add_stock_sensitive(menu, _("Move _up"), GTK_STOCK_GO_UP, bm->editable,
+                     G_CALLBACK(bookmark_menu_up_cb), bm);
+       menu_item_add_stock_sensitive(menu, _("Move _down"), GTK_STOCK_GO_DOWN, bm->editable,
+                     G_CALLBACK(bookmark_menu_down_cb), bm);
+       menu_item_add_stock_sensitive(menu, _("_Remove"), GTK_STOCK_REMOVE, bm->editable,
+                     G_CALLBACK(bookmark_menu_remove_cb), bm);
+
+       if (local)
+               {
+               gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
+                              bookmark_menu_position_cb, button, button_n, time);
+               }
+       else
+               {
+               gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, button_n, time);
+               }
+}
+
+static gint bookmark_press_cb(GtkWidget *button, GdkEventButton *event, gpointer data)
+{
+       BookMarkData *bm = data;
+
+       if (event->button != 3) return FALSE;
+
+       bookmark_menu_popup(bm, button, event->button, event->time, FALSE);
+       
+       return TRUE;
+}
+
+static gint bookmark_keypress_cb(GtkWidget *button, GdkEventKey *event, gpointer data)
+{
+       BookMarkData *bm = data;
+
+       switch (event->keyval)
+               {
+               case GDK_F10:
+                       if (!(event->state & GDK_CONTROL_MASK)) return FALSE;
+               case GDK_Menu:
+                       bookmark_menu_popup(bm, button, 0, event->time, TRUE);
+                       return TRUE;
+                       break;
+               case GDK_Up:
+                       if (event->state & GDK_SHIFT_MASK)
+                               {
+                               bookmark_move(bm, button, -1);
+                               return TRUE;
+                               }
+                       break;
+               case GDK_Down:
+                       if (event->state & GDK_SHIFT_MASK)
+                               {
+                               bookmark_move(bm, button, 1);
+                               return TRUE;
+                               }
+                       break;
+               }
+
+       return FALSE;
+}
+
+static void bookmark_drag_set_data(GtkWidget *button,
+                                  GdkDragContext *context, GtkSelectionData *selection_data,
+                                  guint info, guint time, gpointer data)
+{
+       BookMarkData *bm = data;
+       BookButtonData *b;
+       gchar *uri_text = NULL;
+       gint length = 0;
+       GList *list = NULL;
+
+       if (context->dest_window == bm->widget->window) return;
+
+       b = g_object_get_data(G_OBJECT(button), "bookbuttondata");
+       if (!b) return;
+       
+       list = g_list_append(list, b->path);
+
+       switch (info)
+               {
+               case TARGET_URI_LIST:
+                       uri_text = uri_text_from_list(list, &length, FALSE);
+                       break;
+               case TARGET_TEXT_PLAIN:
+                       uri_text = uri_text_from_list(list, &length, TRUE);
+                       break;
+               }
+
+       g_list_free(list);
+
+       if (!uri_text) return;
+
+       gtk_selection_data_set(selection_data, selection_data->target,
+                              8, uri_text, length);
+       g_free(uri_text);
+}
+
+static void bookmark_drag_begin(GtkWidget *button, GdkDragContext *context, gpointer data)
+{
+       GdkPixbuf *pixbuf;
+       GdkModifierType mask;
+       gint x, y;
+
+       pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8,
+                               button->allocation.width, button->allocation.height);
+       gdk_pixbuf_get_from_drawable(pixbuf, button->window, NULL,
+                                    button->allocation.x, button->allocation.y,
+                                    0, 0, button->allocation.width, button->allocation.height);
+
+       gdk_window_get_pointer(button->window, &x, &y, &mask);
+
+       gtk_drag_set_icon_pixbuf(context, pixbuf,
+                                x - button->allocation.x, y - button->allocation.y);
+       g_object_unref(pixbuf);
+}
+
+static void bookmark_populate(BookMarkData *bm)
+{
+       GtkBox *box;
+       GList *work;
+       GList *children;
+       
+       box = GTK_BOX(bm->box);
+       children = gtk_container_get_children(GTK_CONTAINER(box));
+       work = children;
+       while (work)
+               {
+               GtkWidget *widget = GTK_WIDGET(work->data);
+               work = work->next;
+               gtk_widget_destroy(widget);
+               }
+
+       if (!bm->no_defaults && !history_list_get_by_key(bm->key))
+               {
+               gchar *buf;
+               gchar *path;
+
+               if (!bookmark_default_list)
+                       {
+                       buf = bookmark_string(_("Home"), homedir(), NULL);
+                       history_list_add_to_key(bm->key, buf, 0);
+                       g_free(buf);
+
+                       path = concat_dir_and_file(homedir(), "Desktop");
+                       if (isname(path))
+                               {
+                               buf = bookmark_string(_("Desktop"), path, NULL);
+                               history_list_add_to_key(bm->key, buf, 0);
+                               g_free(buf);
+                               }
+                       g_free(path);
+                       }
+
+               work = bookmark_default_list;
+               while (work && work->next)
+                       {
+                       gchar *name;
+                       
+                       name = work->data;
+                       work = work->next;
+                       path = work->data;
+                       work = work->next;
+
+                       buf = bookmark_string(name, path, NULL);
+                       history_list_add_to_key(bm->key, buf, 0);
+                       g_free(buf);
+                       }
+               }
+
+       work = history_list_get_by_key(bm->key);
+       work = g_list_last(work);
+       while (work)
+               {
+               BookButtonData *b;
+
+               b = bookmark_from_string(work->data);
+               if (b)
+                       {
+                       GtkWidget *box;
+
+                       b->button = gtk_button_new();
+                       gtk_button_set_relief(GTK_BUTTON(b->button), GTK_RELIEF_NONE);
+                       gtk_box_pack_start(GTK_BOX(bm->box), b->button, FALSE, FALSE, 0);
+                       gtk_widget_show(b->button);
+
+                       g_object_set_data_full(G_OBJECT(b->button), "bookbuttondata",
+                                              b, (GDestroyNotify)bookmark_free);
+
+                       box = gtk_hbox_new(FALSE, PREF_PAD_BUTTON_GAP);
+                       gtk_container_add(GTK_CONTAINER(b->button), box);
+                       gtk_widget_show(box);
+
+                       if (b->icon)
+                               {
+                               GdkPixbuf *pixbuf;
+                               gchar *iconl;
+
+                               iconl = path_from_utf8(b->icon);
+                               pixbuf = gdk_pixbuf_new_from_file(iconl, NULL);
+                               g_free(iconl);
+                               if (pixbuf)
+                                       {
+                                       GdkPixbuf *scaled;
+                                       gint w, h;
+
+                                       w = h = 16;
+                                       gtk_icon_size_lookup(GTK_ICON_SIZE_BUTTON, &w, &h);
+
+                                       scaled = gdk_pixbuf_scale_simple(pixbuf, w, h,
+                                                                        GDK_INTERP_BILINEAR);
+                                       b->image = gtk_image_new_from_pixbuf(scaled);
+                                       g_object_unref(scaled);
+                                       g_object_unref(pixbuf);
+                                       }
+                               else
+                                       {
+                                       b->image = gtk_image_new_from_stock(GTK_STOCK_MISSING_IMAGE,
+                                                                           GTK_ICON_SIZE_BUTTON);
+                                       }
+                               }
+                       else
+                               {
+                               b->image = gtk_image_new_from_stock(GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_BUTTON);
+                               }
+                       gtk_box_pack_start(GTK_BOX(box), b->image, FALSE, FALSE, 0);
+                       gtk_widget_show(b->image);
+
+                       b->label = gtk_label_new(b->name);
+                       gtk_box_pack_start(GTK_BOX(box), b->label, FALSE, FALSE, 0);
+                       gtk_widget_show(b->label);
+
+                       g_signal_connect(G_OBJECT(b->button), "clicked",
+                                        G_CALLBACK(bookmark_select_cb), bm);
+                       g_signal_connect(G_OBJECT(b->button), "button_press_event",
+                                        G_CALLBACK(bookmark_press_cb), bm);
+                       g_signal_connect(G_OBJECT(b->button), "key_press_event",
+                                        G_CALLBACK(bookmark_keypress_cb), bm);
+
+                       gtk_drag_source_set(b->button, GDK_BUTTON1_MASK,
+                                           bookmark_drag_types, bookmark_drag_types_n,
+                                           GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+                       g_signal_connect(G_OBJECT(b->button), "drag_data_get",
+                                        G_CALLBACK(bookmark_drag_set_data), bm);
+                       g_signal_connect(G_OBJECT(b->button), "drag_begin",
+                                        G_CALLBACK(bookmark_drag_begin), bm);
+                       }
+
+               work = work->prev;
+               }
+}
+
+static void bookmark_populate_all(const gchar *key)
+{
+       GList *work;
+       
+       if (!key) return;
+       
+       work = bookmark_widget_list;
+       while (work)
+               {
+               BookMarkData *bm;
+
+               bm = work->data;
+               work = work->next;
+
+               if (strcmp(bm->key, key) == 0)
+                       {
+                       bookmark_populate(bm);
+                       }
+               }
+}
+
+static void bookmark_dnd_get_data(GtkWidget *widget,
+                                 GdkDragContext *context, gint x, gint y,
+                                 GtkSelectionData *selection_data, guint info,
+                                 guint time, gpointer data)
+{
+       BookMarkData *bm = data;
+       GList *list = NULL;
+       GList *work;
+
+       if (!bm->editable) return;
+
+       switch (info)
+               {
+               case TARGET_URI_LIST:
+               case TARGET_X_URL:
+                       list = uri_list_from_text(selection_data->data, FALSE);
+                       break;
+               }
+
+       work = list;
+       while (work)
+               {
+               gchar *path = work->data;
+               gchar *buf;
+
+               buf = bookmark_string(filename_from_path(path), path, NULL);
+               history_list_add_to_key(bm->key, buf, 0);
+               g_free(buf);
+
+               work = work->next;
+               }
+
+       path_list_free(list);
+
+       bookmark_populate_all(bm->key);
+}
+
+static void bookmark_list_destroy(GtkWidget *widget, gpointer data)
+{
+       BookMarkData *bm = data;
+
+       bookmark_widget_list = g_list_remove(bookmark_widget_list, bm);
+
+       g_free(bm->key);
+       g_free(bm);
+}
+
+GtkWidget *bookmark_list_new(const gchar *key,
+                            void (*select_func)(const gchar *path, gpointer data), gpointer select_data)
+{
+       GtkWidget *scrolled;
+       BookMarkData *bm;
+       
+       if (!key) key = "bookmarks";
+
+       bm = g_new0(BookMarkData, 1);
+       bm->key = g_strdup(key);
+
+       bm->select_func = select_func;
+       bm->select_data = select_data;
+
+       bm->no_defaults = FALSE;
+       bm->editable = TRUE;
+
+       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
+                                      GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+
+       bm->box = gtk_vbox_new(FALSE, 0);
+       gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled), bm->box);
+       gtk_widget_show(bm->box);
+
+       bookmark_populate(bm);
+
+       g_signal_connect(G_OBJECT(bm->box), "destroy",
+                        G_CALLBACK(bookmark_list_destroy), bm);
+       g_object_set_data(G_OBJECT(bm->box), BOOKMARK_DATA_KEY, bm);
+       g_object_set_data(G_OBJECT(scrolled), BOOKMARK_DATA_KEY, bm);
+       bm->widget = scrolled;
+
+       gtk_drag_dest_set(scrolled,
+                         GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
+                         bookmark_drop_types, bookmark_drop_types_n,
+                         GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+       g_signal_connect(G_OBJECT(scrolled), "drag_data_received",
+                        G_CALLBACK(bookmark_dnd_get_data), bm);
+
+       bookmark_widget_list = g_list_append(bookmark_widget_list, bm);
+
+       return scrolled;
+}
+
+void bookmark_list_set_key(GtkWidget *list, const gchar *key)
+{
+       BookMarkData *bm;
+
+       if (!list || !key) return;
+
+       bm = g_object_get_data(G_OBJECT(list), BOOKMARK_DATA_KEY);
+       if (!bm) return;
+
+       if (bm->key && strcmp(bm->key, key) == 0) return;
+
+       g_free(bm->key);
+       bm->key = g_strdup(key);
+
+       bookmark_populate(bm);
+}
+
+void bookmark_list_set_no_defaults(GtkWidget *list, gint no_defaults)
+{
+       BookMarkData *bm;
+
+       bm = g_object_get_data(G_OBJECT(list), BOOKMARK_DATA_KEY);
+       if (!bm) return;
+
+       bm->no_defaults = no_defaults;
+}
+
+void bookmark_list_set_editable(GtkWidget *list, gint editable)
+{
+       BookMarkData *bm;
+
+       bm = g_object_get_data(G_OBJECT(list), BOOKMARK_DATA_KEY);
+       if (!bm) return;
+
+       bm->editable = editable;
+}
+
+void bookmark_list_add(GtkWidget *list, const gchar *name, const gchar *path)
+{
+       BookMarkData *bm;
+       gchar *buf;
+
+       bm = g_object_get_data(G_OBJECT(list), BOOKMARK_DATA_KEY);
+       if (!bm) return;
+
+       buf = bookmark_string(name, path, NULL);
+       history_list_add_to_key(bm->key, buf, 0);
+       g_free(buf);
+
+       bookmark_populate_all(bm->key);
+}
+
+void bookmark_add_default(const gchar *name, const gchar *path)
+{
+       if (!name || !path) return;
+       bookmark_default_list = g_list_append(bookmark_default_list, g_strdup(name));
+       bookmark_default_list = g_list_append(bookmark_default_list, g_strdup(path));
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * combo with history key
+ *-----------------------------------------------------------------------------
+ */
+
+typedef struct _HistoryComboData HistoryComboData;
+struct _HistoryComboData
+{
+       GtkWidget *combo;
+       GtkWidget *entry;
+       gchar *history_key;
+       gint history_levels;
+};
+
+static void history_combo_destroy(GtkWidget *widget, gpointer data)
+{
+       HistoryComboData *hc = data;
+
+       g_free(hc->history_key);
+       g_free(data);
+}
+
+/* if text is NULL, entry is set to the most recent item */
+GtkWidget *history_combo_new(GtkWidget **entry, const gchar *text,
+                            const gchar *history_key, gint max_levels)
+{
+       HistoryComboData *hc;
+       GList *work;
+       gint n = 0;
+
+       hc = g_new0(HistoryComboData, 1);
+       hc->history_key = g_strdup(history_key);
+       hc->history_levels = max_levels;
+
+       hc->combo = gtk_combo_box_entry_new_text();
+#if 0
+       gtk_combo_set_case_sensitive(GTK_COMBO(hc->combo), TRUE);
+       gtk_combo_set_use_arrows(GTK_COMBO(hc->combo), FALSE);
+#endif
+
+       hc->entry = GTK_BIN(hc->combo)->child;
+
+       g_object_set_data(G_OBJECT(hc->combo), "history_combo_data", hc);
+       g_object_set_data(G_OBJECT(hc->entry), "history_combo_data", hc);
+       g_signal_connect(G_OBJECT(hc->combo), "destroy",
+                        G_CALLBACK(history_combo_destroy), hc);
+
+       work = history_list_get_by_key(hc->history_key);
+       while (work)
+               {
+               gtk_combo_box_append_text(GTK_COMBO_BOX(hc->combo), (gchar *)work->data);
+               work = work->next;
+               n++;
+               }
+
+       if (text)
+               {
+               gtk_entry_set_text(GTK_ENTRY(hc->entry), text);
+               }
+       else if (n > 0)
+               {
+               gtk_combo_box_set_active(GTK_COMBO_BOX(hc->combo), 0);
+               }
+
+       if (entry) *entry = hc->entry;
+       return hc->combo;
+}
+
+/* if text is NULL, current entry text is used
+ * widget can be the combo or entry widget
+ */
+void history_combo_append_history(GtkWidget *widget, const gchar *text)
+{
+       HistoryComboData *hc;
+       gchar *new_text;
+
+       hc = g_object_get_data(G_OBJECT(widget), "history_combo_data");
+       if (!hc)
+               {
+               printf("widget is not a history combo\n");
+               return;
+               }
+
+       if (text)
+               {
+               new_text = g_strdup(text);
+               }
+       else
+               {
+               new_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(hc->entry)));
+               }
+
+       if (new_text && strlen(new_text) > 0)
+               {
+               GtkTreeModel *store;
+               GList *work;
+
+               history_list_add_to_key(hc->history_key, new_text, hc->history_levels);
+
+               gtk_combo_box_set_active(GTK_COMBO_BOX(hc->combo), -1);
+
+               store = gtk_combo_box_get_model(GTK_COMBO_BOX(hc->combo));
+               gtk_list_store_clear(GTK_LIST_STORE(store));
+
+               work = history_list_get_by_key(hc->history_key);
+               while (work)
+                       {
+                       gtk_combo_box_append_text(GTK_COMBO_BOX(hc->combo), (gchar *)work->data);
+                       work = work->next;
+                       }
+               }
+
+       g_free(new_text);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * drag and drop uri utils
+ *-----------------------------------------------------------------------------
+ */
+
+/* the following characters are allowed to be unencoded for pathnames:
+ *     $ & + , / : = @
+ */
+static gint escape_char_list[] = {
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1,   /*   0 */
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1,   /*  10 */ 
+       1, 1, 1, 1, 1, 1, 1, 1, 1, 1,   /*  20 */
+/*          spc !  "  #  $  %  &  '           */
+       1, 1, 0, 0, 1, 1, 0, 1, 0, 0,   /*  30 */
+/*     (  )  *  +  ,  -  .  /  0  1           */
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   /*  40 */
+/*     2  3  4  5  6  7  8  9  :  ;           */
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 1,   /*  50 */
+/*     <  =  >  ?  @  A  B  C  D  E           */
+       1, 0, 1, 1, 0, 0, 0, 0, 0, 0,   /*  60 */
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   /*  70 */
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   /*  80 */
+/*     Z  [  \  ]  ^  _  `  a  b  c           */
+       0, 1, 1, 1, 1, 0, 1, 0, 0, 0,   /*  90 */
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   /* 100 */
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   /* 110 */
+/*     x  y  z  {  |  }  ~ del                */
+       0, 0, 0, 1, 1, 1, 0, 0          /* 120, 127 is end */
+};
+
+static gchar *hex_char = "0123456789ABCDEF";
+
+static gint escape_test(guchar c)
+{
+       if (c < 32 || c > 127) return TRUE;
+       return (escape_char_list[c] != 0);
+}
+
+static const gchar *escape_code(guchar c)
+{
+       static gchar text[4];
+
+       text[0] = '%';
+       text[1] = hex_char[c>>4];
+       text[2] = hex_char[c%16];
+       text[3] = '\0';
+
+       return text;
+}
+
+gchar *uri_text_escape(const gchar *text)
+{
+       GString *string;
+       gchar *result;
+       const gchar *p;
+
+       if (!text) return NULL;
+       
+       string = g_string_new("");
+
+       p = text;
+       while (*p != '\0')
+               {
+               if (escape_test(*p))
+                       {
+                       g_string_append(string, escape_code(*p));
+                       }
+               else
+                       {
+                       g_string_append_c(string, *p);
+                       }
+               p++;
+               }
+
+       result = string->str;
+       g_string_free(string, FALSE);
+
+       /* dropped filenames are expected to be utf-8 compatible */
+       if (!g_utf8_validate(result, -1, NULL))
+               {
+               gchar *tmp;
+
+               tmp = g_locale_to_utf8(result, -1, NULL, NULL, NULL);
+               if (tmp)
+                       {
+                       g_free(result);
+                       result = tmp;
+                       }
+               }
+
+       return result;
+}
+
+/* this operates on the passed string, decoding escaped characters */
+void uri_text_decode(gchar *text)
+{
+       if (strchr(text, '%'))
+               {
+               gchar *w;
+               gchar *r;
+
+               w = r = text;
+
+               while(*r != '\0')
+                       {
+                       if (*r == '%' && *(r + 1) != '\0' && *(r + 2) != '\0')
+                               {
+                               gchar t[3];
+                               gint n;
+
+                               r++;
+                               t[0] = *r;
+                               r++;
+                               t[1] = *r;
+                               t[2] = '\0';
+                               n = (gint)strtol(t, NULL, 16);
+                               if (n > 0 && n < 256)
+                                       {
+                                       *w = (gchar)n;
+                                       }
+                               else
+                                       {
+                                       /* invalid number, rewind and ignore this escape */
+                                       r -= 2;
+                                       *w = *r;
+                                       }
+                               }
+                       else if (w != r)
+                               {
+                               *w = *r;
+                               }
+                       r++;
+                       w++;
+                       }
+               if (*w != '\0') *w = '\0';
+               }
+}
+
+static void uri_list_parse_encoded_chars(GList *list)
+{
+       GList *work = list;
+
+       while (work)
+               {
+               gchar *text = work->data;
+
+               uri_text_decode(text);
+
+               work = work->next;
+               }
+}
+
+GList *uri_list_from_text(gchar *data, gint files_only)
+{
+       GList *list = NULL;
+       gint b, e;
+
+       b = e = 0;
+
+       while (data[b] != '\0')
+               {
+               while (data[e] != '\r' && data[e] != '\n' && data[e] != '\0') e++;
+               if (strncmp(data + b, "file:", 5) == 0)
+                       {
+                       gchar *path;
+                       b += 5;
+                       while (data[b] == '/' && data[b+1] == '/') b++;
+                       path = g_strndup(data + b, e - b);
+                       list = g_list_append(list, path_to_utf8(path));
+                       g_free(path);
+                       }
+               else if (!files_only && strncmp(data + b, "http:", 5) == 0)
+                       {
+                       list = g_list_append(list, g_strndup(data + b, e - b));
+                       }
+               else if (!files_only && strncmp(data + b, "ftp:", 3) == 0)
+                       {
+                       list = g_list_append(list, g_strndup(data + b, e - b));
+                       }
+               while (data[e] == '\r' || data[e] == '\n') e++;
+               b = e;
+               }
+
+       uri_list_parse_encoded_chars(list);
+
+       return list;
+}
+
+gchar *uri_text_from_list(GList *list, gint *len, gint plain_text)
+{
+       gchar *uri_text = NULL;
+       GString *string;
+       GList *work;
+
+       if (!list)
+               {
+               if (len) *len = 0;
+               return NULL;
+               }
+
+       string = g_string_new("");
+
+       work = list;
+       while (work)
+               {
+               const gchar *name8;     /* dnd filenames are in utf-8 */
+
+               name8 = work->data;
+
+               if (!plain_text)
+                       {
+                       gchar *escaped;
+
+                       escaped = uri_text_escape(name8);
+                       g_string_append(string, "file:");
+                       g_string_append(string, escaped);
+                       g_free(escaped);
+
+                       g_string_append(string, "\r\n");
+                       }
+               else
+                       {
+                       g_string_append(string, name8);
+                       if (work->next) g_string_append(string, "\n");
+                       }
+
+               work = work->next;
+               }
+
+       uri_text = string->str;
+       if (len) *len = string->len;
+       g_string_free(string, FALSE);
+
+       return uri_text;
+}
+
diff --git a/src/ui_bookmark.h b/src/ui_bookmark.h
new file mode 100644 (file)
index 0000000..bf66db5
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef UI_BOOKMARK_H
+#define UI_BOOKMARK_H
+
+
+/* history lists */
+
+gint history_list_load(const gchar *path);
+gint history_list_save(const gchar *path);
+
+void history_list_free_key(const gchar *key);
+
+void history_list_add_to_key(const gchar *key, const gchar *path, gint max);
+
+void history_list_item_change(const gchar *key, const gchar *oldpath, const gchar *newpath);
+void history_list_item_move(const gchar *key, const gchar *path, gint direction);
+void history_list_item_remove(const gchar *key, const gchar *path);
+
+const gchar *history_list_find_last_path_by_key(const gchar* key);
+
+/* the returned GList is internal, don't free it */
+GList *history_list_get_by_key(const gchar *key);
+
+
+/* bookmarks */
+
+GtkWidget *bookmark_list_new(const gchar *key,
+                            void (*select_func)(const gchar *path, gpointer data), gpointer select_data);
+void bookmark_list_set_key(GtkWidget *list, const gchar *key);
+void bookmark_list_set_no_defaults(GtkWidget *list, gint no_defaults);
+void bookmark_list_set_editable(GtkWidget *list, gint editable);
+void bookmark_list_add(GtkWidget *list, const gchar *name, const gchar *path);
+
+/* allows apps to set up the defaults */
+void bookmark_add_default(const gchar *name, const gchar *path);
+
+
+/* history combo entry */
+
+GtkWidget *history_combo_new(GtkWidget **entry, const gchar *text,
+                            const gchar *history_key, gint max_levels);
+void history_combo_append_history(GtkWidget *widget, const gchar *text);
+
+
+/* dnd data parsers (uris) */
+
+gchar *uri_text_escape(const gchar *text);
+void uri_text_decode(gchar *text);
+
+GList *uri_list_from_text(gchar *data, gint files_only);
+gchar *uri_text_from_list(GList *list, gint *len, gint plain_text);
+
+
+#endif
+
diff --git a/src/ui_fileops.c b/src/ui_fileops.c
new file mode 100644 (file)
index 0000000..b0e90e9
--- /dev/null
@@ -0,0 +1,800 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include <pwd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/param.h>
+#include <dirent.h>
+#include <utime.h>
+
+#include <glib.h>
+#include <gtk/gtk.h>   /* for locale warning dialog */
+
+#include "ui_fileops.h"
+
+#include "ui_utildlg.h"        /* for locale warning dialog */
+
+/*
+ *-----------------------------------------------------------------------------
+ * generic file information and manipulation routines (public)
+ *-----------------------------------------------------------------------------
+ */ 
+
+/* file sorting method (case) */
+gint file_sort_case_sensitive = FALSE;
+
+
+void print_term(const gchar *text_utf8)
+{
+       gchar *text_l;
+
+       text_l = g_locale_from_utf8(text_utf8, -1, NULL, NULL, NULL);
+       printf((text_l) ? text_l : text_utf8);
+       g_free(text_l);
+}
+
+static void encoding_dialog(const gchar *path);
+
+static gint encoding_dialog_idle(gpointer data)
+{
+       gchar *path = data;
+
+       encoding_dialog(path);
+       g_free(path);
+
+       return FALSE;
+}
+
+static gint encoding_dialog_delay(gpointer data)
+{
+       g_idle_add(encoding_dialog_idle, data);
+
+       return 0;
+}
+
+static void encoding_dialog(const gchar *path)
+{
+       static gint warned_user = FALSE;
+       GenericDialog *gd;
+       GString *string;
+       const gchar *lc;
+       const gchar *bf;
+
+       /* check that gtk is initialized (loop is level > 0) */
+       if (gtk_main_level() == 0)
+               {
+               /* gtk not initialized */
+               gtk_init_add(encoding_dialog_delay, g_strdup(path));
+               return;
+               }
+
+       if (warned_user) return;
+       warned_user = TRUE;
+
+       lc = getenv("LANG");
+       bf = getenv("G_BROKEN_FILENAMES");
+       warned_user = TRUE;
+
+       string = g_string_new("");
+       g_string_append(string, "One or more filenames are not encoded with the preferred locale character set.\n");
+       g_string_append_printf(string, "Operations on, and display of these files with %s may not succeed.\n\n", PACKAGE);
+       g_string_append(string, "If your filenames are not encoded in utf-8, try setting\n");
+       g_string_append(string, "the environment variable G_BROKEN_FILENAMES=1\n");
+       g_string_append_printf(string, "It appears G_BROKEN_FILENAMES is %s%s\n\n",
+                               (bf) ? "set to " : "not set.", (bf) ? bf : "");
+       g_string_append_printf(string, "The locale appears to be set to \"%s\"\n(set by the LANG environment variable)\n", (lc) ? lc : "undefined");
+       if (lc && (strstr(lc, "UTF-8") || strstr(lc, "utf-8")))
+               {
+               gchar *name;
+               name = g_convert(path, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL);
+               string = g_string_append(string, "\nPreferred encoding appears to be UTF-8, however the file:\n");
+               g_string_append_printf(string, "\"%s\"\n%s encoded in valid UTF-8.\n",
+                               (name) ? name : "[name not displayable]",
+                               (g_utf8_validate(path, -1, NULL)) ? "is": "is NOT");
+               g_free(name);
+               }
+
+       gd = generic_dialog_new("Filename encoding locale mismatch",
+                               PACKAGE, "locale warning", NULL, TRUE, NULL, NULL);
+       generic_dialog_add_button(gd, GTK_STOCK_CLOSE, NULL, NULL, TRUE);
+
+       generic_dialog_add_message(gd, GTK_STOCK_DIALOG_WARNING,
+                                  "Filename encoding locale mismatch", string->str);
+
+       gtk_widget_show(gd->dialog);
+
+       g_string_free(string, TRUE);
+}
+
+gchar *path_to_utf8(const gchar *path)
+{
+       gchar *utf8;
+       GError *error = NULL;
+
+       if (!path) return NULL;
+
+       utf8 = g_filename_to_utf8(path, -1, NULL, NULL, &error);
+       if (error)
+               {
+               printf("Unable to convert filename to UTF-8:\n%s\n%s\n", path, error->message);
+               g_error_free(error);
+               encoding_dialog(path);
+               }
+       if (!utf8)
+               {
+               /* just let it through, but bad things may happen */
+               utf8 = g_strdup(path);
+               }
+
+       return utf8;
+}
+
+gchar *path_from_utf8(const gchar *utf8)
+{
+       gchar *path;
+       GError *error = NULL;
+
+       if (!utf8) return NULL;
+
+       path = g_filename_from_utf8(utf8, -1, NULL, NULL, &error);
+       if (error)
+               {
+               printf("Unable to convert filename to locale from UTF-8:\n%s\n%s\n", utf8, error->message);
+               g_error_free(error);
+               }
+       if (!path)
+               {
+               /* if invalid UTF-8, text probaby still in original form, so just copy it */
+               path = g_strdup(utf8);
+               }
+
+       return path;
+}
+
+/* first we try the HOME environment var, if that doesn't work, we try getpwuid(). */
+const gchar *homedir(void)
+{
+       static gchar *home = NULL;
+
+       if (!home)
+               {
+               home = path_to_utf8(getenv("HOME"));
+               }
+       if (!home)
+               {
+               struct passwd *pw = getpwuid(getuid());
+               if (pw) home = path_to_utf8(pw->pw_dir);
+               }
+
+       return home;
+}
+
+gint stat_utf8(const gchar *s, struct stat *st)
+{
+       gchar *sl;
+       gint ret;
+
+       if (!s) return FALSE;
+       sl = path_from_utf8(s);
+       ret = (stat(sl, st) == 0);
+       g_free(sl);
+
+       return ret;
+}
+
+gint isname(const gchar *s)
+{
+       struct stat st;
+
+       return stat_utf8(s, &st);
+}
+
+gint isfile(const gchar *s)
+{
+       struct stat st;
+
+       return (stat_utf8(s, &st) && S_ISREG(st.st_mode));
+}
+
+gint isdir(const gchar *s)
+{
+       struct stat st;
+   
+       return (stat_utf8(s ,&st) && S_ISDIR(st.st_mode));
+}
+
+gint64 filesize(const gchar *s)
+{
+       struct stat st;
+   
+       if (!stat_utf8(s, &st)) return 0;
+       return (gint)st.st_size;
+}
+
+time_t filetime(const gchar *s)
+{
+        struct stat st;
+
+       if (!stat_utf8(s, &st)) return 0;
+       return st.st_mtime;
+}
+
+gint filetime_set(const gchar *s, time_t tval)
+{
+       gint ret = FALSE;
+
+       if (tval > 0)
+               {
+               struct utimbuf ut;
+               gchar *sl;
+
+               ut.actime = ut.modtime = tval;
+
+               sl = path_from_utf8(s);
+               ret = (utime(sl, &ut) == 0);
+               g_free(sl);
+               }
+
+       return ret;
+}
+
+gint access_file(const gchar *s, int mode)
+{
+       gchar *sl;
+       gint ret;
+
+       if (!s) return FALSE;
+
+       sl = path_from_utf8(s);
+       ret = (access(sl, mode) == 0);
+       g_free(sl);
+
+       return ret;
+}
+
+gint unlink_file(const gchar *s)
+{
+       gchar *sl;
+       gint ret;
+
+       if (!s) return FALSE;
+
+       sl = path_from_utf8(s);
+       ret = (unlink(sl) == 0);
+       g_free(sl);
+
+       return ret;
+}
+
+gint symlink_utf8(const gchar *source, const gchar *target)
+{
+       gchar *sl;
+       gchar *tl;
+       gint ret;
+
+       if (!source || !target) return FALSE;
+
+       sl = path_from_utf8(source);
+       tl = path_from_utf8(target);
+
+       ret = (symlink(sl, tl) == 0);
+
+       g_free(sl);
+       g_free(tl);
+
+       return ret;
+}
+
+gint mkdir_utf8(const gchar *s, int mode)
+{
+       gchar *sl;
+       gint ret;
+
+       if (!s) return FALSE;
+
+       sl = path_from_utf8(s);
+       ret = (mkdir(sl, mode) == 0);
+       g_free(sl);
+       return ret;
+}
+
+gint rmdir_utf8(const gchar *s)
+{
+       gchar *sl;
+       gint ret;
+
+       if (!s) return FALSE;
+
+       sl = path_from_utf8(s);
+       ret = (rmdir(sl) == 0);
+       g_free(sl);
+
+       return ret;
+}
+
+gint copy_file_attributes(const gchar *s, const gchar *t, gint perms, gint mtime)
+{
+       struct stat st;
+       gchar *sl, *tl;
+       gint ret = FALSE;
+
+       if (!s || !t) return FALSE;
+
+       sl = path_from_utf8(s);
+       tl = path_from_utf8(t);
+
+       if (stat(sl, &st) == 0)
+               {
+               struct utimbuf tb;
+
+               ret = TRUE;
+
+               /* set the dest file attributes to that of source (ignoring errors) */
+
+               if (perms && chown(tl, st.st_uid, st.st_gid) < 0) ret = FALSE;
+               if (perms && chmod(tl, st.st_mode) < 0) ret = FALSE;
+
+               tb.actime = st.st_atime;
+               tb.modtime = st.st_mtime;
+               if (mtime && utime(tl, &tb) < 0) ret = FALSE;
+               }
+
+       g_free(sl);
+       g_free(tl);
+
+       return ret;
+}
+
+/* paths are in filesystem encoding */
+static gint hard_linked(const gchar *a, const gchar *b)
+{
+       struct stat sta;
+       struct stat stb;
+
+       if (stat(a, &sta) !=  0 || stat(b, &stb) != 0) return FALSE;
+
+       return (sta.st_dev == stb.st_dev &&
+               sta.st_ino == stb.st_ino);
+}
+
+gint copy_file(const gchar *s, const gchar *t)
+{
+       FILE *fi = NULL;
+       FILE *fo = NULL;
+       gchar *sl, *tl;
+       gchar buf[4096];
+       gint b;
+
+       sl = path_from_utf8(s);
+       tl = path_from_utf8(t);
+
+       if (hard_linked(sl, tl))
+               {
+               g_free(sl);
+               g_free(tl);
+               return TRUE;
+               }
+
+       fi = fopen(sl, "rb");
+       if (fi)
+               {
+               fo = fopen(tl, "wb");
+               if (!fo)
+                       {
+                       fclose(fi);
+                       fi = NULL;
+                       }
+               }
+
+       g_free(sl);
+       g_free(tl);
+
+       if (!fi || !fo) return FALSE;
+
+       while((b = fread(buf, sizeof(char), 4096, fi)) && b != 0)
+               {
+               if (fwrite(buf, sizeof(char), b, fo) != b)
+                       {
+                       fclose(fi);
+                       fclose(fo);
+                       return FALSE;
+                       }
+               }
+
+       fclose(fi);
+       fclose(fo);
+
+       copy_file_attributes(s, t, TRUE, TRUE);
+
+       return TRUE;
+}
+
+gint move_file(const gchar *s, const gchar *t)
+{
+       gchar *sl, *tl;
+       gint ret = TRUE;
+
+       if (!s || !t) return FALSE;
+
+       sl = path_from_utf8(s);
+       tl = path_from_utf8(t);
+       if (rename(sl, tl) < 0)
+               {
+               /* this may have failed because moving a file across filesystems
+               was attempted, so try copy and delete instead */
+               if (copy_file(s, t))
+                       {
+                       if (unlink(sl) < 0)
+                               {
+                               /* err, now we can't delete the source file so return FALSE */
+                               ret = FALSE;
+                               }
+                       }
+               else
+                       {
+                       ret = FALSE;
+                       }
+               }
+       g_free(sl);
+       g_free(tl);
+
+       return ret;
+}
+
+gint rename_file(const gchar *s, const gchar *t)
+{
+       gchar *sl, *tl;
+       gint ret;
+
+       if (!s || !t) return FALSE;
+
+       sl = path_from_utf8(s);
+       tl = path_from_utf8(t);
+       ret = (rename(sl, tl) == 0);
+       g_free(sl);
+       g_free(tl);
+
+       return ret;
+}
+
+gchar *get_current_dir(void)
+{
+       gchar *pathl;
+       gchar *path8;
+
+       pathl = g_get_current_dir();
+       path8 = path_to_utf8(pathl);
+       g_free(pathl);
+
+       return path8;
+}
+
+gint path_list(const gchar *path, GList **files, GList **dirs)
+{
+       DIR *dp;
+       struct dirent *dir;
+       struct stat ent_sbuf;
+       GList *f_list = NULL;
+       GList *d_list = NULL;
+       gchar *pathl;
+
+       if (!path) return FALSE;
+
+       pathl = path_from_utf8(path);
+       dp = opendir(pathl);
+       if (!dp)
+               {
+               /* dir not found */
+               g_free(pathl);
+               return FALSE;
+               }
+
+       /* root dir fix */
+       if (pathl[0] == '/' && pathl[1] == '\0')
+               {
+               g_free(pathl);
+               pathl = g_strdup("");
+               }
+
+       while ((dir = readdir(dp)) != NULL)
+               {
+               /* skip removed files */
+               if (dir->d_ino > 0)
+                       {
+                       gchar *name = dir->d_name;
+                       gchar *filepath = g_strconcat(pathl, "/", name, NULL);
+                       if (stat(filepath, &ent_sbuf) >= 0)
+                               {
+                               gchar *path8;
+                               gchar *name8;
+
+                               name8 = path_to_utf8(name);
+                               path8 = g_strconcat(path, "/", name8, NULL);
+                               g_free(name8);
+
+                               if (dirs && S_ISDIR(ent_sbuf.st_mode) &&
+                                   !(name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) )
+                                       {
+                                       d_list = g_list_prepend(d_list, path8);
+                                       path8 = NULL;
+                                               }
+                                       else if (files && S_ISREG(ent_sbuf.st_mode))
+                                       {
+                                       f_list = g_list_prepend(f_list, path8);
+                                       path8 = NULL;
+                                       }
+                               g_free(path8);
+                               }
+                       g_free(filepath);
+                       }
+               }
+       closedir(dp);
+
+       g_free(pathl);
+
+       if (dirs) *dirs = g_list_reverse(d_list);
+       if (files) *files = g_list_reverse(f_list);
+
+       return TRUE;
+}
+
+void path_list_free(GList *list)
+{
+       g_list_foreach(list, (GFunc)g_free, NULL);
+       g_list_free(list);
+}
+
+GList *path_list_copy(GList *list)
+{
+       GList *new_list = NULL;
+       GList *work;
+
+       work = list;
+       while (work)
+               {
+               gchar *path;
+               path = work->data;
+               work = work->next;
+               new_list = g_list_prepend(new_list, g_strdup(path));
+               }
+       return g_list_reverse(new_list);
+}
+
+long checksum_simple(const gchar *path)
+{
+       gchar *path8;
+       FILE *f;
+       long sum = 0;
+       gint c;
+
+       path8 = path_from_utf8(path);
+       f = fopen(path8, "r");
+       g_free(path8);
+       if (!f) return -1;
+
+       while((c = fgetc(f)) != EOF)
+               {
+               sum += c;
+               }
+
+       fclose(f);
+
+       return sum;
+}
+
+gchar *unique_filename(const gchar *path, const gchar *ext, const gchar *divider, gint pad)
+{
+       gchar *unique;
+       gint n = 1;
+
+       if (!ext) ext = "";
+       if (!divider) divider = "";
+
+       unique = g_strconcat(path, ext, NULL);
+       while (isname(unique))
+               {
+               g_free(unique);
+               if (pad)
+                       {
+                       unique = g_strdup_printf("%s%s%03d%s", path, divider, n, ext);
+                       }
+               else
+                       {
+                       unique = g_strdup_printf("%s%s%d%s", path, divider, n, ext);
+                       }
+               n++;
+               if (n > 999)
+                       {
+                       /* well, we tried */
+                       g_free(unique);
+                       return NULL;
+                       }
+               }
+
+       return unique;
+}
+
+gchar *unique_filename_simple(const gchar *path)
+{
+       gchar *unique;
+       const gchar *name;
+       const gchar *ext;
+
+       if (!path) return NULL;
+
+       name = filename_from_path(path);
+       if (!name) return NULL;
+
+       ext = extension_from_path(name);
+
+       if (!ext)
+               {
+               unique = unique_filename(path, NULL, "_", TRUE);
+               }
+       else
+               {
+               gchar *base;
+
+               base = remove_extension_from_path(path);
+               unique = unique_filename(base, ext, "_", TRUE);
+               g_free(base);
+               }
+
+       return unique;
+}
+
+const gchar *filename_from_path(const gchar *path)
+{
+       const gchar *base;
+
+       if (!path) return NULL;
+
+       base = strrchr(path, '/');
+       if (base) return base + 1;
+
+       return path;
+}
+
+gchar *remove_level_from_path(const gchar *path)
+{
+       gchar *new_path;
+       const gchar *ptr = path;
+       gint p;
+
+       if (!path) return NULL;
+
+       p = strlen(path) - 1;
+       if (p < 0) return NULL;
+       while(ptr[p] != '/' && p > 0) p--;
+       if (p == 0 && ptr[p] == '/') p++;
+       new_path = g_strndup(path, (guint)p);
+       return new_path;
+}
+
+gchar *concat_dir_and_file(const gchar *base, const gchar *name)
+{
+       if (!base || !name) return NULL;
+
+       if (strcmp(base, "/") == 0) return g_strconcat(base, name, NULL);
+
+       return g_strconcat(base, "/", name, NULL);
+}
+
+const gchar *extension_from_path(const gchar *path)
+{
+       if (!path) return NULL;
+       return strrchr(path, '.');
+}
+
+gint file_extension_match(const gchar *path, const gchar *ext)
+{
+       gint p;
+       gint e;
+
+       if (!path) return FALSE;
+       if (!ext) return TRUE;
+
+       p = strlen(path);
+       e = strlen(ext);
+
+       return (p > e && strncasecmp(path + p - e, ext, e) == 0);
+}
+
+gchar *remove_extension_from_path(const gchar *path)
+{
+       gchar *new_path;
+       const gchar *ptr = path;
+       gint p;
+
+       if (!path) return NULL;
+       if (strlen(path) < 2) return g_strdup(path);
+
+       p = strlen(path) - 1;
+       while(ptr[p] != '.' && p > 0) p--;
+       if (p == 0) p = strlen(path) - 1;
+       new_path = g_strndup(path, (guint)p);
+       return new_path;
+}
+
+void parse_out_relatives(gchar *path)
+{
+       gint s, t;
+
+       if (!path) return;
+
+       s = t = 0;
+
+       while (path[s] != '\0')
+               {
+               if (path[s] == '/' && path[s+1] == '.' && (path[s+2] == '/' || path[s+2] == '\0') )
+                       {
+                       s += 2;
+                       }
+               else if (path[s] == '/' && path[s+1] == '.' && path[s+2] == '.' && (path[s+3] == '/' || path[s+3] == '\0') )
+                       {
+                       s += 3;
+                       if (t > 0) t--;
+                       while (path[t] != '/' && t > 0) t--;
+                       }
+               else
+                       {
+                       if (s != t) path[t] = path[s];
+                       t++;
+                       s++;
+                       }
+               }
+       if (t == 0 && path[t] == '/') t++;
+       if (t > 1 && path[t-1] == '/') t--;
+       path[t] = '\0';
+}
+
+gint file_in_path(const gchar *name)
+{
+       gchar *path;
+       gchar *namel;
+       gint p, l;
+       gint ret = FALSE;
+
+       if (!name) return FALSE;
+       path = g_strdup(getenv("PATH"));
+       if (!path) return FALSE;
+       namel = path_from_utf8(name);
+
+       p = 0;
+       l = strlen(path);
+       while (p < l && !ret)
+               {
+               gchar *f;
+               gint e = p;
+               while (path[e] != ':' && path[e] != '\0') e++;
+               path[e] = '\0';
+               e++;
+               f = g_strconcat(path + p, "/", namel, NULL);
+               if (isfile(f)) ret = TRUE;
+               g_free(f);
+               p = e;
+               }
+       g_free(namel);
+       g_free(path);
+
+       return ret;
+}
+
diff --git a/src/ui_fileops.h b/src/ui_fileops.h
new file mode 100644 (file)
index 0000000..cee36d1
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef UI_FILEOPS_H
+#define UI_FILEOPS_H
+
+
+#include <sys/stat.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <time.h>
+
+
+#define CASE_SORT(a, b) ( (file_sort_case_sensitive) ? strcmp(a, b) : strcasecmp(a, b) )
+
+extern gint file_sort_case_sensitive;
+
+void print_term(const gchar *text_utf8);
+
+gchar *path_to_utf8(const gchar *path);
+gchar *path_from_utf8(const gchar *path);
+
+const gchar *homedir(void);
+gint stat_utf8(const gchar *s, struct stat *st);
+gint isname(const gchar *s);
+gint isfile(const gchar *s);
+gint isdir(const gchar *s);
+gint64 filesize(const gchar *s);
+time_t filetime(const gchar *s);
+gint filetime_set(const gchar *s, time_t tval);
+gint access_file(const gchar *s, int mode);
+gint unlink_file(const gchar *s);
+gint symlink_utf8(const gchar *source, const gchar *target);
+gint mkdir_utf8(const gchar *s, int mode);
+gint rmdir_utf8(const gchar *s);
+gint copy_file_attributes(const gchar *s, const gchar *t, gint perms, gint mtime);
+gint copy_file(const gchar *s, const gchar *t);
+gint move_file(const gchar *s, const gchar *t);
+gint rename_file(const gchar *s, const gchar *t);
+gchar *get_current_dir(void);
+
+/* return True on success, it is up to you to free
+ * the lists with path_list_free()
+ */
+gint path_list(const gchar *path, GList **files, GList **dirs);
+void path_list_free(GList *list);
+GList *path_list_copy(GList *list);
+
+long checksum_simple(const gchar *path);
+
+
+gchar *unique_filename(const gchar *path, const gchar *ext, const gchar *divider, gint pad);
+gchar *unique_filename_simple(const gchar *path);
+
+const gchar *filename_from_path(const gchar *path);
+gchar *remove_level_from_path(const gchar *path);
+gchar *concat_dir_and_file(const gchar *base, const gchar *name);
+
+const gchar *extension_from_path(const gchar *path);
+gchar *remove_extension_from_path(const gchar *path);
+
+gint file_extension_match(const gchar *path, const gchar *ext);
+
+/* warning note: this modifies path string! */
+void parse_out_relatives(gchar *path);
+
+gint file_in_path(const gchar *name);
+
+#endif
+
+
+
diff --git a/src/ui_help.c b/src/ui_help.c
new file mode 100644 (file)
index 0000000..a816b9e
--- /dev/null
@@ -0,0 +1,272 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+#include "intl.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include "ui_help.h"
+
+#include "ui_fileops.h"
+#include "ui_misc.h"
+
+
+#define HELP_WINDOW_WIDTH 620
+#define HELP_WINDOW_HEIGHT 350
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * 'help' window
+ *-----------------------------------------------------------------------------
+ */
+
+#define SCROLL_MARKNAME "scroll_point"
+
+static void help_window_scroll(GtkWidget *text, const gchar *key)
+{
+       gchar *needle;
+       GtkTextBuffer *buffer;
+       GtkTextIter iter;
+       GtkTextIter start, end;
+
+       if (!text || !key) return;
+
+       needle = g_strdup_printf("[section:%s]", key);
+
+       buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
+       gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);
+
+       if (gtk_text_iter_forward_search(&iter, needle, GTK_TEXT_SEARCH_TEXT_ONLY,
+                                        &start, &end, NULL))
+               {
+               gint line;
+               GtkTextMark *mark;
+
+               line = gtk_text_iter_get_line(&start);
+               gtk_text_buffer_get_iter_at_line_offset(buffer, &iter, line, 0);
+               gtk_text_buffer_place_cursor(buffer, &iter);
+
+#if 0
+               gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(text), &iter, 0.0, TRUE, 0, 0);
+#endif
+
+               /* apparently only scroll_to_mark works when the textview is not visible yet */
+
+               /* if mark exists, move it instead of creating one for every scroll */
+               mark = gtk_text_buffer_get_mark(buffer, SCROLL_MARKNAME);
+               if (mark)
+                       {
+                       gtk_text_buffer_move_mark(buffer, mark, &iter);
+                       }
+               else
+                       {
+                       mark = gtk_text_buffer_create_mark(buffer, SCROLL_MARKNAME, &iter, FALSE);
+                       }
+               gtk_text_view_scroll_to_mark(GTK_TEXT_VIEW(text), mark, 0.0, TRUE, 0, 0);
+               }
+
+       g_free(needle);
+}
+
+static void help_window_load_text(GtkWidget *text, const gchar *path)
+{
+       gchar *pathl;
+       FILE *f;
+       gchar s_buf[1024];
+       GtkTextBuffer *buffer;
+       GtkTextIter iter;
+       GtkTextIter start, end;
+
+       if (!text || !path) return;
+
+       buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
+
+       gtk_text_buffer_get_bounds(buffer, &start, &end);
+       gtk_text_buffer_delete(buffer, &start, &end);
+
+       gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);
+
+       pathl = path_from_utf8(path);
+       f = fopen(pathl, "r");
+       g_free(pathl);
+       if (!f)
+               {
+               gchar *buf;
+               buf = g_strdup_printf(_("Unable to load:\n%s"), path);
+               gtk_text_buffer_insert(buffer, &iter, buf, -1);
+               g_free(buf);
+               }
+       else
+               {
+               while (fgets(s_buf, sizeof(s_buf), f))
+                       {
+                       gchar *buf;
+                       gint l;
+
+                       l = strlen(s_buf);
+
+                       if (!g_utf8_validate(s_buf, l, NULL))
+                               {
+                               buf = g_locale_to_utf8(s_buf, strlen(s_buf), NULL, NULL, NULL);
+                               if (!buf) buf = g_strdup("\n");
+                               }
+                       else
+                               {
+                               buf = NULL;
+                               }
+                       gtk_text_buffer_insert_with_tags_by_name(buffer, &iter,
+                                                                (buf) ? buf : s_buf, -1,
+                                                                "monospace", NULL);
+                       g_free(buf);
+                       }
+               fclose(f);
+               }
+
+       gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0);
+       gtk_text_buffer_place_cursor(buffer, &iter);
+       gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(text), &iter, 0.0, TRUE, 0, 0);
+}
+
+static gint help_window_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
+{
+       gtk_widget_destroy(widget);
+       return TRUE;
+}
+
+static void help_window_close(GtkWidget *widget, gpointer data)
+{
+       GtkWidget *window = data;
+       gtk_widget_destroy(window);
+}
+
+void help_window_set_key(GtkWidget *window, const gchar *key)
+{
+       GtkWidget *text;
+
+       if (!window) return;
+
+       text = g_object_get_data(G_OBJECT(window), "text_widget");
+       if (!text) return;
+
+       gdk_window_raise(window->window);
+
+       if (key) help_window_scroll(text, key);
+}
+
+void help_window_set_file(GtkWidget *window, const gchar *path, const gchar *key)
+{
+       GtkWidget *text;
+
+       if (!window || !path) return;
+
+       text = g_object_get_data(G_OBJECT(window), "text_widget");
+       if (!text) return;
+
+       gdk_window_raise(window->window);
+
+       help_window_load_text(text, path);
+       help_window_scroll(text, key);
+}
+
+GtkWidget *help_window_new(const gchar *title,
+                          const gchar *wmclass, const gchar *subclass,
+                          const gchar *path, const gchar *key)
+{
+       GtkWidget *window;
+       GtkWidget *text;
+       GtkTextBuffer *buffer;
+       GtkWidget *vbox;
+       GtkWidget *hbox;
+       GtkWidget *button;
+       GtkWidget *scrolled;
+
+       /* window */
+
+       window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+       gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
+#if 0
+       gtk_container_set_border_width(GTK_CONTAINER(window), PREF_PAD_BORDER);
+#endif
+       gtk_window_set_wmclass(GTK_WINDOW(window), subclass, wmclass);
+
+       gtk_window_set_default_size(GTK_WINDOW(window), HELP_WINDOW_WIDTH, HELP_WINDOW_HEIGHT);
+
+       gtk_window_set_title(GTK_WINDOW(window), title);
+
+       g_signal_connect(G_OBJECT(window), "delete_event",
+                        G_CALLBACK(help_window_delete_cb), NULL);
+
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_add(GTK_CONTAINER(window), vbox);
+       gtk_widget_show(vbox);
+
+       g_object_set_data(G_OBJECT(window), "text_vbox", vbox);
+
+       /* text window */
+
+       hbox = gtk_hbox_new(FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+       gtk_widget_show(hbox);
+
+       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+       gtk_box_pack_start(GTK_BOX(hbox), scrolled, TRUE, TRUE, 0);
+       gtk_widget_show(scrolled);
+
+       text = gtk_text_view_new();
+       gtk_text_view_set_editable(GTK_TEXT_VIEW(text), FALSE);
+       gtk_container_add(GTK_CONTAINER(scrolled), text);
+       gtk_widget_show(text);
+
+       buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
+       gtk_text_buffer_create_tag(buffer, "monospace",
+                                  "family", "monospace", NULL);
+
+       hbox = gtk_hbutton_box_new();
+       gtk_container_set_border_width(GTK_CONTAINER(hbox), PREF_PAD_BORDER);
+       gtk_button_box_set_layout(GTK_BUTTON_BOX(hbox), GTK_BUTTONBOX_END);
+       gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+       gtk_widget_show(hbox);
+
+       button = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
+       g_signal_connect(G_OBJECT (button), "clicked",
+                        G_CALLBACK(help_window_close), window);
+       gtk_container_add(GTK_CONTAINER(hbox), button);
+       GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+       gtk_widget_grab_default(button);
+       gtk_widget_show(button);
+
+       g_object_set_data(G_OBJECT(window), "text_widget", text);
+
+       help_window_load_text(text, path);
+
+       gtk_widget_show(window);
+
+       help_window_scroll(text, key);
+
+       return window;
+}
+
+GtkWidget *help_window_get_box(GtkWidget *window)
+{
+       return g_object_get_data(G_OBJECT(window), "text_vbox");
+}
+
diff --git a/src/ui_help.h b/src/ui_help.h
new file mode 100644 (file)
index 0000000..ba0d3c0
--- /dev/null
@@ -0,0 +1,27 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef UI_HELP_H
+#define UI_HELP_H
+
+
+GtkWidget *help_window_new(const gchar *title,
+                          const gchar *wmclass, const gchar *subclass,
+                          const gchar *path, const gchar *key);
+void help_window_set_file(GtkWidget *window, const gchar *path, const gchar *key);
+void help_window_set_key(GtkWidget *window, const gchar *key);
+
+GtkWidget *help_window_get_box(GtkWidget *window);
+
+
+#endif
+
diff --git a/src/ui_menu.c b/src/ui_menu.c
new file mode 100644 (file)
index 0000000..5e83560
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+#include "intl.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+
+#include "ui_menu.h"
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * menu items
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void menu_item_finish(GtkWidget *menu, GtkWidget *item, GCallback func, gpointer data)
+{
+       if (func) g_signal_connect(G_OBJECT(item), "activate", func, data);
+       gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+       gtk_widget_show(item);
+}
+
+GtkWidget *menu_item_add(GtkWidget *menu, const gchar *label,
+                        GCallback func, gpointer data)
+{
+       GtkWidget *item;
+
+       item = gtk_menu_item_new_with_mnemonic(label);
+       menu_item_finish(menu, item, func, data);
+
+       return item;
+}
+
+GtkWidget *menu_item_add_stock(GtkWidget *menu, const gchar *label, const gchar *stock_id,
+                              GCallback func, gpointer data)
+{
+       GtkWidget *item;
+       GtkWidget *image;
+
+       item = gtk_image_menu_item_new_with_mnemonic(label);
+       image = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU);
+       gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), image);
+       gtk_widget_show(image);
+       menu_item_finish(menu, item, func, data);
+
+       return item;
+}
+
+GtkWidget *menu_item_add_sensitive(GtkWidget *menu, const gchar *label, gint sensitive,
+                                  GCallback func, gpointer data)
+{
+       GtkWidget *item;
+
+       item = menu_item_add(menu, label, func, data);
+       gtk_widget_set_sensitive(item, sensitive);
+
+       return item;
+}
+
+GtkWidget *menu_item_add_stock_sensitive(GtkWidget *menu, const gchar *label, const gchar *stock_id, gint sensitive,
+                                        GCallback func, gpointer data)
+{
+       GtkWidget *item;
+
+       item = menu_item_add_stock(menu, label, stock_id, func, data);
+       gtk_widget_set_sensitive(item, sensitive);
+       
+       return item;
+}
+
+GtkWidget *menu_item_add_check(GtkWidget *menu, const gchar *label, gint active,
+                              GCallback func, gpointer data)
+{
+       GtkWidget *item;
+
+       item = gtk_check_menu_item_new_with_mnemonic(label);
+       gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), active);
+       menu_item_finish(menu, item, func, data);
+
+       return item;
+}
+
+void menu_item_add_divider(GtkWidget *menu)
+{
+       GtkWidget *item = gtk_menu_item_new();
+       gtk_widget_set_sensitive(item, FALSE);
+        gtk_menu_shell_append(GTK_MENU_SHELL(menu),item);
+        gtk_widget_show(item);
+}
+
+GtkWidget *menu_item_add_simple(GtkWidget *menu, const gchar *label,
+                               GCallback func, gpointer data)
+{
+       GtkWidget *item = gtk_menu_item_new_with_label(label);
+       menu_item_finish(menu, item, func, data);
+
+       return item;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * popup menus
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void popup_menu_short_lived_cb(GtkWidget *widget, gpointer data)
+{
+       /* destroy the menu */
+       g_object_unref(G_OBJECT(data));
+}
+
+GtkWidget *popup_menu_short_lived(void)
+{
+       GtkWidget *menu;
+
+       menu = gtk_menu_new();
+       g_object_ref(G_OBJECT(menu));
+       gtk_object_sink(GTK_OBJECT(menu));
+       g_signal_connect(G_OBJECT(menu), "selection_done",
+                        G_CALLBACK(popup_menu_short_lived_cb), menu);
+       return menu;
+}
+
+gint popup_menu_position_clamp(GtkMenu *menu, gint *x, gint *y, gint height)
+{
+       gint adjusted = FALSE;
+       gint w, h;
+       gint xw, xh;
+       
+       w = GTK_WIDGET(menu)->requisition.width;
+       h = GTK_WIDGET(menu)->requisition.height;
+       xw = gdk_screen_width();
+       xh = gdk_screen_height();
+
+       if (*x + w > xw)
+               {
+               *x = xw - w;
+               adjusted = TRUE;
+               }
+       if (*y + h > xh)
+               {
+               if (height)
+                       {
+                       *y = MAX(0, *y - h - height);
+                       }
+               else
+                       {
+                       *y = xh - h;
+                       }
+               adjusted = TRUE;
+               };
+
+       if (*x < 0)
+               {
+               *x = 0;
+               adjusted = TRUE;
+               }
+       if (*y < 0)
+               {
+               *y = 0;
+               adjusted = TRUE;
+               }
+
+       return adjusted;
+}
+
diff --git a/src/ui_menu.h b/src/ui_menu.h
new file mode 100644 (file)
index 0000000..2ab7c44
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef UI_MENU_H
+#define UI_MENU_H
+
+
+GtkWidget *menu_item_add(GtkWidget *menu, const gchar *label,
+                        GCallback func, gpointer data);
+GtkWidget *menu_item_add_stock(GtkWidget *menu, const gchar *label, const gchar *stock_id,
+                              GCallback func, gpointer data);
+GtkWidget *menu_item_add_sensitive(GtkWidget *menu, const gchar *label, gint sensitive,
+                                  GCallback func, gpointer data);
+GtkWidget *menu_item_add_stock_sensitive(GtkWidget *menu, const gchar *label, const gchar *stock_id, gint sensitive,
+                                        GCallback func, gpointer data);
+GtkWidget *menu_item_add_check(GtkWidget *menu, const gchar *label, gint active,
+                              GCallback func, gpointer data);
+void menu_item_add_divider(GtkWidget *menu);
+
+/* use to avoid mnemonics, for example filenames */
+GtkWidget *menu_item_add_simple(GtkWidget *menu, const gchar *label,
+                                GCallback func, gpointer data);
+
+GtkWidget *popup_menu_short_lived(void);
+
+/* clamp a menu's position to within the screen
+ * if menu will attempt to stay out of region y to y+height
+ */
+gint popup_menu_position_clamp(GtkMenu *menu, gint *x, gint *y, gint height);
+
+
+#endif
+
diff --git a/src/ui_misc.c b/src/ui_misc.c
new file mode 100644 (file)
index 0000000..e3c0c29
--- /dev/null
@@ -0,0 +1,1571 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+#include "intl.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+
+#include "ui_misc.h"
+
+#include "ui_bookmark.h"
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * widget and layout utilities
+ *-----------------------------------------------------------------------------
+ */
+
+GtkWidget *pref_box_new(GtkWidget *parent_box, gint fill,
+                       GtkOrientation orientation, gint padding)
+{
+       GtkWidget *box;
+
+       if (orientation == GTK_ORIENTATION_HORIZONTAL)
+               {
+               box = gtk_hbox_new(FALSE, padding);
+               }
+       else
+               {
+               box = gtk_vbox_new(FALSE, padding);
+               }
+
+       gtk_box_pack_start(GTK_BOX(parent_box), box, fill, fill, 0);
+       gtk_widget_show(box);
+
+       return box;
+}
+
+GtkWidget *pref_group_new(GtkWidget *parent_box, gint fill,
+                         const gchar *text, GtkOrientation orientation)
+{
+       GtkWidget *box;
+       GtkWidget *vbox;
+       GtkWidget *hbox;
+       GtkWidget *label;
+
+       vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+
+       /* add additional spacing if necessary */
+       if (GTK_IS_VBOX(parent_box) && GTK_BOX(parent_box)->children != NULL)
+               {
+               pref_spacer(vbox, PREF_PAD_GROUP - PREF_PAD_GAP);
+               }
+
+       gtk_box_pack_start(GTK_BOX(parent_box), vbox, fill, fill, 0);
+       gtk_widget_show(vbox);
+
+       label = gtk_label_new(text);
+       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+       pref_label_bold(label, TRUE, FALSE);
+
+       gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+       gtk_widget_show(label);
+
+       hbox = gtk_hbox_new(FALSE, PREF_PAD_INDENT);
+       gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+       gtk_widget_show(hbox);
+
+       /* indent using empty box */
+       pref_spacer(hbox, 0);
+
+       if (orientation == GTK_ORIENTATION_HORIZONTAL)
+               {
+               box = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
+               }
+       else
+               {
+               box = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+               }
+       gtk_box_pack_start(GTK_BOX(hbox), box, TRUE, TRUE, 0);
+       gtk_widget_show(box);
+
+       g_object_set_data(G_OBJECT(box), "pref_group", vbox);
+
+       return box;
+}
+
+GtkWidget *pref_group_parent(GtkWidget *child)
+{
+       GtkWidget *parent;
+
+       parent = child;
+       while (parent)
+               {
+               GtkWidget *group;
+
+               group = g_object_get_data(G_OBJECT(parent), "pref_group");
+               if (group && GTK_IS_WIDGET(group)) return group;
+
+               parent = gtk_widget_get_parent(parent);
+               }
+
+       return child;
+}
+
+GtkWidget *pref_frame_new(GtkWidget *parent_box, gint fill,
+                         const gchar *text,
+                         GtkOrientation orientation, gint padding)
+{
+       GtkWidget *box;
+       GtkWidget *frame = NULL;
+
+       frame = gtk_frame_new(text);
+       gtk_box_pack_start(GTK_BOX(parent_box), frame, fill, fill, 0);
+       gtk_widget_show(frame);
+
+       if (orientation == GTK_ORIENTATION_HORIZONTAL)
+               {
+               box = gtk_hbox_new(FALSE, padding);
+               }
+       else
+               {
+               box = gtk_vbox_new(FALSE, padding);
+               }
+       gtk_container_add(GTK_CONTAINER(frame), box);
+       gtk_container_set_border_width(GTK_CONTAINER(box), PREF_PAD_BORDER);
+       gtk_widget_show(box);
+
+       return box;
+}
+
+GtkWidget *pref_spacer(GtkWidget *parent_box, gint padding)
+{
+       GtkWidget *spacer;
+
+       spacer = gtk_hbox_new(FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(parent_box), spacer, FALSE, FALSE, padding / 2);
+       gtk_widget_show(spacer);
+
+       return spacer;
+}
+
+GtkWidget *pref_line(GtkWidget *parent_box, gint padding)
+{
+       GtkWidget *spacer;
+
+       if (GTK_IS_HBOX(parent_box))
+               {
+               spacer = gtk_vseparator_new();
+               }
+       else
+               {
+               spacer = gtk_hseparator_new();
+               }
+
+       gtk_box_pack_start(GTK_BOX(parent_box), spacer, FALSE, FALSE, padding / 2);
+       gtk_widget_show(spacer);
+
+       return spacer;
+}
+
+GtkWidget *pref_label_new(GtkWidget *parent_box, const gchar *text)
+{
+       GtkWidget *label;
+
+       label = gtk_label_new(text);
+       gtk_box_pack_start(GTK_BOX(parent_box), label, FALSE, FALSE, 0);
+       gtk_widget_show(label);
+
+       return label;
+}
+
+GtkWidget *pref_label_new_mnemonic(GtkWidget *parent_box, const gchar *text, GtkWidget *widget)
+{
+       GtkWidget *label;
+
+       label = gtk_label_new_with_mnemonic(text);
+       gtk_label_set_mnemonic_widget(GTK_LABEL(label), widget);
+       gtk_box_pack_start(GTK_BOX(parent_box), label, FALSE, FALSE, 0);
+       gtk_widget_show(label);
+
+       return label;
+}
+
+void pref_label_bold(GtkWidget *label, gint bold, gint increase_size)
+{
+       PangoAttrList *pal;
+       PangoAttribute *pa;
+
+       if (!bold && !increase_size) return;
+
+       pal = pango_attr_list_new();
+
+       if (bold)
+               {
+               pa = pango_attr_weight_new(PANGO_WEIGHT_BOLD);
+               pa->start_index = 0;
+               pa->end_index = G_MAXINT;
+               pango_attr_list_insert(pal, pa);
+               }
+
+       if (increase_size)
+               {
+               pa = pango_attr_scale_new(PANGO_SCALE_LARGE);
+               pa->start_index = 0;
+               pa->end_index = G_MAXINT;
+               pango_attr_list_insert(pal, pa);
+               }
+
+       gtk_label_set_attributes(GTK_LABEL(label), pal);
+       pango_attr_list_unref(pal);
+}
+
+GtkWidget *pref_button_new(GtkWidget *parent_box, const gchar *stock_id,
+                          const gchar *text, gint hide_stock_text,
+                          GCallback func, gpointer data)
+{
+       GtkWidget *button;
+
+       if (stock_id && !text && !hide_stock_text)
+               {
+               button = gtk_button_new_from_stock(stock_id);
+               }
+       else
+               {
+               GtkWidget *image = NULL;
+               GtkWidget *label = NULL;
+
+               button = gtk_button_new();
+
+               if (stock_id) image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_BUTTON);
+               if (text)
+                       {
+                       label = gtk_label_new_with_mnemonic(text);
+                       gtk_misc_set_alignment(GTK_MISC(label), 0.5, 0.5);
+                       gtk_label_set_mnemonic_widget(GTK_LABEL(label), button);
+                       }
+
+               if (image && label)
+                       {
+                       GtkWidget *align;
+                       GtkWidget *hbox;
+
+                       hbox = gtk_hbox_new (FALSE, PREF_PAD_BUTTON_ICON_GAP);
+
+                       align = gtk_alignment_new(0.5, 0.5, 0.0, 0.0);
+                       gtk_container_add(GTK_CONTAINER(button), align);
+                       gtk_widget_show(align);
+
+                       gtk_container_add(GTK_CONTAINER(align), hbox);
+                       gtk_widget_show(hbox);
+
+                       gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
+                       gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+                       }
+               else
+                       {
+                       if (image)
+                               {
+                               gtk_container_add(GTK_CONTAINER(button), image);
+                               }
+                       else if (label)
+                               {
+                               gtk_container_add(GTK_CONTAINER(button), label);
+                               }
+                       }
+
+               if (image) gtk_widget_show(image);
+               if (label) gtk_widget_show(label);
+               }
+
+       if (func) g_signal_connect(G_OBJECT(button), "clicked", func, data);
+
+       if (parent_box)
+               {
+               gtk_box_pack_start(GTK_BOX(parent_box), button, FALSE, FALSE, 0);
+               gtk_widget_show(button);
+               }
+
+       return button;
+}
+
+static GtkWidget *real_pref_checkbox_new(GtkWidget *parent_box, const gchar *text, gint mnemonic_text,
+                                        gint active, GCallback func, gpointer data)
+{
+       GtkWidget *button;
+
+       if (mnemonic_text)
+               {
+               button = gtk_check_button_new_with_mnemonic(text);
+               }
+       else
+               {
+               button = gtk_check_button_new_with_label(text);
+               }
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), active);
+       if (func) g_signal_connect(G_OBJECT(button), "clicked", func, data);
+
+       gtk_box_pack_start(GTK_BOX(parent_box), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       return button;
+}
+
+GtkWidget *pref_checkbox_new(GtkWidget *parent_box, const gchar *text, gint active,
+                            GCallback func, gpointer data)
+{
+       return real_pref_checkbox_new(parent_box, text, FALSE, active, func, data);
+}
+
+GtkWidget *pref_checkbox_new_mnemonic(GtkWidget *parent_box, const gchar *text, gint active,
+                                     GCallback func, gpointer data)
+{
+       return real_pref_checkbox_new(parent_box, text, TRUE, active, func, data);
+}
+
+static void pref_checkbox_int_cb(GtkWidget *widget, gpointer data)
+{
+       gint *result = data;
+
+       *result = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+}
+
+GtkWidget *pref_checkbox_new_int(GtkWidget *parent_box, const gchar *text, gint active,
+                                gint *result)
+{
+       GtkWidget *button;
+
+       button = pref_checkbox_new(parent_box, text, active,
+                                  G_CALLBACK(pref_checkbox_int_cb), result);
+       *result = active;
+
+       return button;
+}
+
+static void pref_checkbox_link_sensitivity_cb(GtkWidget *button, gpointer data)
+{
+       GtkWidget *widget = data;
+
+       gtk_widget_set_sensitive(widget, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)));
+}
+
+void pref_checkbox_link_sensitivity(GtkWidget *button, GtkWidget *widget)
+{
+       g_signal_connect(G_OBJECT(button), "toggled",
+                        G_CALLBACK(pref_checkbox_link_sensitivity_cb), widget);
+
+       pref_checkbox_link_sensitivity_cb(button, widget);
+}
+
+static void pref_checkbox_link_sensitivity_swap_cb(GtkWidget *button, gpointer data)
+{
+       GtkWidget *widget = data;
+
+       gtk_widget_set_sensitive(widget, !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)));
+}
+
+void pref_checkbox_link_sensitivity_swap(GtkWidget *button, GtkWidget *widget)
+{
+       g_signal_connect(G_OBJECT(button), "toggled",
+                        G_CALLBACK(pref_checkbox_link_sensitivity_swap_cb), widget);
+
+       pref_checkbox_link_sensitivity_swap_cb(button, widget);
+}
+
+static GtkWidget *real_pref_radiobutton_new(GtkWidget *parent_box, GtkWidget *sibling,
+                                           const gchar *text, gint mnemonic_text, gint active,
+                                           GCallback func, gpointer data)
+{
+       GtkWidget *button;
+       GSList* group;
+
+       if (sibling)
+               {
+               group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(sibling));
+               }
+       else
+               {
+               group = NULL;
+               }
+
+       if (mnemonic_text)
+               {
+               button = gtk_radio_button_new_with_mnemonic(group, text);
+               }
+       else
+               {
+               button = gtk_radio_button_new_with_label(group, text);
+               }
+
+       if (active) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), active);
+       if (func) g_signal_connect(G_OBJECT(button), "clicked", func, data);
+
+       gtk_box_pack_start(GTK_BOX(parent_box), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       return button;
+}
+
+GtkWidget *pref_radiobutton_new(GtkWidget *parent_box, GtkWidget *sibling,
+                               const gchar *text, gint active,
+                               GCallback func, gpointer data)
+{
+       return real_pref_radiobutton_new(parent_box, sibling, text, FALSE, active, func, data);
+}
+
+GtkWidget *pref_radiobutton_new_mnemonic(GtkWidget *parent_box, GtkWidget *sibling,
+                                        const gchar *text, gint active,
+                                        GCallback func, gpointer data)
+{
+       return real_pref_radiobutton_new(parent_box, sibling, text, TRUE, active, func, data);
+}
+
+#define PREF_RADIO_VALUE_KEY "pref_radio_value"
+
+static void pref_radiobutton_int_cb(GtkWidget *widget, gpointer data)
+{
+       gint *result = data;
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
+               {
+               *result = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), PREF_RADIO_VALUE_KEY));
+               }
+}
+
+GtkWidget *pref_radiobutton_new_int(GtkWidget *parent_box, GtkWidget *sibling,
+                                   const gchar *text, gint active,
+                                   gint *result, gint value,
+                                   GCallback func, gpointer data)
+{
+       GtkWidget *button;
+
+       button = pref_radiobutton_new(parent_box, sibling, text, active,
+                                     G_CALLBACK(pref_radiobutton_int_cb), result);
+       g_object_set_data(G_OBJECT(button), PREF_RADIO_VALUE_KEY, GINT_TO_POINTER(value));
+       if (active) *result = value;
+
+       return button;
+}
+
+static GtkWidget *real_pref_spin_new(GtkWidget *parent_box, const gchar *text, const gchar *suffix,
+                                    gint mnemonic_text,
+                                    gdouble min, gdouble max, gdouble step, gint digits,
+                                    gdouble value,
+                                    GCallback func, gpointer data)
+{
+       GtkWidget *spin;
+       GtkWidget *box;
+       GtkWidget *label;
+
+       box = pref_box_new(parent_box, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+
+       spin = gtk_spin_button_new_with_range(min, max, step);
+       gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), digits);
+       gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), value);
+
+       if (func)
+               {
+               g_signal_connect(G_OBJECT(spin), "value_changed", G_CALLBACK(func), data);
+               }
+
+       if (text)
+               {
+               if (mnemonic_text)
+                       {
+                       label = pref_label_new_mnemonic(box, text, spin);
+                       }
+               else
+                       {
+                       label = pref_label_new(box, text);
+                       }
+               pref_link_sensitivity(label, spin);
+               }
+
+       gtk_box_pack_start(GTK_BOX(box), spin, FALSE, FALSE, 0);
+       gtk_widget_show(spin);
+
+       /* perhaps this should only be PREF_PAD_GAP distance from spinbutton ? */
+       if (suffix)
+               {
+               label =  pref_label_new(box, suffix);
+               pref_link_sensitivity(label, spin);
+               }
+
+       return spin;
+}
+
+GtkWidget *pref_spin_new(GtkWidget *parent_box, const gchar *text, const gchar *suffix,
+                        gdouble min, gdouble max, gdouble step, gint digits,
+                        gdouble value,
+                        GCallback func, gpointer data)
+{
+       return real_pref_spin_new(parent_box, text, suffix, FALSE,
+                                 min, max, step, digits, value, func, data);
+}
+
+GtkWidget *pref_spin_new_mnemonic(GtkWidget *parent_box, const gchar *text, const gchar *suffix,
+                                 gdouble min, gdouble max, gdouble step, gint digits,
+                                 gdouble value,
+                                 GCallback func, gpointer data)
+{
+       return real_pref_spin_new(parent_box, text, suffix, TRUE,
+                                 min, max, step, digits, value, func, data);
+}
+
+static void pref_spin_int_cb(GtkWidget *widget, gpointer data)
+{
+       gint *var = data;
+       *var = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(widget));
+}
+
+GtkWidget *pref_spin_new_int(GtkWidget *parent_box, const gchar *text, const gchar *suffix,
+                            gint min, gint max, gint step,
+                            gint value, gint *value_var)
+{
+       *value_var = value;
+       return pref_spin_new(parent_box, text, suffix,
+                            (gdouble)min, (gdouble)max, (gdouble)step, 0,
+                            value,
+                            G_CALLBACK(pref_spin_int_cb), value_var);
+}
+
+#if 0
+void pref_spin_set_blocking(GtkWidget *spin, gdouble value, gpointer block_data)
+{
+       g_signal_handlers_block_matched(G_OBJECT(spin), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, block_data);
+       gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), value);
+       g_signal_handlers_unblock_matched(G_OBJECT(spin), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, block_data);
+}
+#endif
+
+static void pref_link_sensitivity_cb(GtkWidget *watch, GtkStateType prev_state, gpointer data)
+{
+       GtkWidget *widget = data;
+
+       gtk_widget_set_sensitive(widget, GTK_WIDGET_IS_SENSITIVE(watch));
+}
+
+void pref_link_sensitivity(GtkWidget *widget, GtkWidget *watch)
+{
+       g_signal_connect(G_OBJECT(watch), "state_changed",
+                        G_CALLBACK(pref_link_sensitivity_cb), widget);
+}
+
+void pref_signal_block_data(GtkWidget *widget, gpointer data)
+{
+       g_signal_handlers_block_matched(widget, G_SIGNAL_MATCH_DATA,
+                                       0, 0, NULL, NULL, data);
+}
+
+void pref_signal_unblock_data(GtkWidget *widget, gpointer data)
+{
+       g_signal_handlers_unblock_matched(widget, G_SIGNAL_MATCH_DATA,
+                                         0, 0, NULL, NULL, data);
+}
+
+GtkWidget *pref_table_new(GtkWidget *parent_box, gint columns, gint rows,
+                         gint homogenious, gint fill)
+{
+       GtkWidget *table;
+
+       table = gtk_table_new(rows, columns, homogenious);
+       gtk_table_set_row_spacings(GTK_TABLE(table), PREF_PAD_GAP);
+       gtk_table_set_col_spacings(GTK_TABLE(table), PREF_PAD_SPACE);
+
+       if (parent_box)
+               {
+               gtk_box_pack_start(GTK_BOX(parent_box), table, fill, fill, 0);
+               gtk_widget_show(table);
+               }
+
+       return table;
+}
+
+GtkWidget *pref_table_box(GtkWidget *table, gint column, gint row,
+                         GtkOrientation orientation, const gchar *text)
+{
+       GtkWidget *box;
+       GtkWidget *shell;
+
+       if (text)
+               {
+               shell = gtk_vbox_new(FALSE, 0);
+               box = pref_group_new(shell, TRUE, text, orientation);
+               }
+       else
+               {
+               if (orientation == GTK_ORIENTATION_HORIZONTAL)
+                       {
+                       box = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
+                       }
+               else
+                       {
+                       box = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+                       }
+               shell = box;
+               }
+
+       gtk_table_attach(GTK_TABLE(table), shell, column, column + 1, row, row + 1,
+                        GTK_EXPAND | GTK_FILL, FALSE, 0, 0);
+
+       gtk_widget_show(shell);
+
+       return box;
+}
+
+GtkWidget *pref_table_label(GtkWidget *table, gint column, gint row,
+                           const gchar *text, gfloat alignment)
+{
+       GtkWidget *label;
+       GtkWidget *align;
+
+       align = gtk_alignment_new(alignment, 0.50, 0.0, 0.0);
+       gtk_table_attach(GTK_TABLE(table), align, column, column + 1, row, row + 1,
+                        GTK_FILL, FALSE, 0, 0);
+       gtk_widget_show(align);
+       label = gtk_label_new(text);
+       gtk_container_add(GTK_CONTAINER(align), label);
+       gtk_widget_show(label);
+
+       return label;
+}
+
+GtkWidget *pref_table_button(GtkWidget *table, gint column, gint row,
+                            const gchar *stock_id, const gchar *text, gint hide_stock_text,
+                            GCallback func, gpointer data)
+{
+       GtkWidget *button;
+
+       button = pref_button_new(NULL, stock_id, text, hide_stock_text, func, data);
+       gtk_table_attach(GTK_TABLE(table), button, column, column + 1, row, row + 1,
+                        GTK_FILL, FALSE, 0, 0);
+       gtk_widget_show(button);
+
+       return button;
+}
+
+#if 0
+static GtkWidget *pref_table_checkbox(GtkWidget *table, gint column, gint row,
+                                     const gchar *text, gint active,
+                                     GCallback func, gpointer data)
+{
+       GtkWidget *button;
+
+       button = gtk_check_button_new_with_label(text);
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), active);
+       if (func) g_signal_connect(G_OBJECT(button), "clicked", func, data);
+
+       gtk_table_attach(GTK_TABLE(table), button, column, column + 1, row, row + 1,
+                        GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+       gtk_widget_show(button);
+
+       return button;
+}
+#endif
+
+GtkWidget *pref_table_spin(GtkWidget *table, gint column, gint row,
+                          const gchar *text, const gchar *suffix,
+                          gdouble min, gdouble max, gdouble step, gint digits,
+                          gdouble value,
+                          GCallback func, gpointer data)
+{
+       GtkWidget *spin;
+       GtkWidget *box;
+       GtkWidget *label;
+
+       spin = gtk_spin_button_new_with_range(min, max, step);
+       gtk_spin_button_set_digits(GTK_SPIN_BUTTON(spin), digits);
+       gtk_spin_button_set_value(GTK_SPIN_BUTTON(spin), value);
+       if (func)
+               {
+               g_signal_connect(G_OBJECT(spin), "value_changed", G_CALLBACK(func), data);
+               }
+
+       if (text)
+               {
+               label = pref_table_label(table, column, row, text, 1.0);
+               pref_link_sensitivity(label, spin);
+               column++;
+               }
+
+       if (suffix)
+               {
+               box = gtk_hbox_new(FALSE, PREF_PAD_SPACE);
+               gtk_box_pack_start(GTK_BOX(box), spin, FALSE, FALSE, 0);
+               gtk_widget_show(spin);
+
+               label = pref_label_new(box, suffix);
+               pref_link_sensitivity(label, spin);
+               }
+       else
+               {
+               box = spin;
+               }
+
+       gtk_table_attach(GTK_TABLE(table), box, column, column + 1, row, row + 1,
+                        GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+       gtk_widget_show(box);
+
+       return spin;
+}
+
+static void pref_toolbar_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       GtkTooltips *tips = data;
+
+       g_object_unref(G_OBJECT(tips));
+}
+
+GtkWidget *pref_toolbar_new(GtkWidget *parent_box, GtkToolbarStyle style)
+{
+       GtkWidget *tbar;
+       GtkTooltips *tips;
+
+       tbar = gtk_toolbar_new();
+       gtk_toolbar_set_style(GTK_TOOLBAR(tbar), style);
+
+       if (parent_box)
+               {
+               gtk_box_pack_start(GTK_BOX(parent_box), tbar, FALSE, FALSE, 0);
+               gtk_widget_show(tbar);
+               }
+
+       tips = gtk_tooltips_new();
+       g_object_ref(G_OBJECT(tips));
+        gtk_object_sink(GTK_OBJECT(tips));
+       g_object_set_data(G_OBJECT(tbar), "tooltips", tips);
+       g_signal_connect(G_OBJECT(tbar), "destroy",
+                        G_CALLBACK(pref_toolbar_destroy_cb), tips);
+
+       gtk_tooltips_enable(tips);
+
+       return tbar;
+}
+
+GtkWidget *pref_toolbar_button(GtkWidget *toolbar, const gchar *stock_id, const gchar *label,
+                              const gchar *description,
+                              GCallback func, gpointer data)
+{
+       GtkWidget *item;
+
+       item = GTK_WIDGET(gtk_tool_button_new_from_stock(stock_id));
+       if (label) gtk_tool_button_set_label(GTK_TOOL_BUTTON(item), label);
+
+       if (func) g_signal_connect(item, "clicked", func, data);
+       gtk_container_add(GTK_CONTAINER(toolbar), item);
+       gtk_widget_show(item);
+
+       if (description)
+               {
+               GtkTooltips *tips;
+
+               tips = g_object_get_data(G_OBJECT(toolbar), "tooltips");
+               gtk_tool_item_set_tooltip(GTK_TOOL_ITEM(item), tips, description, NULL);
+               }
+
+       return item;
+}
+
+GtkWidget *pref_toolbar_spacer(GtkWidget *toolbar)
+{
+       GtkWidget *item;
+
+       item = GTK_WIDGET(gtk_separator_tool_item_new());
+       gtk_container_add(GTK_CONTAINER(toolbar), item);
+       gtk_widget_show(item);
+
+       return item;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * date selection entry
+ *-----------------------------------------------------------------------------
+ */
+
+#define DATE_SELECION_KEY "date_selection_data"
+
+
+typedef struct _DateSelection DateSelection;
+struct _DateSelection
+{
+       GtkWidget *box;
+
+       GtkWidget *spin_d;
+       GtkWidget *spin_m;
+       GtkWidget *spin_y;
+
+       GtkWidget *button;
+
+       GtkWidget *window;
+       GtkWidget *calendar;
+};
+
+
+static void date_selection_popup_hide(DateSelection *ds)
+{
+       if (!ds->window) return;
+
+       if (GTK_WIDGET_HAS_GRAB(ds->window))
+               {
+               gtk_grab_remove(ds->window);
+               gdk_keyboard_ungrab(GDK_CURRENT_TIME);
+               gdk_pointer_ungrab(GDK_CURRENT_TIME);
+               }
+
+       gtk_widget_hide(ds->window);
+
+       gtk_widget_destroy(ds->window);
+       ds->window = NULL;
+       ds->calendar = NULL;
+
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ds->button), FALSE);
+}
+
+static gint date_selection_popup_release_cb(GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+       DateSelection *ds = data;
+
+       date_selection_popup_hide(ds);
+       return TRUE;
+}
+
+static gint date_selection_popup_press_cb(GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+       DateSelection *ds = data;
+       gint x, y;
+       gint w, h;
+       gint xr, yr;
+
+       xr = (gint)event->x_root;
+       yr = (gint)event->y_root;
+
+       gdk_window_get_origin(ds->window->window, &x, &y);
+       gdk_drawable_get_size(ds->window->window, &w, &h);
+
+       if (xr < x || yr < y || xr > x + w || yr > y + h)
+               {
+               g_signal_connect(G_OBJECT(ds->window), "button_release_event",
+                                G_CALLBACK(date_selection_popup_release_cb), ds);
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+static void date_selection_popup_sync(DateSelection *ds)
+{
+       gint day, month, year;
+
+       gtk_calendar_get_date(GTK_CALENDAR(ds->calendar), &year, &month, &day);
+       date_selection_set(ds->box, day, month + 1, year);
+}
+
+static gint date_selection_popup_keypress_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       DateSelection *ds = data;
+
+       switch (event->keyval)
+               {
+               case GDK_Return:
+               case GDK_KP_Enter:
+               case GDK_Tab:
+               case GDK_ISO_Left_Tab:
+                       date_selection_popup_sync(ds);
+                       date_selection_popup_hide(ds);
+                       break;
+               case GDK_Escape:
+                       date_selection_popup_hide(ds);
+                       break;
+               default:
+                       break;
+               }
+
+       return FALSE;
+}
+
+static void date_selection_day_cb(GtkWidget *widget, gpointer data)
+{
+       DateSelection *ds = data;
+
+       date_selection_popup_sync(ds);
+}
+
+static void date_selection_doubleclick_cb(GtkWidget *widget, gpointer data)
+{
+       DateSelection *ds = data;
+
+       date_selection_popup_hide(ds);
+}
+
+static void date_selection_popup(DateSelection *ds)
+{
+       gint x, y;
+       gint wx, wy;
+       gint day, month, year;
+
+       if (ds->window) return;
+
+       ds->window = gtk_window_new(GTK_WINDOW_POPUP);
+       gtk_window_set_resizable(GTK_WINDOW(ds->window), FALSE);
+       g_signal_connect(G_OBJECT(ds->window), "button_press_event",
+                        G_CALLBACK(date_selection_popup_press_cb), ds);
+       g_signal_connect(G_OBJECT(ds->window), "key_press_event",
+                        G_CALLBACK(date_selection_popup_keypress_cb), ds);
+
+       ds->calendar = gtk_calendar_new();
+       gtk_container_add(GTK_CONTAINER(ds->window), ds->calendar);
+       gtk_widget_show(ds->calendar);
+
+       date_selection_get(ds->box, &day, &month, &year);
+       gtk_calendar_select_month(GTK_CALENDAR(ds->calendar), month - 1, year);
+       gtk_calendar_select_day(GTK_CALENDAR(ds->calendar), day);
+
+       g_signal_connect(G_OBJECT(ds->calendar), "day_selected",
+                        G_CALLBACK(date_selection_day_cb), ds);
+       g_signal_connect(G_OBJECT(ds->calendar), "day_selected_double_click",
+                       G_CALLBACK(date_selection_doubleclick_cb), ds);
+
+       gtk_widget_realize(ds->window);
+
+       gdk_window_get_origin(ds->button->window, &wx, &wy);
+
+       x = wx + ds->button->allocation.x + ds->button->allocation.width - ds->window->allocation.width;
+       y = wy + ds->button->allocation.y + ds->button->allocation.height;
+
+       if (y + ds->window->allocation.height > gdk_screen_height())
+               {
+               y = wy + ds->button->allocation.y - ds->window->allocation.height;
+               }
+       if (x < 0) x = 0;
+       if (y < 0) y = 0;
+
+       gtk_window_move(GTK_WINDOW(ds->window), x, y);
+       gtk_widget_show(ds->window);
+
+       gtk_widget_grab_focus(ds->calendar);
+       gdk_pointer_grab(ds->window->window, TRUE,
+                        GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK,
+                        NULL, NULL, GDK_CURRENT_TIME);
+       gdk_keyboard_grab(ds->window->window, TRUE, GDK_CURRENT_TIME);
+       gtk_grab_add(ds->window);
+
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ds->button), TRUE);
+}
+
+static void date_selection_button_cb(GtkWidget *widget, gpointer data)
+{
+       DateSelection *ds = data;
+
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ds->button)) == (!ds->window))
+               {
+               date_selection_popup(ds);
+               }
+}
+
+static void button_size_allocate_cb(GtkWidget *button, GtkAllocation *allocation, gpointer data)
+{
+       GtkWidget *spin = data;
+
+       if (allocation->height > spin->requisition.height)
+               {
+               GtkAllocation button_allocation;
+
+               button_allocation = button->allocation;
+               button_allocation.height = spin->requisition.height;
+               button_allocation.y = spin->allocation.y +
+                       (spin->allocation.height - spin->requisition.height) / 2;
+               gtk_widget_size_allocate(button, &button_allocation);
+               }
+}
+
+static void spin_increase(GtkWidget *spin, gint value)
+{
+       GtkRequisition req;
+
+       gtk_widget_size_request(spin, &req);
+       gtk_widget_set_size_request(spin, req.width + value, -1);
+}
+
+static void date_selection_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       DateSelection *ds = data;
+
+       date_selection_popup_hide(ds);
+
+       g_free(ds);
+}
+
+GtkWidget *date_selection_new(void)
+{
+       DateSelection *ds;
+       GtkWidget *arrow;
+
+       ds = g_new0(DateSelection, 1);
+
+       ds->box = gtk_hbox_new(FALSE, 2);
+       g_signal_connect(G_OBJECT(ds->box), "destroy",
+                        G_CALLBACK(date_selection_destroy_cb), ds);
+
+       /* FIXME: use option menu with text format of month instead of a spin button */
+       ds->spin_m = pref_spin_new(ds->box, NULL, NULL, 1, 12, 1, 0, 1, NULL, NULL);
+       ds->spin_d = pref_spin_new(ds->box, NULL, NULL, 1, 31, 1, 0, 1, NULL, NULL);
+       ds->spin_y = pref_spin_new(ds->box, NULL, NULL, 1900, 9999, 1, 0, 1900, NULL, NULL);
+       spin_increase(ds->spin_y, 5);
+
+       ds->button = gtk_toggle_button_new();
+       g_signal_connect(G_OBJECT(ds->button), "size_allocate",
+                        G_CALLBACK(button_size_allocate_cb), ds->spin_y);
+
+       arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE);
+       gtk_container_add(GTK_CONTAINER(ds->button), arrow);
+       gtk_widget_show(arrow);
+
+       gtk_box_pack_start(GTK_BOX(ds->box), ds->button, FALSE, FALSE, 0);
+       g_signal_connect(G_OBJECT(ds->button), "clicked",
+                        G_CALLBACK(date_selection_button_cb), ds);
+       gtk_widget_show(ds->button);
+
+       g_object_set_data(G_OBJECT(ds->box), DATE_SELECION_KEY, ds);
+
+       return ds->box;
+}
+                                                                                                                        
+void date_selection_set(GtkWidget *widget, gint day, gint month, gint year)
+{
+       DateSelection *ds;
+
+       ds = g_object_get_data(G_OBJECT(widget), DATE_SELECION_KEY);
+       if (!ds) return;
+
+       gtk_spin_button_set_value(GTK_SPIN_BUTTON(ds->spin_d), (gdouble)day);
+       gtk_spin_button_set_value(GTK_SPIN_BUTTON(ds->spin_m), (gdouble)month);
+       gtk_spin_button_set_value(GTK_SPIN_BUTTON(ds->spin_y), (gdouble)year);
+}
+
+
+void date_selection_get(GtkWidget *widget, gint *day, gint *month, gint *year)
+{
+       DateSelection *ds;
+
+       ds = g_object_get_data(G_OBJECT(widget), DATE_SELECION_KEY);
+       if (!ds) return;
+
+       if (day) *day = gtk_spin_button_get_value(GTK_SPIN_BUTTON(ds->spin_d));
+       if (month) *month = gtk_spin_button_get_value(GTK_SPIN_BUTTON(ds->spin_m));
+       if (year) *year = gtk_spin_button_get_value(GTK_SPIN_BUTTON(ds->spin_y));
+}
+                                                                                                                        
+void date_selection_time_set(GtkWidget *widget, time_t t)
+{
+       struct tm *lt;
+
+       lt = localtime(&t);
+       if (!lt) return;
+
+       date_selection_set(widget, lt->tm_mday, lt->tm_mon + 1, lt->tm_year + 1900);
+}
+
+time_t date_selection_time_get(GtkWidget *widget)
+{
+       struct tm lt;
+       gint day = 0;
+       gint month = 0;
+       gint year = 0;
+
+       date_selection_get(widget, &day, &month ,&year);
+
+       lt.tm_sec = 0;
+       lt.tm_min = 0;
+       lt.tm_hour = 0;
+       lt.tm_mday = day;
+       lt.tm_mon = month - 1;
+       lt.tm_year = year - 1900;
+       lt.tm_isdst = 0;
+
+       return mktime(&lt);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * Sizer, without using a GtkPaned
+ *-----------------------------------------------------------------------------
+ */
+
+#define SIZER_DATA_KEY "sizer_data"
+
+typedef struct _SizerData SizerData;
+struct _SizerData
+{
+       GtkWidget *sizer;
+       GtkWidget *parent;
+       GtkWidget *bounding_widget;
+       SizerPositionType position;
+
+       gint hsize_min;
+       gint hsize_max;
+       gint vsize_min;
+       gint vsize_max;
+
+       gint in_drag;
+       gint press_x;
+       gint press_y;
+       gint press_width;
+       gint press_height;
+
+       gint handle_prelit;
+};
+
+
+static gint sizer_default_handle_size(void)
+{
+       gint handle_size = 5;
+       GtkWidget *paned;
+       GtkStyle *style;
+
+       paned = gtk_hpaned_new();
+
+       style = gtk_rc_get_style(paned);
+       gtk_widget_set_style(paned, style);
+       gtk_widget_style_get(paned, "handle_size", &handle_size, NULL);
+
+       gtk_widget_destroy(paned);
+
+       return handle_size;
+}
+
+static gint sizer_motion_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       SizerData *sd = data;
+       gint x, y;
+       gint w, h;
+
+       if (!sd->in_drag) return FALSE;
+
+       x = sd->press_x - bevent->x_root;
+       y = sd->press_y - bevent->y_root;
+
+       w = sd->press_width;
+       h = sd->press_height;
+
+       if (sd->position & SIZER_POS_LEFT)
+               {
+               w += x;
+               }
+       else if (sd->position & SIZER_POS_RIGHT)
+               {
+               w -= x;
+               }
+
+       if (sd->position & SIZER_POS_TOP)
+               {
+               h += y;
+               }
+       else if (sd->position & SIZER_POS_BOTTOM)
+               {
+               h -= y;
+               }
+
+       if (sd->hsize_min >= 0) w = MAX(w, sd->hsize_min);
+       if (sd->vsize_min >= 0) h = MAX(h, sd->vsize_min);
+
+       if (sd->bounding_widget)
+               {
+               w = CLAMP(w, sd->sizer->allocation.width, sd->bounding_widget->allocation.width);
+               h = CLAMP(h, sd->sizer->allocation.height, sd->bounding_widget->allocation.height);
+               }
+       else
+               {
+               if (w < sd->sizer->allocation.width) w = sd->sizer->allocation.width;
+               if (h < sd->sizer->allocation.height) h = sd->sizer->allocation.height;
+               }
+
+       if (sd->hsize_max >= 0) w = MIN(w, sd->hsize_max);
+       if (sd->vsize_max >= 0) h = MIN(h, sd->vsize_max);
+
+       if (w == sd->parent->allocation.width) w = -1;
+       if (h == sd->parent->allocation.height) h = -1;
+
+       if (w > 0 || h > 0) gtk_widget_set_size_request(sd->parent, w, h);
+
+       return TRUE;
+}
+
+static gint sizer_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       SizerData *sd = data;
+
+       if (bevent->button != 1) return FALSE;
+
+       sd->in_drag = TRUE;
+       sd->press_x = bevent->x_root;
+       sd->press_y = bevent->y_root;
+
+       sd->press_width = sd->parent->allocation.width;
+       sd->press_height = sd->parent->allocation.height;
+
+       gdk_pointer_grab(sd->sizer->window, FALSE,
+                        GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
+                        NULL, NULL, bevent->time);
+       gtk_grab_add(sd->sizer);
+
+       return TRUE;
+}
+
+static gint sizer_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       SizerData *sd = data;
+
+       if (bevent->button != 1) return FALSE;
+
+       if (gdk_pointer_is_grabbed() && GTK_WIDGET_HAS_GRAB(sd->sizer))
+               {
+               gtk_grab_remove(sd->sizer);
+               gdk_pointer_ungrab(bevent->time);
+               }
+
+       sd->in_drag = FALSE;
+
+       return TRUE;
+}
+
+static void sizer_set_prelight(SizerData *sd, gint prelit)
+{
+       sd->handle_prelit = prelit;
+       gtk_widget_queue_draw_area(sd->sizer, 0, 0,
+                                  sd->sizer->allocation.width, sd->sizer->allocation.height);
+}
+
+static gint sizer_enter_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
+{
+       SizerData *sd = data;
+
+       sizer_set_prelight(sd, TRUE);
+       return TRUE;
+}
+
+static gint sizer_leave_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
+{
+       SizerData *sd = data;
+
+       sizer_set_prelight(sd, FALSE);
+       return TRUE;
+}
+
+static gint sizer_expose_cb(GtkWidget *widget, GdkEventExpose *event, gpointer data)
+{
+       SizerData *sd = data;
+       GdkRectangle clip;
+       GtkOrientation orientation;
+       GtkStateType state;
+
+       gdk_region_get_clipbox(event->region, &clip);
+
+       if (sd->position & SIZER_POS_LEFT || sd->position & SIZER_POS_RIGHT)
+               {
+               orientation = GTK_ORIENTATION_VERTICAL;
+               }
+       else
+               {
+               orientation = GTK_ORIENTATION_HORIZONTAL;
+               }
+
+       if (sd->handle_prelit)
+               {
+               state = GTK_STATE_PRELIGHT;
+               }
+       else
+               {
+               state = widget->state;
+               }
+
+       gtk_paint_handle(widget->style, widget->window, state,
+                        GTK_SHADOW_NONE, &clip, widget, "paned",
+                        0, 0,
+                        widget->allocation.width, widget->allocation.height,
+                        orientation);
+
+       return TRUE;
+}
+
+static void sizer_realize_cb(GtkWidget *widget, gpointer data)
+{
+       SizerData *sd = data;
+       GdkCursorType n;
+
+       n = 0;
+       if (sd->position & SIZER_POS_TOP || sd->position & SIZER_POS_BOTTOM)
+               {
+               n = GDK_SB_V_DOUBLE_ARROW;
+               }
+       if (sd->position & SIZER_POS_LEFT || sd->position & SIZER_POS_RIGHT)
+               {
+               n = (n != 0) ? GDK_FLEUR : GDK_SB_H_DOUBLE_ARROW;
+               }
+
+       if (n != 0 && widget->window)
+               {
+               GdkCursor *cursor;
+               cursor = gdk_cursor_new(n);
+               gdk_window_set_cursor(widget->window, cursor);
+               gdk_cursor_unref(cursor);
+               }
+}
+
+static void sizer_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       SizerData *sd = data;
+
+       g_free(sd);
+}
+
+GtkWidget *sizer_new(GtkWidget *parent, GtkWidget *bounding_widget,
+                    SizerPositionType position)
+{
+       SizerData *sd;
+       gint handle_size;
+
+       sd = g_new0(SizerData, 1);
+
+       sd->sizer = gtk_event_box_new();
+       sd->parent = parent;
+       sd->bounding_widget = bounding_widget;
+       sd->position = position;
+       sd->hsize_min = -1;
+       sd->hsize_max = -1;
+       sd->vsize_min = -1;
+       sd->vsize_max = -1;
+
+       sd->in_drag = FALSE;
+       sd->handle_prelit = FALSE;
+
+       g_signal_connect(G_OBJECT(sd->sizer), "destroy",
+                        G_CALLBACK(sizer_destroy_cb), sd);
+
+       g_signal_connect(G_OBJECT(sd->sizer), "motion_notify_event",
+                        G_CALLBACK(sizer_motion_cb), sd);
+       g_signal_connect(G_OBJECT(sd->sizer), "button_press_event",
+                        G_CALLBACK(sizer_press_cb), sd);
+       g_signal_connect(G_OBJECT(sd->sizer), "button_release_event",
+                        G_CALLBACK(sizer_release_cb), sd);
+
+       g_signal_connect(G_OBJECT(sd->sizer), "enter_notify_event",
+                        G_CALLBACK(sizer_enter_cb), sd);
+       g_signal_connect(G_OBJECT(sd->sizer), "leave_notify_event",
+                        G_CALLBACK(sizer_leave_cb), sd);
+
+       gtk_widget_set_events(sd->sizer, GDK_POINTER_MOTION_MASK |
+                                        GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK |
+                                        GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK);
+
+       g_signal_connect(sd->sizer, "realize",
+                        G_CALLBACK(sizer_realize_cb), sd);
+       g_signal_connect(sd->sizer, "expose_event",
+                        G_CALLBACK(sizer_expose_cb), sd);
+
+       handle_size = sizer_default_handle_size();
+
+       gtk_widget_set_size_request(sd->sizer, handle_size, handle_size);
+#if 0
+       /* use this if you add a shadow border to the handle */
+       gtk_widget_set_size_request(sd->sizer, handle_size + sd->sizer->style->xthickness * 2,
+                                              handle_size + sd->sizer->style->ythickness * 2);
+#endif
+
+       g_object_set_data(G_OBJECT(sd->sizer), SIZER_DATA_KEY,sd);
+
+       return sd->sizer;
+}
+
+void sizer_set_limits(GtkWidget *sizer,
+                     gint hsize_min, gint hsize_max,
+                     gint vsize_min, gint vsize_max)
+{
+       SizerData *sd;
+
+       sd = g_object_get_data(G_OBJECT(sizer), SIZER_DATA_KEY);
+       if (!sd) return;
+
+       sd->hsize_min = hsize_min;
+       sd->hsize_max = hsize_max;
+       sd->vsize_min = vsize_min;
+       sd->vsize_max = vsize_max;
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * storing data in a history list with key,data pairs
+ *-----------------------------------------------------------------------------
+ */
+
+#define PREF_LIST_MARKER_INT "[INT]:"
+#define PREF_LIST_MARKER_DOUBLE "[DOUBLE]:"
+#define PREF_LIST_MARKER_STRING "[STRING]:"
+
+static GList *pref_list_find(const gchar *group, const gchar *token)
+{
+       GList *work;
+       gint l;
+
+       l = strlen(token);
+
+       work = history_list_get_by_key(group);
+       while (work)
+               {
+               const gchar *text = work->data;
+
+               if (strncmp(text, token, l) == 0) return work;
+
+               work = work->next;
+               }
+
+       return NULL;
+}
+
+static gint pref_list_get(const gchar *group, const gchar *key, const gchar *marker, const gchar **result)
+{
+       gchar *token;
+       GList *work;
+       gint ret;
+
+       if (!group || !key || !marker)
+               {
+               *result = NULL;
+               return FALSE;
+               }
+
+       token = g_strconcat(key, marker, NULL);
+
+       work = pref_list_find(group, token);
+       if (work)
+               {
+               *result = (const gchar *)work->data + strlen(token);
+               if (strlen(*result) == 0) *result = NULL;
+               ret = TRUE;
+               }
+       else
+               {
+               *result = NULL;
+               ret = FALSE;
+               }
+
+       g_free(token);
+
+       return ret; 
+}
+
+static void pref_list_set(const gchar *group, const gchar *key, const gchar *marker, const gchar *text)
+{
+       gchar *token;
+       gchar *path;
+       GList *work;
+
+       if (!group || !key || !marker) return;
+
+       token = g_strconcat(key, marker, NULL);
+       path = g_strconcat(token, text, NULL);
+
+       work = pref_list_find(group, token);
+       if (work)
+               {
+               gchar *old_path = work->data;
+
+               if (text)
+                       {
+                       work->data = path;
+                       path = NULL;
+
+                       g_free(old_path);
+                       }
+               else
+                       {
+                       history_list_item_remove(group, old_path);
+                       }
+               }
+       else if (text)
+               {
+               history_list_add_to_key(group, path, 0);
+               }
+
+       g_free(path);
+       g_free(token);
+}
+
+void pref_list_int_set(const gchar *group, const gchar *key, gint value)
+{
+       gchar *text;
+
+       text = g_strdup_printf("%d", value);
+       pref_list_set(group, key, PREF_LIST_MARKER_INT, text);
+       g_free(text);
+}
+
+gint pref_list_int_get(const gchar *group, const gchar *key, gint *result)
+{
+       const gchar *text;
+
+       if (!group || !key)
+               {
+               *result = 0;
+               return FALSE;
+               }
+
+       if (pref_list_get(group, key, PREF_LIST_MARKER_INT, &text) && text)
+               {
+               *result = (gint)strtol(text, NULL, 10);
+               return TRUE;
+               }
+
+       *result = 0;
+       return FALSE;
+}
+
+void pref_list_double_set(const gchar *group, const gchar *key, gdouble value)
+{
+       gchar text[G_ASCII_DTOSTR_BUF_SIZE];
+
+       g_ascii_dtostr(text, sizeof(text), value);
+       pref_list_set(group, key, PREF_LIST_MARKER_DOUBLE, text);
+}
+
+gint pref_list_double_get(const gchar *group, const gchar *key, gdouble *result)
+{
+       const gchar *text;
+
+       if (!group || !key)
+               {
+               *result = 0;
+               return FALSE;
+               }
+
+       if (pref_list_get(group, key, PREF_LIST_MARKER_DOUBLE, &text) && text)
+               {
+               *result = g_ascii_strtod(text, NULL);
+               return TRUE;
+               }
+
+       *result = 0;
+       return FALSE;
+}
+
+void pref_list_string_set(const gchar *group, const gchar *key, const gchar *value)
+{
+       pref_list_set(group, key, PREF_LIST_MARKER_STRING, value);
+}
+
+gint pref_list_string_get(const gchar *group, const gchar *key, const gchar **result)
+{
+       return pref_list_get(group, key, PREF_LIST_MARKER_STRING, result);
+}
+
+
diff --git a/src/ui_misc.h b/src/ui_misc.h
new file mode 100644 (file)
index 0000000..6e53370
--- /dev/null
@@ -0,0 +1,181 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef UI_MISC_H
+#define UI_MISC_H
+
+
+#include <sys/time.h>
+#include <sys/types.h>
+#include <time.h>
+
+
+/* these values are per GNOME HIG */
+
+/* HIG 2.0 chapter 8 defines: */
+
+/* space between elements within control (ex: icon and it's text) */
+#define PREF_PAD_GAP     6
+/* space between label and control(s) */
+#define PREF_PAD_SPACE  12
+/* space between window border and controls */
+#define PREF_PAD_BORDER 12
+/* indent for group members */
+#define PREF_PAD_INDENT 12
+/* vertical space between groups */
+#define PREF_PAD_GROUP  18
+
+/* HIG 2.0 chapter 3.13 defines: */
+
+/* gap between buttons in a dialog */
+#define PREF_PAD_BUTTON_GAP 6
+/* space between buttons in a dialog and it's contents */
+#define PREF_PAD_BUTTON_SPACE 24
+
+/* and these are not in the GNOME HIG */
+
+/* gap between similar toolbar items (buttons) */
+#define PREF_PAD_TOOLBAR_GAP 0
+
+/* HIG 2.0 states 6 pixels between icons and text,
+ * but GTK's stock buttons ignore this (hard coded to 2), we do it too for consistency
+ */
+#define PREF_PAD_BUTTON_ICON_GAP 2
+
+
+GtkWidget *pref_box_new(GtkWidget *parent_box, gint fill,
+                       GtkOrientation orientation, gint padding);
+
+GtkWidget *pref_group_new(GtkWidget *parent_box, gint fill,
+                         const gchar *text, GtkOrientation orientation);
+GtkWidget *pref_group_parent(GtkWidget *child);
+
+GtkWidget *pref_frame_new(GtkWidget *parent_box, gint fill,
+                         const gchar *text,
+                         GtkOrientation orientation, gint padding);
+
+GtkWidget *pref_spacer(GtkWidget *parent_box, gint padding);
+GtkWidget *pref_line(GtkWidget *parent_box, gint padding);
+
+GtkWidget *pref_label_new(GtkWidget *parent_box, const gchar *text);
+GtkWidget *pref_label_new_mnemonic(GtkWidget *parent_box, const gchar *text, GtkWidget *widget);
+void pref_label_bold(GtkWidget *label, gint bold, gint increase_size);
+
+GtkWidget *pref_button_new(GtkWidget *parent_box, const gchar *stock_id,
+                          const gchar *text, gint hide_stock_text,
+                          GCallback func, gpointer data);
+
+GtkWidget *pref_checkbox_new(GtkWidget *parent_box, const gchar *text, gint active,
+                            GCallback func, gpointer data);
+GtkWidget *pref_checkbox_new_mnemonic(GtkWidget *parent_box, const gchar *text, gint active,
+                                     GCallback func, gpointer data);
+
+GtkWidget *pref_checkbox_new_int(GtkWidget *parent_box, const gchar *text, gint active,
+                                gint *result);
+
+void pref_checkbox_link_sensitivity(GtkWidget *button, GtkWidget *widget);
+void pref_checkbox_link_sensitivity_swap(GtkWidget *button, GtkWidget *widget);
+
+GtkWidget *pref_radiobutton_new(GtkWidget *parent_box, GtkWidget *sibling,
+                               const gchar *text, gint active,
+                               GCallback func, gpointer data);
+GtkWidget *pref_radiobutton_new_mnemonic(GtkWidget *parent_box, GtkWidget *sibling,
+                                        const gchar *text, gint active,
+                                        GCallback func, gpointer data);
+
+GtkWidget *pref_radiobutton_new_int(GtkWidget *parent_box, GtkWidget *sibling,
+                                   const gchar *text, gint active,
+                                   gint *result, gint value,
+                                   GCallback func, gpointer data);
+
+GtkWidget *pref_spin_new(GtkWidget *parent_box, const gchar *text, const gchar *suffix,
+                        gdouble min, gdouble max, gdouble step, gint digits,
+                        gdouble value,
+                        GCallback func, gpointer data);
+GtkWidget *pref_spin_new_mnemonic(GtkWidget *parent_box, const gchar *text, const gchar *suffix,
+                                 gdouble min, gdouble max, gdouble step, gint digits,
+                                 gdouble value,
+                                 GCallback func, gpointer data);
+
+GtkWidget *pref_spin_new_int(GtkWidget *parent_box, const gchar *text, const gchar *suffix,
+                            gint min, gint max, gint step,
+                            gint value, gint *value_var);
+
+void pref_link_sensitivity(GtkWidget *widget, GtkWidget *watch);
+
+void pref_signal_block_data(GtkWidget *widget, gpointer data);
+void pref_signal_unblock_data(GtkWidget *widget, gpointer data);
+
+
+GtkWidget *pref_table_new(GtkWidget *parent_box, gint columns, gint rows,
+                         gint homogenious, gint fill);
+
+GtkWidget *pref_table_box(GtkWidget *table, gint column, gint row,
+                         GtkOrientation orientation, const gchar *text);
+
+GtkWidget *pref_table_label(GtkWidget *table, gint column, gint row,
+                           const gchar *text, gfloat alignment);
+
+GtkWidget *pref_table_button(GtkWidget *table, gint column, gint row,
+                            const gchar *stock_id, const gchar *text, gint hide_stock_text,
+                            GCallback func, gpointer data);
+
+GtkWidget *pref_table_spin(GtkWidget *table, gint column, gint row,
+                          const gchar *text, const gchar *suffix,
+                          gdouble min, gdouble max, gdouble step, gint digits,
+                          gdouble value,
+                          GCallback func, gpointer data);
+
+
+GtkWidget *pref_toolbar_new(GtkWidget *parent_box, GtkToolbarStyle style);
+GtkWidget *pref_toolbar_button(GtkWidget *toolbar, const gchar *stock_id, const gchar *label,
+                              const gchar *description,
+                              GCallback func, gpointer data);
+GtkWidget *pref_toolbar_spacer(GtkWidget *toolbar);
+
+
+GtkWidget *date_selection_new(void);
+
+void date_selection_set(GtkWidget *widget, gint day, gint month, gint year);
+void date_selection_get(GtkWidget *widget, gint *day, gint *month, gint *year);
+
+void date_selection_time_set(GtkWidget *widget, time_t t);
+time_t date_selection_time_get(GtkWidget *widget);
+
+
+typedef enum {
+       SIZER_POS_LEFT   = 1 << 0,
+       SIZER_POS_RIGHT  = 1 << 1,
+       SIZER_POS_TOP    = 1 << 2,
+       SIZER_POS_BOTTOM = 1 << 3
+} SizerPositionType;
+
+GtkWidget *sizer_new(GtkWidget *parent, GtkWidget *bounding_widget,
+                    SizerPositionType position);
+
+void sizer_set_limits(GtkWidget *sizer,
+                      gint hsize_min, gint hsize_max,
+                      gint vsize_min, gint vsize_max);
+
+
+void pref_list_int_set(const gchar *group, const gchar *key, gint value);
+gint pref_list_int_get(const gchar *group, const gchar *key, gint *result);
+
+void pref_list_double_set(const gchar *group, const gchar *key, gdouble value);
+gint pref_list_double_get(const gchar *group, const gchar *key, gdouble *result);
+
+void pref_list_string_set(const gchar *group, const gchar *key, const gchar *value);
+gint pref_list_string_get(const gchar *group, const gchar *key, const gchar **result);
+
+
+#endif
+
diff --git a/src/ui_pathsel.c b/src/ui_pathsel.c
new file mode 100644 (file)
index 0000000..624cc3c
--- /dev/null
@@ -0,0 +1,1296 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+#include "intl.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <gtk/gtk.h>
+
+#include <gdk/gdkkeysyms.h> /* for key values */
+
+#include "ui_pathsel.h"
+
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_misc.h"
+#include "ui_utildlg.h"
+#include "ui_tabcomp.h"
+#include "ui_tree_edit.h"
+
+
+#define DEST_WIDTH 250
+#define DEST_HEIGHT 210
+
+#define RENAME_PRESS_DELAY 333 /* 1/3 second, to allow double clicks */
+
+#define PATH_SEL_USE_HEADINGS FALSE
+
+enum {
+       FILTER_COLUMN_NAME = 0,
+       FILTER_COLUMN_FILTER
+};
+
+typedef struct _Dest_Data Dest_Data;
+struct _Dest_Data
+{
+       GtkWidget *d_view;
+       GtkWidget *f_view;
+       GtkWidget *entry;
+       gchar *filter;
+       gchar *path;
+
+       GList *filter_list;
+       GList *filter_text_list;
+       GtkWidget *filter_combo;
+
+       gint show_hidden;
+       GtkWidget *hidden_button;
+
+       GtkWidget *bookmark_list;
+
+       GtkTreePath *right_click_path;
+
+       void (*select_func)(const gchar *path, gpointer data);
+       gpointer select_data;
+
+       GenericDialog *gd;      /* any open confirm dialogs ? */
+};
+
+typedef struct _DestDel_Data DestDel_Data;
+struct _DestDel_Data
+{
+       Dest_Data *dd;
+       gchar *path;
+};
+
+
+static void dest_view_delete_dlg_cancel(GenericDialog *gd, gpointer data);
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * (private)
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void dest_free_data(GtkWidget *widget, gpointer data)
+{
+       Dest_Data *dd = data;
+
+       if (dd->gd)
+               {
+               GenericDialog *gd = dd->gd;
+               dest_view_delete_dlg_cancel(dd->gd, dd->gd->data);
+               generic_dialog_close(gd);
+               }
+       if (dd->right_click_path) gtk_tree_path_free(dd->right_click_path);
+
+       g_free(dd->filter);
+       g_free(dd->path);
+       g_free(dd);
+}
+
+static gint dest_check_filter(const gchar *filter, const gchar *file)
+{
+       const gchar *f_ptr = filter;
+       const gchar *strt_ptr;
+       gint i;
+       gint l;
+
+       l = strlen(file);
+
+       if (filter[0] == '*') return TRUE;
+       while (f_ptr < filter + strlen(filter))
+               {
+               strt_ptr = f_ptr;
+               i=0;
+               while (*f_ptr != ';' && *f_ptr != '\0')
+                       {
+                       f_ptr++;
+                       i++;
+                       }
+               if (*f_ptr != '\0' && f_ptr[1] == ' ') f_ptr++; /* skip space immediately after separator */
+               f_ptr++;
+               if (l >= i && strncasecmp(file + l - i, strt_ptr, i) == 0) return TRUE;
+               }
+       return FALSE;
+}
+
+#ifndef CASE_SORT
+#define CASE_SORT strcmp
+#endif
+
+static gint dest_sort_cb(void *a, void *b)
+{
+       return CASE_SORT((gchar *)a, (gchar *)b);
+}
+
+static gint is_hidden(const gchar *name)
+{
+       if (name[0] != '.') return FALSE;
+       if (name[1] == '\0') return FALSE;
+       if (name[1] == '.' && name[2] == '\0') return FALSE;
+       return TRUE;
+}
+
+static void dest_populate(Dest_Data *dd, const gchar *path)
+{
+       DIR *dp;
+       struct dirent *dir;
+       struct stat ent_sbuf;
+       GList *path_list = NULL;
+       GList *file_list = NULL;
+       GList *list;
+       GtkListStore *store;
+       gchar *pathl;
+
+       if(!path) return;
+
+       pathl = path_from_utf8(path);
+       dp = opendir(pathl);
+       if (!dp)
+               {
+               /* dir not found */
+               g_free(pathl);
+               return;
+               }
+       while ((dir = readdir(dp)) != NULL)
+               {
+               /* skips removed files */
+               if (dir->d_ino > 0 && (dd->show_hidden || !is_hidden(dir->d_name)) )
+                       {
+                       gchar *name = dir->d_name;
+                       gchar *filepath = g_strconcat(pathl, "/", name, NULL);
+                       if (stat(filepath, &ent_sbuf) >= 0 && S_ISDIR(ent_sbuf.st_mode))
+                               {
+                               path_list = g_list_prepend(path_list, path_to_utf8(name));
+                               }
+                       else if (dd->f_view)
+                               {
+                               if (!dd->filter || (dd->filter && dest_check_filter(dd->filter, name)))
+                                       file_list = g_list_prepend(file_list, path_to_utf8(name));
+                               }
+                       g_free(filepath);
+                       }
+               }
+       closedir(dp);
+       g_free(pathl);
+
+       path_list = g_list_sort(path_list, (GCompareFunc) dest_sort_cb);
+       file_list = g_list_sort(file_list, (GCompareFunc) dest_sort_cb);
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dd->d_view)));
+       gtk_list_store_clear(store);
+
+       list = path_list;
+       while (list)
+               {
+               GtkTreeIter iter;
+               gchar *filepath;
+
+               if (strcmp(list->data, ".") == 0)
+                       {
+                       filepath = g_strdup(path);
+                       }
+               else if (strcmp(list->data, "..") == 0)
+                       {
+                       gchar *p;
+                       filepath = g_strdup(path);
+                       p = (gchar *)filename_from_path(filepath);
+                       if (p - 1 != filepath) p--;
+                       p[0] = '\0';
+                       }
+               else
+                       {
+                       filepath = concat_dir_and_file(path, list->data);
+                       }
+               
+               gtk_list_store_append(store, &iter);
+               gtk_list_store_set(store, &iter, 0, list->data, 1, filepath, -1);
+
+               g_free(filepath);
+               list = list->next;
+               }
+
+       path_list_free(path_list);
+
+
+       if (dd->f_view)
+               {
+               store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dd->f_view)));
+               gtk_list_store_clear(store);
+
+               list = file_list;
+               while (list)
+                       {
+                       GtkTreeIter iter;
+                       gchar *filepath;
+                       const gchar *name = list->data;
+
+                       filepath = concat_dir_and_file(path, name);
+               
+                       gtk_list_store_append(store, &iter);
+                       gtk_list_store_set(store, &iter, 0, name, 1, filepath, -1);
+
+                       g_free(filepath);
+                       list = list->next;
+                       }
+
+               path_list_free(file_list);
+               }
+
+       g_free(dd->path);
+       dd->path = g_strdup(path);
+}
+
+static void dest_change_dir(Dest_Data *dd, const gchar *path, gint retain_name)
+{
+       gchar *old_name = NULL;
+       gint s = 0;
+
+       if (retain_name)
+               {
+               const gchar *buf = gtk_entry_get_text(GTK_ENTRY(dd->entry));
+               if (!isdir(buf))
+                       {
+                       if (path && strcmp(path, "/") == 0)
+                               {
+                               old_name = g_strdup(filename_from_path(buf));
+                               }
+                       else
+                               {
+                               old_name = g_strconcat("/", filename_from_path(buf), NULL);
+                               s = 1;
+                               }
+                       }
+               }
+
+       gtk_entry_set_text(GTK_ENTRY(dd->entry), path);
+
+       dest_populate(dd, path);
+
+       /* remember filename */
+       if (old_name)
+               {
+               gint pos = -1;
+               gtk_editable_insert_text(GTK_EDITABLE(dd->entry), old_name, -1, &pos);
+               gtk_editable_select_region(GTK_EDITABLE(dd->entry), strlen(path) + s, strlen(path) + strlen(old_name));
+               g_free(old_name);
+               }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * drag and drop
+ *-----------------------------------------------------------------------------
+ */
+
+enum {
+       TARGET_URI_LIST,
+       TARGET_TEXT_PLAIN
+};
+
+static GtkTargetEntry dest_drag_types[] = {
+       { "text/uri-list", 0, TARGET_URI_LIST },
+       { "text/plain",    0, TARGET_TEXT_PLAIN }
+};
+#define dest_drag_types_n 2
+
+
+static void dest_dnd_set_data(GtkWidget *view,
+                             GdkDragContext *context, GtkSelectionData *selection_data,
+                             guint info, guint time, gpointer data)
+{
+       gchar *path = NULL;
+       gchar *uri_text = NULL;
+       GList *list = NULL;
+       gint length = 0;
+       GtkTreeModel *model;
+       GtkTreeSelection *selection;
+       GtkTreeIter iter;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
+       if (!gtk_tree_selection_get_selected(selection, &model, &iter)) return;
+
+       gtk_tree_model_get(model, &iter, 1, &path, -1);
+       if (!path) return;
+
+       list = g_list_append(list, path);
+
+       switch (info)
+               {
+               case TARGET_URI_LIST:
+                       uri_text = uri_text_from_list(list, &length, FALSE);
+                       break;
+               case TARGET_TEXT_PLAIN:
+                       uri_text = uri_text_from_list(list, &length, TRUE);
+                       break;
+               }
+
+       path_list_free(list);
+
+       if (!uri_text) return;
+
+       gtk_selection_data_set(selection_data, selection_data->target,
+                              8, uri_text, length);
+       g_free(uri_text);
+}
+
+static void dest_dnd_init(Dest_Data *dd)
+{
+       gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(dd->d_view), GDK_BUTTON1_MASK,
+                                              dest_drag_types, dest_drag_types_n,
+                                              GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_ASK);
+       g_signal_connect(G_OBJECT(dd->d_view), "drag_data_get",
+                        G_CALLBACK(dest_dnd_set_data), dd);
+
+       if (dd->f_view)
+               {
+               gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(dd->f_view), GDK_BUTTON1_MASK,
+                                                      dest_drag_types, dest_drag_types_n,
+                                                      GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK | GDK_ACTION_ASK);
+               g_signal_connect(G_OBJECT(dd->f_view), "drag_data_get",
+                                G_CALLBACK(dest_dnd_set_data), dd);
+               }
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * destination widget file management utils
+ *-----------------------------------------------------------------------------
+ */
+
+static void dest_view_store_selection(Dest_Data *dd, GtkTreeView *view)
+{
+       GtkTreeModel *model;
+       GtkTreeSelection *selection;
+       GtkTreeIter iter;
+
+       if (dd->right_click_path) gtk_tree_path_free(dd->right_click_path);
+       dd->right_click_path = NULL;
+
+       selection = gtk_tree_view_get_selection(view);
+       if (!gtk_tree_selection_get_selected(selection, &model, &iter))
+               {
+               return;
+               }
+
+       dd->right_click_path = gtk_tree_model_get_path(model, &iter);
+}
+
+static gint dest_view_rename_cb(TreeEditData *ted, const gchar *old, const gchar *new, gpointer data)
+{
+       Dest_Data *dd = data;
+       GtkTreeModel *model;
+       GtkTreeIter iter;
+       gchar *buf;
+       gchar *old_path;
+       gchar *new_path;
+
+       model = gtk_tree_view_get_model(GTK_TREE_VIEW(ted->tree));
+       gtk_tree_model_get_iter(model, &iter, dd->right_click_path);
+
+       gtk_tree_model_get(model, &iter, 1, &old_path, -1);
+       if (!old_path) return FALSE;
+
+       buf = remove_level_from_path(old_path);
+       new_path = concat_dir_and_file(buf, new);
+       g_free(buf);
+
+       if (isname(new_path))
+               {
+               buf = g_strdup_printf(_("A file with name %s already exists."), new);
+               warning_dialog("Rename failed", buf, GTK_STOCK_DIALOG_INFO, dd->entry);
+               g_free(buf);
+               }
+       else if (!rename_file(old_path, new_path))
+               {
+               buf = g_strdup_printf(_("Failed to rename %s to %s."), old, new);
+               warning_dialog("Rename failed", buf, GTK_STOCK_DIALOG_ERROR, dd->entry);
+               g_free(buf);
+               }
+       else
+               {
+               const gchar *text;
+
+               gtk_list_store_set(GTK_LIST_STORE(model), &iter, 0, new, 1, new_path, -1);
+
+               text = gtk_entry_get_text(GTK_ENTRY(dd->entry));
+               if (text && old_path && strcmp(text, old_path) == 0)
+                       {
+                       gtk_entry_set_text(GTK_ENTRY(dd->entry), new_path);
+                       }
+               }
+
+       g_free(old_path);
+       g_free(new_path);
+
+       return TRUE;
+}
+
+static void dest_view_rename(Dest_Data *dd, GtkTreeView *view)
+{
+       GtkTreeModel *model;
+       GtkTreeIter iter;
+       gchar *text;
+
+       if (!dd->right_click_path) return;
+
+       model = gtk_tree_view_get_model(view);
+       gtk_tree_model_get_iter(model, &iter, dd->right_click_path);
+       gtk_tree_model_get(model, &iter, 0, &text, -1);
+
+       tree_edit_by_path(view, dd->right_click_path, 0, text,
+                         dest_view_rename_cb, dd);
+
+       g_free(text);
+}
+
+static void dest_view_delete_dlg_cancel(GenericDialog *gd, gpointer data)
+{
+       DestDel_Data *dl = data;
+
+       dl->dd->gd = NULL;
+       g_free(dl->path);
+       g_free(dl);
+}
+
+static void dest_view_delete_dlg_ok_cb(GenericDialog *gd, gpointer data)
+{
+       DestDel_Data *dl = data;
+
+       if (!unlink_file(dl->path))
+               {
+               gchar *text = g_strdup_printf(_("Unable to delete file:\n%s"), dl->path);
+               warning_dialog(_("File deletion failed"), text, GTK_STOCK_DIALOG_WARNING, dl->dd->entry);
+               g_free(text);
+               }
+       else if (dl->dd->path)
+               {
+               /* refresh list */
+               gchar *path = g_strdup(dl->dd->path);
+               dest_populate(dl->dd, path);
+               g_free(path);
+               }
+
+       dest_view_delete_dlg_cancel(gd, data);
+}
+
+static void dest_view_delete(Dest_Data *dd, GtkTreeView *view)
+{
+       gchar *path;
+       gchar *text;
+       DestDel_Data *dl;
+       GtkTreeModel *model;
+       GtkTreeIter iter;
+
+       if (view != GTK_TREE_VIEW(dd->f_view)) return;
+       if (!dd->right_click_path) return;
+
+       model = gtk_tree_view_get_model(view);
+       gtk_tree_model_get_iter(model, &iter, dd->right_click_path);
+       gtk_tree_model_get(model, &iter, 1, &path, -1);
+       
+       if (!path) return;
+
+       dl = g_new(DestDel_Data, 1);
+       dl->dd = dd;
+       dl->path = path;
+
+       if (dd->gd)
+               {
+               GenericDialog *gd = dd->gd;
+               dest_view_delete_dlg_cancel(dd->gd, dd->gd->data);
+               generic_dialog_close(gd);
+               }
+
+       dd->gd = generic_dialog_new(_("Delete file"), PACKAGE, "dlg_confirm",
+                                   dd->entry, TRUE,
+                                   dest_view_delete_dlg_cancel, dl);
+
+       generic_dialog_add_button(dd->gd, GTK_STOCK_DELETE, NULL, dest_view_delete_dlg_ok_cb, TRUE);
+
+       text = g_strdup_printf(_("About to delete the file:\n %s"), path);
+       generic_dialog_add_message(dd->gd, GTK_STOCK_DIALOG_QUESTION,
+                                  _("Delete file"), text);
+       g_free(text);
+
+       gtk_widget_show(dd->gd->dialog);
+}
+
+static void dest_view_bookmark(Dest_Data *dd, GtkTreeView *view)
+{
+       GtkTreeModel *model;
+       GtkTreeIter iter;
+       gchar *path;
+
+       if (!dd->right_click_path) return;
+
+       model = gtk_tree_view_get_model(view);
+       gtk_tree_model_get_iter(model, &iter, dd->right_click_path);
+       gtk_tree_model_get(model, &iter, 1, &path, -1);
+
+       bookmark_list_add(dd->bookmark_list, filename_from_path(path), path);
+       g_free(path);
+}
+
+static void dest_popup_dir_rename_cb(GtkWidget *widget, gpointer data)
+{
+       Dest_Data *dd = data;
+       dest_view_rename(dd, GTK_TREE_VIEW(dd->d_view));
+}
+
+static void dest_popup_dir_bookmark_cb(GtkWidget *widget, gpointer data)
+{
+       Dest_Data *dd = data;
+       dest_view_bookmark(dd, GTK_TREE_VIEW(dd->d_view));
+}
+
+static void dest_popup_file_rename_cb(GtkWidget *widget, gpointer data)
+{
+       Dest_Data *dd = data;
+       dest_view_rename(dd, GTK_TREE_VIEW(dd->f_view));
+}
+
+static void dest_popup_file_delete_cb(GtkWidget *widget, gpointer data)
+{
+       Dest_Data *dd = data;
+       dest_view_delete(dd, GTK_TREE_VIEW(dd->f_view));
+}
+
+static void dest_popup_file_bookmark_cb(GtkWidget *widget, gpointer data)
+{
+       Dest_Data *dd = data;
+       dest_view_bookmark(dd, GTK_TREE_VIEW(dd->f_view));
+}
+
+static void dest_popup_position_cb(GtkMenu *menu, gint *x, gint *y,
+                                  gboolean *push_in, gpointer data)
+{
+       Dest_Data *dd = data;
+       GtkTreeView *view;
+       gint cw, ch;
+
+       view = g_object_get_data(G_OBJECT(menu), "active_view");
+
+       tree_view_get_cell_clamped(view, dd->right_click_path, 0, TRUE, x, y, &cw, &ch);
+       *y += ch;
+       popup_menu_position_clamp(menu, x, y, 0);
+}
+
+static gint dest_popup_menu(Dest_Data *dd, GtkTreeView *view,
+                           gint button, guint32 time, gint local)
+{
+       GtkWidget *menu;
+
+       if (!dd->right_click_path) return FALSE;
+
+       if (view == GTK_TREE_VIEW(dd->d_view))
+               {
+               GtkTreeModel *model;
+               GtkTreeIter iter;
+               gchar *text;
+               gint normal_dir;
+
+               model = gtk_tree_view_get_model(view);
+               gtk_tree_model_get_iter(model, &iter, dd->right_click_path);
+               gtk_tree_model_get(model, &iter, 0, &text, -1);
+
+               if (!text) return FALSE;
+              
+               normal_dir = (strcmp(text, ".") == 0 || strcmp(text, "..") == 0);
+
+               menu = popup_menu_short_lived();
+               menu_item_add_sensitive(menu, _("_Rename"), !normal_dir,
+                             G_CALLBACK(dest_popup_dir_rename_cb), dd);
+               menu_item_add_stock(menu, _("Add _Bookmark"), GTK_STOCK_JUMP_TO,
+                             G_CALLBACK(dest_popup_dir_bookmark_cb), dd);
+               }
+       else
+               {
+               menu = popup_menu_short_lived();
+               menu_item_add(menu, _("_Rename"),
+                               G_CALLBACK(dest_popup_file_rename_cb), dd);
+               menu_item_add_stock(menu, _("_Delete"), GTK_STOCK_DELETE,
+                               G_CALLBACK(dest_popup_file_delete_cb), dd);
+               menu_item_add_stock(menu, _("Add _Bookmark"), GTK_STOCK_JUMP_TO,
+                               G_CALLBACK(dest_popup_file_bookmark_cb), dd);
+               }
+
+       if (local)
+               {
+               g_object_set_data(G_OBJECT(menu), "active_view", view);
+               gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
+                              dest_popup_position_cb, dd, button, time);
+               }
+       else
+               {
+               gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, button, time);
+               }
+
+       return TRUE;
+}
+
+static gint dest_press_cb(GtkWidget *view, GdkEventButton *event, gpointer data)
+{
+       Dest_Data *dd = data;
+       GtkTreePath *tpath;
+       GtkTreeViewColumn *column;
+       gint cell_x, cell_y;
+       GtkTreeModel *model;
+       GtkTreeIter iter;
+       GtkTreeSelection *selection;
+
+       if (event->button != 3 ||
+           !gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(view), event->x, event->y,
+                                          &tpath, &column, &cell_x, &cell_y))
+               {
+               return FALSE;
+               }
+
+       model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
+       gtk_tree_model_get_iter(model, &iter, tpath);
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
+       gtk_tree_selection_select_iter(selection, &iter);
+
+       if (dd->right_click_path) gtk_tree_path_free(dd->right_click_path);
+       dd->right_click_path = tpath;
+
+       return dest_popup_menu(dd, GTK_TREE_VIEW(view), 0, event->time, FALSE);
+}
+
+static gboolean dest_keypress_cb(GtkWidget *view, GdkEventKey *event, gpointer data)
+{
+       Dest_Data *dd = data;
+
+       switch (event->keyval)
+               {
+               case GDK_F10:
+                       if (!(event->state & GDK_CONTROL_MASK)) return FALSE;
+               case GDK_Menu:
+                       dest_view_store_selection(dd, GTK_TREE_VIEW(view));
+                       dest_popup_menu(dd, GTK_TREE_VIEW(view), 0, event->time, TRUE);
+                       return TRUE;
+                       break;
+               case 'R': case 'r':
+                       if (event->state & GDK_CONTROL_MASK)
+                               {
+                               dest_view_store_selection(dd, GTK_TREE_VIEW(view));
+                               dest_view_rename(dd, GTK_TREE_VIEW(view));
+                               return TRUE;
+                               }
+                       break;
+               case GDK_Delete:
+                       dest_view_store_selection(dd, GTK_TREE_VIEW(view));
+                       dest_view_delete(dd, GTK_TREE_VIEW(view));
+                       return TRUE;
+                       break;
+               case 'B' : case 'b':
+                       if (event->state & GDK_CONTROL_MASK)
+                               {
+                               dest_view_store_selection(dd, GTK_TREE_VIEW(view));
+                               dest_view_bookmark(dd, GTK_TREE_VIEW(view));
+                               return TRUE;
+                               }
+                       break;
+               }
+
+       return FALSE;
+}
+       
+static void dest_new_dir_cb(GtkWidget *widget, gpointer data)
+{
+       Dest_Data *dd = data;
+       gchar *path;
+       gchar *buf;
+       const gchar *tmp;
+       gint from_text = FALSE;
+
+       tmp = gtk_entry_get_text(GTK_ENTRY(dd->entry));
+       if (!isname(tmp))
+               {
+               path = g_strdup(tmp);
+               from_text = TRUE;
+               }
+       else
+               {
+               buf = concat_dir_and_file(dd->path, _("New folder"));
+               path = unique_filename(buf, NULL, " ", FALSE);
+               g_free(buf);
+               }
+
+       if (!mkdir_utf8(path, 0755))
+               {
+               /* failed */
+               gchar *text;
+
+               text = g_strdup_printf(_("Unable to create folder:\n%s"), filename_from_path(path));
+               warning_dialog(_("Error creating folder"), text, GTK_STOCK_DIALOG_ERROR, dd->entry);
+               g_free(text);
+               }
+       else
+               {
+               GtkTreeIter iter;
+               GtkListStore *store;
+               const gchar *text;
+
+               if (from_text) gtk_entry_set_text(GTK_ENTRY(dd->entry), dd->path);
+
+               store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(dd->d_view)));
+
+               text = filename_from_path(path);
+
+               gtk_list_store_append(store, &iter);
+               gtk_list_store_set(store, &iter, 0, text, 1, path, -1);
+
+               if (dd->right_click_path) gtk_tree_path_free(dd->right_click_path);
+               dd->right_click_path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
+
+               tree_edit_by_path(GTK_TREE_VIEW(dd->d_view), dd->right_click_path, 0, text,
+                                 dest_view_rename_cb, dd);
+               }
+
+       g_free(path);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * destination widget file selection, traversal, view options
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void dest_select_cb(GtkTreeSelection *selection, gpointer data)
+{
+       Dest_Data *dd = data;
+       GtkTreeView *view;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gchar *path;
+
+       if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) return;
+
+       view = gtk_tree_selection_get_tree_view(selection);
+       store = gtk_tree_view_get_model(view);
+       gtk_tree_model_get(store, &iter, 1, &path, -1);
+
+       if (view == GTK_TREE_VIEW(dd->d_view))
+               {
+               dest_change_dir(dd, path, (dd->f_view != NULL));
+               }
+       else
+               {
+               gtk_entry_set_text(GTK_ENTRY(dd->entry), path);
+               }
+
+       g_free(path);
+}
+
+static void dest_activate_cb(GtkWidget *view, GtkTreePath *tpath, GtkTreeViewColumn *column, gpointer data)
+{
+       Dest_Data *dd = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gchar *path;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
+       gtk_tree_model_get_iter(store, &iter, tpath);
+       gtk_tree_model_get(store, &iter, 1, &path, -1);
+
+       if (view == dd->d_view)
+               {
+               dest_change_dir(dd, path, (dd->f_view != NULL));
+               }
+       else
+               {
+               if (dd->select_func)
+                       {
+                       dd->select_func(path, dd->select_data);
+                       }
+               }
+
+       g_free(path);
+}
+
+static void dest_home_cb(GtkWidget *widget, gpointer data)
+{
+       Dest_Data *dd = data;
+
+       dest_change_dir(dd, homedir(), (dd->f_view != NULL));
+}
+
+static void dest_show_hidden_cb(GtkWidget *widget, gpointer data)
+{
+       Dest_Data *dd = data;
+       gchar *buf;
+
+       dd->show_hidden = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dd->hidden_button));
+
+       buf = g_strdup(dd->path);
+       dest_populate(dd, buf);
+       g_free(buf);
+}
+
+static void dest_entry_changed_cb(GtkEditable *editable, gpointer data)
+{
+       Dest_Data *dd = data;
+       const gchar *path;
+       gchar *buf;
+
+       path = gtk_entry_get_text(GTK_ENTRY(dd->entry));
+       if (strcmp(path, dd->path) == 0) return;
+
+       buf = remove_level_from_path(path);
+
+       if (buf && strcmp(buf, dd->path) != 0)
+               {
+               gchar *tmp = remove_trailing_slash(path);
+               if (isdir(tmp))
+                       {
+                       dest_populate(dd, tmp);
+                       }
+               else if (isdir(buf))
+                       {
+                       dest_populate(dd, buf);
+                       }
+               g_free(tmp);
+               }
+       g_free(buf);
+}
+
+static void dest_filter_list_sync(Dest_Data *dd)
+{
+       GtkWidget *entry;
+       GtkListStore *store;
+       gchar *old_text;
+       GList *fwork;
+       GList *twork;
+
+       if (!dd->filter_list || !dd->filter_combo) return;
+
+       entry = GTK_BIN(dd->filter_combo)->child;
+       old_text = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry)));
+
+       store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(dd->filter_combo)));
+       gtk_list_store_clear(store);
+
+       fwork = dd->filter_list;
+       twork = dd->filter_text_list;
+       while (fwork && twork)
+               {
+               GtkTreeIter iter;
+               gchar *name;
+               gchar *filter;
+
+               name = twork->data;
+               filter = fwork->data;
+
+               gtk_list_store_append(store, &iter);
+               gtk_list_store_set(store, &iter, FILTER_COLUMN_NAME, name,
+                                                FILTER_COLUMN_FILTER, filter, -1);
+
+               if (strcmp(old_text, filter) == 0)
+                       {
+                       gtk_combo_box_set_active_iter(GTK_COMBO_BOX(dd->filter_combo), &iter);
+                       }
+
+               fwork = fwork->next;
+               twork = twork->next;
+               }
+
+       g_free(old_text);
+}
+
+static void dest_filter_add(Dest_Data *dd, const gchar *filter, const gchar *description, gint set)
+{
+       GList *work;
+       gchar *buf;
+       gint c = 0;
+
+       if (!filter) return;
+
+       work = dd->filter_list;
+       while (work)
+               {
+               gchar *f = work->data;
+
+               if (strcmp(f, filter) == 0)
+                       {
+                       if (set) gtk_combo_box_set_active(GTK_COMBO_BOX(dd->filter_combo), c);
+                       return;
+                       }
+               work = work->next;
+               c++;
+               }
+
+       dd->filter_list = uig_list_insert_link(dd->filter_list, g_list_last(dd->filter_list), g_strdup(filter));
+
+       if (description)
+               {
+               buf = g_strdup_printf("%s  ( %s )", description, filter);
+               }
+       else
+               {
+               buf = g_strdup_printf("( %s )", filter);
+               }
+       dd->filter_text_list = uig_list_insert_link(dd->filter_text_list, g_list_last(dd->filter_text_list), buf);
+
+       if (set) gtk_entry_set_text(GTK_ENTRY(GTK_BIN(dd->filter_combo)->child), filter);
+       dest_filter_list_sync(dd);
+}
+
+static void dest_filter_clear(Dest_Data *dd)
+{
+       path_list_free(dd->filter_list);
+       dd->filter_list = NULL;
+
+       path_list_free(dd->filter_text_list);
+       dd->filter_text_list = NULL;
+
+       dest_filter_add(dd, "*", _("All Files"), TRUE);
+}
+
+static void dest_filter_changed_cb(GtkEditable *editable, gpointer data)
+{
+       Dest_Data *dd = data;
+       GtkWidget *entry;
+       const gchar *buf;
+       gchar *path;
+
+       entry = GTK_BIN(dd->filter_combo)->child;
+       buf = gtk_entry_get_text(GTK_ENTRY(entry));
+
+       g_free(dd->filter);
+       dd->filter = NULL;
+       if (strlen(buf) > 0) dd->filter = g_strdup(buf);
+
+       path = g_strdup(dd->path);
+       dest_populate(dd, path);
+       g_free(path);
+}
+
+static void dest_bookmark_select_cb(const gchar *path, gpointer data)
+{
+       Dest_Data *dd = data;
+
+       if (isdir(path))
+               {
+               dest_change_dir(dd, path, (dd->f_view != NULL));
+               }
+       else if (isfile(path) && dd->f_view)
+               {
+               gtk_entry_set_text(GTK_ENTRY(dd->entry), path);
+               }       
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * destination widget setup routines (public)
+ *-----------------------------------------------------------------------------
+ */ 
+
+GtkWidget *path_selection_new_with_files(GtkWidget *entry, const gchar *path,
+                                        const gchar *filter, const gchar *filter_desc)
+{
+       GtkWidget *hbox2;
+       Dest_Data *dd;
+       GtkWidget *scrolled;
+       GtkWidget *table;
+       GtkWidget *paned;
+       GtkListStore *store;
+       GtkTreeSelection *selection;
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+
+       dd = g_new0(Dest_Data, 1);
+       dd->show_hidden = FALSE;
+       dd->select_func = NULL;
+       dd->select_data = NULL;
+       dd->gd = NULL;
+
+       table = gtk_table_new(4, (filter != NULL) ? 3 : 1, FALSE);
+       gtk_table_set_col_spacings(GTK_TABLE(table), PREF_PAD_GAP);
+       gtk_table_set_row_spacing(GTK_TABLE(table), 0, PREF_PAD_GAP);
+       gtk_widget_show(table);
+
+       dd->entry = entry;
+       g_object_set_data(G_OBJECT(dd->entry), "destination_data", dd);
+
+       hbox2 = pref_table_box(table, 0, 0, GTK_ORIENTATION_HORIZONTAL, NULL);
+       gtk_box_set_spacing(GTK_BOX(hbox2), PREF_PAD_BUTTON_GAP);
+       pref_button_new(hbox2, NULL, _("Home"), FALSE,
+                       G_CALLBACK(dest_home_cb), dd);
+       pref_button_new(hbox2, NULL, _("New folder"), FALSE,
+                       G_CALLBACK(dest_new_dir_cb), dd);
+
+       dd->hidden_button = gtk_check_button_new_with_label(_("Show hidden"));
+       g_signal_connect(G_OBJECT(dd->hidden_button), "clicked",
+                        G_CALLBACK(dest_show_hidden_cb), dd);
+       gtk_box_pack_end(GTK_BOX(hbox2), dd->hidden_button, FALSE, FALSE, 0);
+       gtk_widget_show(dd->hidden_button);
+
+       hbox2 = gtk_hbox_new(FALSE, PREF_PAD_GAP);
+       if (filter)
+               {
+               paned = gtk_hpaned_new();
+               gtk_table_attach(GTK_TABLE(table), paned, 0, 3, 1, 2,
+                                GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+               gtk_widget_show(paned);
+               gtk_paned_add1(GTK_PANED(paned), hbox2);
+               }
+       else
+               {
+               paned = NULL;
+               gtk_table_attach(GTK_TABLE(table), hbox2, 0, 1, 1, 2,
+                                GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+               }
+       gtk_widget_show(hbox2);
+
+       /* bookmarks */
+       scrolled = bookmark_list_new(NULL, dest_bookmark_select_cb, dd);
+       gtk_box_pack_start(GTK_BOX(hbox2), scrolled, FALSE, FALSE, 0);
+       gtk_widget_show(scrolled);
+
+       dd->bookmark_list = scrolled;
+
+       scrolled = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
+                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+       gtk_box_pack_start(GTK_BOX(hbox2), scrolled, TRUE, TRUE, 0);
+       gtk_widget_show(scrolled);
+
+       store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+       dd->d_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(dd->d_view), PATH_SEL_USE_HEADINGS);
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dd->d_view));
+       gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_SINGLE);
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_title(column, _("Folders"));
+       gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+
+       renderer = gtk_cell_renderer_text_new();
+       gtk_tree_view_column_pack_start(column, renderer, TRUE);
+       gtk_tree_view_column_add_attribute(column, renderer, "text", 0);
+
+       gtk_tree_view_append_column(GTK_TREE_VIEW(dd->d_view), column);
+
+#if 0
+       /* only for debugging */
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_title(column, _("Path"));
+       renderer = gtk_cell_renderer_text_new();
+       gtk_tree_view_column_pack_start(column, renderer, TRUE);
+       gtk_tree_view_column_add_attribute(column, renderer, "text", 1);
+       gtk_tree_view_append_column(GTK_TREE_VIEW(dd->d_view), column);
+#endif
+
+       gtk_widget_set_size_request(dd->d_view, DEST_WIDTH, DEST_HEIGHT);
+       gtk_container_add(GTK_CONTAINER(scrolled), dd->d_view);
+       gtk_widget_show(dd->d_view);
+
+       g_signal_connect(G_OBJECT(dd->d_view), "button_press_event",
+                        G_CALLBACK(dest_press_cb), dd);
+       g_signal_connect(G_OBJECT(dd->d_view), "key_press_event",
+                        G_CALLBACK(dest_keypress_cb), dd);
+       g_signal_connect(G_OBJECT(dd->d_view), "row_activated",
+                        G_CALLBACK(dest_activate_cb), dd);
+       g_signal_connect(G_OBJECT(dd->d_view), "destroy",
+                        G_CALLBACK(dest_free_data), dd);
+       
+       if (filter)
+               {
+               GtkListStore *store;
+
+               hbox2 = pref_table_box(table, 2, 0, GTK_ORIENTATION_HORIZONTAL, NULL);
+               pref_label_new(hbox2, _("Filter:"));
+
+               store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+
+               dd->filter_combo = gtk_combo_box_entry_new_with_model(GTK_TREE_MODEL(store),
+                                                                     FILTER_COLUMN_FILTER);
+               g_object_unref(store);
+               gtk_cell_layout_clear(GTK_CELL_LAYOUT(dd->filter_combo));
+               renderer = gtk_cell_renderer_text_new();
+               gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(dd->filter_combo), renderer, TRUE);
+               gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(dd->filter_combo), renderer,
+                                              "text", FILTER_COLUMN_NAME, NULL);
+#if 0
+               gtk_combo_set_case_sensitive(GTK_COMBO(dd->filter_combo), TRUE);
+#endif
+               gtk_box_pack_start(GTK_BOX(hbox2), dd->filter_combo, TRUE, TRUE, 0);
+               gtk_widget_show(dd->filter_combo);
+
+               scrolled = gtk_scrolled_window_new(NULL, NULL);
+               gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+               gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
+                                       GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+               if (paned)
+                       {
+                       gtk_paned_add2(GTK_PANED(paned), scrolled);
+                       }
+               else
+                       {
+                       gtk_table_attach(GTK_TABLE(table), scrolled, 2, 3, 1, 2,
+                                GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
+                       }
+               gtk_widget_show(scrolled);
+
+               store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
+               dd->f_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+               g_object_unref(store);
+
+               gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(dd->f_view), PATH_SEL_USE_HEADINGS);
+
+               selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dd->f_view));
+               gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_SINGLE);
+
+               column = gtk_tree_view_column_new();
+               gtk_tree_view_column_set_title(column, _("Files"));
+               gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+
+               renderer = gtk_cell_renderer_text_new();
+               gtk_tree_view_column_pack_start(column, renderer, TRUE);
+               gtk_tree_view_column_add_attribute(column, renderer, "text", 0);
+
+               gtk_tree_view_append_column(GTK_TREE_VIEW(dd->f_view), column);
+
+               gtk_widget_set_size_request(dd->f_view, DEST_WIDTH, DEST_HEIGHT);
+               gtk_container_add(GTK_CONTAINER(scrolled), dd->f_view);
+               gtk_widget_show(dd->f_view);
+
+               g_signal_connect(G_OBJECT(dd->f_view), "button_press_event",
+                                G_CALLBACK(dest_press_cb), dd);
+               g_signal_connect(G_OBJECT(dd->f_view), "key_press_event",
+                                G_CALLBACK(dest_keypress_cb), dd);
+               g_signal_connect(G_OBJECT(dd->f_view), "row_activated",
+                                G_CALLBACK(dest_activate_cb), dd);
+               g_signal_connect(selection, "changed",
+                                G_CALLBACK(dest_select_cb), dd);
+
+               dest_filter_clear(dd);
+               dest_filter_add(dd, filter, filter_desc, TRUE);
+
+               dd->filter = g_strdup(gtk_entry_get_text(GTK_ENTRY(GTK_BIN(dd->filter_combo)->child)));
+               }
+
+       if (path && path[0] == '/' && isdir(path))
+               {
+               dest_populate(dd, path);
+               }
+       else
+               {
+               gchar *buf = remove_level_from_path(path);
+               if (buf && buf[0] == '/' && isdir(buf))
+                       {
+                       dest_populate(dd, buf);
+                       }
+               else
+                       {
+                       gint pos = -1;
+
+                       dest_populate(dd, (gchar *)homedir());
+                       if (path) gtk_editable_insert_text(GTK_EDITABLE(dd->entry), "/", -1, &pos);
+                       if (path) gtk_editable_insert_text(GTK_EDITABLE(dd->entry), path, -1, &pos);
+                       }
+               g_free(buf);
+               }
+
+       if (dd->filter_combo)
+               {
+               g_signal_connect(G_OBJECT(GTK_BIN(dd->filter_combo)->child), "changed",
+                                G_CALLBACK(dest_filter_changed_cb), dd);
+               }
+       g_signal_connect(G_OBJECT(dd->entry), "changed",
+                        G_CALLBACK(dest_entry_changed_cb), dd);
+
+       dest_dnd_init(dd);
+
+       return table;
+}
+
+GtkWidget *path_selection_new(const gchar *path, GtkWidget *entry)
+{
+       return path_selection_new_with_files(entry, path, NULL, NULL);
+}
+
+void path_selection_sync_to_entry(GtkWidget *entry)
+{
+       Dest_Data *dd = g_object_get_data(G_OBJECT(entry), "destination_data");
+       const gchar *path;
+
+       if (!dd) return;
+
+       path = gtk_entry_get_text(GTK_ENTRY(entry));
+       
+       if (isdir(path) && strcmp(path, dd->path) != 0)
+               {
+               dest_populate(dd, path);
+               }
+       else
+               {
+               gchar *buf = remove_level_from_path(path);
+               if (isdir(buf) && strcmp(buf, dd->path) != 0)
+                       {
+                       dest_populate(dd, buf);
+                       }
+               g_free(buf);
+               }
+}
+
+void path_selection_add_select_func(GtkWidget *entry,
+                                   void (*func)(const gchar *, gpointer), gpointer data)
+{
+       Dest_Data *dd = g_object_get_data(G_OBJECT(entry), "destination_data");
+
+       if (!dd) return;
+
+       dd->select_func = func;
+       dd->select_data = data;
+}
+
+void path_selection_add_filter(GtkWidget *entry, const gchar *filter, const gchar *description, gint set)
+{
+       Dest_Data *dd = g_object_get_data(G_OBJECT(entry), "destination_data");
+
+       if (!dd) return;
+       if (!filter) return;
+
+       dest_filter_add(dd, filter, description, set);
+}
+
+void path_selection_clear_filter(GtkWidget *entry)
+{
+       Dest_Data *dd = g_object_get_data(G_OBJECT(entry), "destination_data");
+
+       if (!dd) return;
+
+       dest_filter_clear(dd);
+}
+
diff --git a/src/ui_pathsel.h b/src/ui_pathsel.h
new file mode 100644 (file)
index 0000000..09574b4
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifndef UI_PATHSEL_H
+#define UI_PATHSEL_H
+
+
+GtkWidget *path_selection_new_with_files(GtkWidget *entry, const gchar *path,
+                                        const gchar *filter, const gchar *filter_desc);
+GtkWidget *path_selection_new(const gchar *path, GtkWidget *entry);
+
+void path_selection_sync_to_entry(GtkWidget *entry);
+
+void path_selection_add_select_func(GtkWidget *entry,
+                                   void (*func)(const gchar *, gpointer), gpointer data);
+void path_selection_add_filter(GtkWidget *entry, const gchar *filter, const gchar *description, gint set);
+void path_selection_clear_filter(GtkWidget *entry);
+
+
+#endif
+
diff --git a/src/ui_spinner.c b/src/ui_spinner.c
new file mode 100644 (file)
index 0000000..98cd9a9
--- /dev/null
@@ -0,0 +1,214 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+#include "intl.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <gtk/gtk.h>
+
+#include "ui_spinner.h"
+
+#include "ui_icons.h"
+#include "ui_fileops.h"
+
+
+#define SPINNER_FRAMES 19
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * spinner utility
+ *-----------------------------------------------------------------------------
+ */
+
+typedef struct _SpinnerData SpinnerData;
+struct _SpinnerData {
+       GtkWidget *image;
+       GList *list;            /* list of pixbufs */
+       gint frame;
+       gint timer_id;
+};
+
+static void spinner_set_frame(SpinnerData *sp, gint frame)
+{
+       GdkPixbuf *pb;
+
+       pb = g_list_nth_data(sp->list, frame);
+       if (pb) gtk_image_set_from_pixbuf(GTK_IMAGE(sp->image), pb);
+
+       sp->frame = frame;
+}
+
+static void spinner_increment_frame(SpinnerData *sp)
+{
+       sp->frame++;
+       if (sp->frame >= g_list_length(sp->list)) sp->frame = 1;
+       spinner_set_frame(sp, sp->frame);
+}
+
+static gboolean spinner_loop_cb(gpointer data)
+{
+       SpinnerData *sp = data;
+
+       if (sp->list) spinner_increment_frame(sp);
+
+       return TRUE;
+}
+
+static void spinner_set_timeout(SpinnerData *sp, gint interval)
+{
+       if (!sp) return;
+
+       if (sp->timer_id != -1)
+               {
+               g_source_remove(sp->timer_id);
+               sp->timer_id = -1;
+               }
+
+       if (interval > 0)
+               {
+               sp->timer_id = g_timeout_add(interval, spinner_loop_cb, sp);
+               }
+       else if (interval < 0)
+               {
+               spinner_set_frame(sp, 0);
+               }
+
+       gtk_widget_set_sensitive(sp->image, (interval >= 0));
+}
+
+static void spinner_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       SpinnerData *sp = data;
+       GList *work;
+
+       spinner_set_timeout(sp, 0);
+
+       work = sp->list;
+       while (work)
+               {
+               GdkPixbuf *pb = work->data;
+               work = work->next;
+
+               g_object_unref(pb);
+               }
+       g_list_free(sp->list);
+       g_free(sp);
+}
+
+GtkWidget *spinner_new(const gchar *path, gint interval)
+{
+       SpinnerData *sp;
+
+       sp = g_new0(SpinnerData, 1);
+       sp->list = NULL;
+       sp->timer_id = -1;
+
+       if (path)
+               {
+               gchar *pathl;
+               GdkPixbuf *pb;
+               gint n;
+               gchar *buf;
+
+               pathl = path_from_utf8(path);
+
+               n = 0;
+               buf = g_strdup_printf("%s%02d.png", pathl, n);
+               while ((pb = gdk_pixbuf_new_from_file(buf, NULL)))
+                       {
+                       sp->list = g_list_append(sp->list, pb);
+
+                       n++;
+                       g_free(buf);
+                       buf = g_strdup_printf("%s%02d.png", pathl, n);
+                       }
+               g_free(buf);
+
+               g_free(pathl);
+               }
+
+       if (!sp->list)
+               {
+               GdkPixbuf *pb;
+               gint n;
+               gint w, h;
+
+               pb = gdk_pixbuf_new_from_inline (-1, icon_spinner, FALSE, NULL);
+               w = gdk_pixbuf_get_width(pb);
+               h = gdk_pixbuf_get_height(pb) / SPINNER_FRAMES;
+               for (n = 0; n < SPINNER_FRAMES; n++)
+                       {
+                       sp->list = g_list_append(sp->list,
+                                                gdk_pixbuf_new_subpixbuf(pb, 0, n * h, w, h));
+                       }
+               /* pb pixels is inline static, so the subpixbufs in sp->list will be ok */
+               g_object_unref(pb);
+               }
+
+       if (sp->list)
+               {
+               GdkPixbuf *pb;
+
+               pb = sp->list->data;
+               sp->image = gtk_image_new_from_pixbuf(pb);
+               }
+       else
+               {
+               sp->image = gtk_image_new_from_stock(GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_DIALOG);
+               }
+
+       g_object_set_data(G_OBJECT(sp->image), "spinner", sp);
+
+       g_signal_connect(G_OBJECT(sp->image), "destroy",
+                        G_CALLBACK(spinner_destroy_cb), sp);
+
+       spinner_set_timeout(sp, interval);
+
+       return sp->image;
+}
+
+void spinner_set_interval(GtkWidget *spinner, gint interval)
+{
+       SpinnerData *sp;
+
+       sp = g_object_get_data(G_OBJECT(spinner), "spinner");
+
+       spinner_set_timeout(sp, interval);
+}
+
+void spinner_step(GtkWidget *spinner, gint reset)
+{
+       SpinnerData *sp;
+
+       sp = g_object_get_data(G_OBJECT(spinner), "spinner");
+       if (sp->timer_id != -1)
+               {
+               printf("spinner warning: attempt to step with timer set\n");
+               return;
+               }
+
+       if (reset)
+               {
+               spinner_set_frame(sp, 0);
+               }
+       else
+               {
+               spinner_increment_frame(sp);
+               }
+}
+
diff --git a/src/ui_spinner.h b/src/ui_spinner.h
new file mode 100644 (file)
index 0000000..23bf200
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef UI_SPINNER_H
+#define UI_SPINNER_H
+
+
+#define SPINNER_SPEED 100
+
+
+extern const guint8 icon_spinner[];
+extern const guint8 icon_tabcomp[];
+
+/* if path is NULL, the built in spinner is used,
+ * otherwise path must be the location of the first image of the
+ * spinner without the 00.png portion of the pathname, example:
+ *
+ *     /path/to/spinnerimg_
+ *
+ * the files required are then:
+ *
+ *     /path/to/spinnerimg_00.png   non-animated state
+ *     /path/to/spinnerimg_01.png   animation frame 1
+ *     /path/to/spinnerimg_02.png   animation frame 2
+ *     [continues to last frame...]
+ */
+GtkWidget *spinner_new(const gchar *path, gint interval);
+
+void spinner_set_interval(GtkWidget *spinner, gint interval);
+void spinner_step(GtkWidget *spinner, gint reset);
+
+
+#endif
+
diff --git a/src/ui_spinner.png b/src/ui_spinner.png
new file mode 100755 (executable)
index 0000000..440f8a2
Binary files /dev/null and b/src/ui_spinner.png differ
diff --git a/src/ui_tabcomp.c b/src/ui_tabcomp.c
new file mode 100644 (file)
index 0000000..e188d6e
--- /dev/null
@@ -0,0 +1,900 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+#include "intl.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+#include <gdk/gdk.h>
+#include <gtk/gtk.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+#include "ui_tabcomp.h"
+
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_spinner.h"
+#include "ui_utildlg.h"
+
+#include <gdk/gdkkeysyms.h> /* for key values */
+
+
+/* define this to enable a pop-up menu that shows possible matches
+ * #define TAB_COMPLETION_ENABLE_POPUP_MENU
+ */
+#define TAB_COMPLETION_ENABLE_POPUP_MENU 1
+#define TAB_COMP_POPUP_MAX 500
+
+#ifdef TAB_COMPLETION_ENABLE_POPUP_MENU
+#include "ui_menu.h"
+#endif
+
+
+/* ----------------------------------------------------------------
+   Tab completion routines, can be connected to any gtkentry widget
+   using the tab_completion_add_to_entry() function.
+   Use remove_trailing_slash() to strip the trailing '/'.
+   ----------------------------------------------------------------*/
+
+typedef struct _TabCompData TabCompData;
+struct _TabCompData
+{
+       GtkWidget *entry;
+       gchar *dir_path;
+       GList *file_list;
+       void (*enter_func)(const gchar *, gpointer);
+       void (*tab_func)(const gchar *, gpointer);
+       gpointer enter_data;
+       gpointer tab_data;
+
+       GtkWidget *combo;
+       gint has_history;
+       gchar *history_key;
+       gint history_levels;
+
+       FileDialog *fd;
+       gchar *fd_title;
+       gint fd_folders_only;
+       GtkWidget *fd_button;
+};
+
+
+static void tab_completion_select_show(TabCompData *td);
+
+static void tab_completion_free_list(TabCompData *td)
+{
+       GList *list;
+
+       g_free(td->dir_path);
+       td->dir_path = NULL;
+
+       list = td->file_list;
+
+       while(list)
+               {
+               g_free(list->data);
+               list = list->next;
+               }
+
+       g_list_free(td->file_list);
+       td->file_list = NULL;
+}
+
+static void tab_completion_read_dir(TabCompData *td, const gchar *path)
+{
+        DIR *dp;
+        struct dirent *dir;
+        GList *list = NULL;
+       gchar *pathl;
+
+       tab_completion_free_list(td);
+
+       pathl = path_from_utf8(path);
+        dp = opendir(pathl);
+       g_free(pathl);
+       if (!dp)
+                {
+                /* dir not found */
+                return;
+                }
+        while ((dir = readdir(dp)) != NULL)
+                {
+                /* skips removed files */
+                if (dir->d_ino > 0)
+                        {
+                       gchar *name = dir->d_name;
+                       if (strcmp(name, ".") != 0 && strcmp(name, "..") != 0)
+                               {
+                               list = g_list_prepend(list, path_to_utf8(name));
+                               }
+                        }
+               }
+        closedir(dp);
+
+       td->dir_path = g_strdup(path);
+       td->file_list = list;
+}
+
+static void tab_completion_destroy(GtkWidget *widget, gpointer data)
+{
+       TabCompData *td = data;
+
+       tab_completion_free_list(td);
+       g_free(td->history_key);
+
+       if (td->fd) file_dialog_close(td->fd);
+       g_free(td->fd_title);
+
+       g_free(td);
+}
+
+static gint tab_completion_emit_enter_signal(TabCompData *td)
+{
+       gchar *text;
+       if (!td->enter_func) return FALSE;
+
+       text = g_strdup(gtk_entry_get_text(GTK_ENTRY(td->entry)));
+
+       if (text[0] == '~')
+               {
+               gchar *t = text;
+               text = g_strconcat(homedir(), t + 1, NULL);
+               g_free(t);
+               }
+
+       td->enter_func(text, td->enter_data);
+       g_free(text);
+
+       return TRUE;
+}
+
+static void tab_completion_emit_tab_signal(TabCompData *td)
+{
+       gchar *text;
+       if (!td->tab_func) return;
+
+       text = g_strdup(gtk_entry_get_text(GTK_ENTRY(td->entry)));
+
+       if (text[0] == '~')
+               {
+               gchar *t = text;
+               text = g_strconcat(homedir(), t + 1, NULL);
+               g_free(t);
+               }
+
+       td->tab_func(text, td->tab_data);
+       g_free(text);
+}
+
+#ifdef TAB_COMPLETION_ENABLE_POPUP_MENU
+
+static gint tab_completion_popup_key_press(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       TabCompData *td = data;
+
+       if (event->keyval == GDK_Tab ||
+           event->keyval == GDK_BackSpace ||
+           (event->keyval >= 0x20 && event->keyval <= 0xFF) )
+               {
+               if (event->keyval >= 0x20 && event->keyval <= 0xFF)
+                       {
+                       gchar buf[2];
+                       gint p = -1;
+
+                       buf[0] = event->keyval;
+                       buf[1] = '\0';
+                       gtk_editable_insert_text(GTK_EDITABLE(td->entry), buf, 1, &p);
+                       gtk_editable_set_position(GTK_EDITABLE(td->entry), -1);
+                       }
+
+               /*close the menu */
+               gtk_menu_popdown(GTK_MENU(widget));
+               /* doing this does not emit the "selection done" signal, unref it ourselves */
+               gtk_widget_unref(widget);
+                       
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+static void tab_completion_popup_cb(GtkWidget *widget, gpointer data)
+{
+       gchar *name = data;
+       TabCompData *td;
+       gchar *buf;
+       gchar *ptr;
+
+       td = g_object_get_data(G_OBJECT(widget), "tab_completion_data");
+       if (!td) return;
+
+       ptr = td->dir_path + strlen(td->dir_path) - 1;
+       buf = g_strconcat(td->dir_path, (ptr[0] == '/') ? "" : "/", name, NULL);
+       gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
+       gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(buf));
+       g_free(buf);
+
+       tab_completion_emit_tab_signal(td);
+}
+
+static void tab_completion_popup_pos_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
+{
+       TabCompData *td = data;
+       gint height;
+       PangoLayout *layout;
+       PangoRectangle strong_pos, weak_pos;
+       gint length;
+       gint xoffset, yoffset;
+                                                       
+
+       gdk_window_get_origin(td->entry->window, x, y);
+
+       height = MIN(td->entry->requisition.height, td->entry->allocation.height);
+       *y += height;
+
+       length = strlen(gtk_entry_get_text(GTK_ENTRY(td->entry)));
+       gtk_entry_get_layout_offsets(GTK_ENTRY(td->entry), &xoffset, &yoffset);
+
+       layout = gtk_entry_get_layout(GTK_ENTRY(td->entry));
+       pango_layout_get_cursor_pos(layout, length, &strong_pos, &weak_pos);
+       *x += strong_pos.x / PANGO_SCALE + xoffset;
+}
+
+static void tab_completion_popup_list(TabCompData *td, GList *list)
+{
+       GtkWidget *menu;
+       GList *work;
+       GdkEvent *event;
+       guint32 etime;
+       gint ebutton;
+       gint count = 0;
+
+       if (!list) return;
+
+#if 0
+       /*
+        * well, the menu would be too long anyway...
+        * (listing /dev causes gtk+ window allocation errors, -> too big a window)
+        * this is why menu popups are disabled, this really should be a popup scrollable listview.
+        */
+       if (g_list_length(list) > 200) return;
+#endif
+
+       menu = popup_menu_short_lived();
+
+       work = list;
+       while (work && count < TAB_COMP_POPUP_MAX)
+               {
+               gchar *name = work->data;
+               GtkWidget *item;
+
+               item = menu_item_add_simple(menu, name, G_CALLBACK(tab_completion_popup_cb), name);
+               g_object_set_data(G_OBJECT(item), "tab_completion_data", td);
+
+               work = work->next;
+               count++;
+               }
+
+       g_signal_connect(G_OBJECT(menu), "key_press_event",
+                        G_CALLBACK(tab_completion_popup_key_press), td);
+
+       /* peek at the current event to get the time, etc. */
+       event = gtk_get_current_event();
+
+       if (event && event->type == GDK_BUTTON_RELEASE)
+               {
+               ebutton = event->button.button;
+               }
+       else
+               {
+               ebutton = 0;
+               }
+
+       if (event)
+               {
+               etime = gdk_event_get_time(event);
+               gdk_event_free(event);
+               }
+       else
+               {
+               etime = 0;
+               }
+
+       gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
+                      tab_completion_popup_pos_cb, td, ebutton, etime);
+}
+
+#ifndef CASE_SORT
+#define CASE_SORT strcmp
+#endif
+
+static gint simple_sort(gconstpointer a, gconstpointer b)
+{
+        return CASE_SORT((gchar *)a, (gchar *)b);
+}
+
+#endif
+
+static gint tab_completion_do(TabCompData *td)
+{
+       const gchar *entry_text = gtk_entry_get_text(GTK_ENTRY(td->entry));
+       const gchar *entry_file;
+       gchar *entry_dir;
+       gchar *ptr;
+       gint home_exp = FALSE;
+
+       /* home dir expansion */
+       if (entry_text[0] == '~')
+               {
+               entry_dir = g_strconcat(homedir(), entry_text + 1, NULL);
+               home_exp = TRUE;
+               }
+       else
+               {
+               entry_dir = g_strdup(entry_text);
+               }
+
+       entry_file = filename_from_path(entry_text);
+
+       if (isfile(entry_dir))
+               {
+               if (home_exp)
+                       {
+                       gtk_entry_set_text(GTK_ENTRY(td->entry), entry_dir);
+                       gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(entry_dir));
+                       }
+               g_free(entry_dir);
+               return home_exp;
+               }
+       if (isdir(entry_dir) && strcmp(entry_file, ".") != 0 && strcmp(entry_file, "..") != 0)
+               {
+               ptr = entry_dir + strlen(entry_dir) - 1;
+               if (ptr[0] == '/')
+                       {
+                       if (home_exp)
+                               {
+                               gtk_entry_set_text(GTK_ENTRY(td->entry), entry_dir);
+                               gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(entry_dir));
+                               }
+
+                       tab_completion_read_dir(td, entry_dir);
+                       td->file_list = g_list_sort(td->file_list, simple_sort);
+                       if (td->file_list && !td->file_list->next)
+                               {
+                               gchar *buf;
+                               const gchar *file;
+
+                               file = td->file_list->data;
+                               buf = g_strconcat(entry_dir, file, NULL);
+                               if (isdir(buf))
+                                       {
+                                       g_free(buf);
+                                       buf = g_strconcat(entry_dir, file, "/", NULL);
+                                       }
+                               gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
+                               gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(buf));
+                               g_free(buf);
+                               }
+
+#ifdef TAB_COMPLETION_ENABLE_POPUP_MENU
+
+                       else
+                               {
+                               tab_completion_popup_list(td, td->file_list);
+                               }
+#endif
+
+                       g_free(entry_dir);
+                       return home_exp;
+                       }
+               else
+                       {
+                       gchar *buf = g_strconcat(entry_dir, "/", NULL);
+                       gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
+                       gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(buf));
+                       g_free(buf);
+                       g_free(entry_dir);
+                       return TRUE;
+                       }
+               }
+
+       ptr = (gchar *)filename_from_path(entry_dir);
+       if (ptr > entry_dir) ptr--;
+       ptr[0] = '\0';
+
+       if (strlen(entry_dir) == 0)
+               {
+               g_free(entry_dir);
+               entry_dir = g_strdup("/");
+               }
+
+       if (isdir(entry_dir))
+               {
+               GList *list;
+               GList *poss = NULL;
+               gint l = strlen(entry_file);
+
+               if (!td->dir_path || !td->file_list || strcmp(td->dir_path, entry_dir) != 0)
+                       {
+                       tab_completion_read_dir(td, entry_dir);
+                       }
+
+               if (strcmp(entry_dir, "/") == 0) entry_dir[0] = '\0';
+
+               list = td->file_list;
+               while(list)
+                       {
+                       gchar *file = list->data;
+                       if (strncmp(entry_file, file, l) == 0)
+                               {
+                               poss = g_list_prepend(poss, file);
+                               }
+                       list = list->next;
+                       }
+
+               if (poss)
+                       {
+                       if (!poss->next)
+                               {
+                               gchar *file = poss->data;
+                               gchar *buf;
+
+                               buf = g_strconcat(entry_dir, "/", file, NULL);
+
+                               if (isdir(buf))
+                                       {
+                                       g_free(buf);
+                                       buf = g_strconcat(entry_dir, "/", file, "/", NULL);
+                                       }
+                               gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
+                               gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(buf));
+                               g_free(buf);
+                               g_list_free(poss);
+                               g_free(entry_dir);
+                               return TRUE;
+                               }
+                       else
+                               {
+                               gint c = strlen(entry_file);
+                               gint done = FALSE;
+                               gchar *test_file = poss->data;
+
+                               while (!done)
+                                       {
+                                       list = poss;
+                                       if (!list) done = TRUE;
+                                       while(list && !done)
+                                               {
+                                               gchar *file = list->data;
+                                               if (strlen(file) < c || strncmp(test_file, file, c) != 0)
+                                                       {
+                                                       done = TRUE;
+                                                       }
+                                               list = list->next;
+                                               }
+                                       c++;
+                                       }
+                               c -= 2;
+                               if (c > 0)
+                                       {
+                                       gchar *file;
+                                       gchar *buf;
+                                       file = g_strdup(test_file);
+                                       file[c] = '\0';
+                                       buf = g_strconcat(entry_dir, "/", file, NULL);
+                                       gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
+                                       gtk_editable_set_position(GTK_EDITABLE(td->entry), strlen(buf));
+
+#ifdef TAB_COMPLETION_ENABLE_POPUP_MENU
+
+                                       poss = g_list_sort(poss, simple_sort);
+                                       tab_completion_popup_list(td, poss);
+
+#endif
+
+                                       g_free(file);
+                                       g_free(buf);
+                                       g_list_free(poss);
+                                       g_free(entry_dir);
+                                       return TRUE;
+                                       }
+                               }
+                       g_list_free(poss);
+                       }
+               }
+
+       g_free(entry_dir);
+
+       return FALSE;
+}
+
+static gint tab_completion_key_pressed(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       TabCompData *td = data;
+       gint stop_signal = FALSE;
+
+       switch (event->keyval)
+               {
+                case GDK_Tab:
+                       if (!(event->state & GDK_CONTROL_MASK))
+                               {
+                               if (tab_completion_do(td))
+                                       {
+                                       tab_completion_emit_tab_signal(td);
+                                       }
+                               stop_signal = TRUE;
+                               }
+                       break;
+               case GDK_Return: case GDK_KP_Enter:
+                       if (td->fd_button &&
+                           (event->state & GDK_CONTROL_MASK))
+                               {
+                               tab_completion_select_show(td);
+                               stop_signal = TRUE;
+                               }
+                       else if (tab_completion_emit_enter_signal(td))
+                               {
+                               stop_signal = TRUE;
+                               }
+                       break;
+               default:
+                       break;
+               }
+
+       if (stop_signal) g_signal_stop_emission_by_name(G_OBJECT(widget), "key_press_event");
+
+       return (stop_signal);
+}
+
+static void tab_completion_button_pressed(GtkWidget *widget, gpointer data)
+{
+       TabCompData *td;
+       GtkWidget *entry = data;
+
+       td = g_object_get_data(G_OBJECT(entry), "tab_completion_data");
+
+       if (!td) return;
+
+       if (!GTK_WIDGET_HAS_FOCUS(entry))
+               {
+               gtk_widget_grab_focus(entry);
+               }
+
+       if (tab_completion_do(td))
+               {
+               tab_completion_emit_tab_signal(td);
+               }
+}
+
+static void tab_completion_button_size_allocate(GtkWidget *button, GtkAllocation *allocation, gpointer data)
+{
+       GtkWidget *parent = data;
+
+       if (allocation->height > parent->allocation.height)
+               {
+               GtkAllocation button_allocation;
+
+               button_allocation = button->allocation;
+               button_allocation.height = parent->allocation.height;
+               button_allocation.y = parent->allocation.y +
+                       (parent->allocation.height - parent->allocation.height) / 2;
+               gtk_widget_size_allocate(button, &button_allocation);
+               }
+}
+
+static GtkWidget *tab_completion_create_complete_button(GtkWidget *entry, GtkWidget *parent)
+{
+       GtkWidget *button;
+       GtkWidget *icon;
+       GdkPixbuf *pixbuf;
+
+       button = gtk_button_new();
+       GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS);
+       g_signal_connect(G_OBJECT(button), "size_allocate",
+                        G_CALLBACK(tab_completion_button_size_allocate), parent);
+       g_signal_connect(G_OBJECT(button), "clicked",
+                        G_CALLBACK(tab_completion_button_pressed), entry);
+
+       pixbuf = gdk_pixbuf_new_from_inline(-1, icon_tabcomp, FALSE, NULL);
+       icon = gtk_image_new_from_pixbuf(pixbuf);
+       gdk_pixbuf_unref(pixbuf);
+       gtk_container_add(GTK_CONTAINER(button), icon);
+       gtk_widget_show(icon);
+
+       return button;
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * public interface
+ *----------------------------------------------------------------------------
+ */
+
+GtkWidget *tab_completion_new_with_history(GtkWidget **entry, const gchar *text,
+                                          const gchar *history_key, gint max_levels,
+                                          void (*enter_func)(const gchar *, gpointer), gpointer data)
+{
+       GtkWidget *box;
+       GtkWidget *combo;
+       GtkWidget *combo_entry;
+       GtkWidget *button;
+       GList *work;
+       TabCompData *td;
+       gint n = 0;
+
+       box = gtk_hbox_new(FALSE, 0);
+
+       combo = gtk_combo_box_entry_new_text();
+       gtk_box_pack_start(GTK_BOX(box), combo, TRUE, TRUE, 0);
+       gtk_widget_show(combo);
+
+       combo_entry = GTK_BIN(combo)->child;
+#if 0
+       gtk_combo_set_case_sensitive(GTK_COMBO(combo), TRUE);
+       gtk_combo_set_use_arrows(GTK_COMBO(combo), FALSE);
+#endif
+
+       button = tab_completion_create_complete_button(combo_entry, combo);
+       gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       tab_completion_add_to_entry(combo_entry, enter_func, data);
+
+       td = g_object_get_data(G_OBJECT(combo_entry), "tab_completion_data");
+       if (!td) return NULL; /* this should never happen! */
+
+       td->combo = combo;
+       td->has_history = TRUE;
+       td->history_key = g_strdup(history_key);
+       td->history_levels = max_levels;
+
+       work = history_list_get_by_key(td->history_key);
+
+       work = history_list_get_by_key(history_key);
+       while (work)
+               {
+               gtk_combo_box_append_text(GTK_COMBO_BOX(combo), (gchar *)work->data);
+               work = work->next;
+               n++;
+               }
+
+       if (text)
+               {
+               gtk_entry_set_text(GTK_ENTRY(combo_entry), text);
+               }
+       else if (n > 0)
+               {
+               gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
+               }
+
+       if (entry) *entry = combo_entry;
+       return box;
+}
+
+const gchar *tab_completion_set_to_last_history(GtkWidget *entry)
+{
+       TabCompData *td = g_object_get_data(G_OBJECT(entry), "tab_completion_data");
+       const gchar *buf;
+
+       if (!td || !td->has_history) return NULL;
+
+       buf = history_list_find_last_path_by_key(td->history_key);
+       if (buf)
+               {
+               gtk_entry_set_text(GTK_ENTRY(td->entry), buf);
+               }
+
+       return buf;
+}
+
+void tab_completion_append_to_history(GtkWidget *entry, const gchar *path)
+{
+       TabCompData *td;
+       GtkTreeModel *store;
+       GList *work;
+
+       td = g_object_get_data(G_OBJECT(entry), "tab_completion_data");
+
+       if (!path) return;
+
+       if (!td || !td->has_history) return;
+
+       history_list_add_to_key(td->history_key, path, td->history_levels);
+
+       gtk_combo_box_set_active(GTK_COMBO_BOX(td->combo), -1);
+
+       store = gtk_combo_box_get_model(GTK_COMBO_BOX(td->combo));
+       gtk_list_store_clear(GTK_LIST_STORE(store));
+
+       work = history_list_get_by_key(td->history_key);
+       while (work)
+               {
+               gtk_combo_box_append_text(GTK_COMBO_BOX(td->combo), (gchar *)work->data);
+               work = work->next;
+               }
+}
+
+GtkWidget *tab_completion_new(GtkWidget **entry, const gchar *text,
+                             void (*enter_func)(const gchar *, gpointer), gpointer data)
+{
+       GtkWidget *hbox;
+       GtkWidget *button;
+       GtkWidget *newentry;
+
+       hbox = gtk_hbox_new(FALSE, 0);
+
+       newentry = gtk_entry_new();
+       if (text) gtk_entry_set_text(GTK_ENTRY(newentry), text);
+       gtk_box_pack_start(GTK_BOX(hbox), newentry, TRUE, TRUE, 0);
+       gtk_widget_show(newentry);
+
+       button = tab_completion_create_complete_button(newentry, newentry);
+       gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0);
+       gtk_widget_show(button);
+
+       tab_completion_add_to_entry(newentry, enter_func, data);
+
+       if (entry) *entry = newentry;
+       return hbox;
+}
+
+void tab_completion_add_to_entry(GtkWidget *entry, void (*enter_func)(const gchar *, gpointer), gpointer data)
+{
+       TabCompData *td;
+       if (!entry)
+               {
+               printf("Tab completion error: entry != NULL\n");
+               return;
+               }
+
+       td = g_new0(TabCompData, 1);
+       td->entry = entry;
+       td->dir_path = NULL;
+       td->file_list = NULL;
+       td->enter_func = enter_func;
+       td->enter_data = data;
+       td->tab_func = NULL;
+       td->tab_data = NULL;
+
+       td->has_history = FALSE;
+       td->history_key = NULL;
+       td->history_levels = 0;
+
+       g_object_set_data(G_OBJECT(td->entry), "tab_completion_data", td);
+
+       g_signal_connect(G_OBJECT(entry), "key_press_event",
+                        G_CALLBACK(tab_completion_key_pressed), td);
+       g_signal_connect(G_OBJECT(entry), "destroy",
+                        G_CALLBACK(tab_completion_destroy), td);
+}
+
+void tab_completion_add_tab_func(GtkWidget *entry, void (*tab_func)(const gchar *, gpointer), gpointer data)
+{
+       TabCompData *td = g_object_get_data(G_OBJECT(entry), "tab_completion_data");
+
+       if (!td) return;
+
+       td->tab_func = tab_func;
+       td->tab_data = data;
+}
+
+gchar *remove_trailing_slash(const gchar *path)
+{
+       gchar *ret;
+       gint l;
+       if (!path) return NULL;
+
+       ret = g_strdup(path);
+       l = strlen(ret);
+       if (l > 1 && ret[l - 1] == '/') ret[l - 1] = '\0';
+
+       return ret;
+}
+
+static void tab_completion_select_cancel_cb(FileDialog *fd, gpointer data)
+{
+       TabCompData *td = data;
+
+       td->fd = NULL;
+       file_dialog_close(fd);
+}
+
+static void tab_completion_select_ok_cb(FileDialog *fd, gpointer data)
+{
+       TabCompData *td = data;
+
+       gtk_entry_set_text(GTK_ENTRY(td->entry), gtk_entry_get_text(GTK_ENTRY(fd->entry)));
+
+       tab_completion_select_cancel_cb(fd, data);
+
+       tab_completion_emit_enter_signal(td);
+}
+
+static void tab_completion_select_show(TabCompData *td)
+{
+       const gchar *title;
+       const gchar *path;
+
+       if (td->fd)
+               {
+               gtk_window_present(GTK_WINDOW(GENERIC_DIALOG(td->fd)->dialog));
+               return;
+               }
+
+       title = (td->fd_title) ? td->fd_title : _("Select path");
+       td->fd = file_dialog_new(title, PACKAGE, "select_path", td->entry,
+                                tab_completion_select_cancel_cb, td);
+       file_dialog_add_button(td->fd, GTK_STOCK_OK, NULL,
+                                tab_completion_select_ok_cb, TRUE);
+
+       generic_dialog_add_message(GENERIC_DIALOG(td->fd), NULL, title, NULL);
+
+       path = gtk_entry_get_text(GTK_ENTRY(td->entry));
+       if (strlen(path) == 0) path = NULL;
+       if (td->fd_folders_only)
+               {
+               file_dialog_add_path_widgets(td->fd, NULL, path, td->history_key, NULL, NULL);
+               }
+       else
+               {
+               file_dialog_add_path_widgets(td->fd, NULL, path, td->history_key, "*", _("All files"));
+               }
+
+       gtk_widget_show(GENERIC_DIALOG(td->fd)->dialog);
+}
+
+static void tab_completion_select_pressed(GtkWidget *widget, gpointer data)
+{
+       TabCompData *td = data;
+
+       tab_completion_select_show(td);
+}
+
+void tab_completion_add_select_button(GtkWidget *entry, const gchar *title, gint folders_only)
+{
+       TabCompData *td;
+       GtkWidget *parent;
+       GtkWidget *hbox;
+
+       td = g_object_get_data(G_OBJECT(entry), "tab_completion_data");
+
+       if (!td) return;
+
+       g_free(td->fd_title);
+       td->fd_title = g_strdup(title);
+       td->fd_folders_only = folders_only;
+
+       if (td->fd_button) return;
+
+       parent = (td->combo) ? td->combo : td->entry;
+
+       hbox = gtk_widget_get_parent(parent);
+       if (!GTK_IS_BOX(hbox)) return;
+
+       td->fd_button = gtk_button_new_with_label("...");
+       g_signal_connect(G_OBJECT(td->fd_button), "size_allocate",
+                        G_CALLBACK(tab_completion_button_size_allocate), parent);
+       g_signal_connect(G_OBJECT(td->fd_button), "clicked",
+                        G_CALLBACK(tab_completion_select_pressed), td);
+
+       gtk_box_pack_start(GTK_BOX(hbox), td->fd_button, FALSE, FALSE, 0);
+
+       gtk_widget_show(td->fd_button);
+}
+
diff --git a/src/ui_tabcomp.h b/src/ui_tabcomp.h
new file mode 100644 (file)
index 0000000..bc975ed
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifndef UI_TABCOMP_H
+#define UI_TABCOMP_H
+
+
+GtkWidget *tab_completion_new_with_history(GtkWidget **entry, const gchar *text,
+                                          const gchar *history_key, gint max_levels,
+                                          void (*enter_func)(const gchar *, gpointer), gpointer data);
+const gchar *tab_completion_set_to_last_history(GtkWidget *entry);
+void tab_completion_append_to_history(GtkWidget *entry, const gchar *path);
+
+GtkWidget *tab_completion_new(GtkWidget **entry, const gchar *text,
+                             void (*enter_func)(const gchar *, gpointer), gpointer data);
+void tab_completion_add_to_entry(GtkWidget *entry, void (*enter_func)(const gchar *, gpointer), gpointer data);
+void tab_completion_add_tab_func(GtkWidget *entry, void (*tab_func)(const gchar *, gpointer), gpointer data);
+gchar *remove_trailing_slash(const gchar *path);
+
+void tab_completion_add_select_button(GtkWidget *entry, const gchar *title, gint folders_only);
+
+
+#endif
+
diff --git a/src/ui_tabcomp.png b/src/ui_tabcomp.png
new file mode 100644 (file)
index 0000000..c17beaa
Binary files /dev/null and b/src/ui_tabcomp.png differ
diff --git a/src/ui_tree_edit.c b/src/ui_tree_edit.c
new file mode 100644 (file)
index 0000000..4ab8682
--- /dev/null
@@ -0,0 +1,677 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+#include "intl.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+
+#include "ui_tree_edit.h"
+
+/*
+ *-------------------------------------------------------------------
+ * cell popup editor
+ *-------------------------------------------------------------------
+ */
+
+static void tree_edit_close(TreeEditData *ted)
+{
+       gtk_grab_remove(ted->window);
+       gdk_keyboard_ungrab(GDK_CURRENT_TIME);
+       gdk_pointer_ungrab(GDK_CURRENT_TIME);
+
+       gtk_widget_destroy(ted->window);
+
+       g_free(ted->old_name);
+       g_free(ted->new_name);
+       gtk_tree_path_free(ted->path);
+
+       g_free(ted);
+}
+
+static void tree_edit_do(TreeEditData *ted)
+{
+       ted->new_name = g_strdup(gtk_entry_get_text(GTK_ENTRY(ted->entry)));
+
+       if (strcmp(ted->new_name, ted->old_name) != 0)
+               {
+               if (ted->edit_func)
+                       {
+                       if (ted->edit_func(ted, ted->old_name, ted->new_name, ted->edit_data))
+                               {
+                               /* hmm, should the caller be required to set text instead ? */
+                               }
+                       }
+               }
+}
+
+static gint tree_edit_click_end_cb(GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+       TreeEditData *ted = data;
+
+       tree_edit_do(ted);
+       tree_edit_close(ted);
+
+       return TRUE;
+}
+
+static gint tree_edit_click_cb(GtkWidget *widget, GdkEventButton *event, gpointer data)
+{
+       TreeEditData *ted = data;
+
+       gint x, y;
+       gint w, h;
+
+       gint xr, yr;
+
+       xr = (gint)event->x_root;
+       yr = (gint)event->y_root;
+
+       gdk_window_get_origin(ted->window->window, &x, &y);
+       gdk_drawable_get_size(ted->window->window, &w, &h);
+
+       if (xr < x || yr < y || xr > x + w || yr > y + h)
+               {
+               /* gobble the release event, so it does not propgate to an underlying widget */
+               g_signal_connect(G_OBJECT(ted->window), "button_release_event",
+                                G_CALLBACK(tree_edit_click_end_cb), ted);
+               return TRUE;
+               }
+       return FALSE;
+}
+
+static gint tree_edit_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       TreeEditData *ted = data;
+
+       switch (event->keyval)
+               {
+               case GDK_Return:
+               case GDK_KP_Enter:
+               case GDK_Tab:           /* ok, we are going to intercept the focus change
+                                          from keyboard and act like return was hit */
+               case GDK_ISO_Left_Tab:
+               case GDK_Up:
+               case GDK_Down:
+               case GDK_KP_Up:
+               case GDK_KP_Down:
+               case GDK_KP_Left:
+               case GDK_KP_Right:
+                       tree_edit_do(ted);
+                       tree_edit_close(ted);
+                       break;
+               case GDK_Escape:
+                       tree_edit_close(ted);
+                       break;
+               default:
+                       break;
+               }
+
+       return FALSE;
+}
+
+static gboolean tree_edit_by_path_idle_cb(gpointer data)
+{
+       TreeEditData *ted = data;
+       GdkRectangle rect;
+       gint x, y, w, h;        /* geometry of cell within tree */
+       gint wx, wy;            /* geometry of tree from root window */
+       gint sx, sw;
+
+       gtk_tree_view_get_cell_area(ted->tree, ted->path, ted->column, &rect);
+
+       x = rect.x;
+       y = rect.y;
+       w = rect.width + 4;
+       h = rect.height + 4;
+
+       if (gtk_tree_view_column_cell_get_position(ted->column, ted->cell, &sx, &sw))
+               {
+               x += sx;
+               w = MAX(w - sx, sw);
+               }
+
+       gdk_window_get_origin(gtk_tree_view_get_bin_window(ted->tree), &wx, &wy);
+
+       x += wx - 2; /* the -val is to 'fix' alignment of entry position */
+       y += wy - 2;
+
+       /* now show it */
+       gtk_widget_set_size_request(ted->window, w, h);
+       gtk_widget_realize(ted->window);
+       gtk_window_move(GTK_WINDOW(ted->window), x, y);
+       gtk_window_resize(GTK_WINDOW(ted->window), w, h);
+       gtk_widget_show(ted->window);
+
+       /* grab it */
+       gtk_widget_grab_focus(ted->entry);
+       /* explicitely set the focus flag for the entry, for some reason on popup windows this
+        * is not set, and causes no edit cursor to appear ( popups not allowed focus? )
+        */
+       GTK_WIDGET_SET_FLAGS(ted->entry, GTK_HAS_FOCUS);
+       gtk_grab_add(ted->window);
+       gdk_pointer_grab(ted->window->window, TRUE,
+                        GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK,
+                        NULL, NULL, GDK_CURRENT_TIME);
+       gdk_keyboard_grab(ted->window->window, TRUE, GDK_CURRENT_TIME);
+
+       return FALSE;
+}
+
+gint tree_edit_by_path(GtkTreeView *tree, GtkTreePath *tpath, gint column, const gchar *text,
+                      gint (*edit_func)(TreeEditData *, const gchar *, const gchar *, gpointer), gpointer data)
+{
+       TreeEditData *ted;
+       GtkTreeViewColumn *tcolumn;
+       GtkCellRenderer *cell = NULL;
+       GList *list;
+       GList *work;
+
+       if (!edit_func) return FALSE;
+       if (!GTK_WIDGET_VISIBLE(tree)) return FALSE;
+
+       tcolumn = gtk_tree_view_get_column(tree, column);
+       if (!tcolumn) return FALSE;
+
+       list = gtk_tree_view_column_get_cell_renderers(tcolumn);
+       work = list;
+       while (work && !cell)
+               {
+               cell = work->data;
+               if (!GTK_IS_CELL_RENDERER_TEXT(cell))
+                       {
+                       cell = NULL;
+                       }
+               work = work->next;
+               }
+
+       g_list_free(list);
+       if (!cell) return FALSE;
+
+       if (!text) text = "";
+
+       ted = g_new0(TreeEditData, 1);
+
+       ted->old_name = g_strdup(text);
+       ted->new_name = NULL;
+
+       ted->edit_func = edit_func;
+       ted->edit_data = data;
+
+       ted->tree = tree;
+       ted->path = gtk_tree_path_copy(tpath);
+       ted->column = tcolumn;
+       ted->cell = cell;
+
+       gtk_tree_view_scroll_to_cell(ted->tree, ted->path, ted->column, FALSE, 0.0, 0.0);
+
+       /* create the window */
+
+       ted->window = gtk_window_new(GTK_WINDOW_POPUP);
+       gtk_window_set_resizable(GTK_WINDOW(ted->window), FALSE);
+       g_signal_connect(G_OBJECT(ted->window), "button_press_event",
+                        G_CALLBACK(tree_edit_click_cb), ted);
+       g_signal_connect(G_OBJECT(ted->window), "key_press_event",
+                        G_CALLBACK(tree_edit_key_press_cb), ted);
+
+       ted->entry = gtk_entry_new();
+       gtk_entry_set_text(GTK_ENTRY(ted->entry), ted->old_name);
+       gtk_editable_select_region(GTK_EDITABLE(ted->entry), 0, strlen(ted->old_name));
+       gtk_container_add(GTK_CONTAINER(ted->window), ted->entry);
+       gtk_widget_show(ted->entry);
+
+       /* due to the fact that gtktreeview scrolls in an idle loop, we cannot
+        * reliably get the cell position until those scroll priority signals are processed
+        */
+       g_idle_add_full(G_PRIORITY_DEFAULT_IDLE - 2, tree_edit_by_path_idle_cb, ted, NULL);
+
+       return TRUE;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * tree cell position retrieval
+ *-------------------------------------------------------------------
+ */
+
+gint tree_view_get_cell_origin(GtkTreeView *widget, GtkTreePath *tpath, gint column, gint text_cell_only,
+                              gint *x, gint *y, gint *width, gint *height)
+{
+       gint x_origin, y_origin;
+       gint x_offset, y_offset;
+       gint header_size;
+       GtkTreeViewColumn *tv_column;
+       GdkRectangle rect;
+
+       tv_column = gtk_tree_view_get_column(widget, column);
+       if (!tv_column || !tpath) return FALSE;
+
+       /* hmm, appears the rect will not account for X scroll, but does for Y scroll
+        * use x_offset instead for X scroll (sigh)
+        */
+       gtk_tree_view_get_cell_area(widget, tpath, tv_column, &rect);
+       gtk_tree_view_tree_to_widget_coords(widget, 0, 0, &x_offset, &y_offset);
+       gdk_window_get_origin(GTK_WIDGET(widget)->window, &x_origin, &y_origin);
+
+       if (gtk_tree_view_get_headers_visible(widget))
+               {
+               header_size = tv_column->button->allocation.height;
+               }
+       else
+               {
+               header_size = 0;
+               }
+
+       if (text_cell_only)
+               {
+               GtkCellRenderer *cell = NULL;
+               GList *renderers;
+               GList *work;
+               gint cell_x;
+               gint cell_width;
+
+               renderers = gtk_tree_view_column_get_cell_renderers(tv_column);
+               work = renderers;
+               while (work && !cell)
+                       {
+                       cell = work->data;
+                       work = work->next;
+                       if (!GTK_IS_CELL_RENDERER_TEXT(cell)) cell = NULL;
+                       }
+               g_list_free(renderers);
+
+               if (!cell) return FALSE;
+               
+               if (!gtk_tree_view_column_cell_get_position(tv_column, cell, &cell_x, &cell_width))
+                       {
+                       cell_x = 0;
+                       cell_width = rect.width;
+                       }
+               *x = x_origin + x_offset + rect.x + cell_x;
+               *width = cell_width;
+               }
+       else
+               {
+               *x = x_origin + x_offset + rect.x;
+               *width = rect.width;
+               }
+       *y = y_origin + rect.y + header_size;
+       *height = rect.height;
+       return TRUE;
+}
+
+void tree_view_get_cell_clamped(GtkTreeView *widget, GtkTreePath *tpath, gint column, gint text_cell_only,
+                               gint *x, gint *y, gint *width, gint *height)
+{
+       gint wx, wy, ww, wh;
+       GdkWindow *window;
+
+       window = GTK_WIDGET(widget)->window;
+       gdk_window_get_origin(window, &wx, &wy);
+       gdk_drawable_get_size(window, &ww, &wh);
+       if (!tree_view_get_cell_origin(widget, tpath, column, text_cell_only, x,  y, width, height))
+               {
+               *x = wx;
+               *y = wy;
+               *width = ww;
+               *height = wh;
+               return;
+               }
+
+       *width = MIN(*width, ww);
+       *x = CLAMP(*x, wx, wx + ww - (*width));
+       *y = CLAMP(*y, wy, wy + wh);
+       *height = MIN(*height, wy + wh - (*y));
+}
+
+gint tree_view_row_get_visibility(GtkTreeView *widget, GtkTreeIter *iter, gint fully_visible)
+{
+       GtkTreeModel *store;
+       GtkTreePath *tpath;     
+       gint cx, cy;
+                                                                                                                               
+       GdkRectangle vrect;
+       GdkRectangle crect;
+
+       if (!GTK_WIDGET_REALIZED(GTK_WIDGET(widget))) return 0;
+
+       store = gtk_tree_view_get_model(widget);
+       tpath = gtk_tree_model_get_path(store, iter);
+
+       gtk_tree_view_get_visible_rect(widget, &vrect);
+       gtk_tree_view_get_cell_area(widget, tpath, NULL, &crect);
+       gtk_tree_path_free(tpath);
+
+       gtk_tree_view_widget_to_tree_coords(widget, crect.x, crect.y, &cx, &cy);
+
+       if (fully_visible)
+               {
+               if (cy < vrect.y) return -1;
+               if (cy + crect.height > vrect.y + vrect.height) return 1;
+               return 0;
+               }
+
+       if (cy + crect.height < vrect.y) return -1;
+       if (cy > vrect.y + vrect.height) return 1;
+       return 0;
+}
+
+gint tree_view_row_make_visible(GtkTreeView *widget, GtkTreeIter *iter, gint center)
+{
+       GtkTreePath *tpath;
+       gint vis;
+
+       vis = tree_view_row_get_visibility(widget, iter, TRUE);
+
+       tpath = gtk_tree_model_get_path(gtk_tree_view_get_model(widget), iter);
+       if (center && vis != 0)
+               {
+               gtk_tree_view_scroll_to_cell(widget, tpath, NULL, TRUE, 0.5, 0.0);
+               }
+       else if (vis < 0)
+               {
+               gtk_tree_view_scroll_to_cell(widget, tpath, NULL, TRUE, 0.0, 0.0);
+               }
+       else if (vis > 0)
+               {
+               gtk_tree_view_scroll_to_cell(widget, tpath, NULL, TRUE, 1.0, 0.0);
+               }
+       gtk_tree_path_free(tpath);
+
+       return vis;
+}
+
+gint tree_view_move_cursor_away(GtkTreeView *widget, GtkTreeIter *iter, gint only_selected)
+{
+       GtkTreeModel *store;
+       GtkTreePath *tpath;
+       GtkTreePath *fpath;
+       gint move = FALSE;
+
+       if (!iter) return FALSE;
+
+       store = gtk_tree_view_get_model(widget);
+       tpath = gtk_tree_model_get_path(store, iter);
+       gtk_tree_view_get_cursor(widget, &fpath, NULL);
+
+       if (fpath && gtk_tree_path_compare(tpath, fpath) == 0)
+               {
+               GtkTreeSelection *selection;
+
+               selection = gtk_tree_view_get_selection(widget);
+
+               if (!only_selected ||
+                   gtk_tree_selection_path_is_selected(selection, tpath))
+                       {
+                       GtkTreeIter current;
+
+                       current = *iter;
+                       if (gtk_tree_model_iter_next(store, &current))
+                               {
+                               gtk_tree_path_next(tpath);
+                               move = TRUE;
+                               }
+                       else if (gtk_tree_path_prev(tpath) &&
+                                gtk_tree_model_get_iter(store, &current, tpath))
+                               {
+                               move = TRUE;
+                               }
+
+                       if (move)
+                               {
+                               gtk_tree_view_set_cursor(widget, tpath, NULL, FALSE);
+                               }
+                       }
+               }
+
+       gtk_tree_path_free(tpath);
+       if (fpath) gtk_tree_path_free(fpath);
+
+       return move;
+}
+
+gint tree_path_to_row(GtkTreePath *tpath)
+{
+       gint *indices;
+                                                                                                                    
+       indices = gtk_tree_path_get_indices(tpath);
+       if (indices) return indices[0];
+                                                                                                                    
+       return -1;
+}
+
+
+/*
+ *-------------------------------------------------------------------
+ * color utilities
+ *-------------------------------------------------------------------
+ */
+
+void shift_color(GdkColor *src, gshort val, gint direction)
+{
+       gshort cs;
+
+       if (val == -1)
+               {
+               val = STYLE_SHIFT_STANDARD;
+               }
+       else
+               {
+               val = CLAMP(val, 1, 100);
+               }
+       cs = 0xffff / 100 * val;
+
+       /* up or down ? */
+       if (direction < 0 ||
+           (direction == 0 &&((gint)src->red + (gint)src->green + (gint)src->blue) / 3 > 0xffff / 2))
+               {
+               src->red = MAX(0 , src->red - cs);
+               src->green = MAX(0 , src->green - cs);
+               src->blue = MAX(0 , src->blue - cs);
+               }
+       else
+               {
+               src->red = MIN(0xffff, src->red + cs);
+               src->green = MIN(0xffff, src->green + cs);
+               src->blue = MIN(0xffff, src->blue + cs);
+               }
+}
+
+/* darkens or lightens a style's color for given state
+ * esp. useful for alternating dark/light in (c)lists
+ */
+void style_shift_color(GtkStyle *style, GtkStateType type, gshort shift_value, gint direction)
+{
+       if (!style) return;
+
+       shift_color(&style->base[type], shift_value, direction);
+       shift_color(&style->bg[type], shift_value, direction);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * auto scroll by mouse position
+ *-------------------------------------------------------------------
+ */
+
+#define AUTO_SCROLL_DEFAULT_SPEED 100
+#define AUTO_SCROLL_DEFAULT_REGION 20
+
+typedef struct _AutoScrollData AutoScrollData;
+struct _AutoScrollData
+{
+       gint timer_id;
+       gint region_size;
+       GtkWidget *widget;
+       GtkAdjustment *adj;
+       gint max_step;
+
+       gint (*notify_func)(GtkWidget *, gint, gint, gpointer);
+       gpointer notify_data;
+};
+
+void widget_auto_scroll_stop(GtkWidget *widget)
+{
+       AutoScrollData *sd;
+
+       sd = g_object_get_data(G_OBJECT(widget), "autoscroll");
+       if (!sd) return;
+       g_object_set_data(G_OBJECT(widget), "autoscroll", NULL);
+
+       if (sd->timer_id != -1) g_source_remove(sd->timer_id);
+       g_free(sd);
+}
+
+static gint widget_auto_scroll_cb(gpointer data)
+{
+       AutoScrollData *sd = data;
+       GdkWindow *window;
+       gint x, y;
+       gint w, h;
+       gint amt = 0;
+
+       if (sd->max_step < sd->region_size)
+               {
+               sd->max_step = MIN(sd->region_size, sd->max_step + 2);
+               }
+
+       window = sd->widget->window;
+       gdk_window_get_pointer(window, &x, &y, NULL);
+       gdk_drawable_get_size(window, &w, &h);
+
+       if (x < 0 || x >= w || y < 0 || y >= h)
+               {
+               sd->timer_id = -1;
+               widget_auto_scroll_stop(sd->widget);
+               return FALSE;
+               }
+
+       if (h < sd->region_size * 3)
+               {
+               /* height is cramped, nicely divide into three equal regions */
+               if (y < h / 3 || y > h / 3 * 2)
+                       {
+                       amt = (y < h / 2) ? 0 - ((h / 2) - y) : y - (h / 2);
+                       }
+               }
+       else if (y < sd->region_size)
+               {
+               amt = 0 - (sd->region_size - y);
+               }
+       else if (y >= h - sd->region_size)
+               {
+               amt = y - (h - sd->region_size);
+               }
+
+       if (amt != 0)
+               {
+               amt = CLAMP(amt, 0 - sd->max_step, sd->max_step);
+
+               if (sd->adj->value != CLAMP(sd->adj->value + amt, sd->adj->lower, sd->adj->upper - sd->adj->page_size))
+                       {
+                       /* only notify when scrolling is needed */
+                       if (sd->notify_func && !sd->notify_func(sd->widget, x, y, sd->notify_data))
+                               {
+                               sd->timer_id = -1;
+                               widget_auto_scroll_stop(sd->widget);
+                               return FALSE;
+                               }
+
+                       gtk_adjustment_set_value(sd->adj,
+                               CLAMP(sd->adj->value + amt, sd->adj->lower, sd->adj->upper - sd->adj->page_size));
+                       }
+               }
+
+       return TRUE;
+}
+
+gint widget_auto_scroll_start(GtkWidget *widget, GtkAdjustment *v_adj, gint scroll_speed, gint region_size,
+                             gint (*notify_func)(GtkWidget *widget, gint x, gint y, gpointer data), gpointer notify_data)
+{
+       AutoScrollData *sd;
+
+       if (!widget || !v_adj) return 0;
+       if (g_object_get_data(G_OBJECT(widget), "autoscroll")) return 0;
+       if (scroll_speed < 1) scroll_speed = AUTO_SCROLL_DEFAULT_SPEED;
+       if (region_size < 1) region_size = AUTO_SCROLL_DEFAULT_REGION;
+
+       sd = g_new0(AutoScrollData, 1);
+       sd->widget = widget;
+       sd->adj = v_adj;
+       sd->region_size = region_size;
+       sd->max_step = 1;
+       sd->timer_id = g_timeout_add(scroll_speed, widget_auto_scroll_cb, sd);
+
+       sd->notify_func = notify_func;
+       sd->notify_data = notify_data;
+
+       g_object_set_data(G_OBJECT(widget), "autoscroll", sd);
+
+       return scroll_speed;
+}
+
+
+/*
+ *-------------------------------------------------------------------
+ * GList utils
+ *-------------------------------------------------------------------
+ */
+
+GList *uig_list_insert_link(GList *list, GList *link, gpointer data)
+{
+       GList *new_list;
+
+       if (!list || link == list) return g_list_prepend(list, data);
+       if (!link) return g_list_append(list, data);
+
+       new_list = g_list_alloc ();
+       new_list->data = data;
+
+       if (link->prev)
+               {
+               link->prev->next = new_list;
+               new_list->prev = link->prev;
+               }
+       else
+               {
+               list = new_list;
+               }
+       link->prev = new_list;
+       new_list->next = link;
+
+       return list;
+}
+
+GList *uig_list_insert_list(GList *parent, GList *insert_link, GList *list)
+{
+       GList *end;
+
+       if (!insert_link) return g_list_concat(parent, list);
+       if (insert_link == parent) return g_list_concat(list, parent);
+       if (!parent) return list;
+       if (!list) return parent;
+
+       end  = g_list_last(list);
+
+       if (insert_link->prev) insert_link->prev->next = list;
+       list->prev = insert_link->prev;
+       insert_link->prev = end;
+       end->next = insert_link;
+
+       return parent;
+}
diff --git a/src/ui_tree_edit.h b/src/ui_tree_edit.h
new file mode 100644 (file)
index 0000000..0b2400a
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef UI_TREE_EDIT_H
+#define UI_TREE_EDIT_H
+
+
+typedef struct _TreeEditData TreeEditData;
+struct _TreeEditData
+{
+       GtkWidget *window;
+       GtkWidget *entry;
+
+       gchar *old_name;
+       gchar *new_name;
+
+       gint (*edit_func)(TreeEditData *ted, const gchar *oldname, const gchar *newname, gpointer data);
+       gpointer edit_data;
+
+       GtkTreeView *tree;
+       GtkTreePath *path;
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *cell;
+};
+
+
+/*
+ * edit_func: return TRUE if rename successful, FALSE on failure.
+ */
+gint tree_edit_by_path(GtkTreeView *tree, GtkTreePath *tpath, gint column, const gchar *text,
+                      gint (*edit_func)(TreeEditData *, const gchar *, const gchar *, gpointer), gpointer data);
+
+
+/* returns location of cell in screen coordinates */
+gint tree_view_get_cell_origin(GtkTreeView *widget, GtkTreePath *tpath, gint column, gint text_cell_only,
+                              gint *x, gint *y, gint *width, gint *height);
+/* similar to above, but limits the returned area to that of the tree window */
+void tree_view_get_cell_clamped(GtkTreeView *widget, GtkTreePath *tpath, gint column, gint text_cell_only,
+                              gint *x, gint *y, gint *width, gint *height);
+
+/* return 0 = row visible, -1 = row is above, 1 = row is below visible region
+ * if fully_visible is TRUE, the bahavior changes to return -1/1 if _any_ part of the cell is out of view */
+gint tree_view_row_get_visibility(GtkTreeView *widget, GtkTreeIter *iter, gint fully_visible);
+
+/* scrolls to make row visible, if necessary
+ * return is same as above (before the scroll)
+ */
+gint tree_view_row_make_visible(GtkTreeView *widget, GtkTreeIter *iter, gint center);
+
+/* if iter is location of cursor, moves cursor to nearest row */
+gint tree_view_move_cursor_away(GtkTreeView *widget, GtkTreeIter *iter, gint only_selected);
+
+/* utility to return row position of given GtkTreePath
+ */
+gint tree_path_to_row(GtkTreePath *tpath);
+
+
+/* shifts a GdkColor values lighter or darker
+ * val is percent from 1 to 100, or -1 for default (usually 10%)
+ * direction is -1 darker, 0 auto, 1 lighter
+ */
+void shift_color(GdkColor *src, gshort val, gint direction);
+
+/*
+ * Shifts a style's color for given state
+ * Useful for alternating dark/light rows in lists.
+ *
+ * shift_value is 1 to 100, representing the percent of the shift.
+ */
+void style_shift_color(GtkStyle *style, GtkStateType type, gshort shift_value, gint direction);
+
+/*
+ * The standard shift percent for alternating list row colors
+ */
+#define STYLE_SHIFT_STANDARD 10
+
+/*
+ * auto scroll, set scroll_speed or region_size to -1 to their respective the defaults
+ * notify_func will be called before a scroll, return FALSE to turn off autoscroll
+ */
+gint widget_auto_scroll_start(GtkWidget *widget, GtkAdjustment *v_adj, gint scroll_speed, gint region_size,
+                             gint (*notify_func)(GtkWidget *widget, gint x, gint y, gpointer data), gpointer notify_data);
+void widget_auto_scroll_stop(GtkWidget *widget);
+
+
+/*
+ * Various g_list utils, do not really fit anywhere, so they are here.
+ */
+GList *uig_list_insert_link(GList *list, GList *link, gpointer data);
+GList *uig_list_insert_list(GList *parent, GList *insert_link, GList *list);
+
+
+#endif
+
diff --git a/src/ui_utildlg.c b/src/ui_utildlg.c
new file mode 100644 (file)
index 0000000..4b2a00c
--- /dev/null
@@ -0,0 +1,454 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+#include "intl.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <gtk/gtk.h>
+
+#include <gdk/gdkkeysyms.h> /* for keyboard values */
+
+#include "ui_utildlg.h"
+
+#include "ui_fileops.h"
+#include "ui_misc.h"
+#include "ui_pathsel.h"
+#include "ui_tabcomp.h"
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * generic dialog
+ *-----------------------------------------------------------------------------
+ */ 
+
+void generic_dialog_close(GenericDialog *gd)
+{
+       gtk_widget_destroy(gd->dialog);
+       g_free(gd);
+}
+
+static void generic_dialog_click_cb(GtkWidget *widget, gpointer data)
+{
+       GenericDialog *gd = data;
+       void (*func)(GenericDialog *, gpointer);
+       gint auto_close;
+
+       func = g_object_get_data(G_OBJECT(widget), "dialog_function");
+       auto_close = gd->auto_close;
+
+       if (func) func(gd, gd->data);
+       if (auto_close) generic_dialog_close(gd);
+}
+
+static gint generic_dialog_default_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       GenericDialog *gd = data;
+
+       if (event->keyval == GDK_Return && GTK_WIDGET_HAS_FOCUS(widget)
+           && gd->default_cb)
+               {
+               gint auto_close;
+
+               auto_close = gd->auto_close;
+               gd->default_cb(gd, gd->data);
+               if (auto_close) generic_dialog_close(gd);
+
+               return TRUE;
+               }
+       return FALSE;
+}
+
+void generic_dialog_attach_default(GenericDialog *gd, GtkWidget *widget)
+{
+       if (!gd || !widget) return;
+       g_signal_connect(G_OBJECT(widget), "key_press_event",
+                        G_CALLBACK(generic_dialog_default_key_press_cb), gd);
+}
+
+static gint generic_dialog_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       GenericDialog *gd = data;
+
+       if (event->keyval == GDK_Escape)
+               {
+               if (gd->cancel_cb) gd->cancel_cb(gd, gd->data);
+               if (gd->auto_close) generic_dialog_click_cb(widget, data);
+               return TRUE;
+               }
+       return FALSE;
+}
+
+static gint generic_dialog_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
+{
+       GenericDialog *gd = data;
+       gint auto_close;
+
+       auto_close = gd->auto_close;
+
+       if (gd->cancel_cb) gd->cancel_cb(gd, gd->data);
+       if (auto_close) generic_dialog_close(gd);
+
+       return TRUE;
+}
+
+static void generic_dialog_show_cb(GtkWidget *widget, gpointer data)
+{
+       GenericDialog *gd = data;
+       if (gd->cancel_button)
+               {
+               gtk_box_reorder_child(GTK_BOX(gd->hbox), gd->cancel_button, -1);
+               }
+
+       g_signal_handlers_disconnect_by_func(G_OBJECT(widget),
+                                            G_CALLBACK(generic_dialog_show_cb), gd);
+}
+
+gint generic_dialog_get_alternative_button_order(GtkWidget *widget)
+{
+       GtkSettings *settings;
+       GObjectClass *klass;
+       gint alternative_order = FALSE;
+
+       settings = gtk_settings_get_for_screen(gtk_widget_get_screen(widget));
+       klass = G_OBJECT_CLASS(GTK_SETTINGS_GET_CLASS(settings));
+       if (g_object_class_find_property(klass, "gtk-alternative-button-order"))
+               {
+               g_object_get(settings, "gtk-alternative-button-order", &alternative_order, NULL);
+               }
+
+       return alternative_order;
+}
+
+GtkWidget *generic_dialog_add_button(GenericDialog *gd, const gchar *stock_id, const gchar *text,
+                                    void (*func_cb)(GenericDialog *, gpointer), gint is_default)
+{
+       GtkWidget *button;
+       gint alternative_order;
+
+       button = pref_button_new(NULL, stock_id, text, FALSE,
+                                G_CALLBACK(generic_dialog_click_cb), gd);
+
+       GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+       g_object_set_data(G_OBJECT(button), "dialog_function", func_cb);
+
+       gtk_container_add(GTK_CONTAINER(gd->hbox), button);
+
+       alternative_order = generic_dialog_get_alternative_button_order(gd->hbox);
+
+       if (is_default)
+               {
+               gtk_widget_grab_default(button);
+               gtk_widget_grab_focus(button);
+               gd->default_cb = func_cb;
+
+               if (!alternative_order) gtk_box_reorder_child(GTK_BOX(gd->hbox), button, -1);
+               }
+       else
+               {
+               if (!alternative_order) gtk_box_reorder_child(GTK_BOX(gd->hbox), button, 0);
+               }
+
+       gtk_widget_show(button);
+
+       return button;
+}
+
+GtkWidget *generic_dialog_add_message(GenericDialog *gd, const gchar *icon_stock_id,
+                                     const gchar *heading, const gchar *text)
+{
+       GtkWidget *hbox;
+       GtkWidget *vbox;
+       GtkWidget *label;
+
+       hbox = pref_box_new(gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+       if (icon_stock_id)
+               {
+               GtkWidget *image;
+
+               image = gtk_image_new_from_stock(icon_stock_id, GTK_ICON_SIZE_DIALOG);
+               gtk_misc_set_alignment(GTK_MISC(image), 0.5, 0.0);
+               gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
+               gtk_widget_show(image);
+               }
+
+       vbox = pref_box_new(hbox, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_SPACE);
+       if (heading)
+               {
+               label = pref_label_new(vbox, heading);
+               pref_label_bold(label, TRUE, TRUE);
+               gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+               }
+       if (text)
+               {
+               label = pref_label_new(vbox, text);
+               gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+               }
+
+       return vbox;
+}
+
+static void generic_dialog_setup(GenericDialog *gd,
+                                const gchar *title,
+                                const gchar *wmclass, const gchar *wmsubclass,
+                                GtkWidget *parent, gint auto_close,
+                                void (*cancel_cb)(GenericDialog *, gpointer), gpointer data)
+{
+       GtkWidget *vbox;
+
+       gd->auto_close = auto_close;
+       gd->data = data;
+       gd->cancel_cb = cancel_cb;
+
+       gd->dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+       gtk_window_set_type_hint(GTK_WINDOW(gd->dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
+       gtk_window_set_wmclass(GTK_WINDOW(gd->dialog), wmsubclass, wmclass);
+       if (parent)
+               {
+               GtkWindow *window = NULL;
+
+               if (GTK_IS_WINDOW(parent))
+                       {
+                       window = GTK_WINDOW(parent);
+                       }
+               else
+                       {
+                       GtkWidget *top;
+
+                       top = gtk_widget_get_toplevel(parent);
+                       if (GTK_IS_WINDOW(top) && GTK_WIDGET_TOPLEVEL(top)) window = GTK_WINDOW(top);
+                       }
+
+               if (window) gtk_window_set_transient_for(GTK_WINDOW(gd->dialog), window);
+               }
+
+       g_signal_connect(G_OBJECT(gd->dialog), "delete_event",
+                        G_CALLBACK(generic_dialog_delete_cb), gd);
+       g_signal_connect(G_OBJECT(gd->dialog), "key_press_event",
+                        G_CALLBACK(generic_dialog_key_press_cb), gd);
+
+       gtk_window_set_resizable(GTK_WINDOW(gd->dialog), TRUE);
+       gtk_window_set_title(GTK_WINDOW (gd->dialog), title);
+       gtk_container_set_border_width(GTK_CONTAINER(gd->dialog), PREF_PAD_BORDER);
+
+       vbox = gtk_vbox_new(FALSE, PREF_PAD_BUTTON_SPACE);
+       gtk_container_add(GTK_CONTAINER(gd->dialog), vbox);
+       gtk_widget_show(vbox);
+
+       gd->vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+       gtk_box_pack_start(GTK_BOX(vbox), gd->vbox, TRUE, TRUE, 0);
+       gtk_widget_show(gd->vbox);
+
+       gd->hbox = gtk_hbutton_box_new();
+       gtk_button_box_set_layout(GTK_BUTTON_BOX(gd->hbox), GTK_BUTTONBOX_END);
+       gtk_box_set_spacing(GTK_BOX(gd->hbox), PREF_PAD_BUTTON_GAP);
+       gtk_box_pack_start(GTK_BOX(vbox), gd->hbox, FALSE, FALSE, 0);
+       gtk_widget_show(gd->hbox);
+
+       if (gd->cancel_cb)
+               {
+               gd->cancel_button = generic_dialog_add_button(gd, GTK_STOCK_CANCEL, NULL, gd->cancel_cb, TRUE);
+               }
+       else
+               {
+               gd->cancel_button = NULL;
+               }
+
+       if (generic_dialog_get_alternative_button_order(gd->hbox))
+               {
+               g_signal_connect(G_OBJECT(gd->dialog), "show",
+                                G_CALLBACK(generic_dialog_show_cb), gd);
+               }
+
+       gd->default_cb = NULL;
+}
+
+GenericDialog *generic_dialog_new(const gchar *title,
+                                 const gchar *wmclass, const gchar *wmsubclass,
+                                 GtkWidget *parent, gint auto_close,
+                                 void (*cancel_cb)(GenericDialog *, gpointer), gpointer data)
+{
+       GenericDialog *gd;
+
+       gd = g_new0(GenericDialog, 1);
+       generic_dialog_setup(gd, title, wmclass, wmsubclass,
+                            parent, auto_close, cancel_cb, data);
+       return gd;
+}
+/*
+ *-----------------------------------------------------------------------------
+ * simple warning dialog
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void warning_dialog_ok_cb(GenericDialog *gd, gpointer data)
+{
+       /* no op */
+}
+
+GenericDialog *warning_dialog(const gchar *heading, const gchar *text,
+                             const gchar *icon_stock_id, GtkWidget *parent)
+{
+       GenericDialog *gd;
+
+       gd = generic_dialog_new(heading, PACKAGE, "warning", parent, TRUE, NULL, NULL);
+       generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, warning_dialog_ok_cb, TRUE);
+
+       generic_dialog_add_message(gd, icon_stock_id, heading, text);
+
+       gtk_widget_show(gd->dialog);
+
+       return gd;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * generic file ops dialog routines
+ *-----------------------------------------------------------------------------
+ */ 
+
+void file_dialog_close(FileDialog *fd)
+{
+       g_free(fd->source_path);
+       g_free(fd->dest_path);
+       if (fd->source_list) path_list_free(fd->source_list);
+
+       generic_dialog_close(GENERIC_DIALOG(fd));
+}
+
+FileDialog *file_dialog_new(const gchar *title,
+                           const gchar *wmclass, const gchar *wmsubclass,
+                           GtkWidget *parent,
+                           void (*cancel_cb)(FileDialog *, gpointer), gpointer data)
+{
+       FileDialog *fd = NULL;
+
+       fd = g_new0(FileDialog, 1);
+
+       generic_dialog_setup(GENERIC_DIALOG(fd), title,
+                            wmclass, wmsubclass, parent, FALSE,
+                            (void *)cancel_cb, data);
+
+       return fd;
+}
+
+GtkWidget *file_dialog_add_button(FileDialog *fd, const gchar *stock_id, const gchar *text,
+                                 void (*func_cb)(FileDialog *, gpointer), gint is_default)
+{
+       return generic_dialog_add_button(GENERIC_DIALOG(fd), stock_id, text,
+                                        (void *)func_cb, is_default);
+}
+
+static void file_dialog_entry_cb(GtkWidget *widget, gpointer data)
+{
+       FileDialog *fd = data;
+       g_free(fd->dest_path);
+       fd->dest_path = remove_trailing_slash(gtk_entry_get_text(GTK_ENTRY(fd->entry)));
+}
+
+static void file_dialog_entry_enter_cb(const gchar *path, gpointer data)
+{
+       GenericDialog *gd = data;
+
+       file_dialog_entry_cb(NULL, data);
+
+       if (gd->default_cb) gd->default_cb(gd, gd->data);
+}
+
+void file_dialog_add_path_widgets(FileDialog *fd, const gchar *default_path, const gchar *path,
+                                 const gchar *history_key, const gchar *filter, const gchar *filter_desc)
+{
+       GtkWidget *tabcomp;
+       GtkWidget *list;
+
+       if (fd->entry) return;
+
+       tabcomp = tab_completion_new_with_history(&fd->entry, NULL,
+                 history_key, -1, file_dialog_entry_enter_cb, fd);
+       gtk_box_pack_end(GTK_BOX(GENERIC_DIALOG(fd)->vbox), tabcomp, FALSE, FALSE, 0);
+       generic_dialog_attach_default(GENERIC_DIALOG(fd), fd->entry);
+       gtk_widget_show(tabcomp);
+
+       if (path && path[0] == '/')
+               {
+               fd->dest_path = g_strdup(path);
+               }
+       else
+               {
+               const gchar *base;
+
+               base = tab_completion_set_to_last_history(fd->entry);
+
+               if (!base) base = default_path;
+               if (!base) base = homedir();
+
+               if (path)
+                       {
+                       fd->dest_path = concat_dir_and_file(base, path);
+                       }
+               else
+                       {
+                       fd->dest_path = g_strdup(base);
+                       }
+               }
+
+       list = path_selection_new_with_files(fd->entry, fd->dest_path, filter, filter_desc);
+       path_selection_add_select_func(fd->entry, file_dialog_entry_enter_cb, fd);
+       gtk_box_pack_end(GTK_BOX(GENERIC_DIALOG(fd)->vbox), list, TRUE, TRUE, 0);
+       gtk_widget_show(list);
+
+       gtk_widget_grab_focus(fd->entry);
+       if (fd->dest_path)
+               {
+               gtk_entry_set_text(GTK_ENTRY(fd->entry), fd->dest_path);
+               gtk_editable_set_position(GTK_EDITABLE(fd->entry), strlen(fd->dest_path));
+               }
+
+       g_signal_connect(G_OBJECT(fd->entry), "changed",
+                        G_CALLBACK(file_dialog_entry_cb), fd);
+}
+
+void file_dialog_add_filter(FileDialog *fd, const gchar *filter, const gchar *filter_desc, gint set)
+{
+       if (!fd->entry) return;
+       path_selection_add_filter(fd->entry, filter, filter_desc, set);
+}
+
+void file_dialog_clear_filter(FileDialog *fd)
+{
+       if (!fd->entry) return;
+       path_selection_clear_filter(fd->entry);
+}
+
+void file_dialog_sync_history(FileDialog *fd, gint dir_only)
+{
+       if (!fd->dest_path) return;
+
+       if (!dir_only ||
+           (dir_only && isdir(fd->dest_path)) )
+               {
+               tab_completion_append_to_history(fd->entry, fd->dest_path);
+               }
+       else
+               {
+               gchar *buf = remove_level_from_path(fd->dest_path);
+               tab_completion_append_to_history(fd->entry, buf);
+               g_free(buf);
+               }
+}
+
+
diff --git a/src/ui_utildlg.h b/src/ui_utildlg.h
new file mode 100644 (file)
index 0000000..960ffc8
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * (SLIK) SimpLIstic sKin functions
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifndef UI_UTILDLG_H
+#define UI_UTILDLG_H
+
+
+#define GENERIC_DIALOG(gd) ((GenericDialog *)gd)
+
+typedef struct _GenericDialog GenericDialog;
+struct _GenericDialog
+{
+       GtkWidget *dialog;      /* window */
+       GtkWidget *vbox;        /* place to add widgets */
+
+       GtkWidget *hbox;        /* button hbox */
+
+       gint auto_close;
+
+       void (*default_cb)(GenericDialog *, gpointer);
+       void (*cancel_cb)(GenericDialog *, gpointer);
+       gpointer data;
+
+       /* private */
+       GtkWidget *cancel_button;
+};
+
+typedef struct _FileDialog FileDialog;
+struct _FileDialog
+{
+       GenericDialog gd;
+
+       GtkWidget *entry;
+
+       gint type;
+       gint multiple_files;
+
+       gchar *source_path;
+       GList *source_list;
+
+       gchar *dest_path;
+};
+
+
+/* When parent is not NULL, the dialog is set as a transient of the window containing parent */
+GenericDialog *generic_dialog_new(const gchar *title,
+                                 const gchar *wmclass, const gchar *wmsubclass,
+                                 GtkWidget *parent, gint auto_close,
+                                 void (*cancel_cb)(GenericDialog *, gpointer), gpointer data);
+void generic_dialog_close(GenericDialog *gd);
+
+GtkWidget *generic_dialog_add_button(GenericDialog *gd, const gchar *stock_id, const gchar *text,
+                                    void (*func_cb)(GenericDialog *, gpointer), gint is_default);
+void generic_dialog_attach_default(GenericDialog *gd, GtkWidget *widget);
+
+GtkWidget *generic_dialog_add_message(GenericDialog *gd, const gchar *icon_stock_id,
+                                     const gchar *heading, const gchar *text);
+
+gint generic_dialog_get_alternative_button_order(GtkWidget *widget);
+
+GenericDialog *warning_dialog(const gchar *heading, const gchar *text,
+                             const gchar *icon_stock_id, GtkWidget *parent);
+
+FileDialog *file_dialog_new(const gchar *title,
+                           const gchar *wmclass, const gchar *wmsubclass,
+                           GtkWidget *parent,
+                           void (*cancel_cb)(FileDialog *, gpointer), gpointer data);
+void file_dialog_close(FileDialog *fd);
+
+GtkWidget *file_dialog_add_button(FileDialog *fd, const gchar *stock_id, const gchar *text,
+                                 void (*func_cb)(FileDialog *, gpointer), gint is_default);
+
+/* default_path is default base directory, and is only used if no history
+ *  exists for history_key (HOME is used if default_path is NULL).
+ * path can be a full path or only a file name. If name only, appended to
+ *  the default_path or the last history (see default_path)
+ */
+void file_dialog_add_path_widgets(FileDialog *fd, const gchar *default_path, const gchar *path,
+                                 const gchar *history_key, const gchar *filter, const gchar *filter_desc);
+
+void file_dialog_add_filter(FileDialog *fd, const gchar *filter, const gchar *filter_desc, gint set);
+void file_dialog_clear_filter(FileDialog *fd);
+void file_dialog_sync_history(FileDialog *fd, gint dir_only);
+
+
+#endif
+
diff --git a/src/utildlg.c b/src/utildlg.c
deleted file mode 100644 (file)
index 73f45af..0000000
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- * GQview image viewer
- * (C)2000 John Ellis
- *
- * Author: John Ellis
- *
- */
-
-#include "gqview.h"
-#include "image.h"
-
-static void warning_dialog_close(GtkWidget *w, gpointer data);
-static void warning_dialog_destroy(GtkWidget *w, GdkEvent *event, gpointer data);
-
-static void confirm_dialog_click_cb(GtkWidget *w, gpointer data);
-static void confirm_dialog_delete_cb(GtkWidget *w, GdkEvent *event, gpointer data);
-
-static void generic_dialog_delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data);
-
-
-/*
- *-----------------------------------------------------------------------------
- * warning dialog routines
- *-----------------------------------------------------------------------------
- */ 
-
-static void warning_dialog_close(GtkWidget *w, gpointer data)
-{
-       GtkWidget *warning_window = data;
-       gtk_widget_destroy(warning_window);
-}
-
-static void warning_dialog_destroy(GtkWidget *w, GdkEvent *event, gpointer data)
-{
-       warning_dialog_close(NULL, data);
-}
-
-void warning_dialog(gchar *title, gchar *message)
-{
-       GtkWidget *warning_window;
-       GtkWidget *hbox;
-       GtkWidget *vbox;
-       GtkWidget *label;
-       GtkWidget *button;
-
-       warning_window = gtk_window_new(GTK_WINDOW_DIALOG);
-       gtk_signal_connect (GTK_OBJECT (warning_window), "delete_event",(GtkSignalFunc) warning_dialog_destroy, warning_window);
-       gtk_window_set_policy (GTK_WINDOW(warning_window), FALSE, FALSE, TRUE);
-       gtk_window_set_title (GTK_WINDOW (warning_window), title);
-       gtk_container_border_width (GTK_CONTAINER (warning_window), 10);
-
-       vbox = gtk_vbox_new(FALSE, 5);
-       gtk_container_add(GTK_CONTAINER(warning_window),vbox);
-       gtk_widget_show(vbox);
-
-       label = gtk_label_new(message);
-       gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
-       gtk_widget_show(label);
-
-       label = gtk_hseparator_new();
-       gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
-       gtk_widget_show(label);
-
-       hbox = gtk_hbox_new(TRUE, 5);
-       gtk_container_add(GTK_CONTAINER(vbox),hbox);
-       gtk_widget_show(hbox);
-
-       button = gtk_button_new_with_label(_("     Ok     "));
-       gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) warning_dialog_close, warning_window);
-       gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,0);
-       gtk_widget_show(button);
-       
-       gtk_widget_show(warning_window);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * confirmation dialog
- *-----------------------------------------------------------------------------
- */ 
-
-static void confirm_dialog_click_cb(GtkWidget *w, gpointer data)
-{
-       ConfirmDialog *cd = data;
-       gtk_widget_destroy(cd->dialog);
-       g_free(cd);
-}
-
-static void confirm_dialog_delete_cb(GtkWidget *w, GdkEvent *event, gpointer data)
-{
-       ConfirmDialog *cd = data;
-       cd->cancel_cb(NULL, cd->data);
-       confirm_dialog_click_cb(w, data);
-}
-
-void confirm_dialog_add(ConfirmDialog *cd, gchar *text, void (*func_cb)(GtkWidget *, gpointer))
-{
-       GtkWidget *button;
-       button = gtk_button_new_with_label(text);
-       gtk_signal_connect(GTK_OBJECT(button), "clicked", func_cb, cd->data);
-       gtk_signal_connect(GTK_OBJECT(button), "clicked", confirm_dialog_click_cb, cd);
-       gtk_box_pack_end(GTK_BOX(cd->hbox), button, TRUE, TRUE, 0);
-       gtk_widget_grab_focus(button);
-       gtk_widget_show(button);
-}
-
-ConfirmDialog *confirm_dialog_new(gchar *title, gchar *message, void (*cancel_cb)(GtkWidget *, gpointer), gpointer data)
-{
-       ConfirmDialog *cd;
-       GtkWidget *vbox;
-       GtkWidget *label;
-
-       cd = g_new0(ConfirmDialog, 1);
-       cd->data = data;
-       cd->cancel_cb = cancel_cb;
-
-       cd->dialog = gtk_window_new(GTK_WINDOW_DIALOG);
-       gtk_signal_connect (GTK_OBJECT (cd->dialog), "delete_event", confirm_dialog_delete_cb, cd);
-       gtk_window_set_policy (GTK_WINDOW(cd->dialog), FALSE, FALSE, TRUE);
-       gtk_window_set_title (GTK_WINDOW (cd->dialog), title);
-       gtk_container_border_width (GTK_CONTAINER (cd->dialog), 10);
-
-       vbox = gtk_vbox_new(FALSE, 15);
-       gtk_container_add(GTK_CONTAINER(cd->dialog),vbox);
-       gtk_widget_show(vbox);
-
-       label = gtk_label_new(message);
-       gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
-       gtk_widget_show(label);
-
-       cd->util_hbox = gtk_hbox_new(FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(vbox), cd->util_hbox, TRUE, TRUE, 0);
-       gtk_widget_show(cd->util_hbox);
-
-       label = gtk_hseparator_new();
-       gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-       gtk_widget_show(label);
-
-       cd->hbox = gtk_hbox_new(TRUE, 15);
-       gtk_box_pack_start(GTK_BOX(vbox), cd->hbox, FALSE, FALSE, 0);
-       gtk_widget_show(cd->hbox);
-
-       gtk_widget_show(cd->dialog);
-
-       confirm_dialog_add(cd, _("Cancel"), cd->cancel_cb);
-       
-       return cd;
-}
-
-ConfirmDialog *confirm_dialog_new_with_image(gchar *title, gchar *message,
-                                            gchar *img_path1, gchar *img_path2,
-                                            void (*cancel_cb)(GtkWidget *, gpointer), gpointer data)
-{
-       ConfirmDialog *cd;
-       GtkWidget *vbox;
-       GtkWidget *label;
-       ImageWindow *image1;
-       ImageWindow *image2;
-
-       cd = confirm_dialog_new(title, message, cancel_cb, data);
-
-       gtk_widget_set_usize (cd->dialog, 600, 450);
-       gtk_window_set_policy (GTK_WINDOW(cd->dialog), FALSE, TRUE, FALSE);
-
-       gtk_box_set_homogeneous(GTK_BOX(cd->util_hbox), TRUE);
-
-       if (img_path1)
-               {
-               vbox = gtk_vbox_new(FALSE, 5);
-               gtk_box_pack_start(GTK_BOX(cd->util_hbox), vbox, TRUE, TRUE, 0);
-               gtk_widget_show(vbox);
-
-               image1 = image_area_new(NULL);
-               gtk_box_pack_start(GTK_BOX(vbox), image1->eventbox, TRUE, TRUE, 0);
-               image_area_set_image (image1, img_path1, ZOOM_RESET_ORIGINAL);
-               gtk_widget_show_all(image1->eventbox);
-               gtk_object_set_data_full(GTK_OBJECT(image1->eventbox), "image1", image1,
-                                        (GtkDestroyNotify)image_area_free);
-
-               label = gtk_label_new(img_path1);
-               gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-               gtk_widget_show(label);
-               }
-
-       if (img_path2)
-               {
-               vbox = gtk_vbox_new(FALSE, 5);
-               gtk_box_pack_start(GTK_BOX(cd->util_hbox), vbox, TRUE, TRUE, 0);
-               gtk_widget_show(vbox);
-
-               image2 = image_area_new(NULL);
-               gtk_box_pack_start(GTK_BOX(vbox), image2->eventbox, TRUE, TRUE, 0);
-               image_area_set_image (image2, img_path2, ZOOM_RESET_ORIGINAL);
-               gtk_widget_show_all(image2->eventbox);
-               gtk_object_set_data_full(GTK_OBJECT(image2->eventbox), "image2", image2,
-                                        (GtkDestroyNotify)image_area_free);
-
-               label = gtk_label_new(img_path2);
-               gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-               gtk_widget_show(label);
-               }
-
-       return cd;
-}
-
-/*
- *-----------------------------------------------------------------------------
- * generic file ops dialog routines
- *-----------------------------------------------------------------------------
- */ 
-
-void generic_dialog_close(GtkWidget *widget, gpointer data)
-{
-       FileDialog *fd = data;
-       if(fd->dialog) gtk_widget_destroy(fd->dialog);
-       g_free(fd->source_path);
-       g_free(fd->dest_path);
-       if (fd->source_list) free_selected_list(fd->source_list);
-       g_free(fd);
-}
-
-static void generic_dialog_delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
-{
-       generic_dialog_close(NULL, data);
-}
-
-FileDialog *generic_dialog_new(gchar *title, gchar *text, gchar *btn1, gchar *btn2,
-               void (*btn1_cb)(GtkWidget *, gpointer),
-               void (*btn2_cb)(GtkWidget *, gpointer))
-{
-       FileDialog *fd = NULL;
-       GtkWidget *button;
-       GtkWidget *hbox;
-       GtkWidget *label;
-
-       fd = g_new0(FileDialog, 1);
-
-       fd->dialog = gtk_window_new(GTK_WINDOW_DIALOG);
-       gtk_signal_connect (GTK_OBJECT (fd->dialog), "delete_event", (GtkSignalFunc)generic_dialog_delete_cb, fd);
-       gtk_window_set_policy (GTK_WINDOW(fd->dialog), FALSE, TRUE, FALSE);
-       gtk_window_set_title (GTK_WINDOW (fd->dialog), title);
-       gtk_container_border_width (GTK_CONTAINER (fd->dialog), 10);
-
-       fd->vbox = gtk_vbox_new(FALSE,5);
-       gtk_container_add (GTK_CONTAINER(fd->dialog), fd->vbox);
-       gtk_widget_show(fd->vbox);
-
-       if (text)
-               {
-               label = gtk_label_new(text);
-               gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0);
-               gtk_widget_show(label);
-               }
-       
-       if (btn1_cb || btn2_cb)
-               {
-               GtkWidget *sep;
-               hbox = gtk_hbox_new(TRUE, 15);
-               gtk_box_pack_end(GTK_BOX(fd->vbox), hbox, FALSE, FALSE, 5);
-               gtk_widget_show(hbox);
-
-               sep = gtk_hseparator_new();
-               gtk_box_pack_end(GTK_BOX(fd->vbox), sep, FALSE, FALSE, 0);
-               gtk_widget_show(sep);
-               }
-
-       if (btn1_cb)
-               {
-               button = gtk_button_new_with_label(btn1);
-               gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) btn1_cb, fd);
-               gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
-               gtk_widget_grab_focus(button);
-               gtk_widget_show(button);
-               }
-
-       if (btn2_cb)
-               {
-               button = gtk_button_new_with_label(btn2);
-               gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) btn2_cb, fd);
-               gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
-               gtk_widget_show(button);
-               }
-
-       gtk_widget_show(fd->dialog);
-       return fd;
-}
-
diff --git a/src/utildlg.h b/src/utildlg.h
deleted file mode 100644 (file)
index 0c5335f..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * GQview image viewer
- * (C)2000 John Ellis
- *
- * Author: John Ellis
- *
- */
-
-typedef struct _FileDialog FileDialog;
-struct _FileDialog
-{
-       gint type;
-       gint multiple_files;
-
-       GtkWidget *dialog;
-       GtkWidget *vbox;
-       GtkWidget *entry;
-
-       gchar *source_path;
-       GList *source_list;
-
-       gchar *dest_path;
-};
-
-typedef struct _ConfirmDialog ConfirmDialog;
-struct _ConfirmDialog
-{
-       GtkWidget *dialog;
-       GtkWidget *util_hbox;   /* place anything you want here */
-       GtkWidget *hbox;        /* buttons */
-       void (*cancel_cb)(GtkWidget *, gpointer);
-       gpointer data;
-};
-
-
-void warning_dialog(gchar *title, gchar *message);
-
-ConfirmDialog *confirm_dialog_new(gchar *title, gchar *message, void (*cancel_cb)(GtkWidget *, gpointer), gpointer data);
-ConfirmDialog *confirm_dialog_new_with_image(gchar *title, gchar *message,
-                                            gchar *img_path1, gchar *img_path2,
-                                            void (*cancel_cb)(GtkWidget *, gpointer), gpointer data);
-
-void confirm_dialog_add(ConfirmDialog *cd, gchar *text, void (*func_cb)(GtkWidget *, gpointer));
-
-FileDialog *generic_dialog_new(gchar *title, gchar *text, gchar *btn1, gchar *btn2,
-               void (*btn1_cb)(GtkWidget *, gpointer),
-               void (*btn2_cb)(GtkWidget *, gpointer));
-void generic_dialog_close(GtkWidget *widget, gpointer data);
-
index 3f45ea4..99f04f5 100644 (file)
@@ -1,12 +1,86 @@
 /*
- * GQview image viewer
- * (C)2000 John Ellis
+ * GQview
+ * (C) 2004 John Ellis
  *
  * Author: John Ellis
  *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
  */
 
+
 #include "gqview.h"
+#include "utilops.h"
+
+
+#include "cache_maint.h"
+#include "collect.h"
+#include "dupe.h"
+#include "filelist.h"
+#include "image.h"
+#include "img-view.h"
+#include "layout.h"
+#include "search.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_misc.h"
+#include "ui_tabcomp.h"
+
+
+/*
+ *--------------------------------------------------------------------------
+ * call these when names change, files move, deleted, etc.
+ * so that any open windows are also updated
+ *--------------------------------------------------------------------------
+ */
+
+void file_maint_renamed(const gchar *source, const gchar *dest)
+{
+       cache_maint_moved(source, dest);
+       collection_maint_renamed(source, dest);
+
+       layout_maint_renamed(source, dest);
+       view_window_maint_moved(source, dest);
+       dupe_maint_renamed(source, dest);
+       search_maint_renamed(source, dest);
+}
+
+/* under most cases ignore_list should be NULL */
+void file_maint_removed(const gchar *path, GList *ignore_list)
+{
+       layout_maint_removed(path, ignore_list);
+       view_window_maint_removed(path, ignore_list);
+       dupe_maint_removed(path);
+       search_maint_removed(path);
+
+       collection_maint_removed(path);
+       cache_maint_removed(path);
+}
+
+/* special case for correct main window behavior */
+void file_maint_moved(const gchar *source, const gchar *dest, GList *ignore_list)
+{
+       cache_maint_moved(source, dest);
+       collection_maint_renamed(source, dest);
+
+       layout_maint_moved(source, dest, ignore_list);
+       view_window_maint_moved(source, dest);
+       dupe_maint_renamed(source, dest);
+       search_maint_renamed(source, dest);
+}
+
+void file_maint_copied(const gchar *source, const gchar *dest)
+{
+       cache_maint_copied(source, dest);
+}
+
+/*
+ *--------------------------------------------------------------------------
+ * The file manipulation dialogs
+ *--------------------------------------------------------------------------
+ */
+
 
 enum {
        DIALOG_NEW_DIR,
@@ -28,6 +102,16 @@ struct _FileDataMult
        gchar *source;
        gchar *dest;
        gint copy;
+
+       gint rename;
+       gint rename_auto;
+       gint rename_all;
+
+       GtkWidget *rename_box;
+       GtkWidget *rename_entry;
+       GtkWidget *rename_auto_box;
+
+       GtkWidget *yes_all_button;
 };
 
 typedef struct _FileDataSingle FileDataSingle;
@@ -37,52 +121,184 @@ struct _FileDataSingle
        gchar *source;
        gchar *dest;
        gint copy;
+
+       gint rename;
+       gint rename_auto;
+
+       GtkWidget *rename_box;
+       GtkWidget *rename_entry;
+       GtkWidget *rename_auto_box;
 };
 
-static FileDataMult *file_data_multiple_new(GList *source_list, gchar *dest, gint copy);
-static void file_data_multiple_free(FileDataMult *fdm);
-static void file_util_move_multiple(FileDataMult *fdm);
-static void file_util_move_multiple_ok_cb(GtkWidget *widget, gpointer data);
-static void file_util_move_multiple_all_cb(GtkWidget *widget, gpointer data);
-static void file_util_move_multiple_skip_cb(GtkWidget *widget, gpointer data);
-static void file_util_move_multiple_cancel_cb(GtkWidget *widget, gpointer data);
-static void file_util_move_multiple(FileDataMult *fdm);
+/*
+ *--------------------------------------------------------------------------
+ * Adds 1 or 2 images (if 2, side by side) to a GenericDialog
+ *--------------------------------------------------------------------------
+ */
 
-static FileDataSingle *file_data_single_new(gchar *source, gchar *dest, gint copy);
-static void file_data_single_free(FileDataSingle *fds);
-static void file_util_move_single_ok_cb(GtkWidget *widget, gpointer data);
-static void file_util_move_single(FileDataSingle *fds);
-static void file_util_move_single_cancel_cb(GtkWidget *widget, gpointer data);
-static void file_util_move_do(FileDialog *fd);
-static void file_util_move_check(FileDialog *fd);
-static void file_util_move_cb(GtkWidget *widget, gpointer data);
-static void file_util_move_enter_cb(gchar *path, gpointer data);
-static void file_util_move_completion_sync_cb(gchar *path, gpointer data);
-static void real_file_util_move(gchar *source_path, GList *source_list, gchar *dest_path, gint copy);
-
-static void file_util_delete_multiple_ok_cb(GtkWidget *w, gpointer data);
-static void file_util_delete_multiple_cancel_cb(GtkWidget *w, gpointer data);
-static void file_util_delete_multiple(GList *source_list);
-static void file_util_delete_ok_cb(GtkWidget *w, gpointer data);
-static void file_util_delete_cancel_cb(GtkWidget *w, gpointer data);
-static void file_util_delete_single(gchar *path);
-
-static void file_util_rename_multiple_ok_cb(GtkWidget *w, gpointer data);
-static void file_util_rename_multiple_cancel_cb(GtkWidget *w, gpointer data);
-static void file_util_rename_multiple(FileDialog *fd);
-static void file_util_rename_multiple_cb(GtkWidget *w, gpointer data);
-static void file_util_rename_multiple_select_cb(GtkWidget *clist,
-               gint row, gint column, GdkEventButton *bevent, gpointer data);
-static void file_util_rename_multiple_do(GList *source_list);
-
-static void file_util_rename_single_ok_cb(GtkWidget *w, gpointer data);
-static void file_util_rename_single_cancel_cb(GtkWidget *w, gpointer data);
-static void file_util_rename_single(FileDataSingle *fds);
-static void file_util_rename_single_cb(GtkWidget *w, gpointer data);
-static void file_util_rename_single_do(gchar *source_path);
+#define DIALOG_DEF_IMAGE_DIM_X 200
+#define DIALOG_DEF_IMAGE_DIM_Y 150
+
+static void generic_dialog_add_image(GenericDialog *gd, const gchar *path1, const gchar *header1,
+                                    const gchar *path2, const gchar *header2,
+                                    gint show_filename)
+{
+       ImageWindow *imd;
+       GtkWidget *hbox = NULL;
+       GtkWidget *vbox;
+       GtkWidget *label = NULL;
+
+       if (path2)
+               {
+               hbox = pref_box_new(gd->vbox, TRUE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+               }
 
-static void file_util_create_dir_do(gchar *source, gchar *path);
-static void file_util_create_dir_cb(GtkWidget *w, gpointer data);
+       /* image 1 */
+
+       vbox = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+       if (hbox)
+               {
+               GtkWidget *sep;
+
+               gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
+
+               sep = gtk_vseparator_new();
+               gtk_box_pack_start(GTK_BOX(hbox), sep, FALSE, FALSE, 0);
+               gtk_widget_show(sep);
+               }
+       else
+               {
+               gtk_box_pack_start(GTK_BOX(gd->vbox), vbox, TRUE, TRUE, PREF_PAD_GAP);
+               }
+       gtk_widget_show(vbox);
+
+       if (header1)
+               {
+               GtkWidget *head;
+
+               head = pref_label_new(vbox, header1);
+               pref_label_bold(head, TRUE, FALSE);
+               gtk_misc_set_alignment(GTK_MISC(head), 0.0, 0.5);
+               }
+
+       imd = image_new(FALSE);
+       gtk_widget_set_size_request(imd->widget, DIALOG_DEF_IMAGE_DIM_X, DIALOG_DEF_IMAGE_DIM_Y);
+       gtk_box_pack_start(GTK_BOX(vbox), imd->widget, TRUE, TRUE, 0);
+       image_change_path(imd, path1, 0.0);
+       gtk_widget_show(imd->widget);
+
+       if (show_filename)
+               {
+               label = pref_label_new(vbox, (path1 == NULL) ? "" : filename_from_path(path1));
+               }
+
+       /* only the first image is stored (for use in gd_image_set) */
+       g_object_set_data(G_OBJECT(gd->dialog), "img_image", imd);
+       g_object_set_data(G_OBJECT(gd->dialog), "img_label", label);
+               
+
+       /* image 2 */
+
+       if (hbox && path2)
+               {
+               vbox = pref_box_new(hbox, TRUE, GTK_ORIENTATION_VERTICAL, PREF_PAD_GAP);
+
+               if (header2)
+                       {
+                       GtkWidget *head;
+
+                       head = pref_label_new(vbox, header2);
+                       pref_label_bold(head, TRUE, FALSE);
+                       gtk_misc_set_alignment(GTK_MISC(head), 0.0, 0.5);
+                       }
+
+               imd = image_new(FALSE);
+               gtk_widget_set_size_request(imd->widget, DIALOG_DEF_IMAGE_DIM_X, DIALOG_DEF_IMAGE_DIM_Y);
+               gtk_box_pack_start(GTK_BOX(vbox), imd->widget, TRUE, TRUE, 0);
+               image_change_path(imd, path2, 0.0);
+               gtk_widget_show(imd->widget);
+
+               pref_label_new(vbox, filename_from_path(path2));
+               }
+}
+
+static void generic_dialog_image_set(GenericDialog *gd, const gchar *path)
+{
+       ImageWindow *imd;
+       GtkWidget *label;
+       
+       imd = g_object_get_data(G_OBJECT(gd->dialog), "img_image");
+       label = g_object_get_data(G_OBJECT(gd->dialog), "img_label");
+
+       if (!imd) return;
+
+       image_change_path(imd, path, 0.0);
+       if (label) gtk_label_set_text(GTK_LABEL(label), filename_from_path(path));
+}
+
+/*
+ *--------------------------------------------------------------------------
+ * Wrappers to aid in setting additional dialog properties (unde mouse, etc.)
+ *--------------------------------------------------------------------------
+ */
+
+GenericDialog *file_util_gen_dlg(const gchar *title,
+                                const gchar *wmclass, const gchar *wmsubclass,
+                                GtkWidget *parent, gint auto_close,
+                                void (*cancel_cb)(GenericDialog *, gpointer), gpointer data)
+{
+       GenericDialog *gd;
+
+       gd = generic_dialog_new(title, wmclass, wmsubclass, parent, auto_close, cancel_cb, data);
+       if (place_dialogs_under_mouse)
+               {
+               gtk_window_set_position(GTK_WINDOW(gd->dialog), GTK_WIN_POS_MOUSE);
+               }
+
+       return gd;
+}
+
+FileDialog *file_util_file_dlg(const gchar *title,
+                              const gchar *wmclass, const gchar *wmsubclass,
+                              GtkWidget *parent,
+                              void (*cancel_cb)(FileDialog *, gpointer), gpointer data)
+{
+       FileDialog *fd;
+
+       fd = file_dialog_new(title, wmclass, wmsubclass, parent, cancel_cb, data);
+       if (place_dialogs_under_mouse)
+               {
+               gtk_window_set_position(GTK_WINDOW(GENERIC_DIALOG(fd)->dialog), GTK_WIN_POS_MOUSE);
+               }
+
+       return fd;
+}
+
+/* this warning dialog is copied from SLIK's ui_utildg.c,
+ * because it does not have a mouse center option,
+ * and we must center it before show, implement it here.
+ */
+static void file_util_warning_dialog_ok_cb(GenericDialog *gd, gpointer data)
+{
+       /* no op */
+}
+
+GenericDialog *file_util_warning_dialog(const gchar *heading, const gchar *message,
+                                       const gchar *icon_stock_id, GtkWidget *parent)
+{
+       GenericDialog *gd;
+
+       gd = file_util_gen_dlg(heading, "GQview", "warning", parent, TRUE, NULL, NULL);
+       generic_dialog_add_message(gd, icon_stock_id, heading, message);
+       generic_dialog_add_button(gd, GTK_STOCK_OK, NULL, file_util_warning_dialog_ok_cb, TRUE);
+       if (place_dialogs_under_mouse)
+               {
+               gtk_window_set_position(GTK_WINDOW(gd->dialog), GTK_WIN_POS_MOUSE);
+               }
+       gtk_widget_show(gd->dialog);
+
+       return gd;
+}
 
 /*
  *--------------------------------------------------------------------------
@@ -94,7 +310,7 @@ static void file_util_create_dir_cb(GtkWidget *w, gpointer data);
  * Multi file move
  */
 
-static FileDataMult *file_data_multiple_new(GList *source_list, gchar *dest, gint copy)
+static FileDataMult *file_data_multiple_new(GList *source_list, const gchar *dest, gint copy)
 {
        FileDataMult *fdm = g_new0(FileDataMult, 1);
        fdm->confirm_all = FALSE;
@@ -111,131 +327,329 @@ static FileDataMult *file_data_multiple_new(GList *source_list, gchar *dest, gin
 
 static void file_data_multiple_free(FileDataMult *fdm)
 {
-       free_selected_list(fdm->source_list);
+       path_list_free(fdm->source_list);
        g_free(fdm->dest_base);
        g_free(fdm->dest);
        g_free(fdm);
 }
 
-static void file_util_move_multiple_ok_cb(GtkWidget *widget, gpointer data)
+static void file_util_move_multiple(FileDataMult *fdm);
+
+static void file_util_move_multiple_ok_cb(GenericDialog *gd, gpointer data)
 {
        FileDataMult *fdm = data;
+
        fdm->confirmed = TRUE;
+
+       if (fdm->rename_auto)
+               {
+               gchar *buf;
+
+               buf = unique_filename_simple(fdm->dest);
+               if (buf)
+                       {
+                       g_free(fdm->dest);
+                       fdm->dest = buf;
+                       }
+               else
+                       {
+                       /* unique failed? well, return to the overwrite prompt :( */
+                       fdm->confirmed = FALSE;
+                       }
+               }
+       else if (fdm->rename)
+               {
+               const gchar *name;
+
+               name = gtk_entry_get_text(GTK_ENTRY(fdm->rename_entry));
+               if (strlen(name) == 0 ||
+                   strcmp(name, filename_from_path(fdm->source)) == 0)
+                       {
+                       fdm->confirmed = FALSE;
+                       }
+               else
+                       {
+                       g_free(fdm->dest);
+                       fdm->dest = concat_dir_and_file(fdm->dest_base, name);
+                       fdm->confirmed = !isname(fdm->dest);
+                       }
+               }
+
        file_util_move_multiple(fdm);
 }
 
-static void file_util_move_multiple_all_cb(GtkWidget *widget, gpointer data)
+static void file_util_move_multiple_all_cb(GenericDialog *gd, gpointer data)
 {
        FileDataMult *fdm = data;
+
        fdm->confirm_all = TRUE;
+
+       if (fdm->rename_auto) fdm->rename_all = TRUE;
+
        file_util_move_multiple(fdm);
 }
 
-static void file_util_move_multiple_skip_cb(GtkWidget *widget, gpointer data)
+static void file_util_move_multiple_skip_cb(GenericDialog *gd, gpointer data)
 {
        FileDataMult *fdm = data;
+
        fdm->skip = TRUE;
+       fdm->confirmed = TRUE;
+
+       file_util_move_multiple(fdm);
+}
+
+static void file_util_move_multiple_skip_all_cb(GenericDialog *gd, gpointer data)
+{
+       FileDataMult *fdm = data;
+
+       fdm->skip = TRUE;
+       fdm->confirm_all = TRUE;
+       file_util_move_multiple(fdm);
+}
+
+static void file_util_move_multiple_continue_cb(GenericDialog *gd, gpointer data)
+{
+       FileDataMult *fdm = data;
+
+       fdm->confirmed = TRUE;
        file_util_move_multiple(fdm);
 }
 
-static void file_util_move_multiple_cancel_cb(GtkWidget *widget, gpointer data)
+static void file_util_move_multiple_cancel_cb(GenericDialog *gd, gpointer data)
 {
        FileDataMult *fdm = data;
+
        file_data_multiple_free(fdm);
 }
 
+/* rename option */
+
+static void file_util_move_multiple_rename_auto_cb(GtkWidget *widget, gpointer data)
+{
+       GenericDialog *gd = data;
+       FileDataMult *fdm;
+
+       fdm = gd->data;
+
+       fdm->rename_auto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+       gtk_widget_set_sensitive(fdm->rename_box, !fdm->rename_auto);
+       gtk_widget_set_sensitive(fdm->rename_entry, (!fdm->rename_auto && fdm->rename));
+
+       if (fdm->rename_auto)
+               {
+               gchar *preview;
+
+               preview = unique_filename_simple(fdm->dest);
+               if (preview) gtk_entry_set_text(GTK_ENTRY(fdm->rename_entry), filename_from_path(preview));
+               g_free(preview);
+               }
+
+       gtk_widget_set_sensitive(fdm->yes_all_button, (fdm->rename_auto || !fdm->rename));
+}
+
+static void file_util_move_multiple_rename_cb(GtkWidget *widget, gpointer data)
+{
+       GenericDialog *gd = data;
+       FileDataMult *fdm;
+
+       fdm = gd->data;
+
+       fdm->rename = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+       gtk_widget_set_sensitive(fdm->rename_entry, fdm->rename);
+       gtk_widget_set_sensitive(fdm->yes_all_button, !fdm->rename);
+
+       if (fdm->rename) gtk_widget_grab_focus(fdm->rename_entry);
+}
+
+static GenericDialog *file_util_move_multiple_confirm_dialog(FileDataMult *fdm)
+{
+       GenericDialog *gd;
+       GtkWidget *hbox;
+
+       gd = file_util_gen_dlg(_("Overwrite file"), "GQview", "dlg_confirm",
+                               NULL, TRUE,
+                               file_util_move_multiple_cancel_cb, fdm);
+
+       generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION,
+                                  _("Overwrite file?"),
+                                  _("Replace existing file with new file."));
+       pref_spacer(gd->vbox, 0);
+
+       generic_dialog_add_button(gd, GTK_STOCK_YES, _("_Overwrite"), file_util_move_multiple_ok_cb, TRUE);
+       fdm->yes_all_button = generic_dialog_add_button(gd, NULL, _("Overwrite _all"),
+                                                       file_util_move_multiple_all_cb, FALSE);
+       generic_dialog_add_button(gd, GTK_STOCK_GOTO_LAST, _("S_kip all"), file_util_move_multiple_skip_all_cb, FALSE);
+       generic_dialog_add_button(gd, GTK_STOCK_GO_FORWARD, _("_Skip"), file_util_move_multiple_skip_cb, FALSE);
+       generic_dialog_add_image(gd, fdm->dest, _("Existing file"), fdm->source, _("New file"), TRUE);
+
+       /* rename option */
+
+       fdm->rename = FALSE;
+       fdm->rename_all = FALSE;
+       fdm->rename_auto = FALSE;
+
+       hbox = pref_box_new(gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+
+       fdm->rename_auto_box = gtk_check_button_new_with_label(_("Auto rename"));
+       g_signal_connect(G_OBJECT(fdm->rename_auto_box), "clicked",
+                        G_CALLBACK(file_util_move_multiple_rename_auto_cb), gd);
+       gtk_box_pack_start(GTK_BOX(hbox), fdm->rename_auto_box, FALSE, FALSE, 0);
+       gtk_widget_show(fdm->rename_auto_box);
+
+       hbox = pref_box_new(gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+
+       fdm->rename_box = gtk_check_button_new_with_label(_("Rename"));
+       g_signal_connect(G_OBJECT(fdm->rename_box), "clicked",
+                        G_CALLBACK(file_util_move_multiple_rename_cb), gd);
+       gtk_box_pack_start(GTK_BOX(hbox), fdm->rename_box, FALSE, FALSE, 0);
+       gtk_widget_show(fdm->rename_box);
+
+       fdm->rename_entry = gtk_entry_new();
+       gtk_entry_set_text(GTK_ENTRY(fdm->rename_entry), filename_from_path(fdm->dest));
+       gtk_widget_set_sensitive(fdm->rename_entry, FALSE);
+       gtk_box_pack_start(GTK_BOX(hbox), fdm->rename_entry, TRUE, TRUE, 0);
+       gtk_widget_show(fdm->rename_entry);
+
+       return gd;
+}
+
 static void file_util_move_multiple(FileDataMult *fdm)
 {
        while (fdm->dest || fdm->source_next)
                {
+               gint success = FALSE;
+               gint skip_file = FALSE;
+
                if (!fdm->dest)
                        {
                        GList *work = fdm->source_next;
                        fdm->source = work->data;
-                       fdm->dest = g_strconcat(fdm->dest_base, "/", filename_from_path(fdm->source), NULL);
+                       fdm->dest = concat_dir_and_file(fdm->dest_base, filename_from_path(fdm->source));
                        fdm->source_next = work->next;
+                       fdm->confirmed = FALSE;
                        }
 
                if (fdm->dest && fdm->source && strcmp(fdm->dest, fdm->source) == 0)
                        {
-                       ConfirmDialog *cd;
-                       gchar *title;
-                       gchar *text;
-                       if (fdm->copy)
+                       if (!fdm->confirmed)
                                {
-                               title = _("Source to copy matches destination");
-                               text = g_strdup_printf(_("Unable to copy file:\n%s\nto itself."), fdm->dest);
+                               GenericDialog *gd;
+                               const gchar *title;
+                               gchar *text;
+
+                               if (fdm->copy)
+                                       {
+                                       title = _("Source to copy matches destination");
+                                       text = g_strdup_printf(_("Unable to copy file:\n%s\nto itself."), fdm->dest);
+                                       }
+                               else
+                                       {
+                                       title = _("Source to move matches destination");
+                                       text = g_strdup_printf(_("Unable to move file:\n%s\nto itself."), fdm->dest);
+                                       }
+
+                               gd = file_util_gen_dlg(title, "GQview", "dlg_confirm",
+                                                       NULL, TRUE,
+                                                       file_util_move_multiple_cancel_cb, fdm);
+                               generic_dialog_add_message(gd, GTK_STOCK_DIALOG_WARNING, title, text);
+                               g_free(text);
+                               generic_dialog_add_button(gd, GTK_STOCK_GO_FORWARD, _("Co_ntinue"),
+                                                        file_util_move_multiple_continue_cb, TRUE);
+
+                               gtk_widget_show(gd->dialog);
+                               return;
                                }
-                       else
+                       skip_file = TRUE;
+                       }
+               else if (isfile(fdm->dest))
+                       {
+                       if (!fdm->confirmed && !fdm->confirm_all)
                                {
-                               title = _("Source to move matches destination");
-                               text = g_strdup_printf(_("Unable to move file:\n%s\nto itself."), fdm->dest);
+                               GenericDialog *gd;
+
+                               gd = file_util_move_multiple_confirm_dialog(fdm);
+                               gtk_widget_show(gd->dialog);
+                               return;
                                }
-                       cd = confirm_dialog_new(title, text, file_util_move_multiple_cancel_cb, fdm);
-                       confirm_dialog_add(cd, _("Continue"), file_util_move_multiple_skip_cb);
-                       g_free(text);
-                       return;
+                       if (fdm->skip) skip_file = TRUE;
                        }
-               else if (isfile(fdm->dest) && !fdm->confirmed && !fdm->confirm_all && !fdm->skip)
+
+               if (skip_file)
                        {
-                       ConfirmDialog *cd;
-                       gchar *text = g_strdup_printf(_("Overwrite file:\n %s\n with:\b %s"), fdm->dest, fdm->source);
-                       cd = confirm_dialog_new_with_image(_("Overwrite file"), text,
-                                               fdm->dest, fdm->source,
-                                               file_util_move_multiple_cancel_cb, fdm);
-                       confirm_dialog_add(cd, _("Skip"), file_util_move_multiple_skip_cb);
-                       confirm_dialog_add(cd, _("Yes to all"), file_util_move_multiple_all_cb);
-                       confirm_dialog_add(cd, _("Yes"), file_util_move_multiple_ok_cb);
-                       g_free(text);
-                       return;
+                       success = TRUE;
+                       if (!fdm->confirm_all) fdm->skip = FALSE;
                        }
                else
                        {
-                       gint success = FALSE;
-                       if (fdm->skip)
+                       gint try = TRUE;
+
+                       if (fdm->confirm_all && fdm->rename_all && isfile(fdm->dest))
                                {
-                               success = TRUE;
-                               fdm->skip = FALSE;
+                               gchar *buf;
+                               buf = unique_filename_simple(fdm->dest);
+                               if (buf)
+                                       {
+                                       g_free(fdm->dest);
+                                       fdm->dest = buf;
+                                       }
+                               else
+                                       {
+                                       try = FALSE;
+                                       }
                                }
-                       else
+                       if (try)
                                {
                                if (fdm->copy)
                                        {
-                                       success = copy_file(fdm->source, fdm->dest);
+                                       if (copy_file(fdm->source, fdm->dest))
+                                               {
+                                               success = TRUE;
+                                               file_maint_copied(fdm->source, fdm->dest);
+                                               }
                                        }
                                else
                                        {
                                        if (move_file(fdm->source, fdm->dest))
                                                {
                                                success = TRUE;
-                                               file_is_gone(fdm->source, fdm->source_list);
+                                               file_maint_moved(fdm->source, fdm->dest, fdm->source_list);
                                                }
                                        }
                                }
-                       if (!success)
+                       }
+
+               if (!success)
+                       {
+                       GenericDialog *gd;
+                       const gchar *title;
+                       gchar *text;
+
+                       if (fdm->copy)
                                {
-                               ConfirmDialog *cd;
-                               gchar *title;
-                               gchar *text;
-                               if (fdm->copy)
-                                       {
-                                       title = _("Error copying file");
-                                       text = g_strdup_printf(_("Unable to copy file:\n%sto:\n%s\n during multiple file copy."), fdm->source, fdm->dest);
-                                       }
-                               else
-                                       {
-                                       title = _("Error moving file");
-                                       text = g_strdup_printf(_("Unable to move file:\n%sto:\n%s\n during multiple file move."), fdm->source, fdm->dest);
-                                       }
-                               cd = confirm_dialog_new(title, text, file_util_move_multiple_cancel_cb, fdm);
-                               confirm_dialog_add(cd, _("Continue"), file_util_move_multiple_skip_cb);
-                               g_free(text);
-                               return;
+                               title = _("Error copying file");
+                               text = g_strdup_printf(_("Unable to copy file:\n%s\nto:\n%s\nduring multiple file copy."), fdm->source, fdm->dest);
                                }
-                       fdm->confirmed = FALSE;
-                       g_free(fdm->dest);
-                       fdm->dest = NULL;
+                       else
+                               {
+                               title = _("Error moving file");
+                               text = g_strdup_printf(_("Unable to move file:\n%s\nto:\n%s\nduring multiple file move."), fdm->source, fdm->dest);
+                               }
+                       gd = file_util_gen_dlg(title, "GQview", "dlg_confirm",
+                                               NULL, TRUE,
+                                               file_util_move_multiple_cancel_cb, fdm);
+                       generic_dialog_add_message(gd, GTK_STOCK_DIALOG_WARNING, title, text);
+                       g_free(text);
+
+                       generic_dialog_add_button(gd, GTK_STOCK_GO_FORWARD, _("Co_ntinue"),
+                                                 file_util_move_multiple_continue_cb, TRUE);
+                       gtk_widget_show(gd->dialog);
                        }
+
+               g_free(fdm->dest);
+               fdm->dest = NULL;
+
+               if (!success) return;
                }
 
        file_data_multiple_free(fdm);
@@ -245,7 +659,7 @@ static void file_util_move_multiple(FileDataMult *fdm)
  * Single file move
  */
 
-static FileDataSingle *file_data_single_new(gchar *source, gchar *dest, gint copy)
+static FileDataSingle *file_data_single_new(const gchar *source, const gchar *dest, gint copy)
 {
        FileDataSingle *fds = g_new0(FileDataSingle, 1);
        fds->confirmed = FALSE;
@@ -262,35 +676,150 @@ static void file_data_single_free(FileDataSingle *fds)
        g_free(fds);
 }
 
-static void file_util_move_single_ok_cb(GtkWidget *widget, gpointer data)
+static void file_util_move_single(FileDataSingle *fds);
+
+static void file_util_move_single_ok_cb(GenericDialog *gd, gpointer data)
 {
        FileDataSingle *fds = data;
+
        fds->confirmed = TRUE;
+
+       if (fds->rename_auto)
+               {
+               gchar *buf;
+
+               buf = unique_filename_simple(fds->dest);
+               if (buf)
+                       {
+                       g_free(fds->dest);
+                       fds->dest = buf;
+                       }
+               else
+                       {
+                       /* unique failed? well, return to the overwrite prompt :( */
+                       fds->confirmed = FALSE;
+                       }
+               }
+       else if (fds->rename)
+               {
+               const gchar *name;
+
+               name = gtk_entry_get_text(GTK_ENTRY(fds->rename_entry));
+               if (strlen(name) == 0 ||
+                   strcmp(name, filename_from_path(fds->source)) == 0)
+                       {
+                       fds->confirmed = FALSE;
+                       }
+               else
+                       {
+                       gchar *base;
+
+                       base = remove_level_from_path(fds->dest);
+                       g_free(fds->dest);
+                       fds->dest = concat_dir_and_file(base, name);
+                       fds->confirmed = !isname(fds->dest);
+
+                       g_free(base);
+                       }
+               }
+
        file_util_move_single(fds);
 }
 
-static void file_util_move_single_cancel_cb(GtkWidget *widget, gpointer data)
+static void file_util_move_single_cancel_cb(GenericDialog *gd, gpointer data)
 {
        FileDataSingle *fds = data;
+
        file_data_single_free(fds);
 }
 
+static void file_util_move_single_rename_auto_cb(GtkWidget *widget, gpointer data)
+{
+       GenericDialog *gd = data;
+       FileDataSingle *fds;
+
+       fds = gd->data;
+
+       fds->rename_auto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+       gtk_widget_set_sensitive(fds->rename_box, !fds->rename_auto);
+       gtk_widget_set_sensitive(fds->rename_entry, (!fds->rename_auto && fds->rename));
+
+       if (fds->rename_auto)
+               {
+               gchar *preview;
+
+               preview = unique_filename_simple(fds->dest);
+               if (preview) gtk_entry_set_text(GTK_ENTRY(fds->rename_entry), filename_from_path(preview));
+               g_free(preview);
+               }
+}
+
+static void file_util_move_single_rename_cb(GtkWidget *widget, gpointer data)
+{
+       GenericDialog *gd = data;
+       FileDataSingle *fds;
+
+       fds = gd->data;
+
+       fds->rename = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+       gtk_widget_set_sensitive(fds->rename_entry, fds->rename);
+
+       if (fds->rename) gtk_widget_grab_focus(fds->rename_entry);
+}
+
 static void file_util_move_single(FileDataSingle *fds)
 {
        if (fds->dest && fds->source && strcmp(fds->dest, fds->source) == 0)
                {
-               warning_dialog(_("Source matches destination"),
-                              _("Source and destination are the same, operation cancelled."));
+               file_util_warning_dialog(_("Source matches destination"),
+                                        _("Source and destination are the same, operation cancelled."),
+                                        GTK_STOCK_DIALOG_INFO, NULL);
                }
        else if (isfile(fds->dest) && !fds->confirmed)
                {
-               ConfirmDialog *cd;
-               gchar *text = g_strdup_printf(_("Overwrite file:\n%s\n with:\n%s"), fds->dest, fds->source);
-               cd = confirm_dialog_new_with_image(_("Overwrite file"), text,
-                                                  fds->dest, fds->source,
-                                                  file_util_move_single_cancel_cb, fds);
-               confirm_dialog_add(cd, _("Overwrite"), file_util_move_single_ok_cb);
-               g_free(text);
+               GenericDialog *gd;
+               GtkWidget *hbox;
+
+               gd = file_util_gen_dlg(_("Overwrite file"), "GQview", "dlg_confirm",
+                                       NULL, TRUE,
+                                       file_util_move_single_cancel_cb, fds);
+
+               generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION,
+                                          _("Overwrite file?"),
+                                          _("Replace existing file with new file."));
+               pref_spacer(gd->vbox, 0);
+
+               generic_dialog_add_button(gd, GTK_STOCK_OK, _("_Overwrite"), file_util_move_single_ok_cb, TRUE);
+               generic_dialog_add_image(gd, fds->dest, _("Existing file"), fds->source, _("New file"), TRUE);
+
+               /* rename option */
+
+               fds->rename = FALSE;
+               fds->rename_auto = FALSE;
+
+               hbox = pref_box_new(gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+
+               fds->rename_auto_box = gtk_check_button_new_with_label(_("Auto rename"));
+               g_signal_connect(G_OBJECT(fds->rename_auto_box), "clicked",
+                                G_CALLBACK(file_util_move_single_rename_auto_cb), gd);
+               gtk_box_pack_start(GTK_BOX(hbox), fds->rename_auto_box, FALSE, FALSE, 0);
+               gtk_widget_show(fds->rename_auto_box);
+
+               hbox = pref_box_new(gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+
+               fds->rename_box = gtk_check_button_new_with_label(_("Rename"));
+               g_signal_connect(G_OBJECT(fds->rename_box), "clicked",
+                                G_CALLBACK(file_util_move_single_rename_cb), gd);
+               gtk_box_pack_start(GTK_BOX(hbox), fds->rename_box, FALSE, FALSE, 0);
+               gtk_widget_show(fds->rename_box);
+
+               fds->rename_entry = gtk_entry_new();
+               gtk_entry_set_text(GTK_ENTRY(fds->rename_entry), filename_from_path(fds->dest));
+               gtk_widget_set_sensitive(fds->rename_entry, FALSE);
+               gtk_box_pack_start(GTK_BOX(hbox), fds->rename_entry, TRUE, TRUE, 0);
+               gtk_widget_show(fds->rename_entry);
+
+               gtk_widget_show(gd->dialog);
                return;
                }
        else
@@ -298,14 +827,18 @@ static void file_util_move_single(FileDataSingle *fds)
                gint success = FALSE;
                if (fds->copy)
                        {
-                       success = copy_file(fds->source, fds->dest);
+                       if (copy_file(fds->source, fds->dest))
+                               {
+                               success = TRUE;
+                               file_maint_copied(fds->source, fds->dest);
+                               }
                        }
                else
                        {
                        if (move_file(fds->source, fds->dest))
                                {
                                success = TRUE;
-                               file_is_gone(fds->source, NULL);
+                               file_maint_moved(fds->source, fds->dest, NULL);
                                }
                        }
                if (!success)
@@ -322,7 +855,7 @@ static void file_util_move_single(FileDataSingle *fds)
                                title = _("Error moving file");
                                text = g_strdup_printf(_("Unable to move file:\n%s\nto:\n%s"), fds->source, fds->dest);
                                }
-                       warning_dialog(title, text);
+                       file_util_warning_dialog(title, text, GTK_STOCK_DIALOG_ERROR, NULL);
                        g_free(text);
                        }
                }
@@ -336,7 +869,8 @@ static void file_util_move_single(FileDataSingle *fds)
 
 static void file_util_move_do(FileDialog *fd)
 {
-       tab_completion_append_to_history(fd->entry, fd->dest_path);
+       file_dialog_sync_history(fd, TRUE);
+
        if (fd->multiple_files)
                {
                file_util_move_multiple(file_data_multiple_new(fd->source_list, fd->dest_path, fd->type));
@@ -346,62 +880,57 @@ static void file_util_move_do(FileDialog *fd)
                {
                if (isdir(fd->dest_path))
                        {
-                       gchar *buf = g_strconcat(fd->dest_path, "/", filename_from_path(fd->source_path), NULL);
-                       g_free(fd->dest_path);
-                       fd->dest_path = buf;
+                       gchar *buf = concat_dir_and_file(fd->dest_path, filename_from_path(fd->source_path));
+                       gtk_entry_set_text(GTK_ENTRY(fd->entry), buf);
+                       g_free(buf);
                        }
                file_util_move_single(file_data_single_new(fd->source_path, fd->dest_path, fd->type));
                }
 
-       generic_dialog_close(NULL, fd);
+       file_dialog_close(fd);
 }
 
 static void file_util_move_check(FileDialog *fd)
 {
-       g_free(fd->dest_path);
-       fd->dest_path = remove_trailing_slash(gtk_entry_get_text(GTK_ENTRY(fd->entry)));
-
        if (fd->multiple_files && !isdir(fd->dest_path))
                {
                if (isfile(fd->dest_path))
-                       warning_dialog(_("Invalid destination"), _("When operating with multiple files, please select\n a directory, not file."));
+                       {
+                       file_util_warning_dialog(_("Invalid destination"),
+                                                _("When operating with multiple files, please select\na folder, not a file."),
+                                                GTK_STOCK_DIALOG_INFO, NULL);
+                       }
                else
-                       warning_dialog(_("Invalid directory"), _("Please select an existing directory"));
+                       file_util_warning_dialog(_("Invalid folder"),
+                                                _("Please select an existing folder."),
+                                                GTK_STOCK_DIALOG_INFO, NULL);
                return;
                }
 
        file_util_move_do(fd);
 }
 
-static void file_util_move_cb(GtkWidget *widget, gpointer data)
-{
-       FileDialog *fd = data;
-       file_util_move_check(fd);
-}
-
-static void file_util_move_enter_cb(gchar *path, gpointer data)
+static void file_util_move_cb(FileDialog *fd, gpointer data)
 {
-       FileDialog *fd = data;
        file_util_move_check(fd);
 }
 
-static void file_util_move_completion_sync_cb(gchar *path, gpointer data)
+static void file_util_move_cancel_cb(FileDialog *fd, gpointer data)
 {
-       FileDialog *fd = data;
-       destination_widget_sync_to_entry(fd->entry);
+       file_dialog_close(fd);
 }
 
-static void real_file_util_move(gchar *source_path, GList *source_list, gchar *dest_path, gint copy)
+static void real_file_util_move(const gchar *source_path, GList *source_list,
+                               const gchar *dest_path, gint copy, GtkWidget *parent)
 {
        FileDialog *fd;
+       GtkWidget *label;
        gchar *path = NULL;
        gint multiple;
-       gchar *text;
-       gchar *title;
-       gchar *op_text;
-       GtkWidget *tabcomp;
-       GtkWidget *dest;
-       gchar *last_path;
+       const gchar *text;
+       const gchar *title;
+       const gchar *op_text;
+       const gchar *stock_id;
 
        if (!source_path && !source_list) return;
 
@@ -417,74 +946,297 @@ static void real_file_util_move(gchar *source_path, GList *source_list, gchar *d
        else
                {
                path = g_strdup(source_list->data);
-               free_selected_list(source_list);
+               path_list_free(source_list);
                source_list = NULL;
                multiple = FALSE;
                }
 
        if (copy)
                {
-               title = _("GQview - copy");
-               op_text = _("Copy");
+               title = _("Copy - GQview");
+               op_text = _("_Copy");
                if (path)
-                       text = g_strdup_printf(_("Copy file:\n%s\nto:"), path);
+                       {
+                       text = _("Copy file");
+                       }
                else
-                       text = g_strdup_printf(_("Copy multiple files from:\n%s\nto:"), dest_path);
+                       {
+                       text = _("Copy multiple files");
+                       }
+               stock_id = GTK_STOCK_COPY;
                }
        else
                {
-               title = _("GQview - move");
-               op_text = _("Move");
+               title = _("Move - GQview");
+               op_text = _("_Move");
                if (path)
-                       text = g_strdup_printf(_("Move file:\n%s\nto:"), path);
+                       {
+                       text = _("Move file");
+                       }
                else
-                       text = g_strdup_printf(_("Move multiple files from:\n%s\nto:"), dest_path);
+                       {
+                       text = _("Move multiple files");
+                       }
+               stock_id = GTK_STOCK_OK;
                }
 
-       fd = generic_dialog_new(title, text, op_text, _("Cancel"),
-               file_util_move_cb, generic_dialog_close);
+       fd = file_util_file_dlg(title, "GQview", "dlg_copymove", parent,
+                               file_util_move_cancel_cb, NULL);
+       generic_dialog_add_message(GENERIC_DIALOG(fd), NULL, text, NULL);
 
-       g_free(text);
+       if (path)
+               {
+               GtkWidget *box;
+
+               box = pref_box_new(GENERIC_DIALOG(fd)->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_SPACE);
+               pref_label_new(box, _("File name:"));
+               pref_label_new(box, filename_from_path(path));
+               }
+
+       label = pref_label_new(GENERIC_DIALOG(fd)->vbox, _("Choose the destination folder."));
+       gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+       pref_spacer(GENERIC_DIALOG(fd)->vbox, 0);
+
+       file_dialog_add_button(fd, stock_id, op_text, file_util_move_cb, TRUE);
+
+       file_dialog_add_path_widgets(fd, NULL, dest_path, "move_copy", NULL, NULL);
 
        fd->type = copy;
        fd->source_path = path;
        fd->source_list = source_list;
        fd->multiple_files = multiple;
 
-       tabcomp = tab_completion_new_with_history(&fd->entry, fd->dialog, dest_path,
-                                          "move_copy", 32, file_util_move_enter_cb, fd);
-       last_path = tab_completion_set_to_last_history(fd->entry);
-       if (last_path)
+       gtk_widget_show(GENERIC_DIALOG(fd)->dialog);
+}
+
+void file_util_move(const gchar *source_path, GList *source_list, const gchar *dest_path, GtkWidget *parent)
+{
+       real_file_util_move(source_path, source_list, dest_path, FALSE, parent);
+}
+
+void file_util_copy(const gchar *source_path, GList *source_list, const gchar *dest_path, GtkWidget *parent)
+{
+       real_file_util_move(source_path, source_list, dest_path, TRUE, parent);
+}
+
+void file_util_move_simple(GList *list, const gchar *dest_path)
+{
+       if (!list) return;
+       if (!dest_path)
                {
-               fd->dest_path = g_strdup(last_path);
+               path_list_free(list);
+               return;
                }
-       else
+
+       if (!list->next)
+               {
+               const gchar *source;
+               gchar *dest;
+
+               source = list->data;
+               dest = concat_dir_and_file(dest_path, filename_from_path(source));
+
+               file_util_move_single(file_data_single_new(source, dest, FALSE));
+               g_free(dest);
+               path_list_free(list);
+               return;
+               }
+
+       file_util_move_multiple(file_data_multiple_new(list, dest_path, FALSE));
+}
+
+void file_util_copy_simple(GList *list, const gchar *dest_path)
+{
+       if (!list) return;
+       if (!dest_path)
+               {
+               path_list_free(list);
+               return;
+               }
+
+       if (!list->next)
                {
-               fd->dest_path = g_strdup(dest_path);
+               const gchar *source;
+               gchar *dest;
+
+               source = list->data;
+               dest = concat_dir_and_file(dest_path, filename_from_path(source));
+
+               file_util_move_single(file_data_single_new(source, dest, TRUE));
+               g_free(dest);
+               path_list_free(list);
+               return;
                }
-                                          
-/*     tabcomp = tab_completion_new(&fd->entry, fd->dialog, fd->dest_path, file_util_move_enter_cb, fd);
-*/
-       gtk_box_pack_start(GTK_BOX(fd->vbox), tabcomp, FALSE, FALSE, 0);
-       gtk_widget_show(tabcomp);
 
-       gtk_widget_grab_focus(fd->entry);
+       file_util_move_multiple(file_data_multiple_new(list, dest_path, TRUE));
+}
+
+/*
+ *--------------------------------------------------------------------------
+ * Safe Delete
+ *--------------------------------------------------------------------------
+ */
+
+static gint file_util_safe_number(gint64 free_space)
+{
+       gint n = 0;
+       gint64 total = 0;
+       GList *list;
+       GList *work;
+       gint sorted = FALSE;
+       gint warned = FALSE;
+
+       if (!filelist_read(safe_delete_path, &list, NULL)) return 0;
+
+       work = list;
+       while (work)
+               {
+               FileData *fd;
+               gint v;
+              
+               fd = work->data;
+               work = work->next;
+
+               v = (gint)strtol(fd->name, NULL, 10);
+               if (v >= n) n = v + 1;
+
+               total += fd->size;
+               }
 
-       dest = destination_widget_new(fd->dest_path, fd->entry);
+       while (list &&
+              (free_space < 0 || total + free_space > (gint64)safe_delete_size * 1048576) )
+               {
+               FileData *fd;
+
+               if (!sorted)
+                       {
+                       list = filelist_sort(list, SORT_NAME, TRUE);
+                       sorted = TRUE;
+                       }
+
+               fd = list->data;
+               list = g_list_remove(list, fd);
+
+               if (debug) printf("expunging from trash for space: %s\n", fd->name);
+               if (!unlink_file(fd->path) && !warned)
+                       {
+                       file_util_warning_dialog(_("Delete failed"),
+                                                _("Unable to remove old file from trash folder"),
+                                                GTK_STOCK_DIALOG_WARNING, NULL);
+                       warned = TRUE;
+                       }
+               total -= fd->size;
+               file_data_free(fd);
+               }
+
+       filelist_free(list);
+
+       return n;
+}
 
-       tab_completion_add_tab_func(fd->entry, file_util_move_completion_sync_cb, fd);
+void file_util_trash_clear(void)
+{
+       file_util_safe_number(-1);
+}
+
+static gchar *file_util_safe_dest(const gchar *path)
+{
+       gint n;
 
-       gtk_box_pack_start(GTK_BOX(fd->vbox), dest, TRUE, TRUE, 0);
+       n = file_util_safe_number(filesize(path));
+       return g_strdup_printf("%s/%06d_%s", safe_delete_path, n, filename_from_path(path));
 }
 
-void file_util_move(gchar *source_path, GList *source_list, gchar *dest_path)
+static void file_util_safe_del_toggle_cb(GtkWidget *button, gpointer data)
 {
-       real_file_util_move(source_path, source_list, dest_path, FALSE);
+       safe_delete_enable = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button));
+}
+
+static void file_util_safe_del_close_cb(GtkWidget *dialog, gpointer data)
+{
+       GenericDialog **gd = data;
+
+       *gd = NULL;
+}
+
+static gint file_util_unlink(const gchar *path)
+{
+       static GenericDialog *gd = NULL;
+       gchar *result = NULL;
+       gint success = TRUE;
+
+       if (!isfile(path)) return FALSE;
+
+       if (!safe_delete_enable)
+               {
+               return unlink_file(path);
+               }
+
+       if (!isdir(safe_delete_path))
+               {
+               if (debug) printf("creating trash: %s\n", safe_delete_path);
+               if (!safe_delete_path || !mkdir_utf8(safe_delete_path, 0755))
+                       {
+                       result = _("Could not create folder");
+                       success = FALSE;
+                       }
+               }
+
+       if (success)
+               {
+               gchar *dest;
+
+               dest = file_util_safe_dest(path);
+               if (dest)
+                       {
+                       if (debug) printf("safe deleting %s to %s\n", path, dest);
+                       success = move_file(path, dest);
+                       }
+               else
+                       {
+                       success = FALSE;
+                       }
+
+               if (!success && !access_file(path, W_OK))
+                       {
+                       result = _("Permission denied");
+                       }
+               g_free(dest);
+               }
+
+       if (result && !gd)
+               {
+               GtkWidget *button;
+               gchar *buf;
+
+               buf = g_strdup_printf(_("Unable to access or create the trash folder.\n\"%s\""), safe_delete_path);
+               gd = file_util_warning_dialog(result, buf, GTK_STOCK_DIALOG_WARNING, NULL);
+               g_free(buf);
+
+               button = gtk_check_button_new_with_label(_("Turn off safe delete"));
+               g_signal_connect(G_OBJECT(button), "toggled",
+                                G_CALLBACK(file_util_safe_del_toggle_cb), NULL);
+               gtk_box_pack_start(GTK_BOX(gd->vbox), button, FALSE, FALSE, 0);
+               gtk_widget_show(button);
+
+               g_signal_connect(G_OBJECT(gd->dialog), "destroy",
+                                G_CALLBACK(file_util_safe_del_close_cb), &gd);
+               }
+
+       return success;
 }
 
-void file_util_copy(gchar *source_path, GList *source_list, gchar *dest_path)
+static void box_append_safe_delete_status(GenericDialog *gd)
 {
-       real_file_util_move(source_path, source_list, dest_path, TRUE);
+       GtkWidget *label;
+       gchar *buf;
+
+       buf = g_strdup_printf(_("Safe delete: %s"), (safe_delete_enable) ? _("on") : _("off"));
+       label = pref_label_new(gd->vbox, buf);
+       g_free(buf);
+
+       gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
+       gtk_widget_set_sensitive(label, FALSE);
 }
 
 /*
@@ -497,58 +1249,202 @@ void file_util_copy(gchar *source_path, GList *source_list, gchar *dest_path)
  * delete multiple files
  */
 
-static void file_util_delete_multiple_ok_cb(GtkWidget *w, gpointer data)
+static void file_util_delete_multiple_ok_cb(GenericDialog *gd, gpointer data);
+static void file_util_delete_multiple_cancel_cb(GenericDialog *gd, gpointer data);
+
+static void file_util_delete_multiple_ok_cb(GenericDialog *gd, gpointer data)
 {
        GList *source_list = data;
 
-       while(source_list)
+       while (source_list)
                {
                gchar *path = source_list->data;
+
                source_list = g_list_remove(source_list, path);
-               if (unlink (path) < 0)
+
+               if (!file_util_unlink(path))
                        {
-                       ConfirmDialog *cd;
-                       gchar *text;
                        if (source_list)
                                {
+                               GenericDialog *d;
+                               gchar *text;
+
+                               d = file_util_gen_dlg(_("Delete failed"), "GQview", "dlg_confirm",
+                                                     NULL, TRUE,
+                                                     file_util_delete_multiple_cancel_cb, source_list);
+
                                text = g_strdup_printf(_("Unable to delete file:\n %s\n Continue multiple delete operation?"), path);
-                               cd = confirm_dialog_new(_("Delete failed"), text, file_util_delete_multiple_cancel_cb, source_list);
-                               confirm_dialog_add(cd, _("Continue"), file_util_delete_multiple_ok_cb);
+                               generic_dialog_add_message(d, GTK_STOCK_DIALOG_WARNING, NULL, text);
+                               g_free(text);
+
+                               generic_dialog_add_button(d, GTK_STOCK_GO_FORWARD, _("Co_ntinue"),
+                                                         file_util_delete_multiple_ok_cb, TRUE);
+                               gtk_widget_show(d->dialog);
                                }
                        else
                                {
+                               gchar *text;
+                               
                                text = g_strdup_printf(_("Unable to delete file:\n%s"), path);
-                               warning_dialog(_("Delete failed"), text);
+                               file_util_warning_dialog(_("Delete failed"), text, GTK_STOCK_DIALOG_ERROR, NULL);
+                               g_free(text);
                                }
-                       g_free(text);
                        g_free(path);
                        return;
                        }
                else
                        {
-                       file_is_gone(path, source_list);
+                       file_maint_removed(path, source_list);
                        }
                g_free(path);
                }
 }
 
-static void file_util_delete_multiple_cancel_cb(GtkWidget *w, gpointer data)
+static void file_util_delete_multiple_cancel_cb(GenericDialog *gd, gpointer data)
 {
        GList *source_list = data;
-       free_selected_list(source_list);
+
+       path_list_free(source_list);
+}
+
+static void file_util_delete_multiple_review_skip(GenericDialog *gd, gint next)
+{
+       GtkWidget *button_back;
+       GtkWidget *button_next;
+       GtkWidget *button_label;
+       GList *list;
+       GList *list_point;
+       const gchar *path;
+       gchar *buf;
+
+       list = gd->data;
+       button_back = g_object_get_data(G_OBJECT(gd->dialog), "button_back");
+       button_next = g_object_get_data(G_OBJECT(gd->dialog), "button_next");
+       button_label = g_object_get_data(G_OBJECT(gd->dialog), "button_label");
+       list_point = g_object_get_data(G_OBJECT(gd->dialog), "list_point");
+
+       if (!list || !button_label) return;
+
+       if (list_point)
+               {
+               if (next)
+                       {
+                       if (list_point->next) list_point = list_point->next;
+                       }
+               else
+                       {
+                       if (list_point->prev) list_point = list_point->prev;
+                       }
+               }
+       else
+               {
+               list_point = list;
+               }
+
+       if (!list_point) return;
+
+       path = list_point->data;
+       buf = g_strdup_printf(_("File %d of %d"),
+                             g_list_index(list, (gpointer)path) + 1,
+                             g_list_length(list));
+       gtk_label_set_text(GTK_LABEL(button_label), buf);
+       g_free(buf);
+
+       gtk_widget_set_sensitive(button_back, (list_point->prev != NULL) );
+       gtk_widget_set_sensitive(button_next, (list_point->next != NULL) );
+
+       generic_dialog_image_set(gd, path);
+
+       g_object_set_data(G_OBJECT(gd->dialog), "list_point", list_point);
+}
+
+static void file_util_delete_multiple_review_back(GtkWidget *button, gpointer data)
+{
+       GenericDialog *gd = data;
+
+       file_util_delete_multiple_review_skip(gd, FALSE);
+}
+
+static void file_util_delete_multiple_review_next(GtkWidget *button, gpointer data)
+{
+       GenericDialog *gd = data;
+
+       file_util_delete_multiple_review_skip(gd, TRUE);
+}
+
+static void file_util_delete_multiple_review_button_cb(ImageWindow *imd, gint button, guint32 time,
+                                                      gdouble x, gdouble y, guint state, gpointer data)
+{
+       if (button == 1)
+               {
+               file_util_delete_multiple_review_next(NULL, data);
+               }
+       else if (button == 2 || button == 3)
+               {
+               file_util_delete_multiple_review_back(NULL, data);
+               }
 }
 
-static void file_util_delete_multiple(GList *source_list)
-{
-       if (!confirm_delete)
-               {
-               file_util_delete_multiple_ok_cb(NULL, source_list);
-               }
-       else
-               {
-               ConfirmDialog *cd;
-               cd = confirm_dialog_new(_("Delete files"), _("About to delete multiple files..."), file_util_delete_multiple_cancel_cb, source_list);
-               confirm_dialog_add(cd, _("Delete"), file_util_delete_multiple_ok_cb);
+static void file_util_delete_multiple_review_scroll_cb(ImageWindow *imd, GdkScrollDirection direction, guint32 time,
+                                                      gdouble x, gdouble y, guint state, gpointer data)
+{
+       if (direction == GDK_SCROLL_UP)
+               {
+               file_util_delete_multiple_review_back(NULL, data);
+               }
+       else if (direction == GDK_SCROLL_DOWN)
+               {
+               file_util_delete_multiple_review_next(NULL, data);
+               }
+}
+
+static void file_util_delete_multiple(GList *source_list, GtkWidget *parent)
+{
+       if (!confirm_delete)
+               {
+               file_util_delete_multiple_ok_cb(NULL, source_list);
+               }
+       else
+               {
+               GenericDialog *gd;
+               GtkWidget *hbox;
+               GtkWidget *button;
+               GtkWidget *label;
+               ImageWindow *imd;
+               gchar *buf;
+
+               gd = file_util_gen_dlg(_("Delete files - GQview"),
+                                       "GQview", "dlg_confirm", parent, TRUE,
+                                       file_util_delete_multiple_cancel_cb, source_list);
+
+               generic_dialog_add_message(gd, NULL, _("Delete multiple files"), NULL);
+
+               generic_dialog_add_image(gd, NULL, NULL, NULL, NULL, TRUE);
+               imd = g_object_get_data(G_OBJECT(gd->dialog), "img_image");
+               image_set_button_func(imd, file_util_delete_multiple_review_button_cb, gd);
+               image_set_scroll_func(imd, file_util_delete_multiple_review_scroll_cb, gd);
+
+               hbox = pref_box_new(gd->vbox, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_BUTTON_GAP);
+
+               button = pref_button_new(hbox, GTK_STOCK_GO_BACK, NULL, TRUE,
+                                        G_CALLBACK(file_util_delete_multiple_review_back), gd);
+               gtk_widget_set_sensitive(button, FALSE);
+               g_object_set_data(G_OBJECT(gd->dialog), "button_back", button);
+
+               button = pref_button_new(hbox, GTK_STOCK_GO_FORWARD, NULL, TRUE,
+                                        G_CALLBACK(file_util_delete_multiple_review_next), gd);
+               g_object_set_data(G_OBJECT(gd->dialog), "button_next", button);
+
+               buf = g_strdup_printf(_("Review %d files"), g_list_length(source_list) );
+               label = pref_label_new(hbox, buf);
+               g_free(buf);
+               g_object_set_data(G_OBJECT(gd->dialog), "button_label", label);
+
+               box_append_safe_delete_status(gd);
+
+               generic_dialog_add_button(gd, GTK_STOCK_DELETE, NULL, file_util_delete_multiple_ok_cb, TRUE);
+
+               gtk_widget_show(gd->dialog);
                }
 }
 
@@ -556,31 +1452,32 @@ static void file_util_delete_multiple(GList *source_list)
  * delete single file
  */
 
-static void file_util_delete_ok_cb(GtkWidget *w, gpointer data)
+static void file_util_delete_ok_cb(GenericDialog *gd, gpointer data)
 {
        gchar *path = data;
 
-       if (unlink (path) < 0)
+       if (!file_util_unlink(path))
                {
                gchar *text = g_strdup_printf(_("Unable to delete file:\n%s"), path);
-               warning_dialog(_("File deletion failed"), text);
+               file_util_warning_dialog(_("File deletion failed"), text, GTK_STOCK_DIALOG_ERROR, NULL);
                g_free(text);
                }
        else
                {
-               file_is_gone(path, NULL);
+               file_maint_removed(path, NULL);
                }
 
        g_free(path);
 }
 
-static void file_util_delete_cancel_cb(GtkWidget *w, gpointer data)
+static void file_util_delete_cancel_cb(GenericDialog *gd, gpointer data)
 {
        gchar *path = data;
+
        g_free(path);
 }
 
-static void file_util_delete_single(gchar *path)
+static void file_util_delete_single(const gchar *path, GtkWidget *parent)
 {
        gchar *buf = g_strdup(path);
 
@@ -590,30 +1487,53 @@ static void file_util_delete_single(gchar *path)
                }
        else
                {
-               ConfirmDialog *cd;
-               gchar *text = g_strdup_printf(_("About to delete the file:\n %s"), buf);
-               cd = confirm_dialog_new(_("Delete file"), text, file_util_delete_cancel_cb, buf);
-               confirm_dialog_add(cd, _("Delete"), file_util_delete_ok_cb);
-               g_free(text);
+               GenericDialog *gd;
+               GtkWidget *table;
+               gchar *base;
+
+               gd = file_util_gen_dlg(_("Delete file - GQview"), "GQview", "dlg_confirm",
+                                       parent, TRUE,
+                                       file_util_delete_cancel_cb, buf);
+
+               generic_dialog_add_message(gd, NULL, _("Delete file?"), NULL);
+
+               table = pref_table_new(gd->vbox, 2, 2, FALSE, FALSE);
+
+               pref_table_label(table, 0, 0, _("File name:"), 1.0);
+               pref_table_label(table, 1, 0, filename_from_path(path), 0.0);
+
+               pref_table_label(table, 0, 1, _("Location:"), 1.0);
+
+               base = remove_level_from_path(path);
+               pref_table_label(table, 1, 1, base, 0.0);
+               g_free(base);
+
+               generic_dialog_add_image(gd, path, NULL, NULL, NULL, FALSE);
+
+               box_append_safe_delete_status(gd);
+
+               generic_dialog_add_button(gd, GTK_STOCK_DELETE, NULL, file_util_delete_ok_cb, TRUE);
+
+               gtk_widget_show(gd->dialog);
                }
 }
 
-void file_util_delete(gchar *source_path, GList *source_list)
+void file_util_delete(const gchar *source_path, GList *source_list, GtkWidget *parent)
 {
        if (!source_path && !source_list) return;
 
        if (source_path)
                {
-               file_util_delete_single(source_path);
+               file_util_delete_single(source_path, parent);
                }
        else if (!source_list->next)
                {
-               file_util_delete_single(source_list->data);
-               free_selected_list(source_list);
+               file_util_delete_single(source_list->data, parent);
+               path_list_free(source_list);
                }
        else
                {
-               file_util_delete_multiple(source_list);
+               file_util_delete_multiple(source_list, parent);
                }
 }
 
@@ -627,90 +1547,292 @@ void file_util_delete(gchar *source_path, GList *source_list)
  * rename multiple files
  */
 
-static void file_util_rename_multiple_ok_cb(GtkWidget *w, gpointer data)
+enum {
+       RENAME_COLUMN_PATH = 0,
+       RENAME_COLUMN_NAME,
+       RENAME_COLUMN_PREVIEW,
+       RENAME_COLUMN_COUNT
+};
+
+typedef struct _RenameDataMult RenameDataMult;
+struct _RenameDataMult
+{
+       FileDialog *fd;
+
+       gint rename_auto;
+
+       GtkWidget *listview;
+       GtkWidget *button_auto;
+
+       GtkWidget *rename_box;
+       GtkWidget *rename_label;
+       GtkWidget *rename_entry;
+
+       GtkWidget *auto_box;
+       GtkWidget *auto_entry_front;
+       GtkWidget *auto_spin_start;
+       GtkWidget *auto_spin_pad;
+       GtkWidget *auto_entry_end;
+
+       ImageWindow *imd;
+
+       gint update_idle_id;
+};
+
+static void file_util_rename_multiple(RenameDataMult *rd);
+
+static void file_util_rename_multiple_ok_cb(GenericDialog *gd, gpointer data)
+{
+       RenameDataMult *rd = data;
+       GtkWidget *dialog;
+
+       dialog = GENERIC_DIALOG(rd->fd)->dialog;
+       if (!GTK_WIDGET_VISIBLE(dialog)) gtk_widget_show(dialog);
+
+       rd->fd->type = TRUE;
+       file_util_rename_multiple(rd);
+}
+
+static void file_util_rename_multiple_cancel_cb(GenericDialog *gd, gpointer data)
 {
-       FileDialog *fd = data;
-       if (!GTK_WIDGET_VISIBLE(fd->dialog)) gtk_widget_show(fd->dialog);
-       fd->type = TRUE;
-       file_util_rename_multiple(fd);
+       RenameDataMult *rd = data;
+       GtkWidget *dialog;
+
+       dialog = GENERIC_DIALOG(rd->fd)->dialog;
+       if (!GTK_WIDGET_VISIBLE(dialog)) gtk_widget_show(dialog);
 }
 
-static void file_util_rename_multiple_cancel_cb(GtkWidget *w, gpointer data)
+static gint file_util_rename_multiple_find_row(RenameDataMult *rd, const gchar *path, GtkTreeIter *iter)
 {
-       FileDialog *fd = data;
-       if (!GTK_WIDGET_VISIBLE(fd->dialog)) gtk_widget_show(fd->dialog);
-       return;
+       GtkTreeModel *store;
+       gint valid;
+       gint row = 0;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(rd->listview));
+       valid = gtk_tree_model_get_iter_first(store, iter);
+       while (valid)
+               {
+               gchar *path_n;
+               gint ret;
+
+               gtk_tree_model_get(GTK_TREE_MODEL(store), iter, RENAME_COLUMN_PATH, &path_n, -1);
+               ret = (strcmp(path_n, path) == 0);
+               g_free(path_n);
+               if (ret) return row;
+
+               valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), iter);
+               row++;
+               }
+
+       return -1;
 }
 
-static void file_util_rename_multiple(FileDialog *fd)
+static void file_util_rename_multiple(RenameDataMult *rd)
 {
+       FileDialog *fd;
+
+       fd = rd->fd;
+
        if (isfile(fd->dest_path) && !fd->type)
                {
-               ConfirmDialog *cd;
-               gchar *text = g_strdup_printf(_("Overwrite file:\n%s\nby renaming:\n%s"), fd->dest_path, fd->source_path);
-               cd = confirm_dialog_new_with_image(_("Overwrite file"), text,
-                                                  fd->dest_path, fd->source_path,
-                                                  file_util_rename_multiple_cancel_cb, fd);
-               confirm_dialog_add(cd, _("Overwrite"), file_util_rename_multiple_ok_cb);
-               g_free(text);
-               gtk_widget_hide(fd->dialog);
+               GenericDialog *gd;
+
+               gd = file_util_gen_dlg(_("Overwrite file"), "GQview", "dlg_confirm",
+                                       NULL, TRUE,
+                                       file_util_rename_multiple_cancel_cb, rd);
+
+               generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION,
+                                          _("Overwrite file?"),
+                                          _("Replace existing file by renaming new file."));
+               pref_spacer(gd->vbox, 0);
+
+               generic_dialog_add_button(gd, GTK_STOCK_OK, _("_Overwrite"), file_util_rename_multiple_ok_cb, TRUE);
+               generic_dialog_add_image(gd, fd->dest_path, _("Existing file"), fd->source_path, _("New file"), TRUE);
+
+               gtk_widget_hide(GENERIC_DIALOG(fd)->dialog);
+
+               gtk_widget_show(gd->dialog);
                return;
                }
        else
                {
-               if (rename (fd->source_path, fd->dest_path) < 0)
+               if (!rename_file(fd->source_path, fd->dest_path))
                        {
-                       gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\n to:\n%s"), filename_from_path(fd->source_path), filename_from_path(fd->dest_path));
-                       warning_dialog(_("Error renaming file"), text);
+                       gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\n to:\n%s"),
+                                                     filename_from_path(fd->source_path),
+                                                     filename_from_path(fd->dest_path));
+                       file_util_warning_dialog(_("Error renaming file"), text, GTK_STOCK_DIALOG_ERROR, NULL);
                        g_free(text);
                        }
                else
                        {
+                       GtkTreeModel *store;
+                       GtkTreeIter iter;
+                       GtkTreeIter next;
                        gint row;
-                       gint n;
-                       GtkWidget *clist;
-                       gchar *path;
-
-                       file_is_renamed(fd->source_path, fd->dest_path);
-
-                       clist = gtk_object_get_user_data(GTK_OBJECT(fd->entry));
-                       path = gtk_object_get_user_data(GTK_OBJECT(clist));
-                       row = gtk_clist_find_row_from_data(GTK_CLIST(clist), path);
-
-                       n = g_list_length(GTK_CLIST(clist)->row_list);
-                       if (debug) printf("r=%d n=%d\n", row, n);
-                       if (n - 1 > row)
-                               n = row;
-                       else if (n > 1)
-                               n = row - 1;
-                       else
-                               n = -1;
 
-                       if (n >= 0)
+                       file_maint_renamed(fd->source_path, fd->dest_path);
+
+                       store = gtk_tree_view_get_model(GTK_TREE_VIEW(rd->listview));
+                       row = file_util_rename_multiple_find_row(rd, rd->fd->source_path, &iter);
+
+                       if (row >= 0 &&
+                           (gtk_tree_model_iter_nth_child(store, &next, NULL, row + 1) ||
+                           (row > 0 && gtk_tree_model_iter_nth_child(store, &next, NULL, row - 1)) ) )
                                {
-                               gtk_object_set_user_data(GTK_OBJECT(clist), NULL);
-                               gtk_clist_remove(GTK_CLIST(clist), row);
-                               gtk_clist_select_row(GTK_CLIST(clist), n, -1);
+                               GtkTreeSelection *selection;
+
+                               selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(rd->listview));
+                               gtk_tree_selection_select_iter(selection, &next);
+                               gtk_list_store_remove(GTK_LIST_STORE(store), &iter);
                                }
                        else
                                {
-                               if (debug) printf("closed by #%d\n", n);
-                               generic_dialog_close(NULL, fd);
+                               if (debug) printf("closed by #%d\n", row);
+
+                               file_dialog_close(rd->fd);
+                               }
+                       }
+               }
+}
+
+static void file_util_rename_multiple_auto(RenameDataMult *rd)
+{
+       const gchar *front;
+       const gchar *end;
+       gint start_n;
+       gint padding;
+       gint n;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gint valid;
+       gint success;
+
+       history_combo_append_history(rd->auto_entry_front, NULL);
+       history_combo_append_history(rd->auto_entry_end, NULL);
+
+       front = gtk_entry_get_text(GTK_ENTRY(rd->auto_entry_front));
+       end = gtk_entry_get_text(GTK_ENTRY(rd->auto_entry_end));
+       start_n = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rd->auto_spin_start));
+       padding = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rd->auto_spin_pad));
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(rd->listview));
+
+       /* first check for name conflicts */
+       success = TRUE;
+       n = start_n;
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+       while (valid && success)
+               {
+               gchar *dest;
+               gchar *base;
+               gchar *path;
+
+               gtk_tree_model_get(store, &iter, RENAME_COLUMN_PATH, &path, -1);
+
+               base = remove_level_from_path(path);
+               dest = g_strdup_printf("%s/%s%0*d%s", base, front, padding, n, end);
+               if (isname(dest)) success = FALSE;
+               g_free(dest);
+               g_free(base);
+               g_free(path);
+
+               n++;
+               valid = gtk_tree_model_iter_next(store, &iter);
+               }
+
+       if (!success)
+               {
+               file_util_warning_dialog(_("Auto rename"),
+                              _("Can not auto rename with the selected\nnumber set, one or more files exist that\nmatch the resulting name list.\n"),
+                              GTK_STOCK_DIALOG_WARNING, NULL);
+               return;
+               }
+
+       /* select the first iter, so that on fail the correct info is given to user */
+       if (gtk_tree_model_get_iter_first(store, &iter))
+               {
+               GtkTreeSelection *selection;
+
+               selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(rd->listview));
+               gtk_tree_selection_select_iter(selection, &iter);
+               }
+
+       /* now do it for real */
+       success = TRUE;
+       n = start_n;
+       while (success && gtk_tree_model_get_iter_first(store, &iter))
+               {
+               gchar *dest;
+               gchar *base;
+               gchar *path;
+
+               gtk_tree_model_get(store, &iter, RENAME_COLUMN_PATH, &path, -1);
+
+               base = remove_level_from_path(path);
+               dest = g_strdup_printf("%s/%s%0*d%s", base, front, padding, n, end);
+               if (!rename_file(path, dest))
+                       {
+                       success = FALSE;
+                       }
+               else
+                       {
+                       file_maint_renamed(path, dest);
+                       }
+
+               g_free(dest);
+               g_free(base);
+               g_free(path);
+
+               if (success)
+                       {
+                       gtk_list_store_remove(GTK_LIST_STORE(store), &iter);
+                       if (gtk_tree_model_get_iter_first(store, &iter))
+                               {
+                               GtkTreeSelection *selection;
+
+                               selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(rd->listview));
+                               gtk_tree_selection_select_iter(selection, &iter);
                                }
                        }
+
+               n++;
+               }
+
+       if (!success)
+               {
+               gchar *buf;
+
+               n--;
+               gtk_spin_button_set_value(GTK_SPIN_BUTTON(rd->auto_spin_start), (float)n);
+
+               buf = g_strdup_printf(_("Failed to rename\n%s\nThe number was %d."), filename_from_path(rd->fd->source_path), n);
+               file_util_warning_dialog(_("Auto rename"), buf, GTK_STOCK_DIALOG_ERROR, NULL);
+               g_free(buf);
+
+               return;
                }
+
+       file_dialog_close(rd->fd);
 }
 
-static void file_util_rename_multiple_cb(GtkWidget *w, gpointer data)
+static void file_util_rename_multiple_cb(FileDialog *fd, gpointer data)
 {
-       FileDialog *fd = data;
+       RenameDataMult *rd = data;
        gchar *base;
-       gchar *name;
+       const gchar *name;
 
-       name = gtk_entry_get_text(GTK_ENTRY(fd->entry));
+       if (rd->rename_auto)
+               {
+               file_util_rename_multiple_auto(rd);
+               return;
+               }
+
+       name = gtk_entry_get_text(GTK_ENTRY(rd->rename_entry));
        base = remove_level_from_path(fd->source_path);
+
        g_free(fd->dest_path);
-       fd->dest_path = g_strconcat(base, "/", name, NULL);
+       fd->dest_path = concat_dir_and_file(base, name);
        g_free(base);
 
        if (strlen(name) == 0 || strcmp(fd->source_path, fd->dest_path) == 0)
@@ -719,108 +1841,338 @@ static void file_util_rename_multiple_cb(GtkWidget *w, gpointer data)
                }
 
        fd->type = FALSE;
-       file_util_rename_multiple(fd);
+       file_util_rename_multiple(rd);
+}
+
+static void file_util_rename_multiple_close_cb(FileDialog *fd, gpointer data)
+{
+       RenameDataMult *rd = data;
+
+       file_dialog_close(rd->fd);
+}
+
+static gboolean file_util_rename_multiple_select_cb(GtkTreeSelection *selection, GtkTreeModel *store, GtkTreePath *tpath,
+                                                   gboolean path_currently_selected, gpointer data)
+{
+       RenameDataMult *rd = data;
+       GtkTreeIter iter;
+       const gchar *name;
+       gchar *path = NULL;
+
+       if (path_currently_selected ||
+           !gtk_tree_model_get_iter(store, &iter, tpath)) return TRUE;
+       gtk_tree_model_get(store, &iter, RENAME_COLUMN_PATH, &path, -1);
+
+       g_free(rd->fd->source_path);
+       rd->fd->source_path = path;
+
+       name = filename_from_path(rd->fd->source_path);
+       gtk_label_set_text(GTK_LABEL(rd->rename_label), name);
+       gtk_entry_set_text(GTK_ENTRY(rd->rename_entry), name);
+
+       image_change_path(rd->imd, rd->fd->source_path, 0.0);
+
+       if (GTK_WIDGET_VISIBLE(rd->rename_box))
+               {
+               gtk_widget_grab_focus(rd->rename_entry);
+               }
+
+       return TRUE;
 }
 
-static void file_util_rename_multiple_select_cb(GtkWidget *clist,
-               gint row, gint column, GdkEventButton *bevent, gpointer data)
+static void file_util_rename_multiple_preview_update(RenameDataMult *rd)
 {
-       FileDialog *fd = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       const gchar *front;
+       const gchar *end;
+       gint valid;
+       gint start_n;
+       gint padding;
+       gint n;
+
+       front = gtk_entry_get_text(GTK_ENTRY(rd->auto_entry_front));
+       end = gtk_entry_get_text(GTK_ENTRY(rd->auto_entry_end));
+       start_n = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rd->auto_spin_start));
+       padding = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(rd->auto_spin_pad));
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(rd->listview));
+       n = start_n;
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+       while (valid)
+               {
+               gchar *dest;
+
+               dest = g_strdup_printf("%s%0*d%s", front, padding, n, end);
+               gtk_list_store_set(GTK_LIST_STORE(store), &iter, RENAME_COLUMN_PREVIEW, dest, -1);
+               g_free(dest);
+
+               n++;
+               valid = gtk_tree_model_iter_next(store, &iter);
+               }
+
+}
+
+static gboolean file_util_rename_multiple_idle_cb(gpointer data)
+{
+       RenameDataMult *rd = data;
+
+       file_util_rename_multiple_preview_update(rd);
+
+       rd->update_idle_id = -1;
+       return FALSE;
+}
+
+static void file_util_rename_multiple_preview_order_cb(GtkTreeModel *treemodel, GtkTreePath *tpath,
+                                                      GtkTreeIter *iter, gpointer data)
+{
+       RenameDataMult *rd = data;
+
+       if (rd->rename_auto && rd->update_idle_id == -1)
+               {
+               rd->update_idle_id = g_idle_add(file_util_rename_multiple_idle_cb, rd);
+               }
+}
+
+static void file_util_rename_multiple_preview_entry_cb(GtkWidget *entry, gpointer data)
+{
+       RenameDataMult *rd = data;
+       file_util_rename_multiple_preview_update(rd);
+}
+
+static void file_util_rename_multiple_preview_adj_cb(GtkWidget *spin, gpointer data)
+{
+       RenameDataMult *rd = data;
+       file_util_rename_multiple_preview_update(rd);
+}
+
+static void file_util_rename_mulitple_auto_toggle(GtkWidget *widget, gpointer data)
+{
+       RenameDataMult *rd = data;
+       GtkTreeViewColumn *column;
+
+       rd->rename_auto = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rd->button_auto));
+
+       if (rd->rename_auto)
+               {
+               if (GTK_WIDGET_VISIBLE(rd->rename_box)) gtk_widget_hide(rd->rename_box);
+               if (!GTK_WIDGET_VISIBLE(rd->auto_box)) gtk_widget_show(rd->auto_box);
+               file_util_rename_multiple_preview_update(rd);
+               }
+       else
+               {
+               if (GTK_WIDGET_VISIBLE(rd->auto_box)) gtk_widget_hide(rd->auto_box);
+               if (!GTK_WIDGET_VISIBLE(rd->rename_box)) gtk_widget_show(rd->rename_box);
+               }
+
+       column = gtk_tree_view_get_column(GTK_TREE_VIEW(rd->listview), RENAME_COLUMN_PREVIEW - 1);
+       gtk_tree_view_column_set_visible(column, rd->rename_auto);
+}
+
+static GtkWidget *furm_simple_vlabel(GtkWidget *box, const gchar *text, gint expand)
+{
+       GtkWidget *vbox;
        GtkWidget *label;
-       gchar *name;
-       gchar *path;
 
-       label = gtk_object_get_user_data(GTK_OBJECT(fd->dialog));
-       path = gtk_clist_get_row_data(GTK_CLIST(clist), row);
-       g_free(fd->source_path);
-       fd->source_path = g_strdup(path);
-       gtk_object_set_user_data(GTK_OBJECT(clist), path);
-       name = filename_from_path(fd->source_path);
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(box), vbox, expand, expand, 0);
+       gtk_widget_show(vbox);
 
-       gtk_label_set(GTK_LABEL(label), name);
-       gtk_entry_set_text(GTK_ENTRY(fd->entry), name);
+       label = gtk_label_new(text);
+       gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+       gtk_widget_show(label);
 
-       gtk_widget_grab_focus(fd->entry);
+       return vbox;
 }
 
-static void file_util_rename_multiple_do(GList *source_list)
+static GtkTreeViewColumn *file_util_rename_multiple_add_column(RenameDataMult *rd, const gchar *text, gint n)
 {
-       FileDialog *fd;
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+
+       column = gtk_tree_view_column_new();
+        gtk_tree_view_column_set_title(column, text);
+        gtk_tree_view_column_set_min_width(column, 4);
+        gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
+        renderer = gtk_cell_renderer_text_new();
+        gtk_tree_view_column_pack_start(column, renderer, TRUE);
+        gtk_tree_view_column_add_attribute(column, renderer, "text", n);
+        gtk_tree_view_append_column(GTK_TREE_VIEW(rd->listview), column);
+
+       return column;
+}
+
+static void file_util_rename_multiple_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       RenameDataMult *rd = data;
+
+       if (rd->update_idle_id != -1) g_source_remove(rd->update_idle_id);
+
+       g_free(rd);
+}
+
+static void file_util_rename_multiple_do(GList *source_list, GtkWidget *parent)
+{
+       RenameDataMult *rd;
+       GtkWidget *pane;
        GtkWidget *scrolled;
-       GtkWidget *clist;
-       GtkWidget *label;
+       GtkListStore *store;
+       GtkTreeSelection *selection;
+       GtkTreeViewColumn *column;
+       GtkWidget *hbox;
+       GtkWidget *vbox;
+       GtkWidget *box2;
+       GtkWidget *table;
+       GtkWidget *combo;
        GList *work;
 
-       fd = generic_dialog_new(_("GQview - rename"), _("Rename multiple files:"), _("Rename"), _("Cancel"),
-               file_util_rename_multiple_cb, generic_dialog_close);
+       rd = g_new0(RenameDataMult, 1);
+
+       rd->fd = file_util_file_dlg(_("Rename - GQview"),
+                                   "GQview", "dlg_rename", parent,
+                                   file_util_rename_multiple_close_cb, rd);
+       generic_dialog_add_message(GENERIC_DIALOG(rd->fd), NULL, _("Rename multiple files"), NULL);
+       file_dialog_add_button(rd->fd, GTK_STOCK_OK, _("_Rename"), file_util_rename_multiple_cb, TRUE);
+
+       rd->fd->source_path = g_strdup(source_list->data);
+       rd->fd->dest_path = NULL;
+
+       rd->update_idle_id = -1;
 
-       fd->source_path = g_strdup(source_list->data);
-       fd->dest_path = NULL;
+       vbox = GENERIC_DIALOG(rd->fd)->vbox;
 
+       pane = gtk_hpaned_new();
+       gtk_box_pack_start(GTK_BOX(vbox), pane, TRUE, TRUE, 0);
+       gtk_widget_show(pane);
+       
        scrolled = gtk_scrolled_window_new(NULL, NULL);
-       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
-                               GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
-       gtk_box_pack_start(GTK_BOX(fd->vbox), scrolled, TRUE, TRUE, 0);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (scrolled),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+       gtk_paned_pack1(GTK_PANED(pane), scrolled, TRUE, TRUE);
        gtk_widget_show(scrolled);
 
-       clist=gtk_clist_new (1);
-       gtk_clist_set_column_auto_resize(GTK_CLIST(clist), 0, TRUE);
-       gtk_signal_connect (GTK_OBJECT (clist), "select_row",(GtkSignalFunc) file_util_rename_multiple_select_cb, fd);
-       gtk_widget_set_usize(clist, 250, 150);
-       gtk_container_add (GTK_CONTAINER (scrolled), clist);
-       gtk_widget_show (clist);
+       store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+       rd->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
 
-       gtk_object_set_user_data(GTK_OBJECT(clist), source_list->data);
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(rd->listview), TRUE);
+       gtk_tree_view_set_enable_search(GTK_TREE_VIEW(rd->listview), FALSE);
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(rd->listview));
+       gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_SINGLE);
+       gtk_tree_selection_set_select_function(selection, file_util_rename_multiple_select_cb, rd, NULL);
+
+       file_util_rename_multiple_add_column(rd, _("Original Name"), RENAME_COLUMN_NAME);
+       column = file_util_rename_multiple_add_column(rd, _("Preview"), RENAME_COLUMN_PREVIEW);
+       gtk_tree_view_column_set_visible(column, FALSE);
+       
+       gtk_tree_view_set_reorderable(GTK_TREE_VIEW(rd->listview), TRUE);
+       g_signal_connect(G_OBJECT(store), "row_changed",
+                        G_CALLBACK(file_util_rename_multiple_preview_order_cb), rd);
+       gtk_widget_set_size_request(rd->listview, 250, 150);
+
+       gtk_container_add(GTK_CONTAINER(scrolled), rd->listview);
+       gtk_widget_show(rd->listview);
 
        work = source_list;
-       while(work)
-               {
-               gint row;
-               gchar *buf[2];
-               buf[0] = filename_from_path(work->data);
-               buf[1] = NULL;
-               row = gtk_clist_append(GTK_CLIST(clist), buf);
-               gtk_clist_set_row_data_full(GTK_CLIST(clist), row,
-                               work->data, (GtkDestroyNotify) g_free);
+       while (work)
+               {
+               gchar *path = work->data;
+               GtkTreeIter iter;
+
+               gtk_list_store_append(store, &iter);
+               gtk_list_store_set(store, &iter, RENAME_COLUMN_PATH, path, RENAME_COLUMN_NAME, filename_from_path(path), -1);
+
                work = work->next;
                }
 
-       g_list_free(source_list);
+       path_list_free(source_list);
 
-       label = gtk_label_new(_("Rename:"));
-       gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0);
-       gtk_widget_show(label);
+       rd->imd = image_new(TRUE);
+       gtk_widget_set_size_request(rd->imd->widget, DIALOG_DEF_IMAGE_DIM_X, DIALOG_DEF_IMAGE_DIM_Y);
+       gtk_paned_pack2(GTK_PANED(pane), rd->imd->widget, FALSE, TRUE);
+       gtk_widget_show(rd->imd->widget);
 
-       label = gtk_label_new(filename_from_path(fd->source_path));
-       gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0);
-       gtk_widget_show(label);
-       gtk_object_set_user_data(GTK_OBJECT(fd->dialog), label);
+       hbox = gtk_hbox_new(FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+       gtk_widget_show(hbox);
 
-       label = gtk_label_new(_("to:"));
-       gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0);
-       gtk_widget_show(label);
+       rd->button_auto = gtk_check_button_new_with_label(_("Auto rename"));
+       g_signal_connect(G_OBJECT(rd->button_auto), "clicked",
+                        G_CALLBACK(file_util_rename_mulitple_auto_toggle), rd);
+       gtk_box_pack_end(GTK_BOX(hbox), rd->button_auto, FALSE, FALSE, 0);
+       gtk_widget_show(rd->button_auto);
 
-       fd->entry = gtk_entry_new();
-       gtk_entry_set_text(GTK_ENTRY(fd->entry), filename_from_path(fd->source_path));
-       gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0);
-       gtk_widget_grab_focus(fd->entry);
-       gtk_widget_show(fd->entry);
+       rd->rename_box = pref_box_new(vbox, FALSE, GTK_ORIENTATION_VERTICAL, 0);
+       table = pref_table_new(rd->rename_box, 2, 2, FALSE, FALSE);
+
+       pref_table_label(table, 0, 0, _("Original name:"), 1.0);
+       rd->rename_label = pref_table_label(table, 1, 0, filename_from_path(rd->fd->source_path), 0.0);
+
+       pref_table_label(table, 0, 1, _("New name:"), 1.0);
+
+       rd->rename_entry = gtk_entry_new();
+       gtk_entry_set_text(GTK_ENTRY(rd->rename_entry), filename_from_path(rd->fd->source_path));
+       gtk_table_attach(GTK_TABLE(table), rd->rename_entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, FALSE, 0, 0);
+       generic_dialog_attach_default(GENERIC_DIALOG(rd->fd), rd->rename_entry);
+       gtk_widget_grab_focus(rd->rename_entry);
+       gtk_widget_show(rd->rename_entry);
+
+       rd->auto_box = gtk_vbox_new(FALSE, PREF_PAD_GAP);
+       gtk_box_pack_start(GTK_BOX(vbox), rd->auto_box, FALSE, FALSE, 0);
+       /* do not show it here */
+
+       hbox = pref_box_new(rd->auto_box, FALSE, GTK_ORIENTATION_HORIZONTAL, PREF_PAD_GAP);
+
+       box2 = furm_simple_vlabel(hbox, _("Begin text"), TRUE);
+
+       combo = history_combo_new(&rd->auto_entry_front, "", "numerical_rename_prefix", -1);
+       g_signal_connect(G_OBJECT(rd->auto_entry_front), "changed",
+                        G_CALLBACK(file_util_rename_multiple_preview_entry_cb), rd);
+       gtk_box_pack_start(GTK_BOX(box2), combo, TRUE, TRUE, 0);
+       gtk_widget_show(combo);
+       
+       box2 = furm_simple_vlabel(hbox, _("Start #"), FALSE);
 
-       gtk_object_set_user_data(GTK_OBJECT(fd->entry), clist);
+       rd->auto_spin_start = pref_spin_new(box2, NULL, NULL,
+                                           0.0, 1000000.0, 1.0, 0, 0.0,
+                                           G_CALLBACK(file_util_rename_multiple_preview_adj_cb), rd);
+
+       box2 = furm_simple_vlabel(hbox, _("End text"), TRUE);
+
+       combo = history_combo_new(&rd->auto_entry_end, "", "numerical_rename_suffix", -1);
+       g_signal_connect(G_OBJECT(rd->auto_entry_end), "changed",
+                        G_CALLBACK(file_util_rename_multiple_preview_entry_cb), rd);
+       gtk_box_pack_start(GTK_BOX(box2), combo, TRUE, TRUE, 0);
+       gtk_widget_show(combo);
+
+       rd->auto_spin_pad = pref_spin_new(rd->auto_box, _("Padding:"), NULL,
+                                         1.0, 8.0, 1.0, 0, 1.0,
+                                         G_CALLBACK(file_util_rename_multiple_preview_adj_cb), rd);
+
+       image_change_path(rd->imd, rd->fd->source_path, 0.0);
+
+       g_signal_connect(G_OBJECT(GENERIC_DIALOG(rd->fd)->dialog), "destroy",
+                        G_CALLBACK(file_util_rename_multiple_destroy_cb), rd);
+
+       gtk_widget_show(GENERIC_DIALOG(rd->fd)->dialog);
 }
 
 /*
  * rename single file
  */
 
-static void file_util_rename_single_ok_cb(GtkWidget *w, gpointer data)
+static void file_util_rename_single(FileDataSingle *fds);
+
+static void file_util_rename_single_ok_cb(GenericDialog *gd, gpointer data)
 {
        FileDataSingle *fds = data;
        fds->confirmed = TRUE;
        file_util_rename_single(fds);
 }
 
-static void file_util_rename_single_cancel_cb(GtkWidget *w, gpointer data)
+static void file_util_rename_single_cancel_cb(GenericDialog *gd, gpointer data)
 {
        FileDataSingle *fds = data;
        file_data_single_free(fds);
@@ -830,88 +2182,115 @@ static void file_util_rename_single(FileDataSingle *fds)
 {
        if (isfile(fds->dest) && !fds->confirmed)
                {
-               ConfirmDialog *cd;
-               gchar *text = g_strdup_printf(_("Overwrite file:\n%s\nby renaming:\n%s"), fds->dest,fds->source);
-               cd = confirm_dialog_new_with_image(_("Overwrite file"), text,
-                                                  fds->dest, fds->source,
-                                                  file_util_rename_single_cancel_cb, fds);
-               confirm_dialog_add(cd, _("Overwrite"), file_util_rename_single_ok_cb);
-               g_free(text);
+               GenericDialog *gd;
+
+               gd = file_util_gen_dlg(_("Overwrite file"), "GQview", "dlg_confirm",
+                                       NULL, TRUE,
+                                       file_util_rename_single_cancel_cb, fds);
+
+               generic_dialog_add_message(gd, GTK_STOCK_DIALOG_QUESTION,
+                                          _("Overwrite file?"),
+                                          _("Replace existing file by renaming new file."));
+               pref_spacer(gd->vbox, 0);
+
+               generic_dialog_add_button(gd, GTK_STOCK_OK, _("_Overwrite"), file_util_rename_single_ok_cb, TRUE);
+               generic_dialog_add_image(gd, fds->dest, _("Existing file"), fds->source, _("New file"), TRUE);
+
+               gtk_widget_show(gd->dialog);
+
                return;
                }
        else
                {
-               if (rename (fds->source, fds->dest) < 0)
+               if (!rename_file(fds->source, fds->dest))
                        {
                        gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\nto:\n%s"), filename_from_path(fds->source), filename_from_path(fds->dest));
-                       warning_dialog(_("Error renaming file"), text);
+                       file_util_warning_dialog(_("Error renaming file"), text, GTK_STOCK_DIALOG_ERROR, NULL);
                        g_free(text);
                        }
                else
                        {
-                       file_is_renamed(fds->source, fds->dest);
+                       file_maint_renamed(fds->source, fds->dest);
                        }
                }
        file_data_single_free(fds);
 }
 
-static void file_util_rename_single_cb(GtkWidget *w, gpointer data)
+static void file_util_rename_single_cb(FileDialog *fd, gpointer data)
 {
-       FileDialog *fd = data;
-       gchar *name = gtk_entry_get_text(GTK_ENTRY(fd->entry));
-       gchar *buf = g_strconcat(fd->dest_path, "/", name, NULL);
+       const gchar *name;
+       gchar *path;
+
+       name = gtk_entry_get_text(GTK_ENTRY(fd->entry));
+       path = concat_dir_and_file(fd->dest_path, name);
 
-       if (strlen(name) == 0 || strcmp(fd->source_path, buf) == 0)
+       if (strlen(name) == 0 || strcmp(fd->source_path, path) == 0)
                {
-               g_free(buf);
+               g_free(path);
                return;
                }
 
-       g_free(fd->dest_path);
-       fd->dest_path = buf;
+       file_util_rename_single(file_data_single_new(fd->source_path, path, fd->type));
 
-       file_util_rename_single(file_data_single_new(fd->source_path, fd->dest_path, fd->type));
+       g_free(path);
+       file_dialog_close(fd);
+}
 
-       generic_dialog_close(NULL, fd);
+static void file_util_rename_single_close_cb(FileDialog *fd, gpointer data)
+{
+       file_dialog_close(fd);
 }
 
-static void file_util_rename_single_do(gchar *source_path)
+static void file_util_rename_single_do(const gchar *source_path, GtkWidget *parent)
 {
        FileDialog *fd;
-       gchar *text;
-       gchar *name = filename_from_path(source_path);
+       GtkWidget *table;
 
-       text = g_strdup_printf(_("Rename file:\n%s\nto:"), name);
-       fd = generic_dialog_new(_("GQview - rename"), text, _("Rename"), _("Cancel"),
-               file_util_rename_single_cb, generic_dialog_close);
-       g_free(text);
+       fd = file_util_file_dlg(_("Rename - GQview"), "GQview", "dlg_rename", parent,
+                            file_util_rename_single_close_cb, NULL);
+
+       generic_dialog_add_message(GENERIC_DIALOG(fd), NULL, _("Rename file"), NULL);
+       generic_dialog_add_image(GENERIC_DIALOG(fd), source_path, NULL, NULL, NULL, FALSE);
+
+       file_dialog_add_button(fd, GTK_STOCK_OK, _("_Rename"), file_util_rename_single_cb, TRUE);
 
        fd->source_path = g_strdup(source_path);
        fd->dest_path = remove_level_from_path(source_path);
 
+       table = pref_table_new(GENERIC_DIALOG(fd)->vbox, 2, 2, FALSE, FALSE);
+
+       pref_table_label(table, 0, 0, _("Original name:"), 1.0);
+       pref_table_label(table, 1, 0, filename_from_path(fd->source_path), 0.0);
+
+       pref_table_label(table, 0, 1, _("New name:"), 1.0);
+
        fd->entry = gtk_entry_new();
-       gtk_entry_set_text(GTK_ENTRY(fd->entry), name);
-       gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0);
+       gtk_table_attach(GTK_TABLE(table), fd->entry, 1, 2, 1, 2, GTK_EXPAND | GTK_FILL, FALSE, 0, 0);
+       gtk_entry_set_text(GTK_ENTRY(fd->entry), filename_from_path(fd->source_path));
+       gtk_editable_select_region(GTK_EDITABLE(fd->entry), 0, strlen(gtk_entry_get_text(GTK_ENTRY(fd->entry))));
+       generic_dialog_attach_default(GENERIC_DIALOG(fd), fd->entry);
        gtk_widget_grab_focus(fd->entry);
        gtk_widget_show(fd->entry);
+
+       gtk_widget_show(GENERIC_DIALOG(fd)->dialog);
 }
 
-void file_util_rename(gchar *source_path, GList *source_list)
+void file_util_rename(const gchar *source_path, GList *source_list, GtkWidget *parent)
 {
        if (!source_path && !source_list) return;
 
        if (source_path)
                {
-               file_util_rename_single_do(source_path);
+               file_util_rename_single_do(source_path, parent);
                }
        else if (!source_list->next)
                {
-               file_util_rename_single_do(source_list->data);
-               free_selected_list(source_list);
+               file_util_rename_single_do(source_list->data, parent);
+               path_list_free(source_list);
                }
        else
                {
-               file_util_rename_multiple_do(source_list);
+               file_util_rename_multiple_do(source_list, parent);
                }
 }
 
@@ -921,75 +2300,89 @@ void file_util_rename(gchar *source_path, GList *source_list)
  *--------------------------------------------------------------------------
  */
 
-static void file_util_create_dir_do(gchar *source, gchar *path)
+static void file_util_create_dir_do(const gchar *base, const gchar *name)
 {
-       if (isfile(path))
+       gchar *path;
+
+       path = concat_dir_and_file(base, name);
+
+       if (isdir(path))
                {
-               gchar *text = g_strdup_printf(_("The path:\n%s\nalready exists as a file."), filename_from_path(path));
-               warning_dialog(_("Could not create directory"), text);
+               gchar *text = g_strdup_printf(_("The folder:\n%s\nalready exists."), name);
+               file_util_warning_dialog(_("Folder exists"), text, GTK_STOCK_DIALOG_INFO, NULL);
                g_free(text);
                }
-       else if (isdir(path))
+       else if (isname(path))
                {
-               gchar *text = g_strdup_printf(_("The directory:\n%s\nalready exists."), filename_from_path(path));
-               warning_dialog(_("Directory exists"), text);
+               gchar *text = g_strdup_printf(_("The path:\n%s\nalready exists as a file."), name);
+               file_util_warning_dialog(_("Could not create folder"), text, GTK_STOCK_DIALOG_INFO, NULL);
                g_free(text);
                }
        else
                {
-               if (mkdir (path, 0755) < 0)
+               if (!mkdir_utf8(path, 0755))
                        {
-                       gchar *text = g_strdup_printf(_("Unable to create directory:\n%s"), filename_from_path(path));
-                       warning_dialog(_("Error creating directory"), text);
+                       gchar *text = g_strdup_printf(_("Unable to create folder:\n%s"), name);
+                       file_util_warning_dialog(_("Error creating folder"), text, GTK_STOCK_DIALOG_ERROR, NULL);
                        g_free(text);
                        }
-               else
-                       {
-                       if (strcmp(source, current_path) == 0)
-                               {
-                               gchar *buf = g_strdup(current_path);
-                               filelist_change_to(buf);
-                               g_free(buf);
-                               }
-                       }
                }
+
+       g_free(path);
 }
 
-static void file_util_create_dir_cb(GtkWidget *w, gpointer data)
+static void file_util_create_dir_cb(FileDialog *fd, gpointer data)
 {
-       FileDialog *fd = data;
-       gchar *name = gtk_entry_get_text(GTK_ENTRY(fd->entry));
+       const gchar *name;
+
+       name = gtk_entry_get_text(GTK_ENTRY(fd->entry));
 
        if (strlen(name) == 0) return;
 
-       g_free(fd->dest_path);
-       fd->dest_path = g_strconcat(fd->source_path, "/", name, NULL);
+       if (name[0] == '/')
+               {
+               gchar *buf;
+               buf  = remove_level_from_path(name);
+               file_util_create_dir_do(buf, filename_from_path(name));
+               g_free(buf);
+               }
+       else
+               {
+               file_util_create_dir_do(fd->dest_path, name);
+               }
 
-       file_util_create_dir_do(fd->source_path, fd->dest_path);
+       file_dialog_close(fd);
+}
 
-       generic_dialog_close(NULL, fd);
+static void file_util_create_dir_close_cb(FileDialog *fd, gpointer data)
+{
+       file_dialog_close(fd);
 }
 
-void file_util_create_dir(gchar *path)
+void file_util_create_dir(const gchar *path, GtkWidget *parent)
 {
        FileDialog *fd;
        gchar *text;
-       gchar *name;
 
        if (!isdir(path)) return;
-       name = filename_from_path(path);
 
-       text = g_strdup_printf(_("Create directory in:\n%s\nnamed:"), path);
-       fd = generic_dialog_new(_("GQview - new directory"), text, _("Create"), _("Cancel"),
-               file_util_create_dir_cb, generic_dialog_close);
+       fd = file_util_file_dlg(_("New folder - GQview"), "GQview", "dlg_newdir", parent,
+                            file_util_create_dir_close_cb, NULL);
+
+       text = g_strdup_printf(_("Create folder in:\n%s\nnamed:"), path);
+       generic_dialog_add_message(GENERIC_DIALOG(fd), NULL, NULL, text);
        g_free(text);
 
-       fd->source_path = g_strdup(path);
-       fd->dest_path = NULL;
+       file_dialog_add_button(fd, GTK_STOCK_OK, NULL, file_util_create_dir_cb, TRUE);
+
+       fd->dest_path = g_strdup(path);
 
        fd->entry = gtk_entry_new();
-       gtk_box_pack_start(GTK_BOX(fd->vbox), fd->entry, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(GENERIC_DIALOG(fd)->vbox), fd->entry, FALSE, FALSE, 0);
+       generic_dialog_attach_default(GENERIC_DIALOG(fd), fd->entry);
        gtk_widget_grab_focus(fd->entry);
        gtk_widget_show(fd->entry);
+
+       gtk_widget_show(GENERIC_DIALOG(fd)->dialog);
 }
 
diff --git a/src/utilops.h b/src/utilops.h
new file mode 100644 (file)
index 0000000..1671265
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#ifndef UTILOPS_H
+#define UTILOPS_H
+
+
+#include "ui_utildlg.h"
+
+
+void file_maint_renamed(const gchar *source, const gchar *dest);
+void file_maint_removed(const gchar *path, GList *ignore_list);
+void file_maint_moved(const gchar *source, const gchar *dest, GList *ignore_list);
+void file_maint_copied(const gchar *source, const gchar *dest);
+
+GenericDialog *file_util_gen_dlg(const gchar *title,
+                                const gchar *wmclass, const gchar *wmsubclass,
+                                GtkWidget *parent, gint auto_close,
+                                void (*cancel_cb)(GenericDialog *, gpointer), gpointer data);
+FileDialog *file_util_file_dlg(const gchar *title,
+                              const gchar *wmclass, const gchar *wmsubclass,
+                              GtkWidget *parent,
+                              void (*cancel_cb)(FileDialog *, gpointer), gpointer data);
+GenericDialog *file_util_warning_dialog(const gchar *heading, const gchar *message,
+                                       const gchar *icon_stock_id, GtkWidget *parent);
+
+void file_util_trash_clear(void);
+
+void file_util_delete(const gchar *source_path, GList *source_list, GtkWidget *parent);
+void file_util_move(const gchar *source_path, GList *source_list, const gchar *dest_path, GtkWidget *parent);
+void file_util_copy(const gchar *source_path, GList *source_list, const gchar *dest_path, GtkWidget *parent);
+void file_util_rename(const gchar *source_path, GList *source_list, GtkWidget *parent);
+void file_util_create_dir(const gchar *path, GtkWidget *parent);
+
+/* these avoid the location entry dialog, list must be files only and
+ * dest_path must be a valid directory path
+*/
+void file_util_move_simple(GList *list, const gchar *dest_path);
+void file_util_copy_simple(GList *list, const gchar *dest_path);
+
+
+#endif
+
diff --git a/src/view_dir_list.c b/src/view_dir_list.c
new file mode 100644 (file)
index 0000000..e083405
--- /dev/null
@@ -0,0 +1,1166 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#include "gqview.h"
+#include "view_dir_list.h"
+
+#include "dnd.h"
+#include "dupe.h"
+#include "filelist.h"
+#include "layout.h"
+#include "layout_image.h"
+#include "layout_util.h"
+#include "utilops.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_tree_edit.h"
+
+#include <gdk/gdkkeysyms.h> /* for keyboard values */
+
+
+#define VDLIST_PAD 4
+
+
+enum {
+       DIR_COLUMN_POINTER = 0,
+       DIR_COLUMN_ICON,
+       DIR_COLUMN_NAME,
+       DIR_COLUMN_COLOR,
+       DIR_COLUMN_COUNT
+};
+
+
+static void vdlist_popup_destroy_cb(GtkWidget *widget, gpointer data);
+static gint vdlist_auto_scroll_notify_cb(GtkWidget *widget, gint x, gint y, gpointer data);
+
+/*
+ *-----------------------------------------------------------------------------
+ * misc
+ *-----------------------------------------------------------------------------
+ */
+
+static gint vdlist_find_row(ViewDirList *vdl, FileData *fd, GtkTreeIter *iter)
+{
+       GtkTreeModel *store;
+       gint valid;
+       gint row = 0;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+       valid = gtk_tree_model_get_iter_first(store, iter);
+       while (valid)
+               {
+               FileData *fd_n;
+               gtk_tree_model_get(GTK_TREE_MODEL(store), iter, DIR_COLUMN_POINTER, &fd_n, -1);
+               if (fd_n == fd) return row;
+
+               valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), iter);
+               row++;
+               }
+
+       return -1;
+}
+
+static gint vdlist_rename_row_cb(TreeEditData *td, const gchar *old, const gchar *new, gpointer data)
+{
+       ViewDirList *vdl = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       FileData *fd;
+       gchar *old_path;
+       gchar *new_path;
+       gchar *base;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+       if (!gtk_tree_model_get_iter(store, &iter, td->path)) return FALSE;
+       gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &fd, -1);
+       if (!fd) return FALSE;
+       
+       old_path = g_strdup(fd->path);
+
+       base = remove_level_from_path(old_path);
+       new_path = concat_dir_and_file(base, new);
+       g_free(base);
+
+       if (!rename_file(old_path, new_path))
+               {
+               gchar *buf;
+
+               buf = g_strdup_printf(_("Failed to rename %s to %s."), old, new);
+               file_util_warning_dialog("Rename failed", buf, GTK_STOCK_DIALOG_ERROR, vdl->listview);
+               g_free(buf);
+               }
+       else
+               {
+               if (vdl->layout && strcmp(vdl->path, old_path) == 0)
+                       {
+                       layout_set_path(vdl->layout, new_path);
+                       }
+               else
+                       {
+                       vdlist_refresh(vdl);
+                       }
+               }
+
+       g_free(old_path);
+       g_free(new_path);
+       return FALSE;
+}
+
+static void vdlist_rename_by_row(ViewDirList *vdl, FileData *fd)
+{
+       GtkTreeModel *store;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+
+       if (vdlist_find_row(vdl, fd, &iter) < 0) return;
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+       tpath = gtk_tree_model_get_path(store, &iter);
+
+       tree_edit_by_path(GTK_TREE_VIEW(vdl->listview), tpath, 0, fd->name,
+                         vdlist_rename_row_cb, vdl);
+       gtk_tree_path_free(tpath);
+}
+
+static FileData *vdlist_row_by_path(ViewDirList *vdl, const gchar *path, gint *row)
+{
+       GList *work;
+       gint n;
+
+       if (!path)
+               {
+               if (row) *row = -1;
+               return NULL;
+               }
+
+       n = 0;
+       work = vdl->list;
+       while (work)
+               {
+               FileData *fd = work->data;
+               if (strcmp(fd->path, path) == 0)
+                       {
+                       if (row) *row = n;
+                       return fd;
+                       }
+               work = work->next;
+               n++;
+               }
+
+       if (row) *row = -1;
+       return NULL;
+}
+
+static void vdlist_color_set(ViewDirList *vdl, FileData *fd, gint color_set)
+{
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+
+       if (vdlist_find_row(vdl, fd, &iter) < 0) return;
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+       gtk_list_store_set(GTK_LIST_STORE(store), &iter, DIR_COLUMN_COLOR, color_set, -1);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * drop menu (from dnd)
+ *-----------------------------------------------------------------------------
+ */
+
+static void vdlist_drop_menu_copy_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirList *vdl = data;
+       const gchar *path;
+       GList *list;
+
+       if (!vdl->drop_fd) return;
+
+       path = vdl->drop_fd->path;
+       list = vdl->drop_list;
+       vdl->drop_list = NULL;
+
+       file_util_copy_simple(list, path);
+}
+
+static void vdlist_drop_menu_move_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirList *vdl = data;
+       const gchar *path;
+       GList *list;
+
+       if (!vdl->drop_fd) return;
+
+       path = vdl->drop_fd->path;
+       list = vdl->drop_list;
+
+       vdl->drop_list = NULL;
+
+       file_util_move_simple(list, path);
+}
+
+static GtkWidget *vdlist_drop_menu(ViewDirList *vdl, gint active)
+{
+       GtkWidget *menu;
+
+       menu = popup_menu_short_lived();
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(vdlist_popup_destroy_cb), vdl);
+
+       menu_item_add_stock_sensitive(menu, _("_Copy"), GTK_STOCK_COPY, active,
+                                     G_CALLBACK(vdlist_drop_menu_copy_cb), vdl);
+       menu_item_add_sensitive(menu, _("_Move"), active, G_CALLBACK(vdlist_drop_menu_move_cb), vdl);
+
+       menu_item_add_divider(menu);
+       menu_item_add_stock(menu, _("Cancel"), GTK_STOCK_CANCEL, NULL, vdl);
+
+       return menu;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * pop-up menu
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void vdlist_pop_menu_up_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirList *vdl = data;
+       gchar *path;
+
+       if (!vdl->path || strcmp(vdl->path, "/") == 0) return;
+       path = remove_level_from_path(vdl->path);
+
+       if (vdl->select_func)
+               {
+               vdl->select_func(vdl, path, vdl->select_data);
+               }
+
+       g_free(path);
+}
+
+static void vdlist_pop_menu_slide_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirList *vdl = data;
+       gchar *path;
+
+       if (!vdl->layout || !vdl->click_fd) return;
+
+       path = g_strdup(vdl->click_fd->path);
+
+       layout_set_path(vdl->layout, path);
+       layout_select_none(vdl->layout);
+       layout_image_slideshow_stop(vdl->layout);
+       layout_image_slideshow_start(vdl->layout);
+
+       g_free(path);
+}
+
+static void vdlist_pop_menu_slide_rec_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirList *vdl = data;
+       gchar *path;
+       GList *list;
+
+       if (!vdl->layout || !vdl->click_fd) return;
+
+       path = g_strdup(vdl->click_fd->path);
+
+       list = path_list_recursive(path);
+
+       layout_image_slideshow_stop(vdl->layout);
+       layout_image_slideshow_start_from_list(vdl->layout, list);
+
+       g_free(path);
+}
+
+static void vdlist_pop_menu_dupe(ViewDirList *vdl, gint recursive)
+{
+       DupeWindow *dw;
+       const gchar *path;
+       GList *list = NULL;
+
+       if (!vdl->click_fd) return;
+       path = vdl->click_fd->path;
+
+       if (recursive)
+               {
+               list = g_list_append(list, g_strdup(path));
+               }
+       else
+               {
+               path_list(path, &list, NULL);
+               list = path_list_filter(list, FALSE);
+               }
+
+       dw = dupe_window_new(DUPE_MATCH_NAME);
+       dupe_window_add_files(dw, list, recursive);
+
+       path_list_free(list);
+}
+
+static void vdlist_pop_menu_dupe_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirList *vdl = data;
+       vdlist_pop_menu_dupe(vdl, FALSE);
+}
+
+static void vdlist_pop_menu_dupe_rec_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirList *vdl = data;
+       vdlist_pop_menu_dupe(vdl, TRUE);
+}
+
+static void vdlist_pop_menu_new_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirList *vdl = data;
+       gchar *new_path;
+       gchar *buf;
+
+       if (!vdl->path) return;
+
+       buf = concat_dir_and_file(vdl->path, _("new_folder"));
+       new_path = unique_filename(buf, NULL, NULL, FALSE);
+       g_free(buf);
+       if (!new_path) return;
+
+       if (!mkdir_utf8(new_path, 0755))
+               {
+               gchar *text;
+
+               text = g_strdup_printf(_("Unable to create folder:\n%s"), new_path);
+               file_util_warning_dialog(_("Error creating folder"), text, GTK_STOCK_DIALOG_ERROR, vdl->listview);
+               g_free(text);
+               }
+       else
+               {
+               FileData *fd;
+
+               vdlist_refresh(vdl);
+               fd = vdlist_row_by_path(vdl, new_path, NULL);
+
+               vdlist_rename_by_row(vdl, fd);
+               }
+
+       g_free(new_path);
+}
+
+static void vdlist_pop_menu_rename_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirList *vdl = data;
+
+       vdlist_rename_by_row(vdl, vdl->click_fd);
+}
+
+static void vdlist_pop_menu_tree_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirList *vdl = data;
+
+       if (vdl->layout) layout_views_set(vdl->layout, TRUE, vdl->layout->icon_view);
+}
+
+static void vdlist_pop_menu_refresh_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirList *vdl = data;
+
+       if (vdl->layout) layout_refresh(vdl->layout);
+}
+
+static GtkWidget *vdlist_pop_menu(ViewDirList *vdl, FileData *fd)
+{
+       GtkWidget *menu;
+       gint active;
+
+       active = (fd != NULL);
+
+       menu = popup_menu_short_lived();
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(vdlist_popup_destroy_cb), vdl);
+
+       menu_item_add_stock_sensitive(menu, _("_Up to parent"), GTK_STOCK_GO_UP,
+                                     (vdl->path && strcmp(vdl->path, "/") != 0),
+                                     G_CALLBACK(vdlist_pop_menu_up_cb), vdl);
+
+       menu_item_add_divider(menu);
+       menu_item_add_sensitive(menu, _("_Slideshow"), active,
+                               G_CALLBACK(vdlist_pop_menu_slide_cb), vdl);
+       menu_item_add_sensitive(menu, _("Slideshow recursive"), active,
+                               G_CALLBACK(vdlist_pop_menu_slide_rec_cb), vdl);
+
+       menu_item_add_divider(menu);
+       menu_item_add_stock_sensitive(menu, _("Find _duplicates..."), GTK_STOCK_FIND, active,
+                                     G_CALLBACK(vdlist_pop_menu_dupe_cb), vdl);
+       menu_item_add_stock_sensitive(menu, _("Find duplicates recursive..."), GTK_STOCK_FIND, active,
+                                     G_CALLBACK(vdlist_pop_menu_dupe_rec_cb), vdl);
+
+       menu_item_add_divider(menu);
+
+       /* check using . (always row 0) */
+       active = (vdl->path && access_file(vdl->path , W_OK | X_OK));
+       menu_item_add_sensitive(menu, _("_New folder..."), active,
+                               G_CALLBACK(vdlist_pop_menu_new_cb), vdl);
+
+       /* ignore .. and . */
+       active = (active && fd &&
+                 strcmp(fd->name, ".") != 0 &&
+                 strcmp(fd->name, "..") != 0 &&
+                 access_file(fd->path, W_OK | X_OK));
+       menu_item_add_sensitive(menu, _("_Rename..."), active,
+                               G_CALLBACK(vdlist_pop_menu_rename_cb), vdl);
+
+       menu_item_add_divider(menu);
+       menu_item_add_check(menu, _("View as _tree"), FALSE,
+                           G_CALLBACK(vdlist_pop_menu_tree_cb), vdl);
+       menu_item_add_stock(menu, _("Re_fresh"), GTK_STOCK_REFRESH,
+                           G_CALLBACK(vdlist_pop_menu_refresh_cb), vdl);
+
+       return menu;
+}
+
+static void vdlist_popup_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirList *vdl = data;
+
+       vdlist_color_set(vdl, vdl->click_fd, FALSE);
+       vdl->click_fd = NULL;
+       vdl->popup = NULL;
+
+       vdlist_color_set(vdl, vdl->drop_fd, FALSE);
+       path_list_free(vdl->drop_list);
+       vdl->drop_list = NULL;
+       vdl->drop_fd = NULL;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * dnd
+ *-----------------------------------------------------------------------------
+ */
+
+static GtkTargetEntry vdlist_dnd_drop_types[] = {
+       { "text/uri-list", 0, TARGET_URI_LIST }
+};
+static gint vdlist_dnd_drop_types_count = 1;
+
+static void vdlist_dest_set(ViewDirList *vdl, gint enable)
+{
+       if (enable)
+               {
+               gtk_drag_dest_set(vdl->listview,
+                                 GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
+                                 vdlist_dnd_drop_types, vdlist_dnd_drop_types_count,
+                                 GDK_ACTION_MOVE | GDK_ACTION_COPY);
+               }
+       else
+               {
+               gtk_drag_dest_unset(vdl->listview);
+               }
+}
+
+static void vdlist_dnd_get(GtkWidget *widget, GdkDragContext *context,
+                          GtkSelectionData *selection_data, guint info,
+                          guint time, gpointer data)
+{
+       ViewDirList *vdl = data;
+       gchar *path;
+       GList *list;
+       gchar *text = NULL;
+       gint length = 0;
+
+       if (!vdl->click_fd) return;
+       path = vdl->click_fd->path;
+
+       switch (info)
+               {
+               case TARGET_URI_LIST:
+               case TARGET_TEXT_PLAIN:
+                       list = g_list_prepend(NULL, path);
+                       text = uri_text_from_list(list, &length, (info == TARGET_TEXT_PLAIN));
+                       g_list_free(list);
+                       break;
+               }
+       if (text)
+               {
+               gtk_selection_data_set (selection_data, selection_data->target,
+                               8, text, length);
+               g_free(text);
+               }
+}
+
+static void vdlist_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       ViewDirList *vdl = data;
+
+       vdlist_color_set(vdl, vdl->click_fd, TRUE);
+       vdlist_dest_set(vdl, FALSE);
+}
+
+static void vdlist_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       ViewDirList *vdl = data;
+
+       vdlist_color_set(vdl, vdl->click_fd, FALSE);
+
+       if (context->action == GDK_ACTION_MOVE)
+               {
+               vdlist_refresh(vdl);
+               }
+       vdlist_dest_set(vdl, TRUE);
+}
+
+static void vdlist_dnd_drop_receive(GtkWidget *widget,
+                                   GdkDragContext *context, gint x, gint y,
+                                   GtkSelectionData *selection_data, guint info,
+                                   guint time, gpointer data)
+{
+       ViewDirList *vdl = data;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+       FileData *fd = NULL;
+
+       vdl->click_fd = NULL;
+
+       if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), x, y,
+                                         &tpath, NULL, NULL, NULL))
+               {
+               GtkTreeModel *store;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &fd, -1);
+               gtk_tree_path_free(tpath);
+               }
+
+       if (!fd) return;
+
+       if (info == TARGET_URI_LIST)
+               {
+               GList *list;
+               gint active;
+
+               list = uri_list_from_text(selection_data->data, TRUE);
+               if (!list) return;
+
+               active = access_file(fd->path, W_OK | X_OK);
+
+               vdlist_color_set(vdl, fd, TRUE);
+               vdl->popup = vdlist_drop_menu(vdl, active);
+               gtk_menu_popup(GTK_MENU(vdl->popup), NULL, NULL, NULL, NULL, 0, time);
+
+               vdl->drop_fd = fd;
+               vdl->drop_list = list;
+               }
+}
+
+#if 0
+static gint vdlist_get_row_visibility(ViewDirList *vdl, FileData *fd)
+{
+       GtkTreeModel *store;
+       GtkTreeViewColumn *column;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+
+       GdkRectangle vrect;
+       GdkRectangle crect;
+
+       if (!fd || vdlist_find_row(vdl, fd, &iter) < 0) return 0;
+
+       column = gtk_tree_view_get_column(GTK_TREE_VIEW(vdl->listview), 0);
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+       tpath = gtk_tree_model_get_path(store, &iter);
+
+       gtk_tree_view_get_visible_rect(GTK_TREE_VIEW(vdl->listview), &vrect);
+       gtk_tree_view_get_cell_area(GTK_TREE_VIEW(vdl->listview), tpath, column, &crect);
+printf("window: %d + %d; cell: %d + %d\n", vrect.y, vrect.height, crect.y, crect.height);
+       gtk_tree_path_free(tpath);
+
+       if (crect.y + crect.height < vrect.y) return -1;
+       if (crect.y > vrect.y + vrect.height) return 1;
+       return 0;
+}
+#endif
+
+static void vdlist_scroll_to_row(ViewDirList *vdl, FileData *fd, gfloat y_align)
+{
+       GtkTreeIter iter;
+
+       if (GTK_WIDGET_REALIZED(vdl->listview) &&
+           vdlist_find_row(vdl, fd, &iter) >= 0)
+               {
+               GtkTreeModel *store;
+               GtkTreePath *tpath;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+               tpath = gtk_tree_model_get_path(store, &iter);
+               gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(vdl->listview), tpath, NULL, TRUE, y_align, 0.0);
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(vdl->listview), tpath, NULL, FALSE);
+               gtk_tree_path_free(tpath);
+
+               if (!GTK_WIDGET_HAS_FOCUS(vdl->listview)) gtk_widget_grab_focus(vdl->listview);
+               }
+}
+
+static void vdlist_drop_update(ViewDirList *vdl, gint x, gint y)
+{
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+       FileData *fd = NULL;
+
+       if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vdl->listview), x, y,
+                                         &tpath, NULL, NULL, NULL))
+               {
+               GtkTreeModel *store;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &fd, -1);
+               gtk_tree_path_free(tpath);
+               }
+
+       if (fd != vdl->drop_fd)
+               {
+               vdlist_color_set(vdl, vdl->drop_fd, FALSE);
+               vdlist_color_set(vdl, fd, TRUE);
+               }
+
+       vdl->drop_fd = fd;
+}
+
+static void vdlist_dnd_drop_scroll_cancel(ViewDirList *vdl)
+{
+       if (vdl->drop_scroll_id != -1) g_source_remove(vdl->drop_scroll_id);
+       vdl->drop_scroll_id = -1;
+}
+
+static gint vdlist_auto_scroll_idle_cb(gpointer data)
+{
+       ViewDirList *vdl = data;
+
+       if (vdl->drop_fd)
+               {
+               GdkWindow *window;
+               gint x, y;
+               gint w, h;
+
+               window = vdl->listview->window;
+               gdk_window_get_pointer(window, &x, &y, NULL);
+               gdk_drawable_get_size(window, &w, &h);
+               if (x >= 0 && x < w && y >= 0 && y < h)
+                       {
+                       vdlist_drop_update(vdl, x, y);
+                       }
+               }
+
+       vdl->drop_scroll_id = -1;
+       return FALSE;
+}
+
+static gint vdlist_auto_scroll_notify_cb(GtkWidget *widget, gint x, gint y, gpointer data)
+{
+       ViewDirList *vdl = data;
+
+       if (!vdl->drop_fd || vdl->drop_list) return FALSE;
+
+       if (vdl->drop_scroll_id == -1) vdl->drop_scroll_id = g_idle_add(vdlist_auto_scroll_idle_cb, vdl);
+
+       return TRUE;
+}
+
+static gint vdlist_dnd_drop_motion(GtkWidget *widget, GdkDragContext *context,
+                                  gint x, gint y, guint time, gpointer data)
+{
+       ViewDirList *vdl = data;
+
+       vdl->click_fd = NULL;
+
+       if (gtk_drag_get_source_widget(context) == vdl->listview)
+               {
+               /* from same window */
+               gdk_drag_status(context, 0, time);
+               return TRUE;
+               }
+       else
+               {
+               gdk_drag_status(context, context->suggested_action, time);
+               }
+
+       vdlist_drop_update(vdl, x, y);
+
+        if (vdl->drop_fd)
+               {
+               GtkAdjustment *adj = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(vdl->listview));
+               widget_auto_scroll_start(vdl->listview, adj, -1, -1, vdlist_auto_scroll_notify_cb, vdl);
+               }
+
+       return FALSE;
+}
+
+static void vdlist_dnd_drop_leave(GtkWidget *widget, GdkDragContext *context, guint time, gpointer data)
+{
+       ViewDirList *vdl = data;
+
+       if (vdl->drop_fd != vdl->click_fd) vdlist_color_set(vdl, vdl->drop_fd, FALSE);
+
+       vdl->drop_fd = NULL;
+}
+
+static void vdlist_dnd_init(ViewDirList *vdl)
+{
+       gtk_drag_source_set(vdl->listview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+                           dnd_file_drag_types, dnd_file_drag_types_count,
+                           GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+       g_signal_connect(G_OBJECT(vdl->listview), "drag_data_get",
+                        G_CALLBACK(vdlist_dnd_get), vdl);
+       g_signal_connect(G_OBJECT(vdl->listview), "drag_begin",
+                        G_CALLBACK(vdlist_dnd_begin), vdl);
+       g_signal_connect(G_OBJECT(vdl->listview), "drag_end",
+                        G_CALLBACK(vdlist_dnd_end), vdl);
+
+       vdlist_dest_set(vdl, TRUE);
+       g_signal_connect(G_OBJECT(vdl->listview), "drag_data_received",
+                        G_CALLBACK(vdlist_dnd_drop_receive), vdl);
+       g_signal_connect(G_OBJECT(vdl->listview), "drag_motion",
+                        G_CALLBACK(vdlist_dnd_drop_motion), vdl);
+       g_signal_connect(G_OBJECT(vdl->listview), "drag_leave",
+                        G_CALLBACK(vdlist_dnd_drop_leave), vdl);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * main
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void vdlist_select_row(ViewDirList *vdl, FileData *fd)
+{
+       if (fd && vdl->select_func)
+               {
+               gchar *path;
+
+               path = g_strdup(fd->path);
+               vdl->select_func(vdl, path, vdl->select_data);
+               g_free(path);
+               }
+}
+
+const gchar *vdlist_row_get_path(ViewDirList *vdl, gint row)
+{
+       FileData *fd;
+
+       fd = g_list_nth_data(vdl->list, row);
+
+       if (fd) return fd->path;
+
+       return NULL;
+}
+
+static void vdlist_populate(ViewDirList *vdl)
+{
+       GtkListStore *store;
+       GList *work;
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview)));
+       gtk_list_store_clear(store);
+
+       work = vdl->list;
+       while (work)
+               {
+               FileData *fd;
+               GtkTreeIter iter;
+               GdkPixbuf *pixbuf;
+
+               fd = work->data;
+
+               if (access_file(fd->path, R_OK | X_OK) && fd->name)
+                       {
+                       if (fd->name[0] == '.' && fd->name[1] == '\0')
+                               {
+                               pixbuf = vdl->pf->open;
+                               }
+                       else if (fd->name[0] == '.' && fd->name[1] == '.' && fd->name[2] == '\0')
+                               {
+                               pixbuf = vdl->pf->parent;
+                               }
+                       else
+                               {
+                               pixbuf = vdl->pf->close;
+                               }
+                       }
+               else
+                       {
+                       pixbuf = vdl->pf->deny;
+                       }
+
+               gtk_list_store_append(store, &iter);
+               gtk_list_store_set(store, &iter,
+                                  DIR_COLUMN_POINTER, fd,
+                                  DIR_COLUMN_ICON, pixbuf,
+                                  DIR_COLUMN_NAME, fd->name, -1);
+
+               work = work->next;
+               }
+
+       vdl->click_fd = NULL;
+       vdl->drop_fd = NULL;
+}
+
+gint vdlist_set_path(ViewDirList *vdl, const gchar *path)
+{
+       gint ret;
+       FileData *fd;
+       gchar *old_path = NULL;
+
+       if (!path) return FALSE;
+       if (vdl->path && strcmp(path, vdl->path) == 0) return TRUE;
+
+       if (vdl->path)
+               {
+               gchar *base;
+
+               base = remove_level_from_path(vdl->path);
+               if (strcmp(base, path) == 0)
+                       {
+                       old_path = g_strdup(filename_from_path(vdl->path));
+                       }
+               g_free(base);
+               }
+
+       g_free(vdl->path);
+       vdl->path = g_strdup(path);
+
+       filelist_free(vdl->list);
+       vdl->list = NULL;
+
+       ret = filelist_read(vdl->path, NULL, &vdl->list);
+
+       vdl->list = filelist_sort(vdl->list, SORT_NAME, TRUE);
+
+       /* add . and .. */
+
+       if (strcmp(vdl->path, "/") != 0)
+               {
+               fd = g_new0(FileData, 1);
+               fd->path = remove_level_from_path(vdl->path);
+               fd->name = "..";
+               vdl->list = g_list_prepend(vdl->list, fd);
+               }
+
+       fd = g_new0(FileData, 1);
+       fd->path = g_strdup(vdl->path);
+       fd->name = ".";
+       vdl->list = g_list_prepend(vdl->list, fd);
+
+       vdlist_populate(vdl);
+
+       if (old_path)
+               {
+               /* scroll to make last path visible */
+               FileData *found = NULL;
+               GList *work;
+
+               work = vdl->list;
+               while (work && !found)
+                       {
+                       FileData *fd = work->data;
+                       if (strcmp(old_path, fd->name) == 0) found = fd;
+                       work = work->next;
+                       }
+
+               if (found) vdlist_scroll_to_row(vdl, found, 0.5);
+
+               g_free(old_path);
+               return ret;
+               }
+
+       if (GTK_WIDGET_REALIZED(vdl->listview))
+               {
+               gtk_tree_view_scroll_to_point(GTK_TREE_VIEW(vdl->listview), 0, 0);
+               }
+
+       return ret;
+}
+
+void vdlist_refresh(ViewDirList *vdl)
+{
+       gchar *path;
+
+       path = g_strdup(vdl->path);
+       vdl->path = NULL;
+       vdlist_set_path(vdl, path);
+       g_free(path);
+}
+
+static void vdlist_menu_position_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
+{
+       ViewDirList *vdl = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       GtkTreePath *tpath;
+       gint cw, ch;
+
+       if (vdlist_find_row(vdl, vdl->click_fd, &iter) < 0) return;
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdl->listview));
+       tpath = gtk_tree_model_get_path(store, &iter);
+       tree_view_get_cell_clamped(GTK_TREE_VIEW(vdl->listview), tpath, 0, TRUE, x, y, &cw, &ch);
+       gtk_tree_path_free(tpath);
+       *y += ch;
+       popup_menu_position_clamp(menu, x, y, 0);
+}
+
+static gint vdlist_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       ViewDirList *vdl = data;
+       GtkTreePath *tpath;
+       
+       if (event->keyval != GDK_Menu) return FALSE;
+
+       gtk_tree_view_get_cursor(GTK_TREE_VIEW(vdl->listview), &tpath, NULL);
+       if (tpath)
+               {
+               GtkTreeModel *store;
+               GtkTreeIter iter;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &vdl->click_fd, -1);
+               
+               gtk_tree_path_free(tpath);
+               }
+       else
+               {
+               vdl->click_fd = NULL;
+               }
+
+       vdlist_color_set(vdl, vdl->click_fd, TRUE);
+
+       vdl->popup = vdlist_pop_menu(vdl, vdl->click_fd);
+
+       gtk_menu_popup(GTK_MENU(vdl->popup), NULL, NULL, vdlist_menu_position_cb, vdl, 0, GDK_CURRENT_TIME);
+
+       return TRUE;
+}
+
+static gint vdlist_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       ViewDirList *vdl = data;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+       FileData *fd = NULL;
+
+       if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
+                                         &tpath, NULL, NULL, NULL))
+               {
+               GtkTreeModel *store;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &fd, -1);
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(widget), tpath, NULL, FALSE);
+               gtk_tree_path_free(tpath);
+               }
+
+       vdl->click_fd = fd;
+       vdlist_color_set(vdl, vdl->click_fd, TRUE);
+
+       if (bevent->button == 3)
+               {
+               vdl->popup = vdlist_pop_menu(vdl, vdl->click_fd);
+               gtk_menu_popup(GTK_MENU(vdl->popup), NULL, NULL, NULL, NULL,
+                              bevent->button, bevent->time);
+               }
+
+       return TRUE;
+}
+
+static gint vdlist_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       ViewDirList *vdl = data;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+       FileData *fd = NULL;
+
+       vdlist_color_set(vdl, vdl->click_fd, FALSE);
+
+       if (bevent->button != 1) return TRUE;
+
+       if ((bevent->x != 0 || bevent->y != 0) &&
+           gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
+                                         &tpath, NULL, NULL, NULL))
+               {
+               GtkTreeModel *store;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &fd, -1);
+               gtk_tree_path_free(tpath);
+               }
+
+       if (fd && vdl->click_fd == fd)
+               {
+               vdlist_select_row(vdl, vdl->click_fd);
+               }
+
+       return TRUE;
+}
+
+static void vdlist_select_cb(GtkTreeView *tview, GtkTreePath *tpath, GtkTreeViewColumn *column, gpointer data)
+{
+       ViewDirList *vdl = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       FileData *fd;
+
+       store = gtk_tree_view_get_model(tview);
+       gtk_tree_model_get_iter(store, &iter, tpath);
+       gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &fd, -1);
+
+       vdlist_select_row(vdl, fd);
+}
+
+static GdkColor *vdlist_color_shifted(GtkWidget *widget)
+{
+       static GdkColor color;
+       static GtkWidget *done = NULL;
+
+       if (done != widget)
+               {
+               GtkStyle *style;
+
+               style = gtk_widget_get_style(widget);
+               memcpy(&color, &style->base[GTK_STATE_NORMAL], sizeof(color));
+               shift_color(&color, -1, 0);
+               done = widget;
+               }
+
+       return &color;
+}
+
+static void vdlist_color_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
+                           GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+{
+       ViewDirList *vdl = data;
+       gboolean set;
+
+       gtk_tree_model_get(tree_model, iter, DIR_COLUMN_COLOR, &set, -1);
+       g_object_set(G_OBJECT(cell),
+                    "cell-background-gdk", vdlist_color_shifted(vdl->listview),
+                    "cell-background-set", set, NULL);
+}
+
+static void vdlist_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirList *vdl = data;
+
+       if (vdl->popup)
+               {
+               g_signal_handlers_disconnect_matched(G_OBJECT(vdl->popup), G_SIGNAL_MATCH_DATA,
+                                                    0, 0, 0, NULL, vdl);
+               gtk_widget_destroy(vdl->popup);
+               }
+
+       vdlist_dnd_drop_scroll_cancel(vdl);
+       widget_auto_scroll_stop(vdl->listview);
+
+       path_list_free(vdl->drop_list);
+
+       folder_icons_free(vdl->pf);
+
+       g_free(vdl->path);
+       filelist_free(vdl->list);
+       g_free(vdl);
+}
+
+ViewDirList *vdlist_new(const gchar *path)
+{
+       ViewDirList *vdl;
+       GtkListStore *store;
+       GtkTreeSelection *selection;
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+
+       vdl = g_new0(ViewDirList, 1);
+
+       vdl->path = NULL;
+       vdl->list = NULL;
+       vdl->click_fd = NULL;
+
+       vdl->drop_fd = NULL;
+       vdl->drop_list = NULL;
+
+       vdl->drop_scroll_id = -1;
+
+       vdl->popup = NULL;
+
+       vdl->widget = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(vdl->widget), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vdl->widget),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+       g_signal_connect(G_OBJECT(vdl->widget), "destroy",
+                        G_CALLBACK(vdlist_destroy_cb), vdl);
+
+       store = gtk_list_store_new(4, G_TYPE_POINTER, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_BOOLEAN);
+       vdl->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vdl->listview), FALSE);
+       gtk_tree_view_set_enable_search(GTK_TREE_VIEW(vdl->listview), FALSE);
+       g_signal_connect(G_OBJECT(vdl->listview), "row_activated",
+
+                        G_CALLBACK(vdlist_select_cb), vdl);
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vdl->listview));
+       gtk_tree_selection_set_mode(selection, GTK_SELECTION_NONE);
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+
+       renderer = gtk_cell_renderer_pixbuf_new();
+       gtk_tree_view_column_pack_start(column, renderer, FALSE);
+       gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", DIR_COLUMN_ICON);
+       gtk_tree_view_column_set_cell_data_func(column, renderer, vdlist_color_cb, vdl, NULL);
+
+       renderer = gtk_cell_renderer_text_new();
+       gtk_tree_view_column_pack_start(column, renderer, TRUE);
+       gtk_tree_view_column_add_attribute(column, renderer, "text", DIR_COLUMN_NAME);
+       gtk_tree_view_column_set_cell_data_func(column, renderer, vdlist_color_cb, vdl, NULL);
+
+       gtk_tree_view_append_column(GTK_TREE_VIEW(vdl->listview), column);
+
+       g_signal_connect(G_OBJECT(vdl->listview), "key_press_event",
+                          G_CALLBACK(vdlist_press_key_cb), vdl);
+       gtk_container_add(GTK_CONTAINER(vdl->widget), vdl->listview);
+       gtk_widget_show(vdl->listview);
+
+       vdl->pf = folder_icons_new();
+
+       vdlist_dnd_init(vdl);
+
+       g_signal_connect(G_OBJECT(vdl->listview), "button_press_event",
+                        G_CALLBACK(vdlist_press_cb), vdl);
+       g_signal_connect(G_OBJECT(vdl->listview), "button_release_event",
+                        G_CALLBACK(vdlist_release_cb), vdl);
+
+       if (path) vdlist_set_path(vdl, path);
+
+       return vdl;
+}
+
+void vdlist_set_select_func(ViewDirList *vdl,
+                           void (*func)(ViewDirList *vdl, const gchar *path, gpointer data), gpointer data)
+{
+       vdl->select_func = func;
+       vdl->select_data = data;
+}
+
+void vdlist_set_layout(ViewDirList *vdl, LayoutWindow *layout)
+{
+       vdl->layout = layout;
+}
+
diff --git a/src/view_dir_list.h b/src/view_dir_list.h
new file mode 100644 (file)
index 0000000..d9b5d97
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifndef VIEW_DIR_LIST_H
+#define VIEW_DIR_LIST_H
+
+
+ViewDirList *vdlist_new(const gchar *path);
+
+void vdlist_set_select_func(ViewDirList *vdl,
+                           void (*func)(ViewDirList *vdl, const gchar *path, gpointer data), gpointer data);
+
+void vdlist_set_layout(ViewDirList *vdl, LayoutWindow *layout);
+
+gint vdlist_set_path(ViewDirList *vdl, const gchar *path);
+void vdlist_refresh(ViewDirList *vdl);
+
+const gchar *vdlist_row_get_path(ViewDirList *vdl, gint row);
+
+
+#endif
+
+
diff --git a/src/view_dir_tree.c b/src/view_dir_tree.c
new file mode 100644 (file)
index 0000000..9a0437a
--- /dev/null
@@ -0,0 +1,1763 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#include "gqview.h"
+#include "view_dir_tree.h"
+
+
+#include "dnd.h"
+#include "dupe.h"
+#include "filelist.h"
+#include "layout.h"
+#include "layout_image.h"
+#include "layout_util.h"
+#include "utilops.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_tree_edit.h"
+
+#include <gdk/gdkkeysyms.h> /* for keyboard values */
+
+
+#define VDTREE_INDENT 14
+#define VDTREE_PAD 4
+
+enum {
+       DIR_COLUMN_POINTER = 0,
+       DIR_COLUMN_ICON,
+       DIR_COLUMN_NAME,
+       DIR_COLUMN_COLOR,
+       DIR_COLUMN_COUNT
+};
+
+
+typedef struct _PathData PathData;
+struct _PathData
+{
+       gchar *name;
+       FileData *node;
+};
+
+typedef struct _NodeData NodeData;
+struct _NodeData
+{
+       FileData *fd;
+       gint expanded;
+       time_t last_update;
+};
+
+
+static gint vdtree_populate_path_by_iter(ViewDirTree *vdt, GtkTreeIter *iter, gint force, const gchar *target_path);
+static FileData *vdtree_populate_path(ViewDirTree *vdt, const gchar *path, gint expand, gint force);
+
+
+/*
+ *----------------------------------------------------------------------------
+ * utils
+ *----------------------------------------------------------------------------
+ */
+
+static void set_cursor(GtkWidget *widget, GdkCursorType cursor_type)
+{
+       GdkCursor *cursor = NULL;
+
+       if (!widget || !widget->window) return;
+
+       if (cursor_type > -1) cursor = gdk_cursor_new (cursor_type);
+       gdk_window_set_cursor (widget->window, cursor);
+       if (cursor) gdk_cursor_unref(cursor);
+       gdk_flush();
+}
+
+static void vdtree_busy_push(ViewDirTree *vdt)
+{
+       if (vdt->busy_ref == 0) set_cursor(vdt->treeview, GDK_WATCH);
+       vdt->busy_ref++;
+}
+
+static void vdtree_busy_pop(ViewDirTree *vdt)
+{
+       if (vdt->busy_ref == 1) set_cursor(vdt->treeview, -1);
+       if (vdt->busy_ref > 0) vdt->busy_ref--;
+}
+
+static gint vdtree_find_row(ViewDirTree *vdt, FileData *fd, GtkTreeIter *iter, GtkTreeIter *parent)
+{
+       GtkTreeModel *store;
+       gint valid;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview));
+       if (parent)
+               {
+               valid = gtk_tree_model_iter_children(store, iter, parent);
+               }
+       else
+               {
+               valid = gtk_tree_model_get_iter_first(store, iter);
+               }
+       while (valid)
+               {
+               NodeData *nd;
+               GtkTreeIter found;
+
+               gtk_tree_model_get(GTK_TREE_MODEL(store), iter, DIR_COLUMN_POINTER, &nd, -1);
+               if (nd->fd == fd) return TRUE;
+
+               if (vdtree_find_row(vdt, fd, &found, iter))
+                       {
+                       memcpy(iter, &found, sizeof(found));
+                       return TRUE;
+                       }
+
+               valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), iter);
+               }
+
+       return FALSE;
+}
+
+static void vdtree_icon_set_by_iter(ViewDirTree *vdt, GtkTreeIter *iter, GdkPixbuf *pixbuf)
+{
+       GtkTreeModel *store;
+       GdkPixbuf *old;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview));
+       gtk_tree_model_get(store, iter, DIR_COLUMN_ICON, &old, -1);
+       if (old != vdt->pf->deny)
+               {
+               gtk_tree_store_set(GTK_TREE_STORE(store), iter, DIR_COLUMN_ICON, pixbuf, -1);
+               }
+}
+
+static void vdtree_expand_by_iter(ViewDirTree *vdt, GtkTreeIter *iter, gint expand)
+{
+       GtkTreeModel *store;
+       GtkTreePath *tpath;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview));
+       tpath = gtk_tree_model_get_path(store, iter);
+       if (expand)
+               {
+               gtk_tree_view_expand_row(GTK_TREE_VIEW(vdt->treeview), tpath, FALSE);
+               vdtree_icon_set_by_iter(vdt, iter, vdt->pf->open);
+               }
+       else
+               {
+               gtk_tree_view_collapse_row(GTK_TREE_VIEW(vdt->treeview), tpath);
+               }
+       gtk_tree_path_free(tpath);
+}
+
+static void vdtree_expand_by_data(ViewDirTree *vdt, FileData *fd, gint expand)
+{
+       GtkTreeIter iter;
+
+       if (vdtree_find_row(vdt, fd, &iter, NULL))
+               {
+               vdtree_expand_by_iter(vdt, &iter, expand);
+               }
+}
+
+static void vdtree_color_set(ViewDirTree *vdt, FileData *fd, gint color_set)
+{
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+
+       if (!vdtree_find_row(vdt, fd, &iter, NULL)) return;
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview));
+       gtk_tree_store_set(GTK_TREE_STORE(store), &iter, DIR_COLUMN_COLOR, color_set, -1);
+}
+
+static gint vdtree_rename_row_cb(TreeEditData *td, const gchar *old, const gchar *new, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       NodeData *nd;
+       gchar *old_path;
+       gchar *new_path;
+       gchar *base;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview));
+       if (!gtk_tree_model_get_iter(store, &iter, td->path)) return FALSE;
+       gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &nd, -1);
+       if (!nd) return FALSE;
+
+       old_path = g_strdup(nd->fd->path);
+
+       base = remove_level_from_path(old_path);
+       new_path = concat_dir_and_file(base, new);
+       g_free(base);
+
+       if (!rename_file(old_path, new_path))
+               {
+               gchar *buf;
+
+               buf = g_strdup_printf(_("Failed to rename %s to %s."), old, new);
+               file_util_warning_dialog("Rename failed", buf, GTK_STOCK_DIALOG_ERROR, vdt->treeview);
+               g_free(buf);
+               }
+       else
+               {
+               vdtree_populate_path(vdt, new_path, TRUE, TRUE);
+
+               if (vdt->layout && strcmp(vdt->path, old_path) == 0)
+                       {
+                       layout_set_path(vdt->layout, new_path);
+                       }
+               }
+
+       g_free(old_path);
+       g_free(new_path);
+
+       return FALSE;
+}
+
+static void vdtree_rename_by_data(ViewDirTree *vdt, FileData *fd)
+{
+       GtkTreeModel *store;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+
+       if (!fd ||
+           !vdtree_find_row(vdt, fd, &iter, NULL)) return;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview));
+       tpath = gtk_tree_model_get_path(store, &iter);
+
+       tree_edit_by_path(GTK_TREE_VIEW(vdt->treeview), tpath, 0, fd->name,
+                         vdtree_rename_row_cb, vdt);
+       gtk_tree_path_free(tpath);
+}
+
+static void vdtree_node_free(NodeData *nd)
+{
+       if (!nd) return;
+
+       file_data_free(nd->fd);
+       g_free(nd);
+}
+
+static void vdtree_popup_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirTree *vdt = data;
+
+       vdtree_color_set(vdt, vdt->click_fd, FALSE);
+       vdt->click_fd = NULL;
+       vdt->popup = NULL;
+
+       vdtree_color_set(vdt, vdt->drop_fd, FALSE);
+       path_list_free(vdt->drop_list);
+       vdt->drop_list = NULL;
+       vdt->drop_fd = NULL;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * drop menu (from dnd)
+ *-----------------------------------------------------------------------------
+ */
+
+static void vdtree_drop_menu_copy_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       const gchar *path;
+       GList *list;
+
+       if (!vdt->drop_fd) return;
+
+       path = vdt->drop_fd->path;
+       list = vdt->drop_list;
+
+       vdt->drop_list = NULL;
+
+       file_util_copy_simple(list, path);
+}
+
+static void vdtree_drop_menu_move_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       const gchar *path;
+       GList *list;
+
+       if (!vdt->drop_fd) return;
+
+       path = vdt->drop_fd->path;
+       list = vdt->drop_list;
+
+       vdt->drop_list = NULL;
+
+       file_util_move_simple(list, path);
+}
+
+static GtkWidget *vdtree_drop_menu(ViewDirTree *vdt, gint active)
+{
+       GtkWidget *menu;
+
+       menu = popup_menu_short_lived();
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(vdtree_popup_destroy_cb), vdt);
+
+       menu_item_add_stock_sensitive(menu, _("_Copy"), GTK_STOCK_COPY, active,
+                                     G_CALLBACK(vdtree_drop_menu_copy_cb), vdt);
+       menu_item_add_sensitive(menu, _("_Move"), active, G_CALLBACK(vdtree_drop_menu_move_cb), vdt);
+
+       menu_item_add_divider(menu);
+       menu_item_add_stock(menu, _("Cancel"), GTK_STOCK_CANCEL, NULL, vdt);
+
+       return menu;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * pop-up menu
+ *-----------------------------------------------------------------------------
+ */
+
+static void vdtree_pop_menu_up_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       gchar *path;
+
+       if (!vdt->path || strcmp(vdt->path, "/") == 0) return;
+       path = remove_level_from_path(vdt->path);
+
+       if (vdt->select_func)
+               {
+               vdt->select_func(vdt, path, vdt->select_data);
+               }
+
+       g_free(path);
+}
+
+static void vdtree_pop_menu_slide_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       gchar *path;
+
+       if (!vdt->layout) return;
+
+       if (!vdt->click_fd) return;
+       path = g_strdup(vdt->click_fd->path);
+
+       layout_set_path(vdt->layout, path);
+       layout_select_none(vdt->layout);
+       layout_image_slideshow_stop(vdt->layout);
+       layout_image_slideshow_start(vdt->layout);
+
+       g_free(path);
+}
+
+static void vdtree_pop_menu_slide_rec_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       gchar *path;
+       GList *list;
+
+       if (!vdt->layout) return;
+
+       if (!vdt->click_fd) return;
+       path = g_strdup(vdt->click_fd->path);
+
+       list = path_list_recursive(path);
+
+       layout_image_slideshow_stop(vdt->layout);
+       layout_image_slideshow_start_from_list(vdt->layout, list);
+
+       g_free(path);
+}
+
+static void vdtree_pop_menu_dupe(ViewDirTree *vdt, gint recursive)
+{
+       DupeWindow *dw;
+       const gchar *path;
+       GList *list = NULL;
+
+       if (!vdt->click_fd) return;
+       path = vdt->click_fd->path;
+
+       if (recursive)
+               {
+               list = g_list_append(list, g_strdup(path));
+               }
+       else
+               {
+               path_list(path, &list, NULL);
+               list = path_list_filter(list, FALSE);
+               }
+
+       dw = dupe_window_new(DUPE_MATCH_NAME);
+       dupe_window_add_files(dw, list, recursive);
+
+       path_list_free(list);
+}
+
+static void vdtree_pop_menu_dupe_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       vdtree_pop_menu_dupe(vdt, FALSE);
+}
+
+static void vdtree_pop_menu_dupe_rec_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       vdtree_pop_menu_dupe(vdt, TRUE);
+}
+
+static void vdtree_pop_menu_new_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       const gchar *path;
+       gchar *new_path;
+       gchar *buf;
+
+       if (!vdt->click_fd) return;
+       path = vdt->click_fd->path;
+
+       buf = concat_dir_and_file(path, _("new_folder"));
+       new_path = unique_filename(buf, NULL, NULL, FALSE);
+       g_free(buf);
+       if (!new_path) return;
+
+       if (!mkdir_utf8(new_path, 0755))
+               {
+               gchar *text;
+
+               text = g_strdup_printf(_("Unable to create folder:\n%s"), new_path);
+               file_util_warning_dialog(_("Error creating folder"), text, GTK_STOCK_DIALOG_ERROR, vdt->treeview);
+               g_free(text);
+               }
+       else
+               {
+               FileData *fd;
+
+               fd = vdtree_populate_path(vdt, new_path, TRUE, TRUE);
+
+               vdtree_rename_by_data(vdt, fd);
+               }
+
+       g_free(new_path);
+}
+
+static void vdtree_pop_menu_rename_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirTree *vdt = data;
+
+       vdtree_rename_by_data(vdt, vdt->click_fd);
+}
+
+static void vdtree_pop_menu_tree_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirTree *vdt = data;
+
+       if (vdt->layout) layout_views_set(vdt->layout, FALSE, vdt->layout->icon_view);
+}
+
+static void vdtree_pop_menu_refresh_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirTree *vdt = data;
+
+       if (vdt->layout) layout_refresh(vdt->layout);
+}
+
+static GtkWidget *vdtree_pop_menu(ViewDirTree *vdt, FileData *fd)
+{
+       GtkWidget *menu;
+       gint active;
+
+       active = (fd != NULL);
+
+       menu = popup_menu_short_lived();
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(vdtree_popup_destroy_cb), vdt);
+
+       menu_item_add_stock_sensitive(menu, _("_Up to parent"), GTK_STOCK_GO_UP,
+                                     (vdt->path && strcmp(vdt->path, "/") != 0),
+                                     G_CALLBACK(vdtree_pop_menu_up_cb), vdt);
+
+       menu_item_add_divider(menu);
+       menu_item_add_sensitive(menu, _("_Slideshow"), active,
+                               G_CALLBACK(vdtree_pop_menu_slide_cb), vdt);
+       menu_item_add_sensitive(menu, _("Slideshow recursive"), active,
+                               G_CALLBACK(vdtree_pop_menu_slide_rec_cb), vdt);
+
+       menu_item_add_divider(menu);
+       menu_item_add_stock_sensitive(menu, _("Find _duplicates..."), GTK_STOCK_FIND, active,
+                                     G_CALLBACK(vdtree_pop_menu_dupe_cb), vdt);
+       menu_item_add_stock_sensitive(menu, _("Find duplicates recursive..."), GTK_STOCK_FIND, active,
+                                     G_CALLBACK(vdtree_pop_menu_dupe_rec_cb), vdt);
+
+       menu_item_add_divider(menu);
+
+       active = (fd &&
+                 access_file(fd->path, W_OK | X_OK));
+       menu_item_add_sensitive(menu, _("_New folder..."), active,
+                               G_CALLBACK(vdtree_pop_menu_new_cb), vdt);
+
+       menu_item_add_sensitive(menu, _("_Rename..."), active,
+                               G_CALLBACK(vdtree_pop_menu_rename_cb), vdt);
+
+       menu_item_add_divider(menu);
+       menu_item_add_check(menu, _("View as _tree"), TRUE,
+                           G_CALLBACK(vdtree_pop_menu_tree_cb), vdt);
+       menu_item_add_stock(menu, _("Re_fresh"), GTK_STOCK_REFRESH,
+                           G_CALLBACK(vdtree_pop_menu_refresh_cb), vdt);
+
+       return menu;
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * dnd
+ *----------------------------------------------------------------------------
+ */
+
+static GtkTargetEntry vdtree_dnd_drop_types[] = {
+       { "text/uri-list", 0, TARGET_URI_LIST }
+};
+static gint vdtree_dnd_drop_types_count = 1;
+
+
+static void vdtree_dest_set(ViewDirTree *vdt, gint enable)
+{
+       if (enable)
+               {
+               gtk_drag_dest_set(vdt->treeview,
+                                 GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
+                                 vdtree_dnd_drop_types, vdtree_dnd_drop_types_count,
+                                 GDK_ACTION_MOVE | GDK_ACTION_COPY);
+               }
+       else
+               {
+               gtk_drag_dest_unset(vdt->treeview);
+               }
+}
+
+static void vdtree_dnd_get(GtkWidget *widget, GdkDragContext *context,
+                          GtkSelectionData *selection_data, guint info,
+                          guint time, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       gchar *path;
+       GList *list;
+       gchar *uri_text = NULL;
+       gint length = 0;
+
+       if (!vdt->click_fd) return;
+       path = vdt->click_fd->path;
+
+       switch (info)
+               {
+               case TARGET_URI_LIST:
+               case TARGET_TEXT_PLAIN:
+                       list = g_list_prepend(NULL, path);
+                       uri_text = uri_text_from_list(list, &length, (info == TARGET_TEXT_PLAIN));
+                       g_list_free(list);
+                       break;
+               }
+
+       if (uri_text)
+               {
+               gtk_selection_data_set(selection_data, selection_data->target,
+                                      8, uri_text, length);
+               g_free(uri_text);
+               }
+}
+
+static void vdtree_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       ViewDirTree *vdt = data;
+
+       vdtree_color_set(vdt, vdt->click_fd, TRUE);
+       vdtree_dest_set(vdt, FALSE);
+}
+
+static void vdtree_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       ViewDirTree *vdt = data;
+
+       vdtree_color_set(vdt, vdt->click_fd, FALSE);
+       vdtree_dest_set(vdt, TRUE);
+}
+
+static void vdtree_dnd_drop_receive(GtkWidget *widget,
+                                   GdkDragContext *context, gint x, gint y,
+                                   GtkSelectionData *selection_data, guint info,
+                                   guint time, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+       FileData *fd = NULL;
+
+       vdt->click_fd = NULL;
+
+       if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), x, y,
+                                         &tpath, NULL, NULL, NULL))
+               {
+               GtkTreeModel *store;
+               NodeData *nd;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &nd, -1);
+               gtk_tree_path_free(tpath);
+
+               fd = (nd) ? nd->fd : NULL;
+               }
+
+       if (!fd) return;
+
+        if (info == TARGET_URI_LIST)
+                {
+               GList *list;
+               gint active;
+
+               list = uri_list_from_text(selection_data->data, TRUE);
+               if (!list) return;
+
+               active = access_file(fd->path, W_OK | X_OK);
+
+               vdtree_color_set(vdt, fd, TRUE);
+               vdt->popup = vdtree_drop_menu(vdt, active);
+               gtk_menu_popup(GTK_MENU(vdt->popup), NULL, NULL, NULL, NULL, 0, time);
+
+               vdt->drop_fd = fd;
+               vdt->drop_list = list;
+               }
+}
+
+static gint vdtree_dnd_drop_expand_cb(gpointer data)
+{
+       ViewDirTree *vdt = data;
+       GtkTreeIter iter;
+
+       if (vdt->drop_fd &&
+           vdtree_find_row(vdt, vdt->drop_fd, &iter, NULL))
+               {
+               vdtree_populate_path_by_iter(vdt, &iter, FALSE, vdt->path);
+               vdtree_expand_by_data(vdt, vdt->drop_fd, TRUE);
+               }
+
+       vdt->drop_expand_id = -1;
+       return FALSE;
+}
+
+static void vdtree_dnd_drop_expand_cancel(ViewDirTree *vdt)
+{
+       if (vdt->drop_expand_id != -1) g_source_remove(vdt->drop_expand_id);
+       vdt->drop_expand_id = -1;
+}
+
+static void vdtree_dnd_drop_expand(ViewDirTree *vdt)
+{
+       vdtree_dnd_drop_expand_cancel(vdt);
+       vdt->drop_expand_id = g_timeout_add(1000, vdtree_dnd_drop_expand_cb, vdt);
+}
+
+static void vdtree_drop_update(ViewDirTree *vdt, gint x, gint y)
+{
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+       FileData *fd = NULL;
+
+       if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vdt->treeview), x, y,
+                                         &tpath, NULL, NULL, NULL))
+               {
+               GtkTreeModel *store;
+               NodeData *nd;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &nd, -1);
+               gtk_tree_path_free(tpath);
+
+               fd = (nd) ? nd->fd : NULL;
+               }
+
+       if (fd != vdt->drop_fd)
+               {
+               vdtree_color_set(vdt, vdt->drop_fd, FALSE);
+               vdtree_color_set(vdt, fd, TRUE);
+               if (fd) vdtree_dnd_drop_expand(vdt);
+               }
+
+       vdt->drop_fd = fd;
+}
+
+static void vdtree_dnd_drop_scroll_cancel(ViewDirTree *vdt)
+{
+       if (vdt->drop_scroll_id != -1) g_source_remove(vdt->drop_scroll_id);
+       vdt->drop_scroll_id = -1;
+}
+
+static gint vdtree_auto_scroll_idle_cb(gpointer data)
+{
+       ViewDirTree *vdt = data;
+
+       if (vdt->drop_fd)
+               {
+               GdkWindow *window;
+               gint x, y;
+               gint w, h;
+
+               window = vdt->treeview->window;
+               gdk_window_get_pointer(window, &x, &y, NULL);
+               gdk_drawable_get_size(window, &w, &h);
+               if (x >= 0 && x < w && y >= 0 && y < h)
+                       {
+                       vdtree_drop_update(vdt, x, y);
+                       }
+               }
+
+       vdt->drop_scroll_id = -1;
+       return FALSE;
+}
+
+static gint vdtree_auto_scroll_notify_cb(GtkWidget *widget, gint x, gint y, gpointer data)
+{
+       ViewDirTree *vdt = data;
+
+       if (!vdt->drop_fd || vdt->drop_list) return FALSE;
+
+       if (vdt->drop_scroll_id == -1) vdt->drop_scroll_id = g_idle_add(vdtree_auto_scroll_idle_cb, vdt);
+
+       return TRUE;
+}
+
+static gint vdtree_dnd_drop_motion(GtkWidget *widget, GdkDragContext *context,
+                                  gint x, gint y, guint time, gpointer data)
+{
+        ViewDirTree *vdt = data;
+
+       vdt->click_fd = NULL;
+
+       if (gtk_drag_get_source_widget(context) == vdt->treeview)
+               {
+               gdk_drag_status(context, 0, time);
+               return TRUE;
+               }
+       else
+               {
+               gdk_drag_status(context, context->suggested_action, time);
+               }
+
+       vdtree_drop_update(vdt, x, y);
+
+       if (vdt->drop_fd)
+               {
+               GtkAdjustment *adj = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(vdt->treeview));
+               widget_auto_scroll_start(vdt->treeview, adj, -1, -1, vdtree_auto_scroll_notify_cb, vdt);
+               }
+
+       return FALSE;
+}
+
+static void vdtree_dnd_drop_leave(GtkWidget *widget, GdkDragContext *context, guint time, gpointer data)
+{
+       ViewDirTree *vdt = data;
+
+       if (vdt->drop_fd != vdt->click_fd) vdtree_color_set(vdt, vdt->drop_fd, FALSE);
+
+       vdt->drop_fd = NULL;
+
+       vdtree_dnd_drop_expand_cancel(vdt);
+}
+
+static void vdtree_dnd_init(ViewDirTree *vdt)
+{
+       gtk_drag_source_set(vdt->treeview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+                           dnd_file_drag_types, dnd_file_drag_types_count,
+                           GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK);
+       g_signal_connect(G_OBJECT(vdt->treeview), "drag_data_get",
+                        G_CALLBACK(vdtree_dnd_get), vdt);
+       g_signal_connect(G_OBJECT(vdt->treeview), "drag_begin",
+                        G_CALLBACK(vdtree_dnd_begin), vdt);
+       g_signal_connect(G_OBJECT(vdt->treeview), "drag_end",
+                        G_CALLBACK(vdtree_dnd_end), vdt);
+
+       vdtree_dest_set(vdt, TRUE);
+       g_signal_connect(G_OBJECT(vdt->treeview), "drag_data_received",
+                        G_CALLBACK(vdtree_dnd_drop_receive), vdt);
+       g_signal_connect(G_OBJECT(vdt->treeview), "drag_motion",
+                        G_CALLBACK(vdtree_dnd_drop_motion), vdt);
+       g_signal_connect(G_OBJECT(vdt->treeview), "drag_leave",
+                        G_CALLBACK(vdtree_dnd_drop_leave), vdt);
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * parts lists
+ *----------------------------------------------------------------------------
+ */
+
+static GList *parts_list(const gchar *path)
+{
+       GList *list = NULL;
+       const gchar *strb, *strp;
+       gint l;
+
+       strp = path;
+
+       if (*strp != '/') return NULL;
+
+       strp++;
+       strb = strp;
+       l = 0;
+
+       while (*strp != '\0')
+               {
+               if (*strp == '/')
+                       {
+                       if (l > 0) list = g_list_prepend(list, g_strndup(strb, l));
+                       strp++;
+                       strb = strp;
+                       l = 0;
+                       }
+               else
+                       {
+                       strp++;
+                       l++;
+                       }
+               }
+       if (l > 0) list = g_list_prepend(list, g_strndup(strb, l));
+
+       list = g_list_reverse(list);
+
+       list = g_list_prepend(list, g_strdup("/"));
+
+       return list;
+}
+
+static void parts_list_free(GList *list)
+{
+       GList *work = list;
+       while (work)
+               {
+               PathData *pd = work->data;
+               g_free(pd->name);
+               g_free(pd);
+               work = work->next;
+               }
+
+       g_list_free(list);
+}
+
+static GList *parts_list_add_node_points(ViewDirTree *vdt, GList *list)
+{
+       GList *work;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gint valid;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview));
+       valid = gtk_tree_model_get_iter_first(store, &iter);
+
+       work = list;
+       while (work)
+               {
+               PathData *pd;
+               FileData *fd = NULL;
+
+               pd = g_new0(PathData, 1);
+               pd->name = work->data;
+
+               while (valid && !fd)
+                       {
+                       NodeData *nd;
+
+                       gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &nd, -1);
+                       if (strcmp(nd->fd->name, pd->name) == 0)
+                               {
+                               fd = nd->fd;
+                               }
+                       else
+                               {
+                               valid = gtk_tree_model_iter_next(store, &iter);
+                               }
+                       }
+
+               pd->node = fd;
+               work->data = pd;
+
+               if (fd)
+                       {
+                       GtkTreeIter parent;
+                       memcpy(&parent, &iter, sizeof(parent));
+                       valid = gtk_tree_model_iter_children(store, &iter, &parent);
+                       }
+
+               work = work->next;
+               }
+
+       return list;
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * misc
+ *----------------------------------------------------------------------------
+ */
+
+#if 0
+static void vdtree_row_deleted_cb(GtkTreeModel *tree_model, GtkTreePath *tpath, gpointer data)
+{
+       GtkTreeIter iter;
+       NodeData *nd;
+
+       gtk_tree_model_get_iter(tree_model, &iter, tpath);
+       gtk_tree_model_get(tree_model, &iter, DIR_COLUMN_POINTER, &nd, -1);
+
+       if (!nd) return;
+
+       file_data_free(nd->fd);
+       g_free(nd);
+}
+#endif
+
+/*
+ *----------------------------------------------------------------------------
+ * node traversal, management
+ *----------------------------------------------------------------------------
+ */
+
+static gint vdtree_find_iter_by_data(ViewDirTree *vdt, GtkTreeIter *parent, NodeData *nd, GtkTreeIter *iter)
+{
+       GtkTreeModel *store;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview));
+       if (!nd || !gtk_tree_model_iter_children(store, iter, parent)) return -1;
+       do      {
+               NodeData *cnd;
+
+               gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &cnd, -1);
+               if (cnd == nd) return TRUE;
+               } while (gtk_tree_model_iter_next(store, iter));
+
+       return FALSE;
+}
+
+static NodeData *vdtree_find_iter_by_name(ViewDirTree *vdt, GtkTreeIter *parent, const gchar *name, GtkTreeIter *iter)
+{
+       GtkTreeModel *store;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview));
+       if (!name || !gtk_tree_model_iter_children(store, iter, parent)) return NULL;
+       do      {
+               NodeData *nd;
+
+               gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1);
+               if (nd && strcmp(nd->fd->name, name) == 0) return nd;
+               } while (gtk_tree_model_iter_next(store, iter));
+
+       return NULL;
+}
+
+static void vdtree_add_by_data(ViewDirTree *vdt, FileData *fd, GtkTreeIter *parent)
+{
+       GtkTreeStore *store;
+       GtkTreeIter child;
+       GList *list;
+       NodeData *nd;
+       GdkPixbuf *pixbuf;
+       NodeData *end;
+       GtkTreeIter empty;
+
+       if (!fd) return;
+
+       list = parts_list(fd->path);
+       if (!list) return;
+
+       if (access_file(fd->path, R_OK | X_OK))
+               {
+               pixbuf = vdt->pf->close;
+               }
+       else
+               {
+               pixbuf = vdt->pf->deny;
+               }
+
+       nd = g_new0(NodeData, 1);
+       nd->fd = fd;
+       nd->expanded = FALSE;
+       nd->last_update = time(NULL);
+
+       store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview)));
+       gtk_tree_store_append(store, &child, parent);
+       gtk_tree_store_set(store, &child, DIR_COLUMN_POINTER, nd,
+                                        DIR_COLUMN_ICON, pixbuf,
+                                        DIR_COLUMN_NAME, nd->fd->name,
+                                        DIR_COLUMN_COLOR, FALSE, -1);
+
+       /* all nodes are created with an "empty" node, so that the expander is shown
+        * this is removed when the child is populated */
+       end = g_new0(NodeData, 1);
+       end->fd = g_new0(FileData, 1);
+       end->fd->path = g_strdup("");
+       end->fd->name = end->fd->path;
+       end->expanded = TRUE;
+
+       gtk_tree_store_append(store, &empty, &child);
+       gtk_tree_store_set(store, &empty, DIR_COLUMN_POINTER, end,
+                                         DIR_COLUMN_NAME, "empty", -1);
+
+       if (parent)
+               {
+               NodeData *pnd;
+               GtkTreePath *tpath;
+
+               gtk_tree_model_get(GTK_TREE_MODEL(store), parent, DIR_COLUMN_POINTER, &pnd, -1);
+               tpath = gtk_tree_model_get_path(GTK_TREE_MODEL(store), parent);
+               if (tree_descend_subdirs &&
+                   gtk_tree_view_row_expanded(GTK_TREE_VIEW(vdt->treeview), tpath) &&
+                   !nd->expanded)
+                       {
+                       vdtree_populate_path_by_iter(vdt, &child, FALSE, vdt->path);
+                       }
+               gtk_tree_path_free(tpath);
+               }
+}
+
+static gint vdtree_populate_path_by_iter(ViewDirTree *vdt, GtkTreeIter *iter, gint force, const gchar *target_path)
+{
+       GtkTreeModel *store;
+       GList *list;
+       GList *work;
+       GList *old;
+       time_t current_time;
+       GtkTreeIter child;
+       NodeData *nd;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview));
+       gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1);
+
+       if (!nd) return FALSE;
+
+       current_time = time(NULL);
+       
+       if (nd->expanded)
+               {
+               if (!force && current_time - nd->last_update < 10) return TRUE;
+               if (!isdir(nd->fd->path))
+                       {
+                       if (vdt->click_fd == nd->fd) vdt->click_fd = NULL;
+                       if (vdt->drop_fd == nd->fd) vdt->drop_fd = NULL;
+                       gtk_tree_store_remove(GTK_TREE_STORE(store), iter);
+                       vdtree_node_free(nd);
+                       return FALSE;
+                       }
+               if (!force && filetime(nd->fd->path) == nd->fd->date) return TRUE;
+               }
+
+       vdtree_busy_push(vdt);
+
+       list = NULL;
+       filelist_read(nd->fd->path, NULL, &list);
+
+       /* when hidden files are not enabled, and the user enters a hidden path,
+        * allow the tree to display that path by specifically inserting the hidden entries
+        */
+       if (!show_dot_files &&
+           target_path &&
+           strncmp(nd->fd->path, target_path, strlen(nd->fd->path)) == 0)
+               {
+               gint n;
+
+               n = strlen(nd->fd->path);
+               if (target_path[n] == '/' && target_path[n+1] == '.')
+                       {
+                       gchar *name8;
+                       gchar *namel;
+                       struct stat sbuf;
+
+                       n++;
+
+                       while (target_path[n] != '\0' && target_path[n] != '/') n++;
+                       name8 = g_strndup(target_path, n);
+                       namel = path_from_utf8(name8);
+
+                       if (stat_utf8(name8, &sbuf))
+                               {
+                               list = g_list_prepend(list, file_data_new(namel, &sbuf));
+                               }
+
+                       g_free(namel);
+                       g_free(name8);
+                       }
+               }
+
+       old = NULL;
+       if (gtk_tree_model_iter_children(store, &child, iter))
+               {
+               do      {
+                       NodeData *cnd;
+
+                       gtk_tree_model_get(store, &child, DIR_COLUMN_POINTER, &cnd, -1);
+                       old = g_list_prepend(old, cnd);
+                       } while (gtk_tree_model_iter_next(store, &child));
+               }
+
+       work = list;
+       while (work)
+               {
+               FileData *fd;
+
+               fd = work->data;
+               work = work->next;
+
+               if (strcmp(fd->name, ".") == 0 || strcmp(fd->name, "..") == 0)
+                       {
+                       file_data_free(fd);
+                       }
+               else
+                       {
+                       NodeData *cnd;
+
+                       cnd = vdtree_find_iter_by_name(vdt, iter, fd->name, &child);
+                       if (cnd)
+                               {
+                               old = g_list_remove(old, cnd);
+                               if (cnd->expanded && cnd->fd->date != fd->date &&
+                                   vdtree_populate_path_by_iter(vdt, &child, FALSE, target_path))
+                                       {
+                                       cnd->fd->size = fd->size;
+                                       cnd->fd->date = fd->date;
+                                       }
+
+                               file_data_free(fd);
+                               }
+                       else
+                               {
+                               vdtree_add_by_data(vdt, fd, iter);
+                               }
+                       }
+               }
+
+       work = old;
+       while (work)
+               {
+               NodeData *cnd = work->data;
+               work = work->next;
+
+               if (vdt->click_fd == cnd->fd) vdt->click_fd = NULL;
+               if (vdt->drop_fd == cnd->fd) vdt->drop_fd = NULL;
+
+               if (vdtree_find_iter_by_data(vdt, iter, cnd, &child))
+                       {
+                       gtk_tree_store_remove(GTK_TREE_STORE(store), &child);
+                       vdtree_node_free(cnd);
+                       }
+               }
+
+       g_list_free(old);
+       g_list_free(list);
+
+       vdtree_busy_pop(vdt);
+
+       nd->expanded = TRUE;
+       nd->last_update = current_time;
+
+       return TRUE;
+}
+
+static FileData *vdtree_populate_path(ViewDirTree *vdt, const gchar *path, gint expand, gint force)
+{
+       GList *list;
+       GList *work;
+       FileData *fd = NULL;
+
+       if (!path) return NULL;
+
+       vdtree_busy_push(vdt);
+
+       list = parts_list(path);
+       list = parts_list_add_node_points(vdt, list);
+
+       work = list;
+       while (work)
+               {
+               PathData *pd = work->data;
+               if (pd->node == NULL)
+                       {
+                       PathData *parent_pd;
+                       GtkTreeIter parent_iter;
+                       GtkTreeIter iter;
+                       NodeData *nd;
+
+                       if (work == list)
+                               {
+                               /* should not happen */
+                               printf("vdtree warning, root node not found\n");
+                               parts_list_free(list);
+                               vdtree_busy_pop(vdt);
+                               return NULL;
+                               }
+
+                       parent_pd = work->prev->data;
+
+                       if (!vdtree_find_row(vdt, parent_pd->node, &parent_iter, NULL) ||
+                           !vdtree_populate_path_by_iter(vdt, &parent_iter, force, path) ||
+                           (nd = vdtree_find_iter_by_name(vdt, &parent_iter, pd->name, &iter)) == NULL)
+                               {
+                               printf("vdtree warning, aborted at %s\n", parent_pd->name);
+                               parts_list_free(list);
+                               vdtree_busy_pop(vdt);
+                               return NULL;
+                               }
+
+                       pd->node = nd->fd;
+
+                       if (pd->node)
+                               {
+                               if (expand)
+                                       {
+                                       vdtree_expand_by_iter(vdt, &parent_iter, TRUE);
+                                       vdtree_expand_by_iter(vdt, &iter, TRUE);
+                                       }
+                               vdtree_populate_path_by_iter(vdt, &iter, force, path);
+                               }
+                       }
+               else
+                       {
+                       GtkTreeIter iter;
+
+                       if (vdtree_find_row(vdt, pd->node, &iter, NULL))
+                               {
+                               if (expand) vdtree_expand_by_iter(vdt, &iter, TRUE);
+                               vdtree_populate_path_by_iter(vdt, &iter, force, path);
+                               }
+                       }
+
+               work = work->next;
+               }
+
+       work = g_list_last(list);
+       if (work)
+               {
+               PathData *pd = work->data;
+               fd = pd->node;
+               }
+       parts_list_free(list);
+
+       vdtree_busy_pop(vdt);
+
+       return fd;
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * access
+ *----------------------------------------------------------------------------
+ */
+
+static gint selection_is_ok = FALSE;
+
+static gboolean vdtree_select_cb(GtkTreeSelection *selection, GtkTreeModel *store, GtkTreePath *tpath,
+                                 gboolean path_currently_selected, gpointer data)
+{
+       return selection_is_ok;
+}
+
+static void vdtree_select_row(ViewDirTree *vdt, FileData *fd)
+{
+       GtkTreeSelection *selection;
+       GtkTreeIter iter;
+                                                                                                                               
+       if (!vdtree_find_row(vdt, fd, &iter, NULL)) return;
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vdt->treeview));
+
+       /* hack, such that selection is only allowed to be changed from here */
+       selection_is_ok = TRUE;
+       gtk_tree_selection_select_iter(selection, &iter);
+       selection_is_ok = FALSE;
+
+       if (!vdtree_populate_path_by_iter(vdt, &iter, FALSE, vdt->path)) return;
+
+       vdtree_expand_by_iter(vdt, &iter, TRUE);
+
+        if (fd && vdt->select_func)
+                {
+                vdt->select_func(vdt, fd->path, vdt->select_data);
+                }
+}
+
+gint vdtree_set_path(ViewDirTree *vdt, const gchar *path)
+{
+       FileData *fd;
+       GtkTreeIter iter;
+
+       if (!path) return FALSE;
+       if (vdt->path && strcmp(path, vdt->path) == 0) return TRUE;
+
+       g_free(vdt->path);
+       vdt->path = g_strdup(path);
+
+       fd = vdtree_populate_path(vdt, vdt->path, TRUE, TRUE);
+
+       if (!fd) return FALSE;
+
+       if (vdtree_find_row(vdt, fd, &iter, NULL))
+               {
+               GtkTreeModel *store;
+               GtkTreePath *tpath;
+
+               tree_view_row_make_visible(GTK_TREE_VIEW(vdt->treeview), &iter, TRUE);
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview));
+               tpath = gtk_tree_model_get_path(store, &iter);
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(vdt->treeview), tpath, NULL, FALSE);
+               gtk_tree_path_free(tpath);
+
+               vdtree_select_row(vdt, fd);
+               }
+
+       return TRUE;
+}
+
+#if 0
+const gchar *vdtree_get_path(ViewDirTree *vdt)
+{
+       return vdt->path;
+}
+#endif
+
+void vdtree_refresh(ViewDirTree *vdt)
+{
+       vdtree_populate_path(vdt, vdt->path, FALSE, TRUE);
+}
+
+const gchar *vdtree_row_get_path(ViewDirTree *vdt, gint row)
+{
+       printf("FIXME: no get row path\n");
+       return NULL;
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * callbacks
+ *----------------------------------------------------------------------------
+ */
+
+static void vdtree_menu_position_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       GtkTreePath *tpath;
+       gint cw, ch;
+
+       if (vdtree_find_row(vdt, vdt->click_fd, &iter, NULL) < 0) return;
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview));
+       tpath = gtk_tree_model_get_path(store, &iter);
+       tree_view_get_cell_clamped(GTK_TREE_VIEW(vdt->treeview), tpath, 0, TRUE, x, y, &cw, &ch);
+       gtk_tree_path_free(tpath);
+       *y += ch;
+       popup_menu_position_clamp(menu, x, y, 0);
+}
+
+static gint vdtree_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+       FileData *fd = NULL;
+
+       gtk_tree_view_get_cursor(GTK_TREE_VIEW(vdt->treeview), &tpath, NULL);
+       if (tpath)
+               {
+               GtkTreeModel *store;
+               NodeData *nd;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &nd, -1);
+
+               gtk_tree_path_free(tpath);
+
+               fd = (nd) ? nd->fd : NULL;
+               }
+
+       switch (event->keyval)
+               {
+               case GDK_Menu:
+                       vdt->click_fd = fd;
+                       vdtree_color_set(vdt, vdt->click_fd, TRUE);
+
+                       vdt->popup = vdtree_pop_menu(vdt, vdt->click_fd);
+                       gtk_menu_popup(GTK_MENU(vdt->popup), NULL, NULL, vdtree_menu_position_cb, vdt, 0, GDK_CURRENT_TIME);
+
+                       return TRUE;
+                       break;
+               case GDK_plus:
+               case GDK_Right:
+               case GDK_KP_Add:
+                       if (fd)
+                               {
+                               vdtree_populate_path_by_iter(vdt, &iter, FALSE, vdt->path);
+                               vdtree_icon_set_by_iter(vdt, &iter, vdt->pf->open);
+                               }
+                       break;
+               }
+
+       return FALSE;
+}
+
+static gint vdtree_clicked_on_expander(GtkTreeView *treeview, GtkTreePath *tpath,
+                                      GtkTreeViewColumn *column, gint x, gint y, gint *left_of_expander)
+{
+       gint depth;
+       gint size;
+       gint sep;
+       gint exp_width;
+
+       if (column != gtk_tree_view_get_expander_column(treeview)) return FALSE;
+
+       gtk_widget_style_get(GTK_WIDGET(treeview), "expander-size", &size, "horizontal-separator", &sep, NULL);
+       depth = gtk_tree_path_get_depth(tpath);
+
+       exp_width = sep + size + sep;
+
+       if (x <= depth * exp_width)
+               {
+               if (left_of_expander) *left_of_expander = !(x >= (depth - 1) * exp_width);
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+static gint vdtree_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       GtkTreePath *tpath;
+       GtkTreeViewColumn *column;
+       GtkTreeIter iter;
+       NodeData *nd = NULL;
+
+       if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
+                                         &tpath, &column, NULL, NULL))
+               {
+               GtkTreeModel *store;
+               gint left_of_expander;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &nd, -1);
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(widget), tpath, NULL, FALSE);
+
+               if (vdtree_clicked_on_expander(GTK_TREE_VIEW(widget), tpath, column, bevent->x, bevent->y, &left_of_expander))
+                       {
+                       vdt->click_fd = NULL;
+
+                       /* clicking this region should automatically reveal an expander, if necessary
+                        * treeview bug: the expander will not expand until a button_motion_event highlights it.
+                        */
+                       if (bevent->button == 1 &&
+                           !left_of_expander &&
+                           !gtk_tree_view_row_expanded(GTK_TREE_VIEW(vdt->treeview), tpath))
+                               {
+                               vdtree_populate_path_by_iter(vdt, &iter, FALSE, vdt->path);
+                               vdtree_icon_set_by_iter(vdt, &iter, vdt->pf->open);
+                               }
+
+                       gtk_tree_path_free(tpath);
+                       return FALSE;
+                       }
+
+               gtk_tree_path_free(tpath);
+               }
+
+       vdt->click_fd = (nd) ? nd->fd : NULL;
+       vdtree_color_set(vdt, vdt->click_fd, TRUE);
+
+       if (bevent->button == 3)
+               {
+               vdt->popup = vdtree_pop_menu(vdt, vdt->click_fd);
+               gtk_menu_popup(GTK_MENU(vdt->popup), NULL, NULL, NULL, NULL,
+                              bevent->button, bevent->time);
+               }
+
+       return (bevent->button != 1);
+}
+
+static gint vdtree_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+       NodeData *nd = NULL;
+
+       if (!vdt->click_fd) return FALSE;
+       vdtree_color_set(vdt, vdt->click_fd, FALSE);
+
+       if (bevent->button != 1) return TRUE;
+
+       if ((bevent->x != 0 || bevent->y != 0) &&
+           gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
+                                         &tpath, NULL, NULL, NULL))
+               {
+               GtkTreeModel *store;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &nd, -1);
+               gtk_tree_path_free(tpath);
+               }
+
+       if (nd && vdt->click_fd == nd->fd)
+               {
+               vdtree_select_row(vdt, vdt->click_fd);
+               }
+
+       return FALSE;
+}
+
+static void vdtree_row_expanded(GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *tpath, gpointer data)
+{
+       ViewDirTree *vdt = data;
+
+       vdtree_icon_set_by_iter(vdt, iter, vdt->pf->open);
+}
+
+static void vdtree_row_collapsed(GtkTreeView *treeview, GtkTreeIter *iter, GtkTreePath *tpath, gpointer data)
+{
+       ViewDirTree *vdt = data;
+
+       vdtree_icon_set_by_iter(vdt, iter, vdt->pf->close);
+}
+
+static gint vdtree_sort_cb(GtkTreeModel *store, GtkTreeIter *a, GtkTreeIter *b, gpointer data)
+{
+       NodeData *nda;
+       NodeData *ndb;
+
+       gtk_tree_model_get(store, a, DIR_COLUMN_POINTER, &nda, -1);
+       gtk_tree_model_get(store, b, DIR_COLUMN_POINTER, &ndb, -1);
+
+       return CASE_SORT(nda->fd->name, ndb->fd->name);
+}
+
+/*
+ *----------------------------------------------------------------------------
+ * core
+ *----------------------------------------------------------------------------
+ */
+
+static void vdtree_setup_root(ViewDirTree *vdt)
+{
+       const gchar *path = "/";
+       FileData *fd;
+
+       fd = g_new0(FileData, 1);
+       fd->path = g_strdup(path);
+       fd->name = fd->path;
+       fd->size = 0;
+       fd->date = filetime(path);
+       vdtree_add_by_data(vdt, fd, NULL);
+
+       vdtree_expand_by_data(vdt, fd, TRUE);
+       vdtree_populate_path(vdt, path, FALSE, FALSE);
+}
+
+static void vdtree_activate_cb(GtkTreeView *tview, GtkTreePath *tpath, GtkTreeViewColumn *column, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       NodeData *nd;
+
+       store = gtk_tree_view_get_model(tview);
+       gtk_tree_model_get_iter(store, &iter, tpath);
+       gtk_tree_model_get(store, &iter, DIR_COLUMN_POINTER, &nd, -1);
+
+       vdtree_select_row(vdt, nd->fd);
+}
+
+static GdkColor *vdtree_color_shifted(GtkWidget *widget)
+{
+       static GdkColor color;
+       static GtkWidget *done = NULL;
+
+       if (done != widget)
+               {
+               GtkStyle *style;
+
+               style = gtk_widget_get_style(widget);
+               memcpy(&color, &style->base[GTK_STATE_NORMAL], sizeof(color));
+               shift_color(&color, -1, 0);
+               done = widget;
+               }
+
+       return &color;
+}
+
+static void vdtree_color_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
+                           GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       gboolean set;
+
+       gtk_tree_model_get(tree_model, iter, DIR_COLUMN_COLOR, &set, -1);
+       g_object_set(G_OBJECT(cell),
+                    "cell-background-gdk", vdtree_color_shifted(vdt->treeview),
+                    "cell-background-set", set, NULL);
+}
+
+static gboolean vdtree_destroy_node_cb(GtkTreeModel *store, GtkTreePath *tpath, GtkTreeIter *iter, gpointer data)
+{
+       NodeData *nd;
+
+       gtk_tree_model_get(store, iter, DIR_COLUMN_POINTER, &nd, -1);
+       vdtree_node_free(nd);
+
+       return FALSE;
+}
+
+static void vdtree_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       ViewDirTree *vdt = data;
+       GtkTreeModel *store;
+
+       if (vdt->popup)
+               {
+               g_signal_handlers_disconnect_matched(G_OBJECT(vdt->popup), G_SIGNAL_MATCH_DATA,
+                                                    0, 0, 0, NULL, vdt);
+               gtk_widget_destroy(vdt->popup);
+               }
+
+       vdtree_dnd_drop_expand_cancel(vdt);
+       vdtree_dnd_drop_scroll_cancel(vdt);
+       widget_auto_scroll_stop(vdt->treeview);
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vdt->treeview));
+       gtk_tree_model_foreach(store, vdtree_destroy_node_cb, vdt);
+
+       path_list_free(vdt->drop_list);
+
+       folder_icons_free(vdt->pf);
+
+       g_free(vdt->path);
+       g_free(vdt);
+}
+
+ViewDirTree *vdtree_new(const gchar *path, gint expand)
+{
+       ViewDirTree *vdt;
+       GtkTreeStore *store;
+       GtkTreeSelection *selection;
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+
+       vdt = g_new0(ViewDirTree, 1);
+
+       vdt->path = NULL;
+       vdt->click_fd = NULL;
+
+       vdt->drop_fd = NULL;
+       vdt->drop_list = NULL;
+       vdt->drop_scroll_id = -1;
+       vdt->drop_expand_id = -1;
+
+       vdt->popup = NULL;
+
+       vdt->busy_ref = 0;
+
+       vdt->widget = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(vdt->widget), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vdt->widget),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+       g_signal_connect(G_OBJECT(vdt->widget), "destroy",
+                        G_CALLBACK(vdtree_destroy_cb), vdt);
+
+       store = gtk_tree_store_new(4, G_TYPE_POINTER, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_INT);
+       vdt->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vdt->treeview), FALSE);
+       gtk_tree_view_set_enable_search(GTK_TREE_VIEW(vdt->treeview), FALSE);
+       gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store), vdtree_sort_cb, vdt, NULL);
+       gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store),
+                                            GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
+
+       g_signal_connect(G_OBJECT(vdt->treeview), "row_activated",
+                        G_CALLBACK(vdtree_activate_cb), vdt);
+       g_signal_connect(G_OBJECT(vdt->treeview), "row_expanded",
+                        G_CALLBACK(vdtree_row_expanded), vdt);
+       g_signal_connect(G_OBJECT(vdt->treeview), "row_collapsed",
+                        G_CALLBACK(vdtree_row_collapsed), vdt);
+#if 0
+       g_signal_connect(G_OBJECT(store), "row_deleted",
+                        G_CALLBACK(vdtree_row_deleted_cb), vdt);
+#endif
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vdt->treeview));
+       gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
+       gtk_tree_selection_set_select_function(selection, vdtree_select_cb, vdt, NULL);
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
+
+       renderer = gtk_cell_renderer_pixbuf_new();
+       gtk_tree_view_column_pack_start(column, renderer, FALSE);
+       gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", DIR_COLUMN_ICON);
+       gtk_tree_view_column_set_cell_data_func(column, renderer, vdtree_color_cb, vdt, NULL);
+
+       renderer = gtk_cell_renderer_text_new();
+       gtk_tree_view_column_pack_start(column, renderer, TRUE);
+       gtk_tree_view_column_add_attribute(column, renderer, "text", DIR_COLUMN_NAME);
+       gtk_tree_view_column_set_cell_data_func(column, renderer, vdtree_color_cb, vdt, NULL);
+
+       gtk_tree_view_append_column(GTK_TREE_VIEW(vdt->treeview), column);
+
+       g_signal_connect(G_OBJECT(vdt->treeview), "key_press_event",
+                        G_CALLBACK(vdtree_press_key_cb), vdt);
+
+       gtk_container_add(GTK_CONTAINER(vdt->widget), vdt->treeview);
+       gtk_widget_show(vdt->treeview);
+
+       vdt->pf = folder_icons_new();
+
+       vdtree_setup_root(vdt);
+
+       vdtree_dnd_init(vdt);
+
+       g_signal_connect(G_OBJECT(vdt->treeview), "button_press_event",
+                        G_CALLBACK(vdtree_press_cb), vdt);
+       g_signal_connect(G_OBJECT(vdt->treeview), "button_release_event",
+                        G_CALLBACK(vdtree_release_cb), vdt);
+
+       vdtree_set_path(vdt, path);
+
+       return vdt;
+}
+
+void vdtree_set_select_func(ViewDirTree *vdt,
+                            void (*func)(ViewDirTree *vdt, const gchar *path, gpointer data), gpointer data)
+{
+        vdt->select_func = func;
+        vdt->select_data = data;
+}
+
+#if 0
+void vdtree_set_click_func(ViewDirTree *vdt,
+                          void (*func)(ViewDirTree *vdt, GdkEventButton *event, FileData *fd, gpointer), gpointer data)
+{
+       if (!td) return;
+       vdt->click_func = func;
+       vdt->click_data = data;
+}
+#endif
+
+void vdtree_set_layout(ViewDirTree *vdt, LayoutWindow *layout)
+{
+       vdt->layout = layout;
+}
+
diff --git a/src/view_dir_tree.h b/src/view_dir_tree.h
new file mode 100644 (file)
index 0000000..f5ec85e
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifndef VIEW_DIR_TREE_H
+#define VIEW_DIR_TREE_H
+
+ViewDirTree *vdtree_new(const gchar *path, gint expand);
+
+void vdtree_set_select_func(ViewDirTree *vdt,
+                           void (*func)(ViewDirTree *vdt, const gchar *path, gpointer data), gpointer data);
+
+void vdtree_set_layout(ViewDirTree *vdt, LayoutWindow *layout);
+
+gint vdtree_set_path(ViewDirTree *vdt, const gchar *path);
+void vdtree_refresh(ViewDirTree *vdt);
+
+const gchar *vdtree_row_get_path(ViewDirTree *vdt, gint row);
+
+
+#endif
+
diff --git a/src/view_file_icon.c b/src/view_file_icon.c
new file mode 100644 (file)
index 0000000..ba98ebc
--- /dev/null
@@ -0,0 +1,2559 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#include "gqview.h"
+#include "view_file_icon.h"
+
+#include "cellrenderericon.h"
+#include "collect.h"
+#include "collect-io.h"
+#include "collect-table.h"
+#include "dnd.h"
+#include "editors.h"
+#include "img-view.h"
+#include "info.h"
+#include "filelist.h"
+#include "layout.h"
+#include "layout_image.h"
+#include "menu.h"
+#include "thumb.h"
+#include "utilops.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_tree_edit.h"
+
+
+#include <gdk/gdkkeysyms.h> /* for keyboard values */
+
+/* between these, the icon width is increased by thumb_max_width / 2 */
+#define THUMB_MIN_ICON_WIDTH 128
+#define THUMB_MAX_ICON_WIDTH 150
+
+#define VFICON_MAX_COLUMNS 32
+#define THUMB_BORDER_PADDING 2
+
+#define VFICON_TIP_DELAY 500
+
+#define ICON_DATA(x) ((IconData *)x)
+#define FILE_DATA(x) ((FileData *)x)
+
+
+enum {
+       FILE_COLUMN_POINTER = 0,
+       FILE_COLUMN_COUNT
+};
+
+typedef enum {
+       SELECTION_NONE          = 0,
+       SELECTION_SELECTED      = 1 << 0,
+       SELECTION_PRELIGHT      = 1 << 1,
+       SELECTION_FOCUS         = 1 << 2
+} SelectionType;
+
+typedef struct _IconData IconData;
+struct _IconData
+{
+       FileData fd;
+       SelectionType selected;
+};
+
+
+static gint iconlist_read(const gchar *path, GList **list)
+{
+       GList *temp;
+       GList *work;
+
+       if (!filelist_read(path, &temp, NULL)) return FALSE;
+
+       work = temp;
+       while (work)
+               {
+               FileData *fd;
+               IconData *id;
+
+               fd = work->data;
+               id = g_new0(IconData, 1);
+
+               memcpy(id, fd, sizeof(FileData));
+               id->selected = SELECTION_NONE;
+
+               work->data = id;
+               g_free(fd);
+
+               work = work->next;
+               }
+
+       *list = temp;
+
+       return TRUE;
+}
+
+static void iconlist_free(GList *list)
+{
+       filelist_free(list);
+}
+
+
+static void vficon_toggle_filenames(ViewFileIcon *vfi);
+static void vficon_selection_remove(ViewFileIcon *vfi, FileData *fd, SelectionType mask, GtkTreeIter *iter);
+static void vficon_move_focus(ViewFileIcon *vfi, gint row, gint col, gint relative);
+static void vficon_set_focus(ViewFileIcon *vfi, FileData *fd);
+static void vficon_thumb_update(ViewFileIcon *vfi);
+static void vficon_populate_at_new_size(ViewFileIcon *vfi, gint w, gint h, gint force);
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * pop-up menu
+ *-----------------------------------------------------------------------------
+ */
+
+static GList *vficon_pop_menu_file_list(ViewFileIcon *vfi)
+{
+       if (!vfi->click_fd) return NULL;
+
+       if (ICON_DATA(vfi->click_fd)->selected & SELECTION_SELECTED)
+               {
+               return vficon_selection_get_list(vfi);
+               }
+
+       return g_list_append(NULL, g_strdup(vfi->click_fd->path));
+}
+
+static void vficon_pop_menu_edit_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileIcon *vfi;
+       gint n;
+       GList *list;
+
+       vfi = submenu_item_get_data(widget);
+       n = GPOINTER_TO_INT(data);
+
+       if (!vfi) return;
+
+       list = vficon_pop_menu_file_list(vfi);
+       start_editor_from_path_list(n, list);
+       path_list_free(list);
+}
+
+static void vficon_pop_menu_info_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       info_window_new(NULL, vficon_pop_menu_file_list(vfi));
+}
+
+static void vficon_pop_menu_view_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       if (!vfi->click_fd) return;
+
+       if (ICON_DATA(vfi->click_fd)->selected & SELECTION_SELECTED)
+               {
+               GList *list;
+               
+               list = vficon_selection_get_list(vfi);
+               view_window_new_from_list(list);
+               path_list_free(list);
+               }
+       else
+               {
+               view_window_new(vfi->click_fd->path);
+               }
+}
+
+static void vficon_pop_menu_copy_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       file_util_copy(NULL, vficon_pop_menu_file_list(vfi), NULL, vfi->listview);
+}
+
+static void vficon_pop_menu_move_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       file_util_move(NULL, vficon_pop_menu_file_list(vfi), NULL, vfi->listview);
+}
+
+static void vficon_pop_menu_rename_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       file_util_rename(NULL, vficon_pop_menu_file_list(vfi), vfi->listview);
+}
+
+static void vficon_pop_menu_delete_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       file_util_delete(NULL, vficon_pop_menu_file_list(vfi), vfi->listview);
+}
+
+static void vficon_pop_menu_sort_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileIcon *vfi;
+       SortType type;
+       
+       vfi = submenu_item_get_data(widget);
+       if (!vfi) return;
+
+       type = (SortType)GPOINTER_TO_INT(data);
+
+       if (vfi->layout)
+               {
+               layout_sort_set(vfi->layout, type, vfi->sort_ascend);
+               }
+       else
+               {
+               vficon_sort_set(vfi, type, vfi->sort_ascend);
+               }
+}
+
+static void vficon_pop_menu_sort_ascend_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       if (vfi->layout)
+               {
+               layout_sort_set(vfi->layout, vfi->sort_method, !vfi->sort_ascend);
+               }
+       else
+               {
+               vficon_sort_set(vfi, vfi->sort_method, !vfi->sort_ascend);
+               }
+}
+
+static void vficon_pop_menu_list_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       if (vfi->layout) layout_views_set(vfi->layout, vfi->layout->tree_view, FALSE);
+}
+
+static void vficon_pop_menu_show_names_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       vficon_toggle_filenames(vfi);
+}
+
+static void vficon_pop_menu_refresh_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       vficon_refresh(vfi);
+}
+
+static void vficon_popup_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileIcon *vfi = data;                                                                                                                               
+       vficon_selection_remove(vfi, vfi->click_fd, SELECTION_PRELIGHT, NULL);
+       vfi->click_fd = NULL;
+       vfi->popup = NULL;
+}
+
+static GtkWidget *vficon_pop_menu(ViewFileIcon *vfi, gint active)
+{
+       GtkWidget *menu;
+       GtkWidget *item;
+       GtkWidget *submenu;
+
+       menu = popup_menu_short_lived();
+
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(vficon_popup_destroy_cb), vfi);
+
+       submenu_add_edit(menu, &item, G_CALLBACK(vficon_pop_menu_edit_cb), vfi);
+       gtk_widget_set_sensitive(item, active);
+
+       item = menu_item_add_stock(menu, _("_Properties"), GTK_STOCK_PROPERTIES, G_CALLBACK(vficon_pop_menu_info_cb), vfi);
+       gtk_widget_set_sensitive(item, active);
+
+       item = menu_item_add_stock(menu, _("View in _new window"), GTK_STOCK_NEW, G_CALLBACK(vficon_pop_menu_view_cb), vfi);
+       gtk_widget_set_sensitive(item, active);
+
+       menu_item_add_divider(menu);
+       item = menu_item_add_stock(menu, _("_Copy..."), GTK_STOCK_COPY, G_CALLBACK(vficon_pop_menu_copy_cb), vfi);
+       gtk_widget_set_sensitive(item, active);
+       item = menu_item_add(menu, _("_Move..."), G_CALLBACK(vficon_pop_menu_move_cb), vfi);
+       gtk_widget_set_sensitive(item, active);
+       item = menu_item_add(menu, _("_Rename..."), G_CALLBACK(vficon_pop_menu_rename_cb), vfi);
+       gtk_widget_set_sensitive(item, active);
+       item = menu_item_add_stock(menu, _("_Delete..."), GTK_STOCK_DELETE, G_CALLBACK(vficon_pop_menu_delete_cb), vfi);
+       gtk_widget_set_sensitive(item, active);
+
+       menu_item_add_divider(menu);
+
+       submenu = submenu_add_sort(NULL, G_CALLBACK(vficon_pop_menu_sort_cb), vfi,
+                                  FALSE, FALSE, TRUE, vfi->sort_method);
+       menu_item_add_divider(submenu);
+       menu_item_add_check(submenu, _("Ascending"), vfi->sort_ascend,
+                           G_CALLBACK(vficon_pop_menu_sort_ascend_cb), vfi);
+
+       item = menu_item_add(menu, _("_Sort"), NULL, NULL);
+       gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
+
+       menu_item_add_check(menu, _("View as _icons"), TRUE,
+                           G_CALLBACK(vficon_pop_menu_list_cb), vfi);
+       menu_item_add_check(menu, _("Show filename _text"), vfi->show_text,
+                           G_CALLBACK(vficon_pop_menu_show_names_cb), vfi);
+       menu_item_add_stock(menu, _("Re_fresh"), GTK_STOCK_REFRESH, G_CALLBACK(vficon_pop_menu_refresh_cb), vfi);
+
+       return menu;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * signals
+ *-------------------------------------------------------------------
+ */
+
+static void vficon_send_update(ViewFileIcon *vfi)
+{
+       if (vfi->func_status) vfi->func_status(vfi, vfi->data_status);
+}
+
+static void vficon_send_layout_select(ViewFileIcon *vfi, FileData *fd)
+{
+       const gchar *read_ahead_path = NULL;
+
+       if (!vfi->layout || !fd) return;
+
+       if (enable_read_ahead)
+               {
+               FileData *fd_n;
+               gint row;
+
+               row = g_list_index(vfi->list, fd);
+               if (row > vficon_index_by_path(vfi, layout_image_get_path(vfi->layout)) &&
+                   row + 1 < vficon_count(vfi, NULL))
+                       {
+                       fd_n = vficon_index_get_data(vfi, row + 1);
+                       }
+               else if (row > 0)
+                       {
+                       fd_n = vficon_index_get_data(vfi, row - 1);
+                       }
+               else
+                       {
+                       fd_n = NULL;
+                       }
+               if (fd_n) read_ahead_path = fd_n->path;
+               }
+
+       layout_image_set_with_ahead(vfi->layout, fd->path, read_ahead_path);
+}
+
+static void vficon_toggle_filenames(ViewFileIcon *vfi)
+{
+       vfi->show_text = !vfi->show_text;
+       show_icon_names = vfi->show_text;
+
+       vficon_populate_at_new_size(vfi, vfi->listview->allocation.width, vfi->listview->allocation.height, TRUE);
+}
+
+static gint vficon_get_icon_width(ViewFileIcon *vfi)
+{
+       gint width;
+
+       if (!vfi->show_text) return thumb_max_width;
+
+       width = thumb_max_width + thumb_max_width / 2;
+       if (width < THUMB_MIN_ICON_WIDTH) width = THUMB_MIN_ICON_WIDTH;
+       if (width > THUMB_MAX_ICON_WIDTH) width = thumb_max_width;
+
+       return width;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * misc utils
+ *-------------------------------------------------------------------
+ */
+
+static gint vficon_find_position(ViewFileIcon *vfi, FileData *fd, gint *row, gint *col)
+{
+       gint n;
+
+       n = g_list_index(vfi->list, fd);
+
+       if (n < 0) return FALSE;
+
+       *row = n / vfi->columns;
+       *col = n - (*row * vfi->columns);
+
+       return TRUE;
+}
+
+static gint vficon_find_iter(ViewFileIcon *vfi, FileData *fd, GtkTreeIter *iter, gint *column)
+{
+       GtkTreeModel *store;
+       gint row, col;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview));
+       if (!vficon_find_position(vfi, fd, &row, &col)) return FALSE;
+       if (!gtk_tree_model_iter_nth_child(store, iter, NULL, row)) return FALSE;
+       if (column) *column = col;
+
+       return TRUE;
+}
+
+static FileData *vficon_find_data(ViewFileIcon *vfi, gint row, gint col, GtkTreeIter *iter)
+{
+       GtkTreeModel *store;
+       GtkTreeIter p;
+
+       if (row < 0 || col < 0) return NULL;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview));
+       if (gtk_tree_model_iter_nth_child(store, &p, NULL, row))
+               {
+               GList *list;
+
+               gtk_tree_model_get(store, &p, FILE_COLUMN_POINTER, &list, -1);
+               if (!list) return NULL;
+
+               if (iter) *iter = p;
+
+               return g_list_nth_data(list, col);
+               }
+
+       return NULL;
+}
+
+static FileData *vficon_find_data_by_coord(ViewFileIcon *vfi, gint x, gint y, GtkTreeIter *iter)
+{
+       GtkTreePath *tpath;
+       GtkTreeViewColumn *column;
+
+       if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vfi->listview), x, y,
+                                         &tpath, &column, NULL, NULL))
+               {
+               GtkTreeModel *store;
+               GtkTreeIter row;
+               GList *list;
+               gint n;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview));
+               gtk_tree_model_get_iter(store, &row, tpath);
+               gtk_tree_path_free(tpath);
+
+               gtk_tree_model_get(store, &row, FILE_COLUMN_POINTER, &list, -1);
+
+               n = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(column), "column_number"));
+               if (list)
+                       {
+                       if (iter) *iter = row;
+                       return g_list_nth_data(list, n);
+                       }
+               }
+
+       return NULL;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * tooltip type window
+ *-------------------------------------------------------------------
+ */
+
+static void tip_show(ViewFileIcon *vfi)
+{
+       GtkWidget *label;
+       gint x, y;
+
+       if (vfi->tip_window) return;
+
+       gdk_window_get_pointer(gtk_tree_view_get_bin_window(GTK_TREE_VIEW(vfi->listview)), &x, &y, NULL);
+
+       vfi->tip_fd = vficon_find_data_by_coord(vfi, x, y, NULL);
+       if (!vfi->tip_fd) return;
+
+       vfi->tip_window = gtk_window_new(GTK_WINDOW_POPUP);
+       gtk_window_set_resizable(GTK_WINDOW(vfi->tip_window), FALSE);
+       gtk_container_set_border_width(GTK_CONTAINER(vfi->tip_window), 2);
+
+       label = gtk_label_new(vfi->tip_fd->name);
+
+       g_object_set_data(G_OBJECT(vfi->tip_window), "tip_label", label);
+       gtk_container_add(GTK_CONTAINER(vfi->tip_window), label);
+       gtk_widget_show(label);
+
+       gdk_window_get_pointer(NULL, &x, &y, NULL);
+
+       if (!GTK_WIDGET_REALIZED(vfi->tip_window)) gtk_widget_realize(vfi->tip_window);
+       gtk_window_move(GTK_WINDOW(vfi->tip_window), x + 16, y + 16);
+       gtk_widget_show(vfi->tip_window);
+}
+
+static void tip_hide(ViewFileIcon *vfi)
+{
+       if (vfi->tip_window) gtk_widget_destroy(vfi->tip_window);
+       vfi->tip_window = NULL;
+}
+
+static gint tip_schedule_cb(gpointer data)
+{
+       ViewFileIcon *vfi = data;
+       GtkWidget *window;
+
+       if (vfi->tip_delay_id == -1) return FALSE;
+
+       window = gtk_widget_get_toplevel(vfi->listview);
+
+       if (GTK_WIDGET_SENSITIVE(window) &&
+           GTK_WINDOW(window)->has_focus)
+               {
+               tip_show(vfi);
+               }
+
+       vfi->tip_delay_id = -1;
+       return FALSE;
+}
+
+static void tip_schedule(ViewFileIcon *vfi)
+{
+       tip_hide(vfi);
+
+       if (vfi->tip_delay_id != -1)
+               {
+               g_source_remove(vfi->tip_delay_id);
+               vfi->tip_delay_id = -1;
+               }
+
+       if (!vfi->show_text)
+               {
+               vfi->tip_delay_id = g_timeout_add(VFICON_TIP_DELAY, tip_schedule_cb, vfi);
+               }
+}
+
+static void tip_unschedule(ViewFileIcon *vfi)
+{
+       tip_hide(vfi);
+
+       if (vfi->tip_delay_id != -1) g_source_remove(vfi->tip_delay_id);
+       vfi->tip_delay_id = -1;
+}
+
+static void tip_update(ViewFileIcon *vfi, FileData *fd)
+{
+       if (vfi->tip_window)
+               {
+               gint x, y;
+
+               gdk_window_get_pointer(NULL, &x, &y, NULL);
+               gtk_window_move(GTK_WINDOW(vfi->tip_window), x + 16, y + 16);
+
+               if (fd != vfi->tip_fd)
+                       {
+                       GtkWidget *label;
+
+                       vfi->tip_fd = fd;
+
+                       if (!vfi->tip_fd)
+                               {
+                               tip_hide(vfi);
+                               tip_schedule(vfi);
+                               return;
+                               }
+
+                       label = g_object_get_data(G_OBJECT(vfi->tip_window), "tip_label");
+                       gtk_label_set_text(GTK_LABEL(label), vfi->tip_fd->name);
+                       }
+               }
+       else
+               {
+               tip_schedule(vfi);
+               }
+}
+
+/*
+ *-------------------------------------------------------------------
+ * dnd
+ *-------------------------------------------------------------------
+ */
+
+static void vficon_dnd_get(GtkWidget *widget, GdkDragContext *context,
+                          GtkSelectionData *selection_data, guint info,
+                          guint time, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+       GList *list = NULL;
+       gchar *uri_text = NULL;
+       gint total;
+
+       if (!vfi->click_fd) return;
+
+       if (ICON_DATA(vfi->click_fd)->selected & SELECTION_SELECTED)
+               {
+               list = vficon_selection_get_list(vfi);
+               }
+       else
+               {
+               const gchar *path = vfi->click_fd->path;
+
+               list = g_list_append(NULL, g_strdup(path));
+               }
+
+       if (!list) return;
+       uri_text = uri_text_from_list(list, &total, (info == TARGET_TEXT_PLAIN));
+       path_list_free(list);
+
+       if (debug) printf(uri_text);
+
+       gtk_selection_data_set(selection_data, selection_data->target,
+                              8, uri_text, total);
+       g_free(uri_text);
+}
+
+static void vficon_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       tip_unschedule(vfi);
+
+       if (vfi->click_fd && vfi->click_fd->pixbuf)
+               {
+               gint items;
+
+               if (ICON_DATA(vfi->click_fd)->selected & SELECTION_SELECTED)
+                       items = g_list_length(vfi->selection);
+               else
+                       items = 1;
+
+               dnd_set_drag_icon(widget, context, vfi->click_fd->pixbuf, items);
+               }
+}
+
+static void vficon_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       vficon_selection_remove(vfi, vfi->click_fd, SELECTION_PRELIGHT, NULL);
+
+       if (context->action == GDK_ACTION_MOVE)
+               {
+               vficon_refresh(vfi);
+               }
+
+       tip_unschedule(vfi);
+}
+
+static void vficon_dnd_init(ViewFileIcon *vfi)
+{
+       gtk_drag_source_set(vfi->listview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+                           dnd_file_drag_types, dnd_file_drag_types_count,
+                           GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+       g_signal_connect(G_OBJECT(vfi->listview), "drag_data_get",
+                        G_CALLBACK(vficon_dnd_get), vfi);
+       g_signal_connect(G_OBJECT(vfi->listview), "drag_begin",
+                        G_CALLBACK(vficon_dnd_begin), vfi);
+       g_signal_connect(G_OBJECT(vfi->listview), "drag_end",
+                        G_CALLBACK(vficon_dnd_end), vfi);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * cell updates
+ *-------------------------------------------------------------------
+ */
+
+static void vficon_selection_set(ViewFileIcon *vfi, FileData *fd, SelectionType value, GtkTreeIter *iter)
+{
+       IconData *id;
+       GtkTreeModel *store;
+       GList *list;
+
+       if (!fd) return;
+
+       id = ICON_DATA(fd);
+
+       if (id->selected == value) return;
+       id->selected = value;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview));
+       if (iter)
+               {
+               gtk_tree_model_get(store, iter, FILE_COLUMN_POINTER, &list, -1);
+               if (list) gtk_list_store_set(GTK_LIST_STORE(store), iter, FILE_COLUMN_POINTER, list, -1);
+               }
+       else
+               {
+               GtkTreeIter row;
+
+               if (vficon_find_iter(vfi, fd, &row, NULL))
+                       {
+                       gtk_tree_model_get(store, &row, FILE_COLUMN_POINTER, &list, -1);
+                       if (list) gtk_list_store_set(GTK_LIST_STORE(store), &row, FILE_COLUMN_POINTER, list, -1);
+                       }
+               }
+}
+
+static void vficon_selection_add(ViewFileIcon *vfi, FileData *fd, SelectionType mask, GtkTreeIter *iter)
+{
+       if (!fd) return;
+
+       vficon_selection_set(vfi, fd, ICON_DATA(fd)->selected | mask, iter);
+}
+
+static void vficon_selection_remove(ViewFileIcon *vfi, FileData *fd, SelectionType mask, GtkTreeIter *iter)
+{
+       if (!fd) return;
+
+       vficon_selection_set(vfi, fd, ICON_DATA(fd)->selected & ~mask, iter);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * selections
+ *-------------------------------------------------------------------
+ */
+
+static void vficon_verify_selections(ViewFileIcon *vfi)
+{
+       GList *work;
+
+       work = vfi->selection;
+       while (work)
+               {
+               FileData *fd = work->data;
+               work = work->next;
+               if (!g_list_find(vfi->list, fd))
+                       {
+                       vfi->selection = g_list_remove(vfi->selection, fd);
+                       }
+               }
+}
+
+void vficon_select_all(ViewFileIcon *vfi)
+{
+       GList *work;
+
+       g_list_free(vfi->selection);
+       vfi->selection = NULL;
+
+       work = vfi->list;
+       while (work)
+               {
+               vfi->selection = g_list_append(vfi->selection, work->data);
+               vficon_selection_add(vfi, work->data, SELECTION_SELECTED, NULL);
+               work = work->next;
+               }
+
+       vficon_send_update(vfi);
+}
+
+void vficon_select_none(ViewFileIcon *vfi)
+{
+       GList *work;
+
+       work = vfi->selection;
+       while (work)
+               {
+               vficon_selection_remove(vfi, work->data, SELECTION_SELECTED, NULL);
+               work = work->next;
+               }
+
+       g_list_free(vfi->selection);
+       vfi->selection = NULL;
+
+       vficon_send_update(vfi);
+}
+
+static void vficon_select(ViewFileIcon *vfi, FileData *fd)
+{
+       vfi->prev_selection = fd;
+
+       if (!fd || ICON_DATA(fd)->selected & SELECTION_SELECTED) return;
+
+       vfi->selection = g_list_append(vfi->selection, fd);
+       vficon_selection_add(vfi, fd, SELECTION_SELECTED, NULL);
+
+       vficon_send_update(vfi);
+}
+
+static void vficon_unselect(ViewFileIcon *vfi, FileData *fd)
+{
+       vfi->prev_selection = fd;
+
+       if (!fd || !(ICON_DATA(fd)->selected & SELECTION_SELECTED) ) return;
+
+       vfi->selection = g_list_remove(vfi->selection, fd);
+       vficon_selection_remove(vfi, fd, SELECTION_SELECTED, NULL);
+
+       vficon_send_update(vfi);
+}
+
+static void vficon_select_util(ViewFileIcon *vfi, FileData *fd, gint select)
+{
+       if (select)
+               {
+               vficon_select(vfi, fd);
+               }
+       else
+               {
+               vficon_unselect(vfi, fd);
+               }
+}
+
+static void vficon_select_region_util(ViewFileIcon *vfi, FileData *start, FileData *end, gint select)
+{
+       gint row1, col1;
+       gint row2, col2;
+       gint t;
+       gint i, j;
+
+       if (!vficon_find_position(vfi, start, &row1, &col1) ||
+           !vficon_find_position(vfi, end, &row2, &col2) ) return;
+
+       vfi->prev_selection = end;
+
+       if (!collection_rectangular_selection)
+               {
+               GList *work;
+               FileData *fd;
+
+               if (g_list_index(vfi->list, start) > g_list_index(vfi->list, end))
+                       {
+                       fd = start;
+                       start = end;
+                       end = fd;
+                       }
+
+               work = g_list_find(vfi->list, start);
+               while (work)
+                       {
+                       fd = work->data;
+                       vficon_select_util(vfi, fd, select);
+                       
+                       if (work->data != end)
+                               work = work->next;
+                       else
+                               work = NULL;
+                       }
+               return;
+               }
+
+       if (row2 < row1)
+               {
+               t = row1;
+               row1 = row2;
+               row2 = t;
+               }
+       if (col2 < col1)
+               {
+               t = col1;
+               col1 = col2;
+               col2 = t;
+               }
+
+       if (debug) printf("table: %d x %d to %d x %d\n", row1, col1, row2, col2);
+
+       for (i = row1; i <= row2; i++)
+               {
+               for (j = col1; j <= col2; j++)
+                       {
+                       FileData *fd = vficon_find_data(vfi, i, j, NULL);
+                       if (fd) vficon_select_util(vfi, fd, select);
+                       }
+               }
+}
+
+gint vficon_index_is_selected(ViewFileIcon *vfi, gint row)
+{
+       FileData *fd = g_list_nth_data(vfi->list, row);
+
+       if (!fd) return FALSE;
+
+       return (ICON_DATA(fd)->selected & SELECTION_SELECTED);
+}
+
+gint vficon_selection_count(ViewFileIcon *vfi, gint64 *bytes)
+{
+       if (bytes)
+               {
+               gint64 b = 0;
+               GList *work;
+
+               work = vfi->selection;
+               while (work)
+                       {
+                       FileData *fd = work->data;
+                       b += fd->size;
+
+                       work = work->next;
+                       }
+
+               *bytes = b;
+               }
+
+       return g_list_length(vfi->selection);
+}
+
+GList *vficon_selection_get_list(ViewFileIcon *vfi)
+{
+       GList *list = NULL;
+       GList *work;
+
+       work = vfi->selection;
+       while (work)
+               {
+               FileData *fd = work->data;
+
+               list = g_list_prepend(list, g_strdup(fd->path));
+
+               work = work->next;
+               }
+
+       list = g_list_reverse(list);
+
+       return list;
+}
+
+GList *vficon_selection_get_list_by_index(ViewFileIcon *vfi)
+{
+       GList *list = NULL;
+       GList *work;
+
+       work = vfi->selection;  
+       while (work)
+               {
+               list = g_list_prepend(list, GINT_TO_POINTER(g_list_index(vfi->list, work->data)));
+               work = work->next;
+               }
+
+       return g_list_reverse(list);
+}
+
+void vficon_select_by_path(ViewFileIcon *vfi, const gchar *path)
+{
+       FileData *fd;
+       GList *work;
+
+       if (!path) return;
+
+       fd = NULL;
+       work = vfi->list;
+       while (work && !fd)
+               {
+               FileData *chk = work->data;
+               work = work->next;
+               if (strcmp(chk->path, path) == 0) fd = chk;
+               }
+
+       if (!fd) return;
+
+       if (!(ICON_DATA(fd)->selected & SELECTION_SELECTED))
+               {
+               vficon_select_none(vfi);
+               vficon_select(vfi, fd);
+               }
+
+       vficon_set_focus(vfi, fd);
+}
+
+/*
+ *-------------------------------------------------------------------
+ * focus
+ *-------------------------------------------------------------------
+ */
+
+static void vficon_move_focus(ViewFileIcon *vfi, gint row, gint col, gint relative)
+{
+       gint new_row;
+       gint new_col;
+
+       if (relative)
+               {
+               new_row = vfi->focus_row;
+               new_col = vfi->focus_column;
+
+               new_row += row;
+               if (new_row < 0) new_row = 0;
+               if (new_row >= vfi->rows) new_row = vfi->rows - 1;
+
+               while(col != 0)
+                       {
+                       if (col < 0)
+                               {
+                               new_col--;
+                               col++;
+                               }
+                       else
+                               {
+                               new_col++;
+                               col--;
+                               }
+
+                       if (new_col < 0)
+                               {
+                               if (new_row > 0)
+                                       {
+                                       new_row--;
+                                       new_col = vfi->columns - 1;
+                                       }
+                               else
+                                       {
+                                       new_col = 0;
+                                       }
+                               }
+                       if (new_col >= vfi->columns)
+                               {
+                               if (new_row < vfi->rows - 1)
+                                       {
+                                       new_row++;
+                                       new_col = 0;
+                                       }
+                               else
+                                       {
+                                       new_col = vfi->columns - 1;
+                                       }
+                               }
+                       }
+               }
+       else
+               {
+               new_row = row;
+               new_col = col;
+
+               if (new_row >= vfi->rows)
+                       {
+                       if (vfi->rows > 0)
+                               new_row = vfi->rows - 1;
+                       else
+                               new_row = 0;
+                       new_col = vfi->columns - 1;
+                       }
+               if (new_col >= vfi->columns) new_col = vfi->columns - 1;
+               }
+
+       if (new_row == vfi->rows - 1)
+               {
+               gint l;
+
+               /* if we moved beyond the last image, go to the last image */
+
+               l = g_list_length(vfi->list);
+               if (vfi->rows > 1) l -= (vfi->rows - 1) * vfi->columns;
+               if (new_col >= l) new_col = l - 1;
+               }
+
+       vficon_set_focus(vfi, vficon_find_data(vfi, new_row, new_col, NULL));
+}
+
+static void vficon_set_focus(ViewFileIcon *vfi, FileData *fd)
+{
+       GtkTreeIter iter;
+       gint row, col;
+
+       if (g_list_find(vfi->list, vfi->focus_fd))
+               {
+               if (fd == vfi->focus_fd)
+                       {
+                       /* ensure focus row col are correct */
+                       vficon_find_position(vfi, vfi->focus_fd, &vfi->focus_row, &vfi->focus_column);
+                       return;
+                       }
+               vficon_selection_remove(vfi, vfi->focus_fd, SELECTION_FOCUS, NULL);
+               }
+
+       if (!vficon_find_position(vfi, fd, &row, &col))
+               {
+               vfi->focus_fd = NULL;
+               vfi->focus_row = -1;
+               vfi->focus_column = -1;
+               return;
+               }
+
+       vfi->focus_fd = fd;
+       vfi->focus_row = row;
+       vfi->focus_column = col;
+       vficon_selection_add(vfi, vfi->focus_fd, SELECTION_FOCUS, NULL);
+
+       if (vficon_find_iter(vfi, vfi->focus_fd, &iter, NULL))
+               {
+               GtkTreePath *tpath;
+               GtkTreeViewColumn *column;
+               GtkTreeModel *store;
+
+               tree_view_row_make_visible(GTK_TREE_VIEW(vfi->listview), &iter, FALSE);
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview));
+               tpath = gtk_tree_model_get_path(store, &iter);
+               /* focus is set to an extra column with 0 width to hide focus, we draw it ourself */
+               column = gtk_tree_view_get_column(GTK_TREE_VIEW(vfi->listview), VFICON_MAX_COLUMNS);
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(vfi->listview), tpath, column, FALSE);
+               gtk_tree_path_free(tpath);
+               }
+}
+
+static void vficon_update_focus(ViewFileIcon *vfi)
+{
+       gint new_row = 0;
+       gint new_col = 0;
+
+       if (vfi->focus_fd && vficon_find_position(vfi, vfi->focus_fd, &new_row, &new_col))
+               {
+               /* first find the old focus, if it exists and is valid */
+               }
+       else
+               {
+               /* (try to) stay where we were */
+               new_row = vfi->focus_row;
+               new_col = vfi->focus_column;
+               }
+
+       vficon_move_focus(vfi, new_row, new_col, FALSE);
+}
+
+/* used to figure the page up/down distances */
+static gint page_height(ViewFileIcon *vfi)
+{
+       GtkAdjustment *adj;
+       gint page_size;
+       gint row_height;
+       gint ret;
+
+       adj = gtk_tree_view_get_vadjustment(GTK_TREE_VIEW(vfi->listview));
+       page_size = (gint)adj->page_increment;
+
+       row_height = thumb_max_height + THUMB_BORDER_PADDING * 2;
+       if (vfi->show_text) row_height += thumb_max_height / 3;
+
+       ret = page_size / row_height;
+       if (ret < 1) ret = 1;
+
+       return ret;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * keyboard
+ *-------------------------------------------------------------------
+ */
+
+static void vfi_menu_position_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       gint column;
+       GtkTreePath *tpath;
+       gint cw, ch;
+
+       if (!vficon_find_iter(vfi, vfi->click_fd, &iter, &column)) return;
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview));
+       tpath = gtk_tree_model_get_path(store, &iter);
+       tree_view_get_cell_clamped(GTK_TREE_VIEW(vfi->listview), tpath, column, FALSE, x, y, &cw, &ch);
+       gtk_tree_path_free(tpath);
+       *y += ch;
+       popup_menu_position_clamp(menu, x, y, 0);
+}
+
+static gint vficon_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+       gint stop_signal = FALSE;
+       gint focus_row = 0;
+       gint focus_col = 0;
+       FileData *fd;
+
+       switch (event->keyval)
+               {
+               case GDK_Left: case GDK_KP_Left:
+                       focus_col = -1;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Right: case GDK_KP_Right:
+                       focus_col = 1;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Up: case GDK_KP_Up:
+                       focus_row = -1;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Down: case GDK_KP_Down:
+                       focus_row = 1;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Page_Up: case GDK_KP_Page_Up:
+                       focus_row = -page_height(vfi);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Page_Down: case GDK_KP_Page_Down:
+                       focus_row = page_height(vfi);
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Home: case GDK_KP_Home:
+                       focus_row = -vfi->focus_row;
+                       focus_col = -vfi->focus_column;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_End: case GDK_KP_End:
+                       focus_row = vfi->rows - 1 - vfi->focus_row;
+                       focus_col = vfi->columns - 1 - vfi->focus_column;
+                       stop_signal = TRUE;
+                       break;
+               case GDK_space:
+                       fd = vficon_find_data(vfi, vfi->focus_row, vfi->focus_column, NULL);
+                       if (fd)
+                               {
+                               vfi->click_fd = fd;
+                               if (event->state & GDK_CONTROL_MASK)
+                                       {
+                                       gint selected;
+
+                                       selected = ICON_DATA(fd)->selected & SELECTION_SELECTED;
+                                       if (selected)
+                                               {
+                                               vficon_unselect(vfi, fd);
+                                               }
+                                       else
+                                               {
+                                               vficon_select(vfi, fd);
+                                               vficon_send_layout_select(vfi, fd);
+                                               }
+                                       }
+                               else
+                                       {
+                                       vficon_select_none(vfi);
+                                       vficon_select(vfi, fd);
+                                       vficon_send_layout_select(vfi, fd);
+                                       }
+                               }
+                       stop_signal = TRUE;
+                       break;
+               case GDK_Menu:
+                       fd = vficon_find_data(vfi, vfi->focus_row, vfi->focus_column, NULL);
+                       vfi->click_fd = fd;
+
+                       vficon_selection_add(vfi, vfi->click_fd, SELECTION_PRELIGHT, NULL);
+                       tip_unschedule(vfi);
+
+                       vfi->popup = vficon_pop_menu(vfi, (fd != NULL));
+                       gtk_menu_popup(GTK_MENU(vfi->popup), NULL, NULL, vfi_menu_position_cb, vfi, 0, GDK_CURRENT_TIME);
+                       stop_signal = TRUE;
+                       break;
+               default:
+                       break;
+               }
+
+       if (focus_row != 0 || focus_col != 0)
+               {
+               FileData *new_fd;
+               FileData *old_fd;
+
+               old_fd = vficon_find_data(vfi, vfi->focus_row, vfi->focus_column, NULL);
+               vficon_move_focus(vfi, focus_row, focus_col, TRUE);
+               new_fd = vficon_find_data(vfi, vfi->focus_row, vfi->focus_column, NULL);
+
+               if (new_fd != old_fd)
+                       {
+                       if (event->state & GDK_SHIFT_MASK)
+                               {
+                               if (!collection_rectangular_selection)
+                                       {
+                                       vficon_select_region_util(vfi, old_fd, new_fd, FALSE);
+                                       }
+                               else
+                                       {
+                                       vficon_select_region_util(vfi, vfi->click_fd, old_fd, FALSE);
+                                       }
+                               vficon_select_region_util(vfi, vfi->click_fd, new_fd, TRUE);
+                               vficon_send_layout_select(vfi, new_fd);
+                               }
+                       else if (event->state & GDK_CONTROL_MASK)
+                               {
+                               vfi->click_fd = new_fd;
+                               }
+                       else
+                               {
+                               vfi->click_fd = new_fd;
+                               vficon_select_none(vfi);
+                               vficon_select(vfi, new_fd);
+                               vficon_send_layout_select(vfi, new_fd);
+                               }
+                       }
+               }
+
+       if (stop_signal)
+               {
+               g_signal_stop_emission_by_name(GTK_OBJECT(widget), "key_press_event");
+               tip_unschedule(vfi);
+               }
+
+       return stop_signal;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * mouse
+ *-------------------------------------------------------------------
+ */
+
+static gint vficon_motion_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+       FileData *fd;
+
+       fd = vficon_find_data_by_coord(vfi, (gint)bevent->x, (gint)bevent->y, NULL);
+       tip_update(vfi, fd);
+
+       return FALSE;
+}
+
+static gint vficon_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+       GtkTreeIter iter;
+       FileData *fd;
+
+       tip_unschedule(vfi);
+       
+       fd = vficon_find_data_by_coord(vfi, (gint)bevent->x, (gint)bevent->y, &iter);
+
+       vfi->click_fd = fd;
+       vficon_selection_add(vfi, vfi->click_fd, SELECTION_PRELIGHT, &iter);
+
+       switch (bevent->button)
+               {
+               case 1:
+                       if (!GTK_WIDGET_HAS_FOCUS(vfi->listview))
+                               {
+                               gtk_widget_grab_focus(vfi->listview);
+                               }
+#if 0
+                       if (bevent->type == GDK_2BUTTON_PRESS &&
+                           vfi->layout)
+                               {
+                               vficon_selection_remove(vfi, vfi->click_fd, SELECTION_PRELIGHT, &iter);
+                               layout_image_full_screen_start(vfi->layout);
+                               }
+#endif
+                       break;
+               case 3:
+                       vfi->popup = vficon_pop_menu(vfi, (fd != NULL));
+                       gtk_menu_popup(GTK_MENU(vfi->popup), NULL, NULL, NULL, NULL, bevent->button, bevent->time);
+                       break;
+               default:
+                       break;
+               }
+
+       return TRUE;
+}
+
+static gint vficon_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+       GtkTreeIter iter;
+       FileData *fd = NULL;
+       gint was_selected = FALSE;
+
+       tip_schedule(vfi);
+
+       if ((gint)bevent->x != 0 || (gint) bevent->y != 0)
+               {
+               fd = vficon_find_data_by_coord(vfi, (gint)bevent->x, (gint)bevent->y, &iter);
+               }
+
+       if (vfi->click_fd)
+               {
+               vficon_selection_remove(vfi, vfi->click_fd, SELECTION_PRELIGHT, NULL);
+               }
+
+       if (fd) was_selected = (ICON_DATA(fd)->selected & SELECTION_SELECTED);
+
+       if (bevent->button == 1 &&
+           fd && vfi->click_fd == fd)
+               {
+               vficon_set_focus(vfi, fd);
+               
+               if (bevent->state & GDK_CONTROL_MASK)
+                       {
+                       gint select;
+
+                       select = !(ICON_DATA(fd)->selected & SELECTION_SELECTED);
+                       if ((bevent->state & GDK_SHIFT_MASK) && vfi->prev_selection)
+                               {
+                               vficon_select_region_util(vfi, vfi->prev_selection, fd, select);
+                               }
+                       else
+                               {
+                               vficon_select_util(vfi, fd, select);
+                               }
+                       }
+               else
+                       {
+                       vficon_select_none(vfi);
+
+                       if ((bevent->state & GDK_SHIFT_MASK) &&
+                           vfi->prev_selection)
+                               {
+                               vficon_select_region_util(vfi, vfi->prev_selection, fd, TRUE);
+                               }
+                       else
+                               {
+                               vficon_select_util(vfi, fd, TRUE);
+                               was_selected = FALSE;
+                               }
+                       }
+               }
+       else if (bevent->button == 2 &&
+                fd && vfi->click_fd == fd)
+               {
+               vficon_select_util(vfi, fd, !(ICON_DATA(fd)->selected & SELECTION_SELECTED));
+               }
+
+       if (fd && !was_selected &&
+           (ICON_DATA(fd)->selected & SELECTION_SELECTED))
+               {
+               vficon_send_layout_select(vfi, fd);
+               }
+
+       return TRUE;
+}
+
+static gint vficon_leave_cb(GtkWidget *widget, GdkEventCrossing *event, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       tip_unschedule(vfi);
+       return FALSE;
+}
+
+/*
+ *-------------------------------------------------------------------
+ * population
+ *-------------------------------------------------------------------
+ */
+
+static gboolean vficon_destroy_node_cb(GtkTreeModel *store, GtkTreePath *tpath, GtkTreeIter *iter, gpointer data)
+{
+       GList *list;
+
+       gtk_tree_model_get(store, iter, FILE_COLUMN_POINTER, &list, -1);
+       g_list_free(list);
+
+       return FALSE;
+}
+
+static void vficon_clear_store(ViewFileIcon *vfi)
+{
+       GtkTreeModel *store;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview));
+       gtk_tree_model_foreach(store, vficon_destroy_node_cb, NULL);
+
+       gtk_list_store_clear(GTK_LIST_STORE(store));
+}
+
+static void vficon_set_thumb(ViewFileIcon *vfi, FileData *fd, GdkPixbuf *pb)
+{
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       GList *list;
+
+       if (!vficon_find_iter(vfi, fd, &iter, NULL)) return;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview));
+
+       if (pb) g_object_ref(pb);
+       if (fd->pixbuf) g_object_unref(fd->pixbuf);
+       fd->pixbuf = pb;
+
+       gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
+       gtk_list_store_set(GTK_LIST_STORE(store), &iter, FILE_COLUMN_POINTER, list, -1);
+}
+
+static GList *vficon_add_row(ViewFileIcon *vfi, GtkTreeIter *iter)
+{
+       GtkListStore *store;
+       GList *list = NULL;
+       gint i;
+
+       for (i = 0; i < vfi->columns; i++) list = g_list_prepend(list, NULL);
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview)));
+       gtk_list_store_append(store, iter);
+       gtk_list_store_set(store, iter, FILE_COLUMN_POINTER, list, -1);
+
+       return list;
+}
+
+static void vficon_populate(ViewFileIcon *vfi, gint resize, gint keep_position)
+{
+       GtkTreeModel *store;
+       GtkTreePath *tpath;
+       gint row;
+       GList *work;
+       FileData *visible_fd = NULL;
+
+       vficon_verify_selections(vfi);
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview));
+
+       if (keep_position && GTK_WIDGET_REALIZED(vfi->listview) &&
+           gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vfi->listview), 0, 0, &tpath, NULL, NULL, NULL))
+               {
+               GtkTreeIter iter;
+               GList *list;
+
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_path_free(tpath);
+
+               gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
+               if (list) visible_fd = list->data;
+               }
+
+       vficon_clear_store(vfi);
+
+       if (resize)
+               {
+               gint i;
+               gint thumb_width;
+
+               thumb_width = vficon_get_icon_width(vfi);
+
+               for (i = 0; i < VFICON_MAX_COLUMNS; i++)
+                       {
+                       GtkTreeViewColumn *column;
+                       GtkCellRenderer *cell;
+                       GList *list;
+
+                       column = gtk_tree_view_get_column(GTK_TREE_VIEW(vfi->listview), i);
+                       gtk_tree_view_column_set_visible(column, (i < vfi->columns));
+                       gtk_tree_view_column_set_fixed_width(column, thumb_width + (THUMB_BORDER_PADDING * 6));
+
+                       list = gtk_tree_view_column_get_cell_renderers(column);
+                       cell = (list) ? list->data : NULL;
+                       g_list_free(list);
+
+                       if (cell && GQV_IS_CELL_RENDERER_ICON(cell))
+                               {
+                               g_object_set(G_OBJECT(cell), "fixed_width", thumb_width,
+                                                            "fixed_height", thumb_max_height,
+                                                            "show_text", vfi->show_text, NULL);
+                               }
+                       }
+               if (GTK_WIDGET_REALIZED(vfi->listview)) gtk_tree_view_columns_autosize(GTK_TREE_VIEW(vfi->listview));
+               }
+
+       row = -1;
+       work = vfi->list;
+       while (work)
+               {
+               GList *list;
+               GtkTreeIter iter;
+
+               row++;
+
+               list = vficon_add_row(vfi, &iter);
+               while (work && list)
+                       {
+                       list->data = work->data;
+                       list = list->next;
+                       work = work->next;
+                       }
+               }
+
+       if (visible_fd &&
+           gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vfi->listview), 0, 0, &tpath, NULL, NULL, NULL))
+               {
+               GtkTreeIter iter;
+               GList *list;
+
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_path_free(tpath);
+
+               gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
+               if (g_list_find(list, visible_fd) == NULL &&
+                   vficon_find_iter(vfi, visible_fd, &iter, NULL))
+                       {
+                       tree_view_row_make_visible(GTK_TREE_VIEW(vfi->listview), &iter, FALSE);
+                       }
+               }
+
+       vfi->rows = row + 1;
+
+       vficon_send_update(vfi);
+       vficon_thumb_update(vfi);
+}
+
+static void vficon_populate_at_new_size(ViewFileIcon *vfi, gint w, gint h, gint force)
+{
+       gint new_cols;
+       gint thumb_width;
+
+       thumb_width = vficon_get_icon_width(vfi);
+
+       new_cols = w / (thumb_width + (THUMB_BORDER_PADDING * 6));
+       if (new_cols < 1) new_cols = 1;
+
+       if (!force && new_cols == vfi->columns) return;
+
+       vfi->columns = new_cols;
+
+       vficon_populate(vfi, TRUE, TRUE);
+
+       if (debug) printf("col tab pop cols=%d rows=%d\n", vfi->columns, vfi->rows);
+}
+
+static void vficon_sync(ViewFileIcon *vfi)
+{
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       GList *work;
+       gint r, c;
+
+       if (vfi->rows == 0) return;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview));
+
+       r = -1;
+       c = 0;
+
+       work = vfi->list;
+       while (work)
+               {
+               GList *list;
+               r++;
+               c = 0;
+               if (gtk_tree_model_iter_nth_child(store, &iter, NULL, r))
+                       {
+                       gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
+                       gtk_list_store_set(GTK_LIST_STORE(store), &iter, FILE_COLUMN_POINTER, list, -1);
+                       }
+               else
+                       {
+                       list = vficon_add_row(vfi, &iter);
+                       }
+               
+               while (list)
+                       {
+                       FileData *fd;
+                       if (work)
+                               {
+                               fd = work->data;
+                               work = work->next;
+                               c++;
+                               }
+                       else
+                               {
+                               fd = NULL;
+                               }
+                       if (list)
+                               {
+                               list->data = fd;
+                               list = list->next;
+                               }
+                       }
+               }
+
+       r++;
+       while (gtk_tree_model_iter_nth_child(store, &iter, NULL, r))
+               {
+               GList *list;
+
+               gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
+               gtk_list_store_remove(GTK_LIST_STORE(store), &iter);
+               g_list_free(list);
+               }
+
+       vfi->rows = r;
+
+       vficon_update_focus(vfi);
+}
+
+static gint vficon_sync_idle_cb(gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       if (vfi->sync_idle_id == -1) return FALSE;
+       vfi->sync_idle_id = -1;
+
+       vficon_sync(vfi);
+       return FALSE;
+}
+
+static void vficon_sync_idle(ViewFileIcon *vfi)
+{
+       if (vfi->sync_idle_id == -1)
+               {
+               /* high priority, the view needs to be resynced before a redraw
+                * may contain invalid pointers at this time
+                */
+               vfi->sync_idle_id = g_idle_add_full(G_PRIORITY_HIGH, vficon_sync_idle_cb, vfi, NULL);
+               }
+}
+
+static void vficon_sized_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       vficon_populate_at_new_size(vfi, allocation->width, allocation->height, FALSE);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * misc
+ *-----------------------------------------------------------------------------
+ */
+
+void vficon_sort_set(ViewFileIcon *vfi, SortType type, gint ascend)
+{
+       if (vfi->sort_method == type && vfi->sort_ascend == ascend) return;
+
+       vfi->sort_method = type;
+       vfi->sort_ascend = ascend;
+
+       if (!vfi->list) return;
+
+       vfi->list = filelist_sort(vfi->list, vfi->sort_method, vfi->sort_ascend);
+       vficon_sync(vfi);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * thumb updates
+ *-----------------------------------------------------------------------------
+ */
+
+static gint vficon_thumb_next(ViewFileIcon *vfi);
+
+static void vficon_thumb_status(ViewFileIcon *vfi, gdouble val, const gchar *text)
+{
+       if (vfi->func_thumb_status)
+               {
+               vfi->func_thumb_status(vfi, val, text, vfi->data_thumb_status);
+               }
+}
+
+static void vficon_thumb_cleanup(ViewFileIcon *vfi)
+{
+       vficon_thumb_status(vfi, 0.0, NULL);
+
+       g_list_free(vfi->thumbs_list);
+       vfi->thumbs_list = NULL;
+       vfi->thumbs_count = 0;
+       vfi->thumbs_running = FALSE;
+
+       thumb_loader_free(vfi->thumbs_loader);
+       vfi->thumbs_loader = NULL;
+
+       vfi->thumbs_fd = NULL;
+}
+
+static void vficon_thumb_stop(ViewFileIcon *vfi)
+{
+       if (vfi->thumbs_running) vficon_thumb_cleanup(vfi);
+}
+
+static void vficon_thumb_do(ViewFileIcon *vfi, ThumbLoader *tl, FileData *fd)
+{
+       GdkPixbuf *pixbuf;
+
+       if (!fd) return;
+
+       pixbuf = thumb_loader_get_pixbuf(tl, TRUE);
+       vficon_set_thumb(vfi, fd, pixbuf);
+       g_object_unref(pixbuf);
+
+       vficon_thumb_status(vfi, (gdouble)(vfi->thumbs_count) / g_list_length(vfi->list), _("Loading thumbs..."));
+}
+
+static void vficon_thumb_error_cb(ThumbLoader *tl, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       if (vfi->thumbs_fd && vfi->thumbs_loader == tl)
+               {
+               vficon_thumb_do(vfi, tl, vfi->thumbs_fd);
+               }
+
+       while (vficon_thumb_next(vfi));
+}
+
+static void vficon_thumb_done_cb(ThumbLoader *tl, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       if (vfi->thumbs_fd && vfi->thumbs_loader == tl)
+               {
+               vficon_thumb_do(vfi, tl, vfi->thumbs_fd);
+               }
+
+       while (vficon_thumb_next(vfi));
+}
+
+static gint vficon_thumb_next(ViewFileIcon *vfi)
+{
+       GtkTreePath *tpath;
+       FileData *fd = NULL;
+
+       if (!GTK_WIDGET_REALIZED(vfi->listview))
+               {
+               vficon_thumb_status(vfi, 0.0, NULL);
+               return FALSE;
+               }
+
+       if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vfi->listview), 0, 0, &tpath, NULL, NULL, NULL))
+               {
+               GtkTreeModel *store;
+               GtkTreeIter iter;
+               gint valid = TRUE;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_path_free(tpath);
+
+               while (!fd && valid && tree_view_row_get_visibility(GTK_TREE_VIEW(vfi->listview), &iter, FALSE) == 0)
+                       {
+                       GList *list;
+
+                       gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
+
+                       while (!fd && list)
+                               {
+                               FileData *tfd = list->data;
+                               if (tfd && !tfd->pixbuf) fd = tfd;
+                               list = list->next;
+                               }
+
+                       valid = gtk_tree_model_iter_next(store, &iter);
+                       }
+               }
+
+       /* then find first undone */
+
+       if (!fd)
+               {
+               GList *work = vfi->list;
+               while (work && !fd)
+                       {
+                       FileData *fd_p = work->data;
+                       work = work->next;
+
+                       if (!fd_p->pixbuf) fd = fd_p;
+                       }
+               }
+
+       if (!fd)
+               {
+               /* done */
+               vficon_thumb_cleanup(vfi);
+               return FALSE;
+               }
+
+       vfi->thumbs_count++;
+
+       vfi->thumbs_fd = fd;
+
+       thumb_loader_free(vfi->thumbs_loader);
+
+       vfi->thumbs_loader = thumb_loader_new(thumb_max_width, thumb_max_height);
+       thumb_loader_set_callbacks(vfi->thumbs_loader,
+                                  vficon_thumb_done_cb,
+                                  vficon_thumb_error_cb,
+                                  NULL,
+                                  vfi);
+
+       if (!thumb_loader_start(vfi->thumbs_loader, fd->path))
+               {
+               /* set icon to unknown, continue */
+               if (debug) printf("thumb loader start failed %s\n", vfi->thumbs_loader->path);
+               vficon_thumb_do(vfi, vfi->thumbs_loader, fd);
+
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+static void vficon_thumb_update(ViewFileIcon *vfi)
+{
+       vficon_thumb_stop(vfi);
+
+       vficon_thumb_status(vfi, 0.0, _("Loading thumbs..."));
+       vfi->thumbs_running = TRUE;
+
+       while (vficon_thumb_next(vfi));
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * row stuff
+ *-----------------------------------------------------------------------------
+ */
+
+FileData *vficon_index_get_data(ViewFileIcon *vfi, gint row)
+{
+       return FILE_DATA(g_list_nth_data(vfi->list, row));
+}
+
+gchar *vficon_index_get_path(ViewFileIcon *vfi, gint row)
+{
+       FileData *fd;
+
+       fd = g_list_nth_data(vfi->list, row);
+
+       return (fd ? fd->path : NULL);
+}
+
+gint vficon_index_by_path(ViewFileIcon *vfi, const gchar *path)
+{
+       gint p = 0;
+       GList *work;
+
+       if (!path) return -1;
+
+       work = vfi->list;
+       while (work)
+               {
+               FileData *fd = work->data;
+               if (strcmp(path, fd->path) == 0) return p;
+               work = work->next;
+               p++;
+               }
+
+       return -1;
+}
+
+gint vficon_count(ViewFileIcon *vfi, gint64 *bytes)
+{
+       if (bytes)
+               {
+               gint64 b = 0;
+               GList *work;
+
+               work = vfi->list;
+               while (work)
+                       {
+                       FileData *fd = work->data;
+                       work = work->next;
+                       b += fd->size;
+                       }
+
+               *bytes = b;
+               }
+
+       return g_list_length(vfi->list);
+}
+
+GList *vficon_get_list(ViewFileIcon *vfi)
+{
+       GList *list = NULL;
+       GList *work;
+
+       work = vfi->list;
+       while (work)
+               {
+               FileData *fd = work->data;
+               work = work->next;
+
+               list = g_list_prepend(list, g_strdup(fd->path));
+               }
+
+       return g_list_reverse(list);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *
+ *-----------------------------------------------------------------------------
+ */
+
+static gint vficon_refresh_real(ViewFileIcon *vfi, gint keep_position)
+{
+       gint ret = TRUE;
+       GList *old_list;
+       GList *work;
+       FileData *focus_fd;
+
+       focus_fd = vfi->focus_fd;
+
+       old_list = vfi->list;
+       vfi->list = NULL;
+
+       if (vfi->path)
+               {
+               ret = iconlist_read(vfi->path, &vfi->list);
+               }
+
+       /* check for same files from old_list */
+       work = old_list;
+       while (work)
+               {
+               FileData *fd;
+               GList *needle;
+
+               fd = work->data;
+               needle = vfi->list;
+               while (needle)
+                       {
+                       FileData *fdn = needle->data;
+                       if (strcmp(fd->name, fdn->name) == 0)
+                               {
+                               /* swap, to retain old thumb, selection */
+                               needle->data = fd;
+                               work->data = fdn;
+                               needle = NULL;
+
+                               if (fd->date != fdn->date || fd->size != fdn->size)
+                                       {
+                                       /* file changed, update */
+                                       fd->date = fdn->date;
+                                       fd->size = fdn->size;
+                                       vficon_set_thumb(vfi, fd, NULL);
+                                       }
+                               }
+                       else
+                               {
+                               needle = needle->next;
+                               }
+                       }
+
+               work = work->next;
+               }
+
+       vfi->list = filelist_sort(vfi->list, vfi->sort_method, vfi->sort_ascend);
+
+       work = old_list;
+       while (work)
+               {
+               FileData *fd = work->data;
+               work = work->next;
+
+               if (fd == vfi->prev_selection) vfi->prev_selection = NULL;
+               if (fd == vfi->click_fd) vfi->click_fd = NULL;
+               }
+
+       vficon_populate(vfi, TRUE, keep_position);
+
+       /* attempt to keep focus on same icon when refreshing */
+       if (focus_fd && g_list_find(vfi->list, focus_fd))
+               {
+               vficon_set_focus(vfi, focus_fd);
+               }
+
+       iconlist_free(old_list);
+
+       return ret;
+}
+
+gint vficon_refresh(ViewFileIcon *vfi)
+{
+       return vficon_refresh_real(vfi, TRUE);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * draw, etc.
+ *-----------------------------------------------------------------------------
+ */
+
+typedef struct _ColumnData ColumnData;
+struct _ColumnData
+{
+       ViewFileIcon *vfi;
+       gint number;
+};
+
+static void vficon_cell_data_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
+                               GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+{
+       ColumnData *cd = data;
+       ViewFileIcon *vfi;
+       GtkStyle *style;
+       GList *list;
+       FileData *fd;
+       GdkColor color_fg;
+       GdkColor color_bg;
+
+       vfi = cd->vfi;
+
+       gtk_tree_model_get(tree_model, iter, FILE_COLUMN_POINTER, &list, -1);
+       fd = g_list_nth_data(list, cd->number);
+
+       style = gtk_widget_get_style(vfi->listview);
+       if (fd && ICON_DATA(fd)->selected & SELECTION_SELECTED)
+               {
+               memcpy(&color_fg, &style->text[GTK_STATE_SELECTED], sizeof(color_fg));
+               memcpy(&color_bg, &style->base[GTK_STATE_SELECTED], sizeof(color_bg));
+               }
+       else
+               {
+               memcpy(&color_fg, &style->text[GTK_STATE_NORMAL], sizeof(color_fg));
+               memcpy(&color_bg, &style->base[GTK_STATE_NORMAL], sizeof(color_bg));
+               }
+
+       if (fd && ICON_DATA(fd)->selected & SELECTION_PRELIGHT)
+               {
+#if 0
+               shift_color(&color_fg, -1, 0);
+#endif
+               shift_color(&color_bg, -1, 0);
+               }
+
+       if (GQV_IS_CELL_RENDERER_ICON(cell))
+                {
+               if (fd)
+                       {
+                       g_object_set(cell,      "pixbuf", fd->pixbuf,
+                                               "text", fd->name,
+                                               "cell-background-gdk", &color_bg,
+                                               "cell-background-set", TRUE,
+                                               "foreground-gdk", &color_fg,
+                                               "foreground-set", TRUE,
+                                               "has-focus", (vfi->focus_fd == fd), NULL);
+                       }
+               else
+                       {
+                       g_object_set(cell,      "pixbuf", NULL,
+                                               "text", NULL,
+                                               "cell-background-set", FALSE,
+                                               "foreground-set", FALSE,
+                                               "has-focus", FALSE, NULL);
+                       }       
+               }
+}
+
+static void vficon_append_column(ViewFileIcon *vfi, gint n)
+{
+       ColumnData *cd;
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_min_width(column, 0);
+
+       gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+       gtk_tree_view_column_set_alignment(column, 0.5);
+
+       renderer = gqv_cell_renderer_icon_new();
+       gtk_tree_view_column_pack_start(column, renderer, FALSE);
+       g_object_set(G_OBJECT(renderer), "xpad", THUMB_BORDER_PADDING * 2,
+                                        "ypad", THUMB_BORDER_PADDING,
+                                        "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL);
+
+       g_object_set_data(G_OBJECT(column), "column_number", GINT_TO_POINTER(n));
+
+       cd = g_new0(ColumnData, 1);
+       cd->vfi = vfi;
+       cd->number = n;
+       gtk_tree_view_column_set_cell_data_func(column, renderer, vficon_cell_data_cb, cd, g_free);
+
+       gtk_tree_view_append_column(GTK_TREE_VIEW(vfi->listview), column);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * base
+ *-----------------------------------------------------------------------------
+ */
+
+gint vficon_set_path(ViewFileIcon *vfi, const gchar *path)
+{
+       gint ret;
+
+       if (!path) return FALSE;
+       if (vfi->path && strcmp(path, vfi->path) == 0) return TRUE;
+
+       g_free(vfi->path);
+       vfi->path = g_strdup(path);
+
+       g_list_free(vfi->selection);
+       vfi->selection = NULL;
+
+       iconlist_free(vfi->list);
+       vfi->list = NULL;
+
+       /* NOTE: populate will clear the store for us */
+       ret = vficon_refresh_real(vfi, FALSE);
+
+       vfi->focus_fd = NULL;
+       vficon_move_focus(vfi, 0, 0, FALSE);
+
+       return ret;
+}
+
+static void vficon_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileIcon *vfi = data;
+
+       if (vfi->popup)
+               {
+               g_signal_handlers_disconnect_matched(G_OBJECT(vfi->popup), G_SIGNAL_MATCH_DATA,
+                                                    0, 0, 0, NULL, vfi);
+               gtk_widget_destroy(vfi->popup);
+               }
+
+       if (vfi->sync_idle_id != -1) g_source_remove(vfi->sync_idle_id);
+
+       tip_unschedule(vfi);
+
+       vficon_thumb_cleanup(vfi);
+
+       g_free(vfi->path);
+
+       iconlist_free(vfi->list);
+       g_list_free(vfi->selection);
+       g_free(vfi);
+}
+
+ViewFileIcon *vficon_new(const gchar *path)
+{
+       ViewFileIcon *vfi;
+       GtkListStore *store;
+       GtkTreeSelection *selection;
+       gint i;
+
+       vfi = g_new0(ViewFileIcon, 1);
+
+       vfi->path = NULL;
+       vfi->sort_method = SORT_NAME;
+       vfi->sort_ascend = TRUE;
+
+       vfi->selection = NULL;
+       vfi->prev_selection = NULL;
+
+       vfi->tip_window = NULL;
+       vfi->tip_delay_id = -1;
+
+       vfi->focus_row = 0;
+       vfi->focus_column = 0;
+       vfi->focus_fd = NULL;
+
+       vfi->show_text = show_icon_names;
+
+       vfi->sync_idle_id = -1;
+
+       vfi->popup = NULL;
+
+       vfi->widget = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(vfi->widget), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vfi->widget),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+       g_signal_connect(G_OBJECT(vfi->widget), "destroy",
+                        G_CALLBACK(vficon_destroy_cb), vfi);
+
+       store = gtk_list_store_new(1, G_TYPE_POINTER);
+       vfi->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vfi->listview));
+       gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_NONE);
+
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vfi->listview), FALSE);
+       gtk_tree_view_set_enable_search(GTK_TREE_VIEW(vfi->listview), FALSE);
+
+       for (i = 0; i < VFICON_MAX_COLUMNS; i++)
+               {
+               vficon_append_column(vfi, i);
+               }
+
+       /* zero width column to hide tree view focus, we draw it ourselves */
+       vficon_append_column(vfi, i);
+       /* end column to fill white space */
+       vficon_append_column(vfi, i);
+
+       g_signal_connect(G_OBJECT(vfi->listview), "size_allocate",
+                        G_CALLBACK(vficon_sized_cb), vfi);
+       g_signal_connect(G_OBJECT(vfi->listview), "key_press_event",
+                        G_CALLBACK(vficon_press_key_cb), vfi);
+
+       gtk_container_add(GTK_CONTAINER(vfi->widget), vfi->listview);
+       gtk_widget_show(vfi->listview);
+
+       vficon_dnd_init(vfi);
+
+       gtk_widget_set_events(vfi->listview, GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK |
+                             GDK_BUTTON_PRESS_MASK | GDK_LEAVE_NOTIFY_MASK);
+       g_signal_connect(G_OBJECT(vfi->listview), "button_press_event",
+                        G_CALLBACK(vficon_press_cb), vfi);
+       g_signal_connect(G_OBJECT(vfi->listview), "button_release_event",
+                        G_CALLBACK(vficon_release_cb), vfi);
+       g_signal_connect(G_OBJECT(vfi->listview),"motion_notify_event",
+                        G_CALLBACK(vficon_motion_cb), vfi);
+       g_signal_connect(G_OBJECT(vfi->listview), "leave_notify_event",
+                        G_CALLBACK(vficon_leave_cb), vfi);
+
+       /* force vfi->columns to be at least 1 (sane) - this will be corrected in the size_cb */
+       vficon_populate_at_new_size(vfi, 1, 1, FALSE);
+
+       if (path) vficon_set_path(vfi, path);
+
+       return vfi;
+}
+
+void vficon_set_status_func(ViewFileIcon *vfi,
+                           void (*func)(ViewFileIcon *vfi, gpointer data), gpointer data)
+{
+       vfi->func_status = func;
+       vfi->data_status = data;
+}
+
+void vficon_set_thumb_status_func(ViewFileIcon *vfi,
+                                 void (*func)(ViewFileIcon *vfi, gdouble val, const gchar *text, gpointer data),
+                                 gpointer data)
+{
+       vfi->func_thumb_status = func;
+       vfi->data_thumb_status = data;
+}
+
+void vficon_set_layout(ViewFileIcon *vfi, LayoutWindow *layout)
+{
+       vfi->layout = layout;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * maintenance (for rename, move, remove)
+ *-----------------------------------------------------------------------------
+ */
+
+static gint vficon_maint_find_closest(ViewFileIcon *vfi, gint row, gint count, GList *ignore_list)
+{
+       GList *list = NULL;
+       GList *work;
+       gint rev = row - 1;
+       row ++;
+
+       work = ignore_list;
+       while (work)
+               {
+               gint f = vficon_index_by_path(vfi, work->data);
+               if (f >= 0) list = g_list_prepend(list, GINT_TO_POINTER(f));
+               work = work->next;
+               }
+
+       while (list)
+               {
+               gint c = TRUE;
+               work = list;
+               while (work && c)
+                       {
+                       gpointer p = work->data;
+                       work = work->next;
+                       if (row == GPOINTER_TO_INT(p))
+                               {
+                               row++;
+                               c = FALSE;
+                               }
+                       if (rev == GPOINTER_TO_INT(p))
+                               {
+                               rev--;
+                               c = FALSE;
+                               }
+                       if (!c) list = g_list_remove(list, p);
+                       }
+               if (c && list)
+                       {
+                       g_list_free(list);
+                       list = NULL;
+                       }
+               }
+       if (row > count - 1)
+               {
+               if (rev < 0)
+                       return -1;
+               else
+                       return rev;
+               }
+       else
+               {
+               return row;
+               }
+}
+
+gint vficon_maint_renamed(ViewFileIcon *vfi, const gchar *source, const gchar *dest)
+{
+       gint ret = FALSE;
+       gint row;
+       gchar *source_base;
+       gchar *dest_base;
+       GList *work;
+       FileData *fd;
+
+       row = vficon_index_by_path(vfi, source);
+       if (row < 0) return FALSE;
+
+       source_base = remove_level_from_path(source);
+       dest_base = remove_level_from_path(dest);
+
+       work = g_list_nth(vfi->list, row);
+       fd = work->data;
+
+       if (strcmp(source_base, dest_base) == 0)
+               {
+               vfi->list = g_list_remove(vfi->list, fd);
+               g_free(fd->path);
+
+               fd->path = g_strdup(dest);
+               fd->name = filename_from_path(fd->path);
+
+               vfi->list = filelist_insert_sort(vfi->list, fd, vfi->sort_method, vfi->sort_ascend);
+
+               vficon_sync(vfi);
+               ret = TRUE;
+               }
+       else
+               {
+               ret = vficon_maint_removed(vfi, source, NULL);
+               }
+
+       g_free(source_base);
+       g_free(dest_base);
+
+       return ret;
+}
+
+gint vficon_maint_removed(ViewFileIcon *vfi, const gchar *path, GList *ignore_list)
+{
+       FileData *fd;
+       gint row;
+       gint new_row = -1;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+
+       row = vficon_index_by_path(vfi, path);
+       if (row < 0) return FALSE;
+
+       fd = g_list_nth_data(vfi->list, row);
+       if (!fd) return FALSE;
+
+       if ((ICON_DATA(fd)->selected & SELECTION_SELECTED) &&
+           layout_image_get_collection(vfi->layout, NULL) == NULL)
+               {
+               vficon_unselect(vfi, fd);
+
+               if (!vfi->selection)
+                       {
+                       gint n;
+
+                       n = vficon_count(vfi, NULL);
+                       if (ignore_list)
+                               {
+                               new_row = vficon_maint_find_closest(vfi, row, n, ignore_list);
+                               if (debug) printf("row = %d, closest is %d\n", row, new_row);
+                               }
+                       else
+                               {
+                               if (row + 1 < n)
+                                       {
+                                       new_row = row + 1;
+                                       }
+                               else if (row > 0)
+                                       {
+                                       new_row = row - 1;
+                                       }
+                               }
+                       }
+               else if (ignore_list)
+                       {
+                       GList *work;
+
+                       work = vfi->selection;
+                       while (work)
+                               {
+                               FileData *ignore_fd;
+                               GList *tmp;
+                               gint match = FALSE;
+
+                               ignore_fd = work->data;
+                               work = work->next;
+
+                               tmp = ignore_list;
+                               while (tmp && !match)
+                                       {
+                                       const gchar *ignore_path;
+
+                                       ignore_path = tmp->data;
+                                       tmp = tmp->next;
+
+                                       if (strcmp(ignore_fd->path, ignore_path) == 0)
+                                               {
+                                               match = TRUE;
+                                               }
+                                       }
+                               if (!match)
+                                       {
+                                       new_row = g_list_index(vfi->list, ignore_fd);
+                                       work = NULL;
+                                       }
+                               }
+                       if (new_row == -1)
+                               {
+                               /* selection all ignored, use closest */
+                               new_row = vficon_maint_find_closest(vfi, row, vficon_count(vfi, NULL), ignore_list);
+                               }
+                       }
+               else
+                       {
+                       new_row = g_list_index(vfi->list, vfi->selection->data);
+                       }
+               if (new_row >= 0)
+                       {
+                       FileData *fdn;
+
+                       fdn = g_list_nth_data(vfi->list, new_row);
+                       vficon_select(vfi, fdn);
+                       vficon_send_layout_select(vfi, fdn);
+                       }
+               }
+
+       /* Thumb loader check */
+       if (fd == vfi->thumbs_fd) vfi->thumbs_fd = NULL;
+
+       if (vfi->prev_selection == fd) vfi->prev_selection = NULL;
+       if (vfi->click_fd == fd) vfi->click_fd = NULL;
+
+       /* remove pointer to this fd from grid */
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfi->listview));
+       if (gtk_tree_model_iter_nth_child(store, &iter, NULL, row / vfi->columns))
+               {
+               GList *list;
+
+               gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &list, -1);
+               list = g_list_find(list, fd);
+               if (list) list->data = NULL;
+               }
+
+       vfi->list = g_list_remove(vfi->list, fd);
+       file_data_free(fd);
+
+       vficon_sync_idle(vfi);
+       vficon_send_update(vfi);
+
+       return TRUE;
+}
+
+gint vficon_maint_moved(ViewFileIcon *vfi, const gchar *source, const gchar *dest, GList *ignore_list)
+{
+       gint ret = FALSE;
+       gchar *buf;
+
+       if (!source || !vfi->path) return FALSE;
+
+       buf = remove_level_from_path(source);
+
+       if (strcmp(buf, vfi->path) == 0)
+               {
+               ret = vficon_maint_removed(vfi, source, ignore_list);
+               }
+
+       g_free(buf);
+
+       return ret;
+}
+
diff --git a/src/view_file_icon.h b/src/view_file_icon.h
new file mode 100644 (file)
index 0000000..e66edad
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifndef VIEW_FILE_ICON_H
+#define VIEW_FILE_ICON_H
+
+
+ViewFileIcon *vficon_new(const gchar *path);
+
+gint vficon_set_path(ViewFileIcon *vfi, const gchar *path);
+void vficon_set_status_func(ViewFileIcon *vfi,
+                           void (*func)(ViewFileIcon *vfi, gpointer data), gpointer data);
+void vficon_set_thumb_status_func(ViewFileIcon *vfi,
+                                 void (*func)(ViewFileIcon *vfi, gdouble val, const gchar *text, gpointer data),
+                                 gpointer data);
+
+void vficon_set_layout(ViewFileIcon *vfi, LayoutWindow *layout);
+
+gint vficon_set_path(ViewFileIcon *vfi, const gchar *path);
+gint vficon_refresh(ViewFileIcon *vfi);
+
+void vficon_sort_set(ViewFileIcon *vfi, SortType type, gint ascend);
+
+FileData *vficon_index_get_data(ViewFileIcon *vfi, gint row);
+gchar *vficon_index_get_path(ViewFileIcon *vfi, gint row);
+gint vficon_index_by_path(ViewFileIcon *vfi, const gchar *path);
+gint vficon_count(ViewFileIcon *vfi, gint64 *bytes);
+GList *vficon_get_list(ViewFileIcon *vfi);
+
+gint vficon_index_is_selected(ViewFileIcon *vfi, gint row);
+gint vficon_selection_count(ViewFileIcon *vfi, gint64 *bytes);
+GList *vficon_selection_get_list(ViewFileIcon *vfi);
+GList *vficon_selection_get_list_by_index(ViewFileIcon *vfi);
+
+void vficon_select_all(ViewFileIcon *vfi);
+void vficon_select_none(ViewFileIcon *vfi);
+void vficon_select_by_path(ViewFileIcon *vfi, const gchar *path);
+
+
+gint vficon_maint_renamed(ViewFileIcon *vfi, const gchar *source, const gchar *dest);
+gint vficon_maint_removed(ViewFileIcon *vfi, const gchar *path, GList *ignore_list);
+gint vficon_maint_moved(ViewFileIcon *vfi, const gchar *source, const gchar *dest, GList *ignore_list);
+
+
+#endif
+
+
diff --git a/src/view_file_list.c b/src/view_file_list.c
new file mode 100644 (file)
index 0000000..780e0d2
--- /dev/null
@@ -0,0 +1,1818 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#include "gqview.h"
+#include "view_file_list.h"
+
+#include "cache_maint.h"
+#include "dnd.h"
+#include "editors.h"
+#include "img-view.h"
+#include "info.h"
+#include "layout.h"
+#include "layout_image.h"
+#include "menu.h"
+#include "thumb.h"
+#include "utilops.h"
+#include "ui_bookmark.h"
+#include "ui_fileops.h"
+#include "ui_menu.h"
+#include "ui_tree_edit.h"
+
+#include <gdk/gdkkeysyms.h> /* for keyboard values */
+
+
+enum {
+       FILE_COLUMN_POINTER = 0,
+       FILE_COLUMN_THUMB,
+       FILE_COLUMN_NAME,
+       FILE_COLUMN_SIZE,
+       FILE_COLUMN_DATE,
+       FILE_COLUMN_COLOR,
+       FILE_COLUMN_COUNT
+};
+
+
+static gint vflist_row_is_selected(ViewFileList *vfl, FileData *fd);
+static gint vflist_row_rename_cb(TreeEditData *td, const gchar *old, const gchar *new, gpointer data);
+static void vflist_populate_view(ViewFileList *vfl);
+
+/*
+ *-----------------------------------------------------------------------------
+ * signals
+ *-----------------------------------------------------------------------------
+ */
+
+static void vflist_send_update(ViewFileList *vfl)
+{
+       if (vfl->func_status) vfl->func_status(vfl, vfl->data_status);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * misc
+ *-----------------------------------------------------------------------------
+ */
+
+static gint vflist_find_row(ViewFileList *vfl, FileData *fd, GtkTreeIter *iter)
+{
+       GtkTreeModel *store;
+       gint valid;
+       gint row = 0;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview));
+       valid = gtk_tree_model_get_iter_first(store, iter);
+       while (valid)
+               {
+               FileData *fd_n;
+               gtk_tree_model_get(GTK_TREE_MODEL(store), iter, FILE_COLUMN_POINTER, &fd_n, -1);
+               if (fd_n == fd) return row;
+
+               valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), iter);
+               row++;
+               }
+
+       return -1;
+}
+
+static void vflist_color_set(ViewFileList *vfl, FileData *fd, gint color_set)
+{
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+
+       if (vflist_find_row(vfl, fd, &iter) < 0) return;
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview));
+       gtk_list_store_set(GTK_LIST_STORE(store), &iter, FILE_COLUMN_COLOR, color_set, -1);
+}
+
+static void vflist_move_cursor(ViewFileList *vfl, GtkTreeIter *iter)
+{
+       GtkTreeModel *store;
+       GtkTreePath *tpath;
+
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview));
+
+       tpath = gtk_tree_model_get_path(store, iter);
+       gtk_tree_view_set_cursor(GTK_TREE_VIEW(vfl->listview), tpath, NULL, FALSE);
+       gtk_tree_path_free(tpath);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * dnd
+ *-----------------------------------------------------------------------------
+ */
+
+static void vflist_dnd_get(GtkWidget *widget, GdkDragContext *context,
+                          GtkSelectionData *selection_data, guint info,
+                          guint time, gpointer data)
+{
+       ViewFileList *vfl = data;
+       GList *list = NULL;
+       gchar *uri_text = NULL;
+       gint total;
+
+       if (!vfl->click_fd) return;
+
+       if (vflist_row_is_selected(vfl, vfl->click_fd))
+               {
+               list = vflist_selection_get_list(vfl);
+               }
+       else
+               {
+               list = g_list_append(NULL, g_strdup(vfl->click_fd->path));
+               }
+
+       if (!list) return;
+
+       uri_text = uri_text_from_list(list, &total, (info == TARGET_TEXT_PLAIN));
+       path_list_free(list);
+
+       if (debug) printf(uri_text);
+
+       gtk_selection_data_set(selection_data, selection_data->target, 8, uri_text, total);
+       g_free(uri_text);
+}
+
+static void vflist_dnd_begin(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       vflist_color_set(vfl, vfl->click_fd, TRUE);
+
+       if (vfl->thumbs_enabled &&
+           vfl->click_fd && vfl->click_fd->pixbuf)
+               {
+               gint items;
+
+               if (vflist_row_is_selected(vfl, vfl->click_fd))
+                       items = vflist_selection_count(vfl, NULL);
+               else
+                       items = 1;
+
+               dnd_set_drag_icon(widget, context, vfl->click_fd->pixbuf, items);
+               }
+}
+
+static void vflist_dnd_end(GtkWidget *widget, GdkDragContext *context, gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       vflist_color_set(vfl, vfl->click_fd, FALSE);
+
+       if (context->action == GDK_ACTION_MOVE)
+               {
+               vflist_refresh(vfl);
+               }
+}
+
+static void vflist_dnd_init(ViewFileList *vfl)
+{
+       gtk_drag_source_set(vfl->listview, GDK_BUTTON1_MASK | GDK_BUTTON2_MASK,
+                           dnd_file_drag_types, dnd_file_drag_types_count,
+                           GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_LINK);
+       g_signal_connect(G_OBJECT(vfl->listview), "drag_data_get",
+                        G_CALLBACK(vflist_dnd_get), vfl);
+       g_signal_connect(G_OBJECT(vfl->listview), "drag_begin",
+                        G_CALLBACK(vflist_dnd_begin), vfl);
+       g_signal_connect(G_OBJECT(vfl->listview), "drag_end",
+                        G_CALLBACK(vflist_dnd_end), vfl);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * pop-up menu
+ *-----------------------------------------------------------------------------
+ */
+
+static GList *vflist_pop_menu_file_list(ViewFileList *vfl)
+{
+       if (!vfl->click_fd) return NULL;
+
+       if (vflist_row_is_selected(vfl, vfl->click_fd))
+               {
+               return vflist_selection_get_list(vfl);
+               }
+
+       return g_list_append(NULL, g_strdup(vfl->click_fd->path));
+}
+
+static void vflist_pop_menu_edit_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileList *vfl;
+       gint n;
+       GList *list;
+
+       vfl = submenu_item_get_data(widget);
+       n = GPOINTER_TO_INT(data);
+
+       if (!vfl) return;
+
+       list = vflist_pop_menu_file_list(vfl);
+       start_editor_from_path_list(n, list);
+       path_list_free(list);
+}
+
+static void vflist_pop_menu_info_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       info_window_new(NULL, vflist_pop_menu_file_list(vfl));
+}
+
+static void vflist_pop_menu_view_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       if (vflist_row_is_selected(vfl, vfl->click_fd))
+               {
+               GList *list;
+
+               list = vflist_selection_get_list(vfl);
+               view_window_new_from_list(list);
+               path_list_free(list);
+               }
+       else
+               {
+               const gchar *path;
+               
+               path = vfl->click_fd->path;
+               view_window_new(path);
+               }
+}
+
+static void vflist_pop_menu_copy_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       file_util_copy(NULL, vflist_pop_menu_file_list(vfl), NULL, vfl->listview);
+}
+
+static void vflist_pop_menu_move_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       file_util_move(NULL, vflist_pop_menu_file_list(vfl), NULL, vfl->listview);
+}
+
+static void vflist_pop_menu_rename_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileList *vfl = data;
+       GList *list;
+
+       list = vflist_pop_menu_file_list(vfl);
+       if (enable_in_place_rename &&
+           list && !list->next && vfl->click_fd)
+               {
+               GtkTreeModel *store;
+               GtkTreeIter iter;
+
+               path_list_free(list);
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview));
+               if (vflist_find_row(vfl, vfl->click_fd, &iter) >= 0)
+                       {
+                       GtkTreePath *tpath;
+
+                       tpath = gtk_tree_model_get_path(store, &iter);
+                       tree_edit_by_path(GTK_TREE_VIEW(vfl->listview), tpath,
+                                         FILE_COLUMN_NAME -1, vfl->click_fd->name,
+                                         vflist_row_rename_cb, vfl);
+                       gtk_tree_path_free(tpath);
+                       }
+               return;
+               }
+
+       file_util_rename(NULL, list, vfl->listview);
+}
+
+static void vflist_pop_menu_delete_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       file_util_delete(NULL, vflist_pop_menu_file_list(vfl), vfl->listview);
+}
+
+static void vflist_pop_menu_sort_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileList *vfl;
+       SortType type;
+       
+       vfl = submenu_item_get_data(widget);
+       if (!vfl) return;
+
+       type = (SortType)GPOINTER_TO_INT(data);
+
+       if (vfl->layout)
+               {
+               layout_sort_set(vfl->layout, type, vfl->sort_ascend);
+               }
+       else
+               {
+               vflist_sort_set(vfl, type, vfl->sort_ascend);
+               }
+}
+
+static void vflist_pop_menu_sort_ascend_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       if (vfl->layout)
+               {
+               layout_sort_set(vfl->layout, vfl->sort_method, !vfl->sort_ascend);
+               }
+       else
+               {
+               vflist_sort_set(vfl, vfl->sort_method, !vfl->sort_ascend);
+               }
+}
+
+static void vflist_pop_menu_icons_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       if (vfl->layout) layout_views_set(vfl->layout, vfl->layout->tree_view, TRUE);
+}
+
+static void vflist_pop_menu_thumbs_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       vflist_color_set(vfl, vfl->click_fd, FALSE);
+       if (vfl->layout)
+               {
+               layout_thumb_set(vfl->layout, !vfl->thumbs_enabled);
+               }
+       else
+               {
+               vflist_thumb_set(vfl, !vfl->thumbs_enabled);
+               }
+}
+
+static void vflist_pop_menu_refresh_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       vflist_color_set(vfl, vfl->click_fd, FALSE);
+       vflist_refresh(vfl);
+}
+
+static void vflist_popup_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileList *vfl = data;
+       vflist_color_set(vfl, vfl->click_fd, FALSE);
+       vfl->click_fd = NULL;
+       vfl->popup = NULL;
+}
+
+static GtkWidget *vflist_pop_menu(ViewFileList *vfl, FileData *fd)
+{
+       GtkWidget *menu;
+       GtkWidget *item;
+       GtkWidget *submenu;
+       gint active;
+
+       vflist_color_set(vfl, fd, TRUE);
+       active = (fd != NULL);
+
+       menu = popup_menu_short_lived();
+       g_signal_connect(G_OBJECT(menu), "destroy",
+                        G_CALLBACK(vflist_popup_destroy_cb), vfl);
+
+       submenu_add_edit(menu, &item, G_CALLBACK(vflist_pop_menu_edit_cb), vfl);
+       gtk_widget_set_sensitive(item, active);
+
+       menu_item_add_stock_sensitive(menu, _("_Properties"), GTK_STOCK_PROPERTIES, active,
+                                     G_CALLBACK(vflist_pop_menu_info_cb), vfl);
+       menu_item_add_stock_sensitive(menu, _("View in _new window"), GTK_STOCK_NEW, active,
+                                     G_CALLBACK(vflist_pop_menu_view_cb), vfl);
+
+       menu_item_add_divider(menu);
+       menu_item_add_stock_sensitive(menu, _("_Copy..."), GTK_STOCK_COPY, active,
+                                     G_CALLBACK(vflist_pop_menu_copy_cb), vfl);
+       menu_item_add_sensitive(menu, _("_Move..."), active,
+                               G_CALLBACK(vflist_pop_menu_move_cb), vfl);
+       menu_item_add_sensitive(menu, _("_Rename..."), active,
+                               G_CALLBACK(vflist_pop_menu_rename_cb), vfl);
+       menu_item_add_stock_sensitive(menu, _("_Delete..."), GTK_STOCK_DELETE, active,
+                               G_CALLBACK(vflist_pop_menu_delete_cb), vfl);
+
+       menu_item_add_divider(menu);
+
+       submenu = submenu_add_sort(NULL, G_CALLBACK(vflist_pop_menu_sort_cb), vfl,
+                                  FALSE, FALSE, TRUE, vfl->sort_method);
+       menu_item_add_divider(submenu);
+       menu_item_add_check(submenu, _("Ascending"), vfl->sort_ascend,
+                           G_CALLBACK(vflist_pop_menu_sort_ascend_cb), vfl);
+
+       item = menu_item_add(menu, _("_Sort"), NULL, NULL);
+       gtk_menu_item_set_submenu(GTK_MENU_ITEM(item), submenu);
+
+       menu_item_add_check(menu, _("View as _icons"), FALSE,
+                           G_CALLBACK(vflist_pop_menu_icons_cb), vfl);
+       menu_item_add_check(menu, _("Show _thumbnails"), vfl->thumbs_enabled,
+                           G_CALLBACK(vflist_pop_menu_thumbs_cb), vfl);
+       menu_item_add_stock(menu, _("Re_fresh"), GTK_STOCK_REFRESH, G_CALLBACK(vflist_pop_menu_refresh_cb), vfl);
+
+       return menu;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * callbacks
+ *-----------------------------------------------------------------------------
+ */
+
+static gint vflist_row_rename_cb(TreeEditData *td, const gchar *old, const gchar *new, gpointer data)
+{
+       ViewFileList *vfl = data;
+       gchar *old_path;
+       gchar *new_path;
+
+       if (strlen(new) == 0) return FALSE;
+
+       old_path = concat_dir_and_file(vfl->path, old);
+       new_path = concat_dir_and_file(vfl->path, new);
+
+       if (strchr(new, '/') != NULL)
+               {
+               gchar *text = g_strdup_printf(_("Invalid file name:\n%s"), new);
+               file_util_warning_dialog(_("Error renaming file"), text, GTK_STOCK_DIALOG_ERROR, vfl->listview);
+               g_free(text);
+               }
+       else if (isfile(new_path))
+               {
+               gchar *text = g_strdup_printf(_("A file with name %s already exists."), new);
+               file_util_warning_dialog(_("Error renaming file"), text, GTK_STOCK_DIALOG_ERROR, vfl->listview);
+               g_free(text);
+               }
+       else if (!rename_file(old_path, new_path))
+               {
+               gchar *text = g_strdup_printf(_("Unable to rename file:\n%s\nto:\n%s"), old, new);
+               file_util_warning_dialog(_("Error renaming file"), text, GTK_STOCK_DIALOG_ERROR, vfl->listview);
+               g_free(text);
+               }
+       else
+               {
+               file_maint_renamed(old_path, new_path);
+               }
+
+       g_free(old_path);
+       g_free(new_path);
+
+       return FALSE;
+}
+
+static void vflist_menu_position_cb(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer data)
+{
+       ViewFileList *vfl = data;
+       GtkTreeModel *store;
+       GtkTreeIter iter;
+       GtkTreePath *tpath;
+       gint cw, ch;
+
+       if (vflist_find_row(vfl, vfl->click_fd, &iter) < 0) return;
+       store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview));
+       tpath = gtk_tree_model_get_path(store, &iter);
+       tree_view_get_cell_clamped(GTK_TREE_VIEW(vfl->listview), tpath, FILE_COLUMN_NAME - 1, TRUE, x, y, &cw, &ch);
+       gtk_tree_path_free(tpath);
+       *y += ch;
+       popup_menu_position_clamp(menu, x, y, 0);
+}
+
+static gint vflist_press_key_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
+{
+       ViewFileList *vfl = data;
+       GtkTreePath *tpath;
+
+       if (event->keyval != GDK_Menu) return FALSE;
+
+       gtk_tree_view_get_cursor(GTK_TREE_VIEW(vfl->listview), &tpath, NULL);
+       if (tpath)
+               {
+               GtkTreeModel *store;
+               GtkTreeIter iter;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &vfl->click_fd, -1);
+               gtk_tree_path_free(tpath);
+               }
+       else
+               {
+               vfl->click_fd = NULL;
+               }
+
+       vfl->popup = vflist_pop_menu(vfl, vfl->click_fd);
+       gtk_menu_popup(GTK_MENU(vfl->popup), NULL, NULL, vflist_menu_position_cb, vfl, 0, GDK_CURRENT_TIME);
+
+       return TRUE;
+}
+
+static gint vflist_press_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       ViewFileList *vfl = data;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+       FileData *fd = NULL;
+
+       if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
+                                         &tpath, NULL, NULL, NULL))
+               {
+               GtkTreeModel *store;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
+#if 0
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(widget), tpath, NULL, FALSE);
+#endif
+               gtk_tree_path_free(tpath);
+               }
+
+       vfl->click_fd = fd;
+
+       if (bevent->button == 3)
+               {
+               vfl->popup = vflist_pop_menu(vfl, vfl->click_fd);
+               gtk_menu_popup(GTK_MENU(vfl->popup), NULL, NULL, NULL, NULL,
+                               bevent->button, bevent->time);
+               return TRUE;
+               }
+
+       if (!fd) return FALSE;
+
+       if (bevent->button == 2)
+               {
+               if (!vflist_row_is_selected(vfl, fd))
+                       {
+                       vflist_color_set(vfl, fd, TRUE);
+                       }
+               return TRUE;
+               }
+
+
+       if (bevent->button == 1 && bevent->type == GDK_BUTTON_PRESS &&
+           !(bevent->state & GDK_SHIFT_MASK ) &&
+           !(bevent->state & GDK_CONTROL_MASK ) &&
+           vflist_row_is_selected(vfl, fd))
+               {
+               gtk_widget_grab_focus(widget);
+               return TRUE;
+               }
+
+#if 0
+       if (bevent->button == 1 && bevent->type == GDK_2BUTTON_PRESS)
+               {
+               if (vfl->layout) layout_image_full_screen_start(vfl->layout);
+               }
+#endif
+
+       return FALSE;
+}
+
+static gint vflist_release_cb(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
+{
+       ViewFileList *vfl = data;
+       GtkTreePath *tpath;
+       GtkTreeIter iter;
+       FileData *fd = NULL;
+
+       if (bevent->button == 2)
+               {
+               vflist_color_set(vfl, vfl->click_fd, FALSE);
+               }
+
+       if (bevent->button != 1 && bevent->button != 2)
+               {
+               return TRUE;
+               }
+
+       if ((bevent->x != 0 || bevent->y != 0) &&
+           gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), bevent->x, bevent->y,
+                                         &tpath, NULL, NULL, NULL))
+               {
+               GtkTreeModel *store;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(widget));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
+               gtk_tree_path_free(tpath);
+               }
+
+       if (bevent->button == 2)
+               {
+               if (fd && vfl->click_fd == fd)
+                       {
+                       GtkTreeSelection *selection;
+
+                       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+                       if (vflist_row_is_selected(vfl, fd))
+                               {
+                               gtk_tree_selection_unselect_iter(selection, &iter);
+                               }
+                       else
+                               {
+                               gtk_tree_selection_select_iter(selection, &iter);
+                               }
+                       }
+               return TRUE;
+               }
+
+       if (fd && vfl->click_fd == fd &&
+           !(bevent->state & GDK_SHIFT_MASK ) &&
+           !(bevent->state & GDK_CONTROL_MASK ) &&
+           vflist_row_is_selected(vfl, fd))
+               {
+               GtkTreeSelection *selection;
+
+               selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+               gtk_tree_selection_unselect_all(selection);
+               gtk_tree_selection_select_iter(selection, &iter);
+               vflist_move_cursor(vfl, &iter);
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+static void vflist_select_image(ViewFileList *vfl, gint row)
+{
+       const gchar *path;
+       const gchar *read_ahead_path = NULL;
+
+       path = vflist_index_get_path(vfl, row);
+       if (!path) return;
+
+       if (path && enable_read_ahead)
+               {
+               FileData *fd;
+               if (row > vflist_index_by_path(vfl, layout_image_get_path(vfl->layout)) &&
+                   row + 1 < vflist_count(vfl, NULL))
+                       {
+                       fd = vflist_index_get_data(vfl, row + 1);
+                       }
+               else if (row > 0)
+                       {
+                       fd = vflist_index_get_data(vfl, row - 1);
+                       }
+               else
+                       {
+                       fd = NULL;
+                       }
+               if (fd) read_ahead_path = fd->path;
+               }
+
+       layout_image_set_with_ahead(vfl->layout, path, read_ahead_path);
+}
+
+static gint vflist_select_idle_cb(gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       if (!vfl->layout)
+               {
+               vfl->select_idle_id = -1;
+               return FALSE;
+               }
+
+       vflist_send_update(vfl);
+
+       if (vfl->select_fd)
+               {
+               vflist_select_image(vfl, g_list_index(vfl->list, vfl->select_fd));
+               vfl->select_fd = NULL;
+               }
+
+       vfl->select_idle_id = -1;
+       return FALSE;
+}
+
+static void vflist_select_idle_cancel(ViewFileList *vfl)
+{
+       if (vfl->select_idle_id != -1) g_source_remove(vfl->select_idle_id);
+       vfl->select_idle_id = -1;
+}
+
+static gboolean vflist_select_cb(GtkTreeSelection *selection, GtkTreeModel *store, GtkTreePath *tpath,
+                                gboolean path_currently_selected, gpointer data)
+{
+       ViewFileList *vfl = data;
+       GtkTreeIter iter;
+
+       if (!path_currently_selected &&
+           gtk_tree_model_get_iter(store, &iter, tpath))
+               {
+               gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &vfl->select_fd, -1);
+               }
+       else
+               {
+               vfl->select_fd = NULL;
+               }
+
+       if (vfl->layout &&
+           vfl->select_idle_id == -1)
+               {
+               vfl->select_idle_id = g_idle_add(vflist_select_idle_cb, vfl);
+               }
+
+       return TRUE;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * misc
+ *-----------------------------------------------------------------------------
+ */
+
+void vflist_sort_set(ViewFileList *vfl, SortType type, gint ascend)
+{
+       GtkListStore *store;
+       GList *work;
+
+       if (vfl->sort_method == type && vfl->sort_ascend == ascend) return;
+
+       vfl->sort_method = type;
+       vfl->sort_ascend = ascend;
+
+       if (!vfl->list) return;
+
+       vfl->list = filelist_sort(vfl->list, vfl->sort_method, vfl->sort_ascend);
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview)));
+
+       /* reorder the treeview, maintaining current selection */
+       work = g_list_last(vfl->list);
+       while (work)
+               {
+               FileData *fd;
+               GtkTreeIter iter;
+
+               fd = work->data;
+               if (vflist_find_row(vfl, fd, &iter) >= 0)
+                       {
+                       gtk_list_store_move_after(store, &iter, NULL);
+                       }
+
+               work = work->prev;
+               }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * thumb updates
+ *-----------------------------------------------------------------------------
+ */
+
+static gint vflist_thumb_next(ViewFileList *vfl);
+
+static void vflist_thumb_status(ViewFileList *vfl, gdouble val, const gchar *text)
+{
+       if (vfl->func_thumb_status)
+               {
+               vfl->func_thumb_status(vfl, val, text, vfl->data_thumb_status);
+               }
+}
+
+static void vflist_thumb_cleanup(ViewFileList *vfl)
+{
+       vflist_thumb_status(vfl, 0.0, NULL);
+
+       vfl->thumbs_count = 0;
+       vfl->thumbs_running = FALSE;
+
+       thumb_loader_free(vfl->thumbs_loader);
+       vfl->thumbs_loader = NULL;
+
+       vfl->thumbs_filedata = NULL;
+}
+
+static void vflist_thumb_stop(ViewFileList *vfl)
+{
+        if (vfl->thumbs_running) vflist_thumb_cleanup(vfl);
+}
+
+static void vflist_thumb_do(ViewFileList *vfl, ThumbLoader *tl, FileData *fd)
+{
+       GtkListStore *store;
+       GtkTreeIter iter;
+
+       if (!fd || vflist_find_row(vfl, fd, &iter) < 0) return;
+
+       if (fd->pixbuf) g_object_unref(fd->pixbuf);
+       fd->pixbuf = thumb_loader_get_pixbuf(tl, TRUE);
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview)));
+       gtk_list_store_set(store, &iter, FILE_COLUMN_THUMB, fd->pixbuf, -1);
+
+       vflist_thumb_status(vfl, (gdouble)(vfl->thumbs_count) / g_list_length(vfl->list), _("Loading thumbs..."));
+}
+
+static void vflist_thumb_error_cb(ThumbLoader *tl, gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       if (vfl->thumbs_filedata && vfl->thumbs_loader == tl)
+               {
+               vflist_thumb_do(vfl, tl, vfl->thumbs_filedata);
+               }
+
+       while (vflist_thumb_next(vfl));
+}
+
+static void vflist_thumb_done_cb(ThumbLoader *tl, gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       if (vfl->thumbs_filedata && vfl->thumbs_loader == tl)
+               {
+               vflist_thumb_do(vfl, tl, vfl->thumbs_filedata);
+               }
+
+       while (vflist_thumb_next(vfl));
+}
+
+static gint vflist_thumb_next(ViewFileList *vfl)
+{
+       GtkTreePath *tpath;
+       FileData *fd = NULL;
+
+       /* first check the visible files */
+
+       if (GTK_WIDGET_REALIZED(vfl->listview) &&
+           gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vfl->listview), 0, 0, &tpath, NULL, NULL, NULL))
+               {
+               GtkTreeModel *store;
+               GtkTreeIter iter;
+               gint valid = TRUE;
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview));
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_path_free(tpath);
+
+               while (!fd && valid && tree_view_row_get_visibility(GTK_TREE_VIEW(vfl->listview), &iter, FALSE) == 0)
+                       {
+                       gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
+                       if (fd->pixbuf) fd = NULL;
+
+                       valid = gtk_tree_model_iter_next(store, &iter);
+                       }
+               }
+
+       /* then find first undone */
+
+       if (!fd)
+               {
+               GList *work = vfl->list;
+               while (work && !fd)
+                       {
+                       FileData *fd_p = work->data;
+                       work = work->next;
+
+                       if (!fd_p->pixbuf) fd = fd_p;
+                       }
+               }
+
+       if (!fd)
+               {
+               /* done */
+               vflist_thumb_cleanup(vfl);
+               return FALSE;
+               }
+
+       vfl->thumbs_count++;
+
+       vfl->thumbs_filedata = fd;
+
+       thumb_loader_free(vfl->thumbs_loader);
+
+       vfl->thumbs_loader = thumb_loader_new(thumb_max_width, thumb_max_height);
+       thumb_loader_set_callbacks(vfl->thumbs_loader,
+                                  vflist_thumb_done_cb,
+                                  vflist_thumb_error_cb,
+                                  NULL,
+                                  vfl);
+
+       if (!thumb_loader_start(vfl->thumbs_loader, fd->path))
+               {
+               /* set icon to unknown, continue */
+               if (debug) printf("thumb loader start failed %s\n", vfl->thumbs_loader->path);
+               vflist_thumb_do(vfl, vfl->thumbs_loader, fd);
+
+               return TRUE;
+               }
+
+       return FALSE;
+}
+
+static void vflist_thumb_update(ViewFileList *vfl)
+{
+       vflist_thumb_stop(vfl);
+       if (!vfl->thumbs_enabled) return;
+
+       vflist_thumb_status(vfl, 0.0, _("Loading thumbs..."));
+       vfl->thumbs_running = TRUE;
+
+       while (vflist_thumb_next(vfl));
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * row stuff
+ *-----------------------------------------------------------------------------
+ */
+
+FileData *vflist_index_get_data(ViewFileList *vfl, gint row)
+{
+       return g_list_nth_data(vfl->list, row);
+}
+
+gchar *vflist_index_get_path(ViewFileList *vfl, gint row)
+{
+       FileData *fd;
+
+       fd = g_list_nth_data(vfl->list, row);
+
+       return (fd ? fd->path : NULL);
+}
+
+static gint vflist_row_by_path(ViewFileList *vfl, const gchar *path, FileData **fd)
+{
+       gint p = 0;
+       GList *work;
+
+       if (!path) return -1;
+
+       work = vfl->list;
+       while (work)
+               {
+               FileData *fd_n = work->data;
+               if (strcmp(path, fd_n->path) == 0)
+                       {
+                       if (fd) *fd = fd_n;
+                       return p;
+                       }
+               work = work->next;
+               p++;
+               }
+
+       if (fd) *fd = NULL;
+       return -1;
+}
+
+gint vflist_index_by_path(ViewFileList *vfl, const gchar *path)
+{
+       return vflist_row_by_path(vfl, path, NULL);
+}
+
+gint vflist_count(ViewFileList *vfl, gint64 *bytes)
+{
+       if (bytes)
+               {
+               gint64 b = 0;
+               GList *work;
+
+               work = vfl->list;
+               while (work)
+                       {
+                       FileData *fd = work->data;
+                       work = work->next;
+                       b += fd->size;
+                       }
+
+               *bytes = b;
+               }
+
+       return g_list_length(vfl->list);
+}
+
+GList *vflist_get_list(ViewFileList *vfl)
+{
+       GList *list = NULL;
+       GList *work;
+
+       work = vfl->list;
+       while (work)
+               {
+               FileData *fd = work->data;
+               work = work->next;
+
+               list = g_list_prepend(list, g_strdup(fd->path));
+               }
+
+       return g_list_reverse(list);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * selections
+ *-----------------------------------------------------------------------------
+ */
+
+static gint vflist_row_is_selected(ViewFileList *vfl, FileData *fd)
+{
+       GtkTreeModel *store;
+       GtkTreeSelection *selection;
+       GList *slist;
+       GList *work;
+       gint found = FALSE;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vfl->listview));
+       slist = gtk_tree_selection_get_selected_rows(selection, &store);
+       work = slist;
+       while (!found && work)
+               {
+               GtkTreePath *tpath = work->data;
+               FileData *fd_n;
+               GtkTreeIter iter;
+
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd_n, -1);
+               if (fd_n == fd) found = TRUE;
+               work = work->next;
+               }
+       g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+       g_list_free(slist);
+
+       return found;
+}
+
+gint vflist_index_is_selected(ViewFileList *vfl, gint row)
+{
+       FileData *fd;
+
+       fd = vflist_index_get_data(vfl, row);
+       return vflist_row_is_selected(vfl, fd);
+}
+
+gint vflist_selection_count(ViewFileList *vfl, gint64 *bytes)
+{
+       GtkTreeModel *store;
+       GtkTreeSelection *selection;
+       GList *slist;
+       gint count;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vfl->listview));
+       slist = gtk_tree_selection_get_selected_rows(selection, &store);
+
+       if (bytes)
+               {
+               gint64 b = 0;
+               GList *work;
+
+               work = slist;
+               while (work)
+                       {
+                       GtkTreePath *tpath = work->data;
+                       GtkTreeIter iter;
+                       FileData *fd;
+
+                       gtk_tree_model_get_iter(store, &iter, tpath);
+                       gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
+                       b += fd->size;
+
+                       work = work->next;
+                       }
+
+               *bytes = b;
+               }
+
+       count = g_list_length(slist);
+       g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+       g_list_free(slist);
+
+       return count;
+}
+
+GList *vflist_selection_get_list(ViewFileList *vfl)
+{
+       GtkTreeModel *store;
+       GtkTreeSelection *selection;
+       GList *slist;
+       GList *list = NULL;
+       GList *work;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vfl->listview));
+       slist = gtk_tree_selection_get_selected_rows(selection, &store);
+       work = slist;
+       while (work)
+               {
+               GtkTreePath *tpath = work->data;
+               FileData *fd;
+               GtkTreeIter iter;
+
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
+
+               list = g_list_prepend(list, g_strdup(fd->path));
+
+               work = work->next;
+               }
+       g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+       g_list_free(slist);
+
+       return g_list_reverse(list);
+}
+
+GList *vflist_selection_get_list_by_index(ViewFileList *vfl)
+{
+       GtkTreeModel *store;
+       GtkTreeSelection *selection;
+       GList *slist;
+       GList *list = NULL;
+       GList *work;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vfl->listview));
+       slist = gtk_tree_selection_get_selected_rows(selection, &store);
+       work = slist;
+       while (work)
+               {
+               GtkTreePath *tpath = work->data;
+               FileData *fd;
+               GtkTreeIter iter;
+
+               gtk_tree_model_get_iter(store, &iter, tpath);
+               gtk_tree_model_get(store, &iter, FILE_COLUMN_POINTER, &fd, -1);
+
+               list = g_list_prepend(list, GINT_TO_POINTER(g_list_index(vfl->list, fd)));
+
+               work = work->next;
+               }
+       g_list_foreach(slist, (GFunc)gtk_tree_path_free, NULL);
+       g_list_free(slist);
+
+       return g_list_reverse(list);
+}
+
+void vflist_select_all(ViewFileList *vfl)
+{
+       GtkTreeSelection *selection;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vfl->listview));
+       gtk_tree_selection_select_all(selection);
+
+       vfl->select_fd = NULL;
+}
+
+void vflist_select_none(ViewFileList *vfl)
+{
+       GtkTreeSelection *selection;
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vfl->listview));
+       gtk_tree_selection_unselect_all(selection);
+}
+
+void vflist_select_by_path(ViewFileList *vfl, const gchar *path)
+{
+       FileData *fd;
+       GtkTreeIter iter;
+
+       if (vflist_row_by_path(vfl, path, &fd) < 0) return;
+       if (vflist_find_row(vfl, fd, &iter) < 0) return;
+
+       tree_view_row_make_visible(GTK_TREE_VIEW(vfl->listview), &iter, TRUE);
+
+       if (!vflist_row_is_selected(vfl, fd))
+               {
+               GtkTreeSelection *selection;
+               GtkTreeModel *store;
+               GtkTreePath *tpath;
+
+               selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vfl->listview));
+               gtk_tree_selection_unselect_all(selection);
+               gtk_tree_selection_select_iter(selection, &iter);
+               vflist_move_cursor(vfl, &iter);
+
+               store = gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview));
+               tpath = gtk_tree_model_get_path(store, &iter);
+               gtk_tree_view_set_cursor(GTK_TREE_VIEW(vfl->listview), tpath, NULL, FALSE);
+               gtk_tree_path_free(tpath);
+               }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * core (population)
+ *-----------------------------------------------------------------------------
+ */
+
+static void vflist_listview_set_height(GtkWidget *listview, gint thumb)
+{
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *cell;
+       GList *list;
+
+       column = gtk_tree_view_get_column(GTK_TREE_VIEW(listview), FILE_COLUMN_THUMB - 1);
+       if (!column) return;
+
+       gtk_tree_view_column_set_fixed_width(column, (thumb) ? thumb_max_width : 4);
+
+       list = gtk_tree_view_column_get_cell_renderers(column);
+       if (!list) return;
+       cell = list->data;
+       g_list_free(list);
+
+       g_object_set(G_OBJECT(cell), "height", (thumb) ? thumb_max_height : -1, NULL);
+       gtk_tree_view_columns_autosize(GTK_TREE_VIEW(listview));
+}
+
+static void vflist_populate_view(ViewFileList *vfl)
+{
+       GtkListStore *store;
+       GtkTreeIter iter;
+       gint thumbs;
+       GList *work;
+       GtkTreeRowReference *visible_row = NULL;
+       GtkTreePath *tpath;
+       gint valid;
+
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview)));
+       thumbs = vfl->thumbs_enabled;
+
+       vflist_thumb_stop(vfl);
+
+       if (!vfl->list)
+               {
+               gtk_list_store_clear(store);
+               vflist_send_update(vfl);
+               return;
+               }
+
+       if (GTK_WIDGET_REALIZED(vfl->listview) &&
+           gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(vfl->listview), 0, 0, &tpath, NULL, NULL, NULL))
+               {
+               visible_row = gtk_tree_row_reference_new(GTK_TREE_MODEL(store), tpath);
+               gtk_tree_path_free(tpath);
+               }
+
+       vflist_listview_set_height(vfl->listview, thumbs);
+
+       valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter);
+
+       work = vfl->list;
+       while (work)
+               {
+               gint match;
+               FileData *fd = work->data;
+               gint done = FALSE;
+
+               while (!done)
+                       {
+                       FileData *old_fd = NULL;
+
+                       if (valid)
+                               {
+                               gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &old_fd, -1);
+                               match = CASE_SORT(fd->name, old_fd->name);
+                               }
+                       else
+                               {
+                               match = -1;
+                               }
+
+                       if (match < 0)
+                               {
+                               GtkTreeIter new;
+                               gchar *size;
+
+                               size = text_from_size(fd->size);
+                               if (valid)
+                                       {
+                                       gtk_list_store_insert_before(store, &new, &iter);
+                                       }
+                               else
+                                       {
+                                       gtk_list_store_append(store, &new);
+                                       }
+                               gtk_list_store_set(store, &new, FILE_COLUMN_POINTER, fd,
+                                                               FILE_COLUMN_THUMB, (thumbs) ? fd->pixbuf : NULL,
+                                                               FILE_COLUMN_NAME, fd->name,
+                                                               FILE_COLUMN_SIZE, size,
+                                                               FILE_COLUMN_DATE, text_from_time(fd->date),
+                                                               FILE_COLUMN_COLOR, FALSE, -1);
+                               g_free(size);
+
+                               done = TRUE;
+                               }
+                       else if (match > 0)
+                               {
+                               valid = gtk_list_store_remove(store, &iter);
+                               }
+                       else
+                               {
+                               gtk_list_store_set(store, &iter, FILE_COLUMN_POINTER, fd, -1);
+                               if (fd->date != old_fd->date)
+                                       {
+                                       gchar *size;
+
+                                       /* update, file changed */
+                                       size = text_from_size(fd->size);
+                                       gtk_list_store_set(store, &iter, FILE_COLUMN_SIZE, size,
+                                                                        FILE_COLUMN_DATE, text_from_time(fd->date), -1);
+                                       g_free(size);
+                                       }
+                               else if (fd != old_fd)
+                                       {
+                                       /* preserve thumbnail */
+                                       if (fd->pixbuf) g_object_unref(fd->pixbuf);
+                                       fd->pixbuf = old_fd->pixbuf;
+                                       if (fd->pixbuf) g_object_ref(fd->pixbuf);
+                                       }
+
+                               gtk_list_store_set(store, &iter, FILE_COLUMN_THUMB, (thumbs) ? fd->pixbuf : NULL, -1);
+
+                               if (vfl->select_fd == old_fd) vfl->select_fd = fd;
+
+                               if (valid) valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &iter);
+
+                               done = TRUE;
+                               }
+                       }
+               work = work->next;
+               }
+
+       while (valid)
+               {
+               valid = gtk_list_store_remove(store, &iter);
+               }
+
+       if (visible_row)
+               {
+               if (gtk_tree_row_reference_valid(visible_row))
+                       {
+                       tpath = gtk_tree_row_reference_get_path(visible_row);
+                       gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(vfl->listview), tpath, NULL, TRUE, 0.0, 0.0);
+                       gtk_tree_path_free(tpath);
+                       }
+               gtk_tree_row_reference_free(visible_row);
+               }
+
+       vflist_send_update(vfl);
+       vflist_thumb_update(vfl);
+}
+
+gint vflist_refresh(ViewFileList *vfl)
+{
+       GList *old_list;
+       gint ret = TRUE;
+
+       old_list = vfl->list;
+       vfl->list = NULL;
+
+       if (vfl->path)
+               {
+               ret = filelist_read(vfl->path, &vfl->list, NULL);
+               }
+
+       vfl->list = filelist_sort(vfl->list, vfl->sort_method, vfl->sort_ascend);
+       vflist_populate_view(vfl);
+
+       filelist_free(old_list);
+
+       return ret;
+}
+
+/* this overrides the low default of a GtkCellRenderer from 100 to CELL_HEIGHT_OVERRIDE, something sane for our purposes */
+
+#define CELL_HEIGHT_OVERRIDE 512
+
+static void cell_renderer_height_override(GtkCellRenderer *renderer)
+{
+       GParamSpec *spec;
+
+       spec = g_object_class_find_property(G_OBJECT_GET_CLASS(G_OBJECT(renderer)), "height");
+       if (spec && G_IS_PARAM_SPEC_INT(spec))
+               {
+               GParamSpecInt *spec_int;
+
+               spec_int = G_PARAM_SPEC_INT(spec);
+               if (spec_int->maximum < CELL_HEIGHT_OVERRIDE) spec_int->maximum = CELL_HEIGHT_OVERRIDE;
+               }
+}
+
+static GdkColor *vflist_listview_color_shifted(GtkWidget *widget)
+{
+       static GdkColor color;
+       static GtkWidget *done = NULL;
+
+       if (done != widget)
+               {
+               GtkStyle *style;
+
+               style = gtk_widget_get_style(widget);
+               memcpy(&color, &style->base[GTK_STATE_NORMAL], sizeof(color));
+               shift_color(&color, -1, 0);
+               done = widget;
+               }
+
+       return &color;
+}
+
+static void vflist_listview_color_cb(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell,
+                                    GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
+{
+       ViewFileList *vfl = data;
+       gboolean set;
+
+       gtk_tree_model_get(tree_model, iter, FILE_COLUMN_COLOR, &set, -1);
+       g_object_set(G_OBJECT(cell),
+                    "cell-background-gdk", vflist_listview_color_shifted(vfl->listview),
+                    "cell-background-set", set, NULL);
+}
+
+static void vflist_listview_add_column(ViewFileList *vfl, gint n, const gchar *title, gint image, gint right_justify)
+{
+       GtkTreeViewColumn *column;
+       GtkCellRenderer *renderer;
+
+       column = gtk_tree_view_column_new();
+       gtk_tree_view_column_set_title(column, title);
+       gtk_tree_view_column_set_min_width(column, 4);
+
+       if (!image)
+               {
+               gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_GROW_ONLY);
+               renderer = gtk_cell_renderer_text_new();
+               if (right_justify)
+                       {
+                       g_object_set(G_OBJECT(renderer), "xalign", 1.0, NULL);
+                       }
+               gtk_tree_view_column_pack_start(column, renderer, TRUE);
+               gtk_tree_view_column_add_attribute(column, renderer, "text", n);
+               }
+       else
+               {
+               gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
+               renderer = gtk_cell_renderer_pixbuf_new();
+               cell_renderer_height_override(renderer);
+               gtk_tree_view_column_pack_start(column, renderer, TRUE);
+               gtk_tree_view_column_add_attribute(column, renderer, "pixbuf", n);
+               }
+
+       gtk_tree_view_column_set_cell_data_func(column, renderer, vflist_listview_color_cb, vfl, NULL);
+
+       gtk_tree_view_append_column(GTK_TREE_VIEW(vfl->listview), column);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * base
+ *-----------------------------------------------------------------------------
+ */
+
+gint vflist_set_path(ViewFileList *vfl, const gchar *path)
+{
+       GtkListStore *store;
+
+       if (!path) return FALSE;
+       if (vfl->path && strcmp(path, vfl->path) == 0) return TRUE;
+
+       g_free(vfl->path);
+       vfl->path = g_strdup(path);
+
+       /* force complete reload */
+       store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview)));
+       gtk_list_store_clear(store);
+
+       filelist_free(vfl->list);
+       vfl->list = NULL;
+
+       return vflist_refresh(vfl);
+}
+
+static void vflist_destroy_cb(GtkWidget *widget, gpointer data)
+{
+       ViewFileList *vfl = data;
+
+       if (vfl->popup)
+               {
+               g_signal_handlers_disconnect_matched(G_OBJECT(vfl->popup), G_SIGNAL_MATCH_DATA,
+                                                    0, 0, 0, NULL, vfl);
+               gtk_widget_destroy(vfl->popup);
+               }
+
+       vflist_select_idle_cancel(vfl);
+       vflist_thumb_stop(vfl);
+
+       g_free(vfl->path);
+       filelist_free(vfl->list);
+       g_free(vfl);
+}
+
+ViewFileList *vflist_new(const gchar *path, gint thumbs)
+{
+       ViewFileList *vfl;
+       GtkListStore *store;
+       GtkTreeSelection *selection;
+
+       vfl = g_new0(ViewFileList, 1);
+
+       vfl->path = NULL;
+       vfl->list = NULL;
+       vfl->click_fd = NULL;
+       vfl->select_fd = NULL;
+       vfl->sort_method = SORT_NAME;
+       vfl->sort_ascend = TRUE;
+       vfl->thumbs_enabled = thumbs;
+
+       vfl->thumbs_running = FALSE;
+       vfl->thumbs_count = 0;
+       vfl->thumbs_loader = NULL;
+       vfl->thumbs_filedata = NULL;
+
+       vfl->select_idle_id = -1;
+
+       vfl->popup = NULL;
+
+       vfl->widget = gtk_scrolled_window_new(NULL, NULL);
+       gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(vfl->widget), GTK_SHADOW_IN);
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(vfl->widget),
+                                      GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+       g_signal_connect(G_OBJECT(vfl->widget), "destroy",
+                        G_CALLBACK(vflist_destroy_cb), vfl);
+
+       store = gtk_list_store_new(6, G_TYPE_POINTER, GDK_TYPE_PIXBUF, G_TYPE_STRING,
+                                  G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN);
+       vfl->listview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+       g_object_unref(store);
+
+       selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vfl->listview));
+       gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_MULTIPLE);
+       gtk_tree_selection_set_select_function(selection, vflist_select_cb, vfl, NULL);
+
+       gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(vfl->listview), FALSE);
+       gtk_tree_view_set_enable_search(GTK_TREE_VIEW(vfl->listview), FALSE);
+
+       vflist_listview_add_column(vfl, FILE_COLUMN_THUMB, "", TRUE, FALSE);
+       vflist_listview_add_column(vfl, FILE_COLUMN_NAME, _("Name"), FALSE, FALSE);
+       vflist_listview_add_column(vfl, FILE_COLUMN_SIZE, _("Size"), FALSE, TRUE);
+       vflist_listview_add_column(vfl, FILE_COLUMN_DATE, _("Date"), FALSE, TRUE);
+
+       g_signal_connect(G_OBJECT(vfl->listview), "key_press_event",
+                        G_CALLBACK(vflist_press_key_cb), vfl);
+
+       gtk_container_add (GTK_CONTAINER(vfl->widget), vfl->listview);
+       gtk_widget_show(vfl->listview);
+
+       vflist_dnd_init(vfl);
+
+       g_signal_connect(G_OBJECT(vfl->listview), "button_press_event",
+                        G_CALLBACK(vflist_press_cb), vfl);
+       g_signal_connect(G_OBJECT(vfl->listview), "button_release_event",
+                        G_CALLBACK(vflist_release_cb), vfl);
+
+       if (path) vflist_set_path(vfl, path);
+
+       return vfl;
+}
+
+void vflist_set_status_func(ViewFileList *vfl,
+                           void (*func)(ViewFileList *vfl, gpointer data), gpointer data)
+{
+       vfl->func_status = func;
+       vfl->data_status = data;
+}
+
+void vflist_set_thumb_status_func(ViewFileList *vfl,
+                                 void (*func)(ViewFileList *vfl, gdouble val, const gchar *text, gpointer data),
+                                 gpointer data)
+{
+       vfl->func_thumb_status = func;
+       vfl->data_thumb_status = data;
+}
+
+void vflist_thumb_set(ViewFileList *vfl, gint enable)
+{
+       if (vfl->thumbs_enabled == enable) return;
+
+       vfl->thumbs_enabled = enable;
+       vflist_refresh(vfl);
+}
+
+void vflist_set_layout(ViewFileList *vfl, LayoutWindow *layout)
+{
+       vfl->layout = layout;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * maintenance (for rename, move, remove)
+ *-----------------------------------------------------------------------------
+ */
+
+static gint vflist_maint_find_closest(ViewFileList *vfl, gint row, gint count, GList *ignore_list)
+{
+       GList *list = NULL;
+       GList *work;
+       gint rev = row - 1;
+       row ++;
+
+       work = ignore_list;
+       while (work)
+               {
+               gint f = vflist_index_by_path(vfl, work->data);
+               if (f >= 0) list = g_list_prepend(list, GINT_TO_POINTER(f));
+               work = work->next;
+               }
+
+       while (list)
+               {
+               gint c = TRUE;
+               work = list;
+               while (work && c)
+                       {
+                       gpointer p = work->data;
+                       work = work->next;
+                       if (row == GPOINTER_TO_INT(p))
+                               {
+                               row++;
+                               c = FALSE;
+                               }
+                       if (rev == GPOINTER_TO_INT(p))
+                               {
+                               rev--;
+                               c = FALSE;
+                               }
+                       if (!c) list = g_list_remove(list, p);
+                       }
+               if (c && list)
+                       {
+                       g_list_free(list);
+                       list = NULL;
+                       }
+               }
+       if (row > count - 1)
+               {
+               if (rev < 0)
+                       return -1;
+               else
+                       return rev;
+               }
+       else
+               {
+               return row;
+               }
+}
+
+gint vflist_maint_renamed(ViewFileList *vfl, const gchar *source, const gchar *dest)
+{
+       gint ret = FALSE;
+       gint row;
+       gchar *source_base;
+       gchar *dest_base;
+       GList *work;
+       FileData *fd;
+
+       row = vflist_index_by_path(vfl, source);
+       if (row < 0) return FALSE;
+
+       source_base = remove_level_from_path(source);
+       dest_base = remove_level_from_path(dest);
+
+       work = g_list_nth(vfl->list, row);
+       fd = work->data;
+
+       if (strcmp(source_base, dest_base) == 0)
+               {
+               GtkListStore *store;
+               GtkTreeIter iter;
+               GtkTreeIter position;
+               gint old_row;
+               gint n;
+
+               old_row = g_list_index(vfl->list, fd);
+
+               vfl->list = g_list_remove(vfl->list, fd);
+               g_free(fd->path);
+
+               fd->path = g_strdup(dest);
+               fd->name = filename_from_path(fd->path);
+
+               vfl->list = filelist_insert_sort(vfl->list, fd, vfl->sort_method, vfl->sort_ascend);
+               n = g_list_index(vfl->list, fd);
+
+               store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview)));
+               row = vflist_find_row(vfl, fd, &iter);
+               if (vflist_find_row(vfl, fd, &iter) >= 0 &&
+                   gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &position, NULL, n))
+                       {
+                       if (old_row >= n)
+                               {
+                               gtk_list_store_move_before(store, &iter, &position);
+                               }
+                       else
+                               {
+                               gtk_list_store_move_after(store, &iter, &position);
+                               }
+                       }
+               gtk_list_store_set(store, &iter, FILE_COLUMN_NAME, fd->name, -1);
+
+               ret = TRUE;
+               }
+       else
+               {
+               ret = vflist_maint_removed(vfl, source, NULL);
+               }
+
+       g_free(source_base);
+       g_free(dest_base);
+
+       return ret;
+}
+
+gint vflist_maint_removed(ViewFileList *vfl, const gchar *path, GList *ignore_list)
+{
+       GtkTreeIter iter;
+       GList *list;
+       FileData *fd;
+       gint row;
+       gint new_row = -1;
+
+       row = vflist_index_by_path(vfl, path);
+       if (row < 0) return FALSE;
+
+       if (vflist_index_is_selected(vfl, row) &&
+           layout_image_get_collection(vfl->layout, NULL) == NULL)
+               {
+               gint n;
+
+               n = vflist_count(vfl, NULL);
+               if (ignore_list)
+                       {
+                       new_row = vflist_maint_find_closest(vfl, row, n, ignore_list);
+                       if (debug) printf("row = %d, closest is %d\n", row, new_row);
+                       }
+               else
+                       {
+                       if (row + 1 < n)
+                               {
+                               new_row = row + 1;
+                               }
+                       else if (row > 0)
+                               {
+                               new_row = row - 1;
+                               }
+                       }
+               vflist_select_none(vfl);
+               if (new_row >= 0)
+                       {
+                       fd = vflist_index_get_data(vfl, new_row);
+                       if (vflist_find_row(vfl, fd, &iter) >= 0)
+                               {
+                               GtkTreeSelection *selection;
+
+                               selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(vfl->listview));
+                               gtk_tree_selection_select_iter(selection, &iter);
+                               vflist_move_cursor(vfl, &iter);
+                               }
+                       }
+               }
+
+       fd = vflist_index_get_data(vfl, row);
+       if (vflist_find_row(vfl, fd, &iter) >= 0)
+               {
+               GtkListStore *store;
+               store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vfl->listview)));
+               gtk_list_store_remove(store, &iter);
+               }
+       list = g_list_nth(vfl->list, row);
+       fd = list->data;
+
+       /* thumbnail loader check */
+       if (fd == vfl->thumbs_filedata) vfl->thumbs_filedata = NULL;
+
+       vfl->list = g_list_remove(vfl->list, fd);
+       file_data_free(fd);
+
+       vflist_send_update(vfl);
+
+       return TRUE;
+}
+
+gint vflist_maint_moved(ViewFileList *vfl, const gchar *source, const gchar *dest, GList *ignore_list)
+{
+       gint ret = FALSE;
+       gchar *buf;
+
+       if (!source || !vfl->path) return FALSE;
+
+       buf = remove_level_from_path(source);
+
+       if (strcmp(buf, vfl->path) == 0)
+               {
+               ret = vflist_maint_removed(vfl, source, ignore_list);
+               }
+
+       g_free(buf);
+
+       return ret;
+}
+
diff --git a/src/view_file_list.h b/src/view_file_list.h
new file mode 100644 (file)
index 0000000..b82b03c
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * GQview
+ * (C) 2004 John Ellis
+ *
+ * Author: John Ellis
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+#ifndef VIEW_FILE_LIST_H
+#define VIEW_FILE_LIST_H
+
+
+#include "filelist.h"
+
+
+ViewFileList *vflist_new(const gchar *path, gint thumbs);
+
+void vflist_set_status_func(ViewFileList *vfl,
+                           void (*func)(ViewFileList *vfl, gpointer data), gpointer data);
+void vflist_set_thumb_status_func(ViewFileList *vfl,
+                                 void (*func)(ViewFileList *vfl, gdouble val, const gchar *text, gpointer data),
+                                 gpointer data);
+
+void vflist_set_layout(ViewFileList *vfl, LayoutWindow *layout);
+
+gint vflist_set_path(ViewFileList *vfl, const gchar *path);
+gint vflist_refresh(ViewFileList *vfl);
+
+void vflist_thumb_set(ViewFileList *vfl, gint enable);
+void vflist_sort_set(ViewFileList *vfl, SortType type, gint ascend);
+
+FileData *vflist_index_get_data(ViewFileList *vfl, gint row);
+gchar *vflist_index_get_path(ViewFileList *vfl, gint row);
+gint vflist_index_by_path(ViewFileList *vfl, const gchar *path);
+gint vflist_count(ViewFileList *vfl, gint64 *bytes);
+GList *vflist_get_list(ViewFileList *vfl);
+
+gint vflist_index_is_selected(ViewFileList *vfl, gint row);
+gint vflist_selection_count(ViewFileList *vfl, gint64 *bytes);
+GList *vflist_selection_get_list(ViewFileList *vfl);
+GList *vflist_selection_get_list_by_index(ViewFileList *vfl);
+
+void vflist_select_all(ViewFileList *vfl);
+void vflist_select_none(ViewFileList *vfl);
+void vflist_select_by_path(ViewFileList *vfl, const gchar *path);
+
+
+gint vflist_maint_renamed(ViewFileList *vfl, const gchar *source, const gchar *dest);
+gint vflist_maint_removed(ViewFileList *vfl, const gchar *path, GList *ignore_list);
+gint vflist_maint_moved(ViewFileList *vfl, const gchar *source, const gchar *dest, GList *ignore_list);
+
+
+#endif
diff --git a/src/window.c b/src/window.c
deleted file mode 100644 (file)
index 924a3a2..0000000
+++ /dev/null
@@ -1,502 +0,0 @@
-/*
- * GQview image viewer
- * (C)2000 John Ellis
- *
- * Author: John Ellis
- *
- */
-
-#include "gqview.h"
-
-#define MAINWINDOW_DEF_WIDTH 500
-#define MAINWINDOW_DEF_HEIGHT 400
-#define TOOLWINDOW_DEF_WIDTH 224
-#define TOOLWINDOW_DEF_HEIGHT 450
-#define LIST_DEFAULT_WIDTH -1
-#define LIST_DEFAULT_HEIGHT 100
-
-static GtkWidget *add_label(gchar *text, GtkWidget *box, gint start, gint size, gint expand);
-static void info_area_create(GtkWidget *vbox);
-
-static void toolwindow_create();
-static void toolwindow_destroy();
-static void toolwindow_show();
-
-static void image_focus_paint(GtkWidget *widget);
-static gint image_focus_expose (GtkWidget *widget, GdkEventExpose *event, gpointer data);
-static gint image_focus_in_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data);
-static gint image_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data);
-
-static void create_tools(GtkAccelGroup *accel_grp, GtkTooltips *tooltips);
-static void mainwindow_destroy_cb(GtkWidget *widget, gpointer data);
-
-/*
- *-----------------------------------------------------------------------------
- * information widget creation routines (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static GtkWidget *add_label(gchar *text, GtkWidget *box, gint start, gint size, gint expand)
-{
-       GtkWidget *label;
-       GtkWidget *frame;
-
-       frame = gtk_frame_new (NULL);
-       if (size)
-               gtk_widget_set_usize (frame, size, -1);
-       gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_IN);
-       if (start)
-               gtk_box_pack_start(GTK_BOX(box), frame, expand, expand, 0);
-       else
-               gtk_box_pack_end(GTK_BOX(box), frame, expand, expand, 0);
-       gtk_widget_show(frame);
-
-       label = gtk_label_new(text);
-       gtk_container_add (GTK_CONTAINER (frame), label);
-       gtk_widget_show(label);
-
-       return label;
-}
-
-static void info_area_create(GtkWidget *vbox)
-{
-       gchar *status_text;
-       gchar *details_text;
-       gchar *zoom_text;
-       gchar *buf;
-
-       if (info_status)
-               {
-               gtk_label_get(GTK_LABEL(info_status), &buf);
-               status_text = g_strdup(buf);
-
-               gtk_label_get(GTK_LABEL(info_details), &buf);
-               details_text = g_strdup(buf);
-
-               gtk_label_get(GTK_LABEL(info_zoom), &buf);
-               zoom_text = g_strdup(buf);
-               }
-       else
-               {
-               status_text = g_strdup("");
-               details_text = g_strdup("GQview");
-               zoom_text = g_strdup(":");
-               }
-
-       if (info_box)
-               {
-               gtk_widget_destroy(info_box);
-               info_box = NULL;
-               }
-
-       if (vbox)
-               {
-               GtkWidget *hbox;
-               hbox = gtk_hbox_new(FALSE, 0);
-               gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
-               gtk_widget_show(hbox);
-                       
-               info_progress_bar = gtk_progress_bar_new();
-               gtk_widget_set_usize(info_progress_bar,150,-1);
-               gtk_box_pack_start (GTK_BOX (hbox), info_progress_bar, FALSE, FALSE, 0);
-               gtk_widget_show(info_progress_bar);
-
-               info_zoom = add_label(zoom_text, hbox, FALSE, 48, FALSE);
-
-               info_status = add_label(status_text, vbox, TRUE, 0, FALSE);
-               info_details = add_label(details_text, vbox, TRUE, 0, FALSE);
-               }
-       else
-               {
-               info_box = gtk_hbox_new(FALSE, 0);
-
-               info_progress_bar = gtk_progress_bar_new();
-               gtk_widget_set_usize(info_progress_bar,150,-1);
-               gtk_box_pack_start (GTK_BOX (info_box), info_progress_bar, FALSE, FALSE, 0);
-               gtk_widget_show(info_progress_bar);
-
-               info_status = add_label(status_text, info_box, TRUE, 0, TRUE);
-               info_details = add_label(details_text, info_box, TRUE, 0, TRUE);
-               info_zoom = add_label(zoom_text, info_box, FALSE, 48, FALSE);
-
-               gtk_widget_show(info_box);
-               }
-
-       image_set_labels(info_details, info_zoom);
-
-       g_free(status_text);
-       g_free(details_text);
-       g_free(zoom_text);
-}
-
-/*
- *-----------------------------------------------------------------------------
- * tool window create/show/hide routines (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void toolwindow_destroy_cb(GtkWidget *widget, gpointer data)
-{
-       toolwindow_float();
-}
-
-static void toolwindow_create()
-{
-       GtkWidget *vbox;
-       GtkAllocation req_size;
-
-       toolwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-       gtk_signal_connect (GTK_OBJECT (toolwindow), "delete_event",(GtkSignalFunc) toolwindow_destroy_cb, NULL);
-       gtk_window_set_policy(GTK_WINDOW(toolwindow), TRUE, TRUE, FALSE);
-       gtk_window_set_title (GTK_WINDOW (toolwindow), _("GQview Tools"));
-       gtk_window_set_wmclass(GTK_WINDOW (toolwindow), "tools", "GQview");
-       gtk_container_border_width (GTK_CONTAINER (toolwindow), 0);
-       gtk_window_add_accel_group(GTK_WINDOW(toolwindow),mainwindow_accel_grp);
-
-       gtk_signal_connect(GTK_OBJECT(toolwindow), "key_press_event", GTK_SIGNAL_FUNC(key_press_cb), NULL);
-
-       if (save_window_positions)
-               {
-               gtk_window_set_default_size (GTK_WINDOW(toolwindow), float_window_w, float_window_h);
-               gtk_widget_set_uposition(toolwindow, float_window_x, float_window_y);
-               req_size.x = req_size.y = 0;
-               req_size.width = float_window_w;
-               req_size.height = float_window_h;
-               }
-       else
-               {
-               gtk_window_set_default_size (GTK_WINDOW(toolwindow), TOOLWINDOW_DEF_WIDTH, TOOLWINDOW_DEF_HEIGHT);
-               req_size.x = req_size.y = 0;
-               req_size.width = TOOLWINDOW_DEF_WIDTH;
-               req_size.height = TOOLWINDOW_DEF_HEIGHT;
-               }
-       gtk_widget_size_allocate(toolwindow, &req_size);
-
-       vbox = gtk_vbox_new(FALSE, 0);
-       gtk_container_add(GTK_CONTAINER(toolwindow), vbox);
-
-       gtk_widget_realize(toolwindow);
-       gtk_widget_realize(vbox);
-
-       if (tool_vbox->parent)
-               {
-               gtk_widget_ref(tool_vbox);
-               gtk_container_remove(GTK_CONTAINER(tool_vbox->parent), tool_vbox);
-               gtk_box_pack_start(GTK_BOX(vbox), tool_vbox, TRUE, TRUE, 0);
-               gtk_widget_unref(tool_vbox);
-               }
-       else
-               {
-               gtk_box_pack_start(GTK_BOX(vbox), tool_vbox, TRUE, TRUE, 0);
-               }
-
-       info_area_create(vbox);
-
-       gtk_widget_show_all(vbox);
-}
-
-static void toolwindow_destroy()
-{
-       if (toolwindow && GTK_WIDGET_VISIBLE(toolwindow))
-               {
-               gdk_window_get_position (toolwindow->window, &float_window_x, &float_window_y);
-               gdk_window_get_size(toolwindow->window, &float_window_w, &float_window_h);
-               }
-
-       info_area_create(NULL);
-
-       gtk_widget_ref(tool_vbox);
-       gtk_container_remove(GTK_CONTAINER(tool_vbox->parent), tool_vbox);
-       gtk_box_pack_start(GTK_BOX(mainwindow_hbox), tool_vbox, FALSE, FALSE, 0);
-       gtk_widget_unref(tool_vbox);
-
-       gtk_box_pack_start(GTK_BOX(mainwindow_vbox), info_box, FALSE, FALSE, 0);
-       gtk_widget_destroy(toolwindow);
-       toolwindow = NULL;
-}
-
-static void toolwindow_show()
-{
-       gtk_widget_show(toolwindow);
-       if (save_window_positions)
-               gdk_window_move(toolwindow->window, float_window_x, float_window_y);
-
-}
-
-/*
- *-----------------------------------------------------------------------------
- * tool window hide/float routines (public)
- *-----------------------------------------------------------------------------
- */ 
-
-void toolwindow_float()
-{
-       if (toolwindow)
-               {
-               if (GTK_WIDGET_VISIBLE(toolwindow))
-                       {
-                       toolwindow_destroy();
-                       tools_float = FALSE;
-                       tools_hidden = FALSE;
-                       }
-               else
-                       {
-                       toolwindow_show();
-                       tools_float = TRUE;
-                       tools_hidden = FALSE;
-                       }
-               }
-       else
-               {
-               toolwindow_create();
-               toolwindow_show();
-               tools_float = TRUE;
-               tools_hidden = FALSE;
-               }
-}
-
-void toolwindow_hide()
-{
-       if (toolwindow)
-               {
-               if (GTK_WIDGET_VISIBLE(toolwindow))
-                       {
-                       gtk_widget_hide(toolwindow);
-                       gdk_window_get_position (toolwindow->window, &float_window_x, &float_window_y);
-                       gdk_window_get_size(toolwindow->window, &float_window_w, &float_window_h);
-                       tools_hidden = TRUE;
-                       }
-               else
-                       {
-                       if (tools_float)
-                               toolwindow_show();
-                       else
-                               toolwindow_destroy();
-                       tools_hidden = FALSE;
-                       }
-               }
-       else
-               {
-               toolwindow_create();
-               tools_hidden = TRUE;
-               }
-}
-
-/*
- *-----------------------------------------------------------------------------
- * image viewport focus display (private)
- *-----------------------------------------------------------------------------
- */ 
-
-static void image_focus_paint(GtkWidget *widget)
-{
-       gint width, height;
-       gdk_window_get_size (widget->window, &width, &height);
-       gdk_draw_rectangle (widget->window,
-                           widget->style->black_gc,
-                           FALSE,
-                           0, 0, width - 1, height - 1);
-}
-
-static gint image_focus_expose (GtkWidget *widget, GdkEventExpose *event, gpointer data)
-{
-       image_focus_paint (widget);
-       return TRUE;
-}
-
-static gint image_focus_in_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data)
-{
-       gtk_signal_connect_after (GTK_OBJECT (widget), "draw",
-                       GTK_SIGNAL_FUNC (image_focus_expose), NULL);
-       gtk_signal_connect (GTK_OBJECT (widget), "expose_event",
-                       GTK_SIGNAL_FUNC (image_focus_paint), NULL);
-       GTK_WIDGET_SET_FLAGS(widget, GTK_HAS_FOCUS);
-
-       gtk_widget_queue_draw (widget);
-       return FALSE;
-}
-
-static gint image_focus_out_cb(GtkWidget *widget, GdkEventFocus *event, gpointer data)
-{
-       gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
-                       GTK_SIGNAL_FUNC (image_focus_paint), NULL);
-       gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
-                       GTK_SIGNAL_FUNC (image_focus_expose), NULL);
-       GTK_WIDGET_UNSET_FLAGS(widget, GTK_HAS_FOCUS);
-       gtk_widget_queue_clear (widget);
-       gtk_viewport_set_shadow_type (GTK_VIEWPORT(widget), GTK_SHADOW_IN);
-       return FALSE;
-}
-
-/*
- *-----------------------------------------------------------------------------
- * main window setup
- *-----------------------------------------------------------------------------
- */ 
-
-static void create_tools(GtkAccelGroup *accel_grp, GtkTooltips *tooltips)
-{
-       GtkWidget *menu_bar;
-       GtkWidget *button_bar;
-       GtkWidget *vpaned;
-       GtkWidget *scrolled;
-       GtkWidget *tabcomp;
-
-       tool_vbox = gtk_vbox_new(FALSE, 0);
-
-       menu_bar = create_menu_bar(accel_grp);
-       gtk_box_pack_start (GTK_BOX(tool_vbox), menu_bar,FALSE,FALSE,0);
-       gtk_widget_show(menu_bar);
-
-       button_bar = create_button_bar(tooltips);
-       gtk_box_pack_start (GTK_BOX(tool_vbox), button_bar,FALSE,FALSE,0);
-       gtk_widget_show(button_bar);
-
-       /* path entry */
-       tabcomp = tab_completion_new(&path_entry, mainwindow, NULL, path_entry_cb, NULL);
-       tab_completion_add_tab_func(path_entry, path_entry_tab_cb, NULL);
-       gtk_box_pack_start (GTK_BOX (tool_vbox), tabcomp, FALSE, FALSE, 0);
-       gtk_widget_show (tabcomp);
-
-        /* history button */
-       history_menu = gtk_option_menu_new ();
-       gtk_box_pack_start (GTK_BOX (tool_vbox), history_menu, FALSE, FALSE, 0);
-       gtk_widget_show (history_menu);
-
-       vpaned = gtk_vpaned_new ();
-       gtk_paned_handle_size (GTK_PANED(vpaned), 10);
-       gtk_paned_gutter_size (GTK_PANED(vpaned), 10);
-       gtk_box_pack_start (GTK_BOX (tool_vbox), vpaned, TRUE, TRUE, 0);
-       gtk_widget_show (vpaned);
-
-       /* dir list */
-       scrolled = gtk_scrolled_window_new(NULL, NULL);
-       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
-                               GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
-       gtk_paned_add1 (GTK_PANED(vpaned), scrolled);
-       gtk_widget_show(scrolled);
-
-       dir_clist=gtk_clist_new(1);
-       gtk_signal_connect (GTK_OBJECT (dir_clist), "button_press_event",(GtkSignalFunc) dir_press_cb, NULL);
-       gtk_signal_connect (GTK_OBJECT (dir_clist), "select_row",(GtkSignalFunc) dir_select_cb, NULL);
-       gtk_clist_column_titles_passive (GTK_CLIST (dir_clist)); 
-       gtk_widget_set_usize(dir_clist, LIST_DEFAULT_WIDTH, LIST_DEFAULT_HEIGHT);
-       gtk_container_add (GTK_CONTAINER (scrolled), dir_clist);
-       gtk_widget_show(dir_clist);
-
-       /* file list */
-       scrolled = gtk_scrolled_window_new(NULL, NULL);
-       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
-                               GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
-       gtk_paned_add2 (GTK_PANED(vpaned), scrolled);
-       gtk_widget_show(scrolled);
-
-       file_clist=gtk_clist_new(1);
-       gtk_clist_set_selection_mode(GTK_CLIST(file_clist), GTK_SELECTION_EXTENDED);
-       gtk_signal_connect (GTK_OBJECT (file_clist), "button_press_event",(GtkSignalFunc) file_press_cb, NULL);
-       gtk_signal_connect (GTK_OBJECT (file_clist), "select_row",(GtkSignalFunc) file_select_cb, NULL);
-       gtk_signal_connect_after (GTK_OBJECT (file_clist), "unselect_row",(GtkSignalFunc) file_unselect_cb, NULL);
-       gtk_clist_column_titles_passive (GTK_CLIST (file_clist)); 
-       gtk_widget_set_usize(file_clist, LIST_DEFAULT_WIDTH, LIST_DEFAULT_HEIGHT);
-       gtk_container_add (GTK_CONTAINER (scrolled), file_clist);
-       gtk_widget_show(file_clist);
-
-       gtk_widget_show(tool_vbox);
-}
-
-static void mainwindow_destroy_cb(GtkWidget *widget, gpointer data)
-{
-       exit_gqview();
-}
-
-void create_main_window()
-{
-       GtkWidget *image_window;
-       GtkAllocation req_size;
-       GtkTooltips *tooltips;
-       GdkColormap *colormap;
-       static GdkColor tooltip_color = { 0, 0xffff, 0xf9f9, 0xcbcb }; /*255 249 203*/
-
-       mainwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-       gtk_window_set_policy(GTK_WINDOW(mainwindow), TRUE, TRUE, FALSE);
-
-       gtk_signal_connect (GTK_OBJECT (mainwindow), "delete_event",(GtkSignalFunc) mainwindow_destroy_cb, NULL);
-
-       gtk_window_set_title(GTK_WINDOW (mainwindow), "GQview");
-       gtk_window_set_wmclass(GTK_WINDOW (mainwindow), "gqview", "GQview");
-       gtk_container_border_width (GTK_CONTAINER (mainwindow), 0);
-
-       gtk_signal_connect(GTK_OBJECT(mainwindow), "key_press_event", GTK_SIGNAL_FUNC(key_press_cb), NULL);
-
-       if (save_window_positions)
-               {
-               req_size.x = main_window_x;
-               req_size.y = main_window_y;
-               req_size.width = main_window_w;
-               req_size.height = main_window_h;
-               gtk_window_set_default_size (GTK_WINDOW(mainwindow), main_window_w, main_window_h);
-               gtk_widget_set_uposition(mainwindow, main_window_x, main_window_y);
-
-               }
-       else
-               {
-               req_size.x = 0;
-               req_size.y = 0;
-               req_size.width = MAINWINDOW_DEF_WIDTH;
-               req_size.height = MAINWINDOW_DEF_HEIGHT;
-               gtk_window_set_default_size (GTK_WINDOW(mainwindow), MAINWINDOW_DEF_WIDTH, MAINWINDOW_DEF_HEIGHT);
-               }
-
-       gtk_widget_size_allocate(mainwindow, &req_size);
-
-       gtk_widget_realize(mainwindow);
-
-       mainwindow_accel_grp = gtk_accel_group_new ();
-       gtk_window_add_accel_group(GTK_WINDOW(mainwindow),mainwindow_accel_grp);
-
-       tooltips = gtk_tooltips_new();
-       colormap = gdk_window_get_colormap (mainwindow->window);
-       gdk_color_alloc (colormap, &tooltip_color);
-       gtk_tooltips_set_colors(tooltips, &tooltip_color, &mainwindow->style->fg[GTK_STATE_NORMAL]);
-
-       create_menu_popups();
-       create_tools(mainwindow_accel_grp, tooltips);
-
-       image_window = image_create();
-
-       mainwindow_vbox = gtk_vbox_new(FALSE, 0);
-       gtk_container_add (GTK_CONTAINER (mainwindow), mainwindow_vbox);
-       gtk_widget_show(mainwindow_vbox);
-
-       mainwindow_hbox = gtk_hbox_new(FALSE, 0);
-       gtk_box_pack_start(GTK_BOX(mainwindow_vbox), mainwindow_hbox, TRUE, TRUE, 0);
-       gtk_widget_show(mainwindow_hbox);
-
-       if (tools_float || tools_hidden)
-               {
-               toolwindow_create();
-               if (!tools_hidden)
-                       {
-                       toolwindow_show();
-                       }
-               }
-       else
-               {
-               info_area_create(NULL);
-               gtk_box_pack_start(GTK_BOX(mainwindow_hbox), tool_vbox, FALSE, FALSE, 0);
-               gtk_box_pack_start(GTK_BOX(mainwindow_vbox), info_box, FALSE, FALSE, 0);
-               }
-
-       gtk_box_pack_end(GTK_BOX(mainwindow_hbox), image_window, TRUE, TRUE, 0);
-       gtk_widget_show_all(image_window);
-       
-       GTK_WIDGET_SET_FLAGS(main_image->viewport, GTK_CAN_FOCUS);
-       gtk_signal_connect(GTK_OBJECT(main_image->viewport), "focus_in_event", GTK_SIGNAL_FUNC(image_focus_in_cb), NULL);
-       gtk_signal_connect(GTK_OBJECT(main_image->viewport), "focus_out_event", GTK_SIGNAL_FUNC(image_focus_out_cb), NULL);
-
-       gtk_widget_show(mainwindow);
-
-       if (save_window_positions)
-               gdk_window_move(mainwindow->window, main_window_x, main_window_y);
-}
-